За основу была взята схема из 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шт.
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
Это же число в других системах исчисления
Пример:
2) Регулировка обоих каналов
Состоит из двух команд. Отдельно задается значение единиц и десятков. Может принимать значение:
Пример:
Устанавливаем значение громкости на обоих каналах равное половине (39)
3) Регулировка левого канала
Состоит из двух команд. Отдельно задается значение единиц и десятков. Может принимать значение:
Пример:
Устанавливаем значение громкости на левом канале равное -32Дб. Значения десятков и единиц представлены в виде суммы.
4) Регулировка правого канала
Состоит из двух команд. Отдельно задается значение единиц и десятков. Может принимать значение:
Пример:
Устанавливаем значение громкости из переменной Volume(int). Значение переменной может быть от 0 до 79.
Для получения десятков значение переменной Volume делим на 10. Т.к. тип переменой int может быть только целым числом – дробная часть автоматически отсекается.
Для получения единиц используем оператор %(остаток от деления целых чисел). Остатком от деления значения переменной Volume на 10 будет цифра, обозначающая единицы в числе.
5) Включение режима «MUTE» (Отключение звука)
Для включения режима «MUTE» необходимо подать команду 0b01111001, для отключения – 0b01111000 или передать значения громкости.
Пример:
Отключаем звук.
Данная плата использовалась для написания статей:
На этом все! На все адекватные вопросы отвечу в комментариях.
…… 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: Выложил файлы в первых комментариях к данной статье на нашем телеграмм канале. Не забудьте подписаться на канал!
Комментариев нет:
Отправить комментарий