Потенциометр представляет собой механическое устройство, с помощью которого можно получить необходимое значение сопротивления, что приведет к изменению величины протекающего через него тока. В электронных схемах у потенциометра достаточно много применений, но одно из наиболее частых – это управление уровнем звука в усилителях звуковой частоты.
Потенциометр не усиливает сигнал, он образует делитель напряжения, с помощью которого входной сигнал ослабляется на заданную величину. В этой статье мы рассмотрим цифровой регулятор уровня звука на микросхеме PT2258 и плате Arduino. Также вы можете посмотреть следующие проекты на аналогичную тематику на нашем сайте:
- простой аудиоплеер и усилитель на Arduino Uno;
- генерация тонов движениями пальцев с использованием Arduino.
Микросхема PT2258
Микросхема PT2258 представляет собой 6-ти канальный электронный контроллер звука и построена на основе CMOS технологии. Микросхема PT2258 изначально была спроектирована для работы с многоканальными аудио-видео приложениями.
Микросхема работает по интерфейсу I2C и обеспечивает диапазон ослабления от 0 до -79dB с шагом 1dB. Изготовляется в 20-ти контактном корпусе DIP или SOP.
Основные технические характеристики микросхемы:
- 6 входных и выходных каналов (для домашних аудио систем формата 5.1);
- выбираемый адрес I2C;
- хорошая развязка между каналами (для приложений с малым уровнем шума);
- отношение сигнал/шум (S/N ratio) более 100 дБ;
- рабочее напряжение от 5 до 9 В.
Как работает микросхема PT2258
Данная микросхема передает и принимает данные от микроконтроллера по линиям интерфейса I2C SCL и SDA, которые образуют шину. Для устойчивой работы рекомендуется данные линии использовать с подтягивающими резисторами сопротивлением 4,7 кОм.
Далее мы кратком рассмотрим принципы работы микросхемы PT2258 по линиям интерфейса I2C. Если вам неинтересна данная информация, то вы можете ее пропустить потому что всю эту работу берет на себя библиотека для Arduino.
Валидация (подтверждение) данных
- данные на линии SDA считаются правильными (подтвержденными) только когда на линии SCL состояние HIGH;
- состояния линии SDA (HIGH и LOW) изменяются только когда на линии SCL состояние LOW.
Условия начала и окончания передачи
Условие начала передачи (Start Condition) активируется когда:
- На линии SCL установлено состояние HIGH.
- Линия SDA переключается из состояния HIGH в LOW.
Условие окончания передачи (Stop Condition) активируется когда:
- Линия SCL установлена в состояние HIGH.
- Линия SDA переключается из состояния LOW в HIGH.
Примечание: эта информация очень полезна для отладки сигналов.
Формат данных
Каждый байт, передаваемый по линии SDA, состоит из 8 бит. Каждый байт должен заканчиваться битом подтверждения.
Подтверждение
Подтверждение (Acknowledgment) гарантирует устойчивое и правильное функционирование. Во время импульса подтверждения (Acknowledge Clock Pulse) микроконтроллер устанавливает контакт SDA в состояние HIGH и в этот же самый момент периферийное устройство (к примеру, аудио процессор) устанавливает на контакте SDA состояние LOW.
Периферийное устройство (в нашем случае PT2258) должно сформировать подтверждение после приема байта, линия SDA будет оставаться в состоянии HIGH во время девятого (9th) импульса синхронизации (Clock Pulse). После этого передатчик ведущего устройства (master) должен сформировать сигнал STOP для прекращения передачи.
Выбор адреса (Address Selection)
Адрес I2C микросхемы PT2258 зависит от состояния CODE1 (контакт № 17) и CODE2 (контакт № 4). Возможные при этом адреса представлены в следующей таблице.
CODE1 (PIN No. 17) | CODE2 (PIN No. 4) | HEX ADDRESS |
0 | 0 | 0X80 |
0 | 1 | 0X84 |
1 | 0 | 0X88 |
1 | 1 | 0X8C |
Протокол интерфейса
Состоит из следующих элементов:
- стартовый бит;
- байт адреса чипа;
- бит подтверждения (ACK);
- байт данных;
- стоповый бит.
Вспомогательные операции
После того, как на микросхему будет подано питание, необходимо подождать, по меньшей мере, 200ms перед тем как передавать первый бит данных, иначе передача данных может окончиться передачей.
После этой задержки первое, что нужно сделать, это очистить регистр при помощи передачи “0XC0” по линии I2C, это гарантирует в дальнейшем правильное функционирование устройства.
Описанная операция очищает целый регистр, теперь нам необходимо установить значение в регистре, иначе регистр будет хранить устаревшее значение и мы получим неправильное значение на выходе.
Чтобы обеспечить правильную настройку звука необходимо последовательно передавать коды 10dB и 1dB на аттенюатор, иначе микросхема может работать неправильно. Более наглядно это процесс представлен на следующей диаграмме:
Чтобы обеспечить правильное функционирование микросхемы PT2258 убедитесь в том, скорость (частота) передачи данных по интерфейсу I2C никогда не будет превышать 100KHz.
Более подробно принципы функционирования микросхемы PT2258 можно изучить в даташите на нее.
Необходимые компоненты
- Плата Arduino Nano (купить на AliExpress).
- Микросхема PT2258 (купить на AliExpress).
- Макетная плата.
- Соединительные провода.
- Кнопки.
- Резистор 4,7 кОм, 5% — 2 шт. (купить на AliExpress).
- Резистор 150 кОм, 5% — 4 шт.
- Резистор 10 кОм, 5% — 2 шт.
- Конденсатор 10 мкФ – 6 шт. (купить на AliExpress).
- Конденсатор 0,1 мкФ – 1 шт. (купить на AliExpress).
Реклама: ООО «АЛИБАБА.КОМ (РУ)» ИНН: 7703380158
Схема проекта
Схема цифрового регулятора уровня звука на Arduino и микросхеме PT2258 представлена на следующем рисунке.
В демонстрационных целях схема собрана на макетной плате.
Примечание: все компоненты на макетной плате следует размещать как можно ближе друг к другу чтобы уменьшить влияние паразитных емкостей и индуктивностей.
Объяснение программы для Arduino
Полный код программы приведен в конце статьи, здесь же мы кратко рассмотрим его основные фрагменты.
Для упрощения написания программы для нашего проекта мы использовали библиотеку PT2258 с сервиса GitHub, написанную пользователем с ником sunrutcon.
Это отлично написанная библиотека, но поскольку она очень старая и содержит некоторые баги, мы решили пофиксить их прежде чем использовать ее в нашем проекте.
Сначала скачайте эту библиотеку с GitHub и распакуйте ее.
После извлечения ее из архива вы увидите в ней два файла. Откройте файл PT2258.cpp любым текстовым редактором, мы использовали Notepad++.
Вы увидите в нем, что буква “w” библиотеки для работы с протоколом I2C (wire library) написана с маленькой буквы, что несовместимо с последними версиями Arduino, вам следует заменить ее на большую букву “W”. Это все, что необходимо сделать с данным файлом.
1 2 3 |
#include <arduino.h> #include <wire.h> #include <PT2258.h> |
Далее код программы мы начнем с подключения в него необходимых библиотек. Библиотека Wire используется для связи по протоколу I2C между платой Arduino и микросхемой PT2258. Библиотека для работы с PT2258 содержит всю необходимую информацию чтобы данная микросхема могла работать по протоколу I2C. Библиотека ezButton используется для подключения кнопки.
1 2 3 |
#include <PT2258.h> #include <ezButton.h> #include <Wire.h> |
Далее объявим объекты для работы с микросхемой PT2258 и двумя кнопками.
1 2 3 |
PT2258 pt2258; ezButton button_1(2); ezButton button_2(4); |
Далее определим уровень звука по умолчанию – он будет использоваться при подаче питания на микросхему.
1 |
Int volume = 40; |
Далее инициализируем последовательную связь и установим частоту синхронизации для шины I2C.
1 2 |
Serial.begin(9600); Wire.setClock(100000); |
Следует отметить, что очень важно для нашего проекта установить частоту для шины I2C, поскольку максимальная частота этой шины, которая поддерживается микросхемой PT2258, составляет 100KHz.
Далее проверим действительно ли микросхема PT2258 может работать по протоколу I2C.
1 2 3 4 |
If (!pt2258.init()) Serial.printIn(“PT2258 Successfully Initiated”); Else Serial.printIn(“Failed to Initiate PT2258”); |
Далее установим задержку срабатывания для кнопок, необходимую для борьбы с дребезгом контактов (debounce delay).
1 2 |
Button_1.setDebounceTime(50); Button_2.setDebounceTime(50); |
И, наконец, инициализируем микросхему PT2258 и установим в ней уровни звука и контакты по умолчанию.
1 2 3 |
/* Iniciating PT with default volume and Pin*/ Pt2258.setChannelVolume(volume,4); Pt2258.setChannelVolume(volume,5); |
На этом мы закончим функцию Void Setup(). В функции Void Loop() нам необходимо вызвать функции циклов (loop function) из класса кнопок.
1 2 |
Button_1.loop(); //Library norms Button_2.loop(); //Library norms |
Следующая секция условия if предназначена для увеличения уровня звука.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
/* if button 1 is pressed if condition is true */ If (button_1.ispressed()) { Volume++; // Incrementing the volume counter. // This if statement ensures the volume does not goes above 79 If (volume >= 79) { Volume = 79; } Serial.print(“volume: “); // printing the volume level Serial.printIn(volume); /* set the volume for channel 4 Which is in PIN 9 of the PT2558 IC */ Pt2558.setChannelVolume(volume,4); /*set the volume for channel 5 Which is the PIN 10 of the PT2558 IC */ Pt2558.setChannelVolume(volume,5); } |
Следующая секция условия if предназначена для уменьшения уровня звука.
1 2 3 4 5 6 7 8 9 10 11 12 |
// The same happens for the button 2 If (button_2.isPressed()) { Volume--; // this if statement ensures the volume level does not go below zero. If (volume <= 0) Volume = 0; Serial.print(“volume: “); Serial.printIn(volume); Pt2258.setChannelVolume(volume,4); Pt2558.setChannelVolume(volume,5); } |
Тестирование работы проекта
Для тестирования нашего проекта мы использовали следующие компоненты:
- Трансформатор с отводами 13-0-13.
- Два динамика 4Ω 20W в качестве нагрузки.
- Источник аудио сигнала (смартфон).
Для управления уровнем звука использовались две кнопки в схеме проекта. Более подробно эти процессы можно посмотреть на видео, приведенном в конце статьи.
Чтобы улучшить работу схемы ее можно собрать на печатной плате – это позволит уменьшить нежелательные шумы. Также можно добавить дополнительный фильтр для устранения высокочастотных шумов.
Исходный код программы (скетча)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 |
#include <PT2258.h> #include <ezButton.h> #include <Wire.h> PT2258 pt2258; // PT2258 Object ezButton button_1(2); //Button_1 Object ezButton button_2(4); //Button_2 Object int volume = 40; // Default volume / Starting Volume void setup() { Serial.begin(9600); //UART begin Wire.setClock(100000); // установка частоты синхронизации шины I2C 100KHz /*проверяем может ли Arduino обмениваться данными с микросхемой PT2258 или нет*/ if (!pt2258.init()) Serial.println("PT2258 Successfully Initiated"); else Serial.println("Failed to Initiate PT2258"); /* установка задержки для устранения эффекта дребезга контактов у кнопок*/ button_1.setDebounceTime(50); button_2.setDebounceTime(50); /*инициализируем PT2258 и устанавливаем в ней уровни звука по умолчанию*/ pt2258.setChannelVolume(volume, 4); pt2258.setChannelVolume(volume, 5); } void loop() { button_1.loop(); //Library norms button_2.loop(); //Library norms /* действия, выполняемые при нажатии кнопки 1*/ if (button_1.isPressed()) { volume++; // инкрементируем счетчик звка // следующее условие гарантирует что уровень звука не будет больше 79 if (volume >= 79) { volume = 79; } Serial.print("volume: "); // выводим уровень звука в окно монитора последовательной связи Serial.println(volume); /*устанавливаем уровень звука для канала 4 который на контакте 9 микросхемы PT2258 */ pt2258.setChannelVolume(volume, 4); /* устанавливаем уровень звука для канала 5 который на контакте 10 микросхемы PT2258 */ pt2258.setChannelVolume(volume, 5); } //действия, выполняемые при нажатии кнопки 2 if (button_2.isPressed()) { volume--; //следующее условие гарантирует что уровень звука не станет меньше нуля if (volume <= 0) volume = 0; Serial.print("volume: "); Serial.println(volume); pt2258.setChannelVolume(volume, 4); pt2258.setChannelVolume(volume, 5); } } |
3 ответа к “Цифровой регулятор уровня звука на Arduino и микросхеме PT2258”
error: no matching function for call to ‘PT2258::PT2258()’
При проверке скетча, ошибка, четвёртая строчка, что это?
PT2258 pt2258; // PT2258 Object
Это создается объект для работы с микросхемой PT2258. Скорее всего у вас какая то проблема с библиотекой PT2258.h