Авторизация
Регистрация

Напомнить пароль

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

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

Заказал потенциометр с приводом. Пока шла посылка из Китая, занялся отладкой программы и общей компоновкой устройства. Еще хотелось сделать ручку со светодиодным маркером. С нее и начал.
После этого принялся за надписи на передней панели. Распечатал на пленке и наклеил на белый двусторонний скотч.Схема на ардуино программируется под любой пульт. Выбираем лишние кнопки на тел. пульте и используем под громкость и отключение громкости (всего 3 команды). Потенциометр имеет вывод от середины. Так что регулятор сделал с тонкомпенсацией по такой схеме.Первым делом собрал регулятор с тонкомпенсацией и сразу захотелось проверить как это работает. В программе RMAA все наглядно видно. Частотная характеристика при 100 громкости (белая) и при 50% (зеленая). Программа приводит характеристику к 0 дБ, поэтому на графике не видно затухания по уровню, но форму хорошо видно.Драйвер двигателя поставил в виде готового модуля. Сигнал идет через реле, которое при отключении громкости замыкает выход регулятора на корпус. Ключом для реле служит смд микросхема ULN2004A. Все это добро проверил и запихнул в корпус.
Думаю на этом закончить свои эксперименты с регулятором. Тут пока делал появилась идея для тех кто хочет, чтобы уровень отображался цифрами. Это проще сделать, если использовать не сдвоенный, а счетверённый регулятор. Где дополнительные секции будут использоваться как датчик абсолютного положения. А то, тот огород, что я видел здесь — это нечто. Крутят энкодер, который подает команды на вращение регулятора. Ну это так — мысли вслух.
Добавить в избранное
+49 +61
свернутьразвернуть
Комментарии (43)
RSS
+
avatar
+6
Думаю на этом закончить свои эксперименты с регулятором.
Нет предела совершенству. Будем ждать очередную часть ;-)
+
avatar
+1
Будем ждать очередную часть ;-)
Однозначно да, ждём продолжения. ;)
+
avatar
0
Я бы взял шаговик и as5600, ну и банк сопротивлений i2c и получилось бы проще, технологичней и в разы надёжней.

Но если вот прям позарез хочется аналог — то сопротивление с проходным шкифом (с двух сторон торчит), на одну ручку, вторую через втулку на шаговик, сзади шаговика магнит и as5600, все.

P.S. AS5600 — absolute encoder, идёт со спецмагнитами, у которых полюса на одной стороне.

P. P. S. при изменении угла ручки без мотора отслеживать момент и подавать небольшое напряжение на его обмотки, чтобы ручка крутилась с ощущаемыми кликами.
+
avatar
0
  • Kabron
  • 10 июня 2025, 23:27
Я бы взял шаговик и as5600, ну и банк сопротивлений i2c
А шаговик тогда нах?
+
avatar
+3
Чтобы ручку вращать, как хочет автор + создание ощущаемыми кликов при прокручивании.
+
avatar
0
  • Kabron
  • 10 июня 2025, 23:55
Ну и пусь вращаеца еще лучше светодиодами оформить или ваще TFT, а управление по и2с.
+
avatar
+11
Подсветку «крутилки» можно было проще сделать, чтоб проводки не «терлись», просто в крпусе крутилки глазок, а светодиод не подвижен в корпусе, под крутилкой.
+
avatar
+13
  • DVANru
  • 11 июня 2025, 00:22
Раньше с пультами проблем не было, и ручки реально вращались!
+
avatar
+3
  • Sayal
  • 11 июня 2025, 10:25
Мелкий ПТК провернуть не сможет.
+
avatar
+4
  • Dimon_
  • 11 июня 2025, 12:08
Особенно пассатижами!
+
avatar
0
А когда была одна программа, пассатижи были редко нужны.
+
avatar
0
  • Dimon_
  • 11 июня 2025, 12:39
Когда была одна программа, тогда и штатные ручки ПТК не ломались :)

Пассатижи стали элементом ПДУ именно после того, как появилось минимум две программы ЦТ (а потом и четыре).
+
avatar
+1
Чтобы видеть положение вала, можно к нему приклеить магнит, а по бокам — два аналоговых датчика холла.
И еще программу бы глянуть
+
avatar
+2
#include <IRremote.h>
#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
}


}
+
avatar
+1
Есть тег «программный код»:
<code>
	mov	ax, bx
	pop	es
</code>
А еще есть спойлер
<spoiler title='А еще есть спойлер'></spoiler>
+
avatar
+1
жесть конечно :) в детстве хотел подобное, хорошо я не меломан и чаще слушаю через блютус, а там управление громкостью либо с наушников, либо с телефона
+
avatar
+5
Еще бы видео, чтобы посмотреть, как это вживую выглядит. Если не сложно, добавьте, пожалуйста. Реально интересно.
+
avatar
+1
Я пытался гифку вставить, не получается. Только позволяет ссылку на Ютуб. Может подскажет кто как проще видео вставить
+
avatar
+4
Я пытался гифку вставить, не получается. Только позволяет ссылку на Ютуб. Может подскажет кто как проще видео вставить
Залить видео на ezgif.com в конверт gif из видео.
Сгенерить. Сжать потом так, чтобы итоговая картинка весила не более 5мб.
Тогда редактор PlusPda даст залить эту gif в обзор.
+
avatar
+4
Спасибо, вставил гифку
+
avatar
+1
Спасибо, вставил гифку
Годная магия! Одобряю!
+
avatar
0
Присоединяюсь к просьбе. И ещё вопрос. А чем обусловлен такой размер корпуса? Он же проктически пустой, наводки какие-то?
+
avatar
0
А чем обусловлен такой размер корпуса? Он же проктически пустой, наводки какие-то?
Типовой же корпус. Скорее всего что было, то и пошло в дело
+
avatar
0
Да, типовой. В расчете может еще туда что-то засунуть. Валяется платка BBE. Уже испытана, может воткну.Надо только перключатель подходящий найти.
+
avatar
0
Китайская плата в сборе не подошла, потому что регулятор возвращался в какое-то положение ( начальное по его мнению) после повторного включения.
Странно, брал тут https://aliexpress.ru/item/1005003429395704.html, где выключил, там и остаётся при повторном включении.
+
avatar
0
Скорее всего это как-то конфигурируется, но в описании этого не было.
+
avatar
0
С «неонкой» веселее :) А японские строители диодика пожалели
+
avatar
0
Самый лучший регулятор громкости — PGA2311
В своё время готовые регуляторы были в продаже.
Нашёл старое фото, где он присутствует:
+
avatar
+7
На фото корпус акустики от стиралки? )
+
avatar
0
Это была бы ну очень компактная стиралка. Попробуй ещё купи такую ;)
+
avatar
0
Ну, конечно же. А как еще получить по-настоящему чистый звук?
+
avatar
0
Шутники из чиподипа:

+
avatar
0
На али были наборы для самостоятельной сборки плата с пжа2311 + пульт ДУ

Проблема в том, что без процессора микросхема 2311 бесполезна.
+
avatar
+1
+
avatar
0
Дело же не в этом, а в предложении заказать тысячу микросхем за миллион рублей. А набор мне не нужен, у меня иногда возникает идея доделать свой анализатор спектра, а там как раз на вход нужен программируемый усилитель (или аттенюатор), данная микросхема подошла бы прекрасно.
Проблема в том, что без процессора микросхема 2311 бесполезна.
Это не проблема, сейчас МК даже в чайниках есть.
+
avatar
0
самый лучший регулятор громкости — PGA2311
естественно нет. У вас THD+N указано для 1kHz и 2v RMS. Оно растет с увеличением частоты и уменьшением и увеличением напряжения относительно даташитного. Ничего лучше регулятора громкости на хороших малосигнальных реле не придумали
+
avatar
0
Гдеж ты раньше был!!! Очень достойно
Мое уважение
+
avatar
0
  • DjBoom
  • 11 июня 2025, 16:51
Мне всегда нравилось регулировка энкодером, ну и соотвествено громкость идикацией на ручке делениями. Мне кажется будет проще и эстетичнее.
+
avatar
0
  • serghs
  • 11 июня 2025, 18:22
Подобные задачи (сохранение предыдущих установок) решаются применением энкодера и записью/чтением EEPROM.
+
avatar
0
на гитхабе был проект с bldc в качестве движка и крутилки- причем с программируемым шагом и ответными кликами и споротивлением.
а сам регулятор — лучше уж по схеме Никитина на реле. можно конечно и потенциометр с мотором для управления и ADC контроль.

+
avatar
0
китайцы уже нанесли ответный удар…
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.