понедельник, 1 октября 2018 г.

Отладочная плата pt2257 для Arduino


Продолжаю делиться отладочными платами собственного изготовления для проектов на Arduino. Первой была плата индикации на семисегментном индикаторе и микросхеме 74HC595. Продолжением является отладочная плата электронного стерео регулятора громкости на pt2257.


За основу была взята схема из datasheet на микросхему:


После небольшой доработки, которая заключалась добавлении разъемов и подтягивающих резисторов, получилась такая схема:


Применяемые детали, их назначение и цена:

1) Макетная плата 3х7см. На BangGood’e 40 штук за $8.99. Получается в среднем 22 цента за штуку:


2) Разъемы X1, X2 для подключения входа и выхода аудиосигнала. Цена на Ebay - $1 за 10 шт. Т.е. 10 центов за штуку или 2шт. = $0.2


3) Панельки DIP8 – 2шт. Одна для микросхемы PT2257, вторая (на схеме обозначена X7), для подключения в случае необходимости микроконтроллера типа Attiny25-85. Цена на ebay $1 за 20шт ($0.05 штука). 2 штуки = $0.1


4) Разделительные конденсаторы C1-C4 емкостью 10мкФ. Можно использовать или выпанные из старой техники или купить на ebay. Стоят примерно $1 за 10шт. Выходит $0.1 штука или $0.4 за 4шт.

5) Фильтрующие конденсаторы по питанию C5 и C6. Для C5 я использовал керамические емкостью 0.1мкФ стоимостью $1 за 20шт. $0.05 штука. В качестве конденсатора C6 можно использовать любой электролитический, емкостью от 47мкФ и выше.



6) Микросхема DD1 tp2257. Цена на ebay начинается от $1.35.



7) Резисторы R1-R5 сопротивлением 10кОм. Цена на ebay.com - $1 за 100шт., т.е. 5 шт. = $0.05


8) Для питания платы от внешнего источника питания предназначен разъем X3 типа MicroUSB. Чтобы не испытывать трудности с припаиванием миниатюрного разъема, я использовал плату-адаптер. Цена такой платы около $1 за 5шт. ($0.2 за 1 шт.)


9) Разъемы X4(питание), X5 (Входы i2c и PB1),  X6 (для работы с портами при вставленном в панельку микроконтроллере Attiny). Разъемы представляют собой пины от 40-пинового разьема:


Итого по деталям плата обошлась мне около $3.
Расположение деталей на плате и разводка проводов (дорожек) производилась согласно чертежа  sprint layout:


Сам чертеж можно скачать здесь.
Внешний вид готовой отладочной  платы:


Данную отладочную плату можно использовать в двух вариантах:
        1) При подключении к Arduino-совместимой плате – используются разъемы X4 (питание) и X5(SDA и SCL - сигналы управления шиной i2c). Остальные разъемы не используются.
        2) В разъем X7 вставляется заранее запрограммированный микроконтроллер Attiny. К разъемам X4-X5 можно подключать какое-либо i2c устройство, например oled- дисплей, а к контактам PB1, PB3-PB4 какую либо периферию: кнопки, энкодер, приемник ИК и т.д. Программировать микроконтроллер можно со среды Arduino через вот такой аналог Digispark.

Программная часть

Как и в случае с дисплеем на сдвиговом регистре для программирования мы не будем использовать никаких специальных библиотек, кроме встроенной в ардуино библиотеку управления шиной i2c wire.
Простейшая программа для управления I2c выглядит так

#include <Wire.h>
 void setup() {
  Wire.begin();  // Подключение к шине I2с
}
void loop() {
Wire.beginTransmission(0x44);  // Начало передачи для pt2257 (i2c адрес 0х44)
Wire.write(<<команда>>);         // Отправляем команду(команды) для pt2257
Wire.endTransmission();             // Окончание передачи

Теперь разберемся, какую же команду нужно отправлять. Смотрим в таблицу из даташита:

Как видим из таблицы 1 каждая команда состоит из 8 бит (1 байта). Это значит что любая команда представляет собой число от 0 до 255. Также видно, 2 функции(“Function Off» и «Mute») состоят из одной команды, а остальные из двух (отдельно десятки и отдельно единицы).
Рассмотрим функции поподробней:
1) Function OFF 
Действие данной функции не описано в даташите. Я подозреваю, что микросхема при этом само-отключается и ведет себя так, как будто ее нет в схеме. Для ее выполнения необходимо подать команду в двоичном виде: 0b111111111

Это же число в других системах исчисления
Пример:

            ……
Wire.beginTransmission(0x44);  // Начало передачи для pt2257 (i2c адрес 0х44)
Wire.write(0b11111111);         // Вместо 0b11111111 можно отправить 255 или 0xFF
Wire.endTransmission();             // Окончание передачи
            ……


2) Регулировка обоих каналов
Состоит из двух команд. Отдельно задается значение единиц и десятков. Может принимать значение:

Пример: 
Устанавливаем значение громкости на обоих каналах равное половине (39)

           ……
Wire.beginTransmission(0x44);  // Начало передачи для pt2257 (i2c адрес 0х44)
Wire.write(0xE3);         // Отправляем десятки
Wire.write(0xD9);         // Отправляем единицы
Wire.endTransmission();             // Окончание передачи
            ……

3) Регулировка левого канала
Состоит из двух команд. Отдельно задается значение единиц и десятков. Может принимать значение:

Пример: 
Устанавливаем значение громкости на левом канале равное -32Дб. Значения десятков и единиц представлены в виде суммы.

          ……
Wire.beginTransmission(0x44);  // Начало передачи для pt2257 (i2c адрес 0х44)
Wire.write(0xB0+3);         // Отправляем десятки (B0+3 = B3)
Wire.write(0xA0+2);         // Отправляем единицы (A0+2=A2)
Wire.endTransmission();             // Окончание передачи
            ……

4) Регулировка правого канала
Состоит из двух команд. Отдельно задается значение единиц и десятков. Может принимать значение:


Пример: 
Устанавливаем значение громкости из переменной Volume(int). Значение переменной может быть от 0 до 79. 
Для получения десятков значение переменной Volume делим на 10. Т.к. тип переменой int может быть только целым числом – дробная часть автоматически отсекается. 
Для получения единиц используем оператор %(остаток от деления целых чисел). Остатком от деления значения переменной Volume на 10 будет цифра, обозначающая единицы в числе.

           ……
Wire.beginTransmission(0x44);  // Начало передачи для pt2257 (i2c адрес 0х44)
Wire.write(Volume/10+48);         // Отправляем десятки громкости в pt2257
Wire.write(Volume%10+32);         // Отправляем единицы громкости в tp2257
Wire.endTransmission();             // Окончание передачи
            ……

5) Включение режима «MUTE» (Отключение звука)
Для включения режима «MUTE» необходимо подать команду 0b01111001, для отключения – 0b01111000 или передать значения громкости.

Пример:
Отключаем звук. 

           ……
Wire.beginTransmission(0x44);  // Начало передачи для pt2257 (i2c адрес 0х44)
Wire.write(121);         // Отправляем команду включить «MUTE»
Wire.endTransmission();             // Окончание передачи
            ……

Данная плата использовалась для написания статей:

1) Регулятор громкости: Arduino, энкодер и pt2257. Версии 2, 3, 4 и 5


На этом все! На все адекватные вопросы отвечу в комментариях.

Upd 31.05.2022:  Выложил файлы в первых комментариях к данной статье на нашем телеграмм канале. Не забудьте подписаться на канал!

Комментариев нет:

Отправить комментарий