Моторизованный регулятор громкости на ардуино

Это уже третий вариант устройства для дистанционного регулирования громкости, на котором я решил остановиться. Нравится мне, когда ручка сама поворачивается. Есть в этом что-то теплое ламповое. Китайская плата в сборе не подошла, потому что регулятор возвращался в какое-то положение ( начальное по его мнению) после повторного включения. Решил использовать тот же электромеханический привод, но схему на ардуино.
Заказал потенциометр с приводом. Пока шла посылка из Китая, занялся отладкой программы и общей компоновкой устройства. Еще хотелось сделать ручку со светодиодным маркером. С нее и начал.


После этого принялся за надписи на передней панели. Распечатал на пленке и наклеил на белый двусторонний скотч.
Схема на ардуино программируется под любой пульт. Выбираем лишние кнопки на тел. пульте и используем под громкость и отключение громкости (всего 3 команды). Потенциометр имеет вывод от середины. Так что регулятор сделал с тонкомпенсацией по такой схеме.
Первым делом собрал регулятор с тонкомпенсацией и сразу захотелось проверить как это работает. В программе RMAA все наглядно видно. Частотная характеристика при 100 громкости (белая) и при 50% (зеленая). Программа приводит характеристику к 0 дБ, поэтому на графике не видно затухания по уровню, но форму хорошо видно.
Драйвер двигателя поставил в виде готового модуля. Сигнал идет через реле, которое при отключении громкости замыкает выход регулятора на корпус. Ключом для реле служит смд микросхема ULN2004A. Все это добро проверил и запихнул в корпус.

Думаю на этом закончить свои эксперименты с регулятором. Тут пока делал появилась идея для тех кто хочет, чтобы уровень отображался цифрами. Это проще сделать, если использовать не сдвоенный, а счетверённый регулятор. Где дополнительные секции будут использоваться как датчик абсолютного положения. А то, тот огород, что я видел здесь — это нечто. Крутят энкодер, который подает команды на вращение регулятора. Ну это так — мысли вслух.
Заказал потенциометр с приводом. Пока шла посылка из Китая, занялся отладкой программы и общей компоновкой устройства. Еще хотелось сделать ручку со светодиодным маркером. С нее и начал.









Самые обсуждаемые обзоры
+72 |
2477
85
|
+51 |
2266
30
|
+61 |
3208
43
|
Но если вот прям позарез хочется аналог — то сопротивление с проходным шкифом (с двух сторон торчит), на одну ручку, вторую через втулку на шаговик, сзади шаговика магнит и as5600, все.
P.S. AS5600 — absolute encoder, идёт со спецмагнитами, у которых полюса на одной стороне.
P. P. S. при изменении угла ручки без мотора отслеживать момент и подавать небольшое напряжение на его обмотки, чтобы ручка крутилась с ощущаемыми кликами.
Пассатижи стали элементом ПДУ именно после того, как появилось минимум две программы ЦТ (а потом и четыре).
И еще программу бы глянуть
#include <Wire.h>
#include <EEPROM.h>
int vol,minus, plus, zero; // переменные для eeprom текущая громкость, коды +-zero
byte w,mute;
#include <IRremote.h>
int res, level, k=0;;
int RECV_PIN = 2; // pin подключения ик прриемника
unsigned long timer_m = 0;
unsigned long timer_mode = 0;
unsigned long time;
int m = 1;
bool mode = 0, flag = false;
int t1 = 2000, t2 = 15000;
IRrecv irrecv(RECV_PIN);
unsigned long eventTime;
decode_results results;
#define but_min 10 // кнопка уменшения громкости
#define but_plus 9 // кнопка увеличения громкости
#define but_mute 8 // кнопка отключения громкости
#define statPIN 7 // Постоянно горит — режим программирования, моргает при приеме правильной команды.
#define off 6 // пин горит когда звук отключен
#define wrcode 3 // кнопка включения сервисного режима
#define up 1
#define dwn 0
#define mot_plus 4 // пин управление мотором +
#define mot_minus 5 // пин кправления мотором — void setup() {
Serial.begin(9600);
Wire.begin();
//Wire.setClock(800000L);
pinMode(but_plus,INPUT_PULLUP);// кнопка ++
pinMode(but_min,INPUT_PULLUP);// кнопка — pinMode(but_mute,INPUT_PULLUP);// кнопка off
pinMode(statPIN,OUTPUT); // индикатор статус
pinMode(off, OUTPUT);// индикатор вык
pinMode(wrcode,INPUT_PULLUP);// кнопка запись кодов
pinMode(mot_plus, OUTPUT);// мотор вправо
pinMode(mot_minus,OUTPUT);// мотор влево
// При включении записывает в PT2257 последние значения громкости
mute = EEPROM.read(0);// состояние mute
zero = EEPROM.read(2);// command mute
plus = EEPROM.read(4);// vol+command eeprom
minus = EEPROM.read(6);// vol-command eeprom
Serial.print(«mute = „);
Serial.println(mute);
Serial.print(“mute code = „);
Serial.println(zero);
Serial.print(“plus code = „);
Serial.println(plus);
Serial.print(“minus code = „);
Serial.println(minus);
irrecv.enableIRIn(); // Start the receiver
}
void loop() {
bool btnState = digitalRead(wrcode);
if (btnState == 0 && flag == 0 )
{ delay(10);
flag = true;
timer_mode = millis();
}
if (btnState == 0 && flag == 1 && millis()-timer_mode > t1 )
{
timer_mode = millis();
mode = !mode;
digitalWrite(statPIN, mode); // mode 1 — запись, mode 0 — нормальная работа
Serial.print(“удерж mode=»);
Serial.println(mode);
}
if (btnState==1 && flag==1 )
{
flag = false;
timer_mode = millis();
//mode = !mode;
Serial.print(" отпуск mode=");
Serial.println(mode);
}
if (btnState==1 && mode == 1 && flag==0 && millis()-timer_mode> t2) // Отключение режима программирование через t2 мсек
{
mode = 0;
timer_mode = millis();
digitalWrite(statPIN, mode); // mode 1 — запись, mode 0 — нормальная работа
Serial.print(«отключ программ mode=»);
Serial.println(mode);
}
digitalWrite(statPIN, mode); // mode 0 — запись, mode 1 — нормальная работа
//Serial.println(«release»);*/
if (mode == 0) readcom();
if (mode == 1) writecom();
}
void readcom()
{
digitalWrite(statPIN, LOW);
/////////////////////////////////////// прием трех команды ик /////////////////////////////////////
if (irrecv.decode(&results)) {
res = results.value;
Serial.print(«Read „);
Serial.println(res);
digitalWrite(statPIN, HIGH); // индикация према сигнала
if (res == plus )
{
eventTime=millis();
digitalWrite(mot_plus,HIGH);
Serial.println(“plus»);
mute=0;
Serial.print(«mute „);
Serial.println(mute);
time = millis();
w=1;
//delay(50);
}
if (res == minus)
{
eventTime=millis();
digitalWrite(mot_minus,HIGH);
mute=0;
Serial.println(“minus»);
Serial.print(«mute „);
Serial.println(mute);
time = millis();
w=1;
//delay(50);
}
//delay(200);
if (res == zero){
if (millis()-timer_m>1000) {
digitalWrite(off,!digitalRead(off));
mute = digitalRead(off);
w=1;
Serial.print(“Mute=»);
Serial.println(mute);
timer_m = millis();
time = millis();
delay(500);
}
}
irrecv.resume(); // Receive the next value
digitalWrite(statPIN, LOW); //
if(millis()-eventTime>1)
{
digitalWrite(mot_plus,0);
digitalWrite(mot_minus,0);
}
//delay(10);
}
if(digitalRead(but_mute)==LOW) {
if (millis()-timer_m > 1000){
digitalWrite(off,!digitalRead(off));
mute = digitalRead(off);
timer_m = millis();
time = millis();
w=1;
Serial.print(«Mute=»);
Serial.println(mute);
delay(200);
}
}
if (digitalRead(but_plus)==LOW) {
digitalWrite(mot_plus,1);
eventTime=millis();
digitalWrite(off,0);
mute=0;
time = millis();
w=1;
Serial.println(vol);
}
if(digitalRead(but_min)==LOW) {
digitalWrite(mot_minus,1);
eventTime=millis();
digitalWrite(off,0);
mute=0;
time = millis();
w=1;
Serial.println(vol);
}
if(millis()-eventTime>90) {
digitalWrite(mot_plus,0);
digitalWrite(mot_minus,0); }
if(millis()-time>10000 && w==1){// запись всех настроек в EEPROM через 10 сек неактивности
EEPROM.update(0,mute); w=0; Serial.println(«Saved data»);}
}
//////////////////////////////////// запись кодов с обчающего пульта //////////////////////
void writecom(){
digitalWrite(statPIN, HIGH);
if (irrecv.decode(&results)) {
res = results.value;
Serial.print(«Read write»);
Serial.println(res);
time = millis();
if (digitalRead(but_mute)==LOW) {EEPROM.update(2,res); Serial.println(«EEPROM zero»); zero = res;digitalWrite(statPIN, LOW); delay(1000);} // запись принятого кода в память погасание светодиода на 1 с
if (digitalRead(but_plus)==LOW) {EEPROM.update(4,res); Serial.println(«EEPROM plus»); plus = res;digitalWrite(statPIN, LOW); delay(1000);}
if (digitalRead(but_min)==LOW) {EEPROM.update(6,res); Serial.println(«EEPROM minus»); minus = res;digitalWrite(statPIN, LOW); delay(1000);}
irrecv.resume(); // Receive the next value
}
}
Сгенерить. Сжать потом так, чтобы итоговая картинка весила не более 5мб.
Тогда редактор PlusPda даст залить эту gif в обзор.
Нашёл старое фото, где он присутствует:
Проблема в том, что без процессора микросхема 2311 бесполезна.
Это не проблема, сейчас МК даже в чайниках есть.
а сам регулятор — лучше уж по схеме Никитина на реле. можно конечно и потенциометр с мотором для управления и ADC контроль.