Начало публикации в статье вечер первый.
На второй вечер я окончательно определился с тем, какую конфигурацию комьютера я хочу. Особенностью ретро-компьютеров в клавиатуре был встроенный динамик. Кажется, он был не везде. Но большинство компьютеров имели по крайней мере пьзезо-пищалку, которая могла извлекать звуки разной высоты. Из них можно было даже извлекать мелодии. В более продвинутых моделях были уже многоканальные генераторы звука, которые могли играть несколько нот одновременно, т.е. делать мелодию. Например, в ZX Spectrum 128 и более поздних моделях был звуковой процессор Yamaha AY-3-8910, очень популярный в те годы трёхканальный генератор звука. Сам по себе Raspberry Zero может проигрывать звук, но отдельного линейного выхода не имеет, он передаёт звук по HDMI, так что просто подключить к линейному выходу усилитель класса D и вывести звук на динамик не получится. К счастью, у меня была компактная и достаточно мощная для моих целей плата MAX98357A. К ней есть отличное руководство на сайте Adafruit. Эта плата называется I2S усилитель, она сочетает в себе цифро-аналоговый преобразователь звука и усилитель звука. К плате можно подключать динамики мощностью до 3 Вт с сопротивлением 4-8 Ом. Самый мощный звук получится на динамике с сопротивлением 4 Ом - плата сможет “раскачать” трехватный динамик. Проблема в том, что большинство динамиков довольно толстые, они просто не войдут внутрь клавиатуры по толщине. Кроме того, большинство динамиков получится разместить исключительно горизонтально, т.е. звук будет направлен в стол, соответственно, будет сильно заглушаться. У меня оказался удивительно маленький двухватный динамик с сопротивлением 8 Ом. MAX98357A по спецификации при сопротивлении 8 Ом может “раскачать” только динамик мощностью 1.8 Вт, но двухватный тоже подошёл. То, что он нашёлся у меня - большая удача. Мне пришлось канибализировать его из Speaker pHAT. В спецификации он заявлен, как “8Ω 2W Mylar speaker”. Мне это ни о чём не говорит, я заказал на ebay пару похожих динамиков, но пока не получил их и не могу посоветовать, подойдут ли они. Динамик из Speaker pHAT подошёл просто идеально.
Распаять MAX98357A оказалось сложнее, чем я думал. Из-за нехватки места в клавиатуре я не рекомендую распаивать “гребёнки” на платы. Они съедают драгоценное место. На фото ниже видно, что я испольовал Raspberry Zero с уже распаянной с завода гребёнкой. Это было ошибкой, потом мне пришлось откусывать неиспользованные выводы гребёнки и загибать использованные. Лучше не полениться и выпаять гребёнку.
Кроме того, для Raspberry Pi есть три разных схемы нумирации GPIO пинов. Их нумеруют по порядку и по четырём разным схемам. Существует нумерация Broadcom, Wiring Pi, физическая (по физическим номерам пинов) и альтернативный Broadcom для старых Raspberry Pi. Нужно знать, что в большинстве случаев используется нумерация Broadcom, её схема приведена ниже. Ещё один способ получить подсказку по нумерации портов - ввести команду pinout
в терминале Raspberry Pi.
Распайка на фото выше неверная, первоначально я сделал её по физической нумерации. В спецификации на MAX98357A распайка заявлена так:
Выход MAX98357A | Выход Raspberry Zero |
---|---|
Vin | 5 V |
GND | GND |
DIN | GPIO 21 |
BCLK | GPIO 18 |
LRCLK | GPIO 19 |
В конце концов мне удалось разобраться, на фото ниже вся схема в полном сборе
Помимо звуковой платы здесь распаян включатель и светодиод, который светится во время работы устройства. Это мои, оригинальные, доработки, поэтому расскажу о них подробнее. В сети есть схемы со светодиодом, который включается програмно. С этим связаны две очевидные проблемы. Во-первых нужно написать программу, которая будет включать светодиод. Во-вторых, он включается не сразу, а только когда в ходе загрузки запускается программа включающая его. Я просто припаял светодиод к пинам параллельного интерфейса Raspberry Zero. Короткую ногу светодиода (анод) припаиваем к любому выходу GND. Длинную ногу (катод) через резистор на 220-330 Ом припаиваем к выходу TxD, он же пин #14 на схеме выше. Осталось включить UART интерфейс добавив строчку enable_uart=1
в файл /boot/config.txt
. Никакого дополнительного программирования не потребуется. Светодиод будет включаться при загрузке на самом раннем этапе, ещё до запуска Linux.
С выключателем та же проблема. Можно подключить его к одному из цифровых выходов Raspberry и написать программу, которая отслеживает нажатие кнопки и выключает устройство при нажатии. Но это будет всего лишь дублировать обычное выключение устройства командой shutdown или кнопкой “завершение работы” в графическом интерфейсе. Когда устройство выключено - отслеживать кнопку некому, поэтому для нормальной фукнциональности кнопки включения пришлось бы делать дополнительную электронную схему, может быть даже с собственным контроллером. Потом что, для того, чтобы включить выключенное программно устройство нужно сначала физически выключить и потом включить питание. Поэтому вместо кнопки включения/выключения я сделал кнопку Reset.
В Raspberry Zero есть два контакта специального назначения. Это контакты TV/AV по которым можно выводить картинку на телевизор. И порт RUN, замыкание которого на включенном устройстве делает Reset, а на выключенном, но с поданным питанием - включает плату. Я просто подключил кнопку напрямую в двум выводам порта Run. Так что это кнопка Reset, она же включает выключенное устройство при наличии питания.
Остаётся порт TV, если у кого-то остался ЭЛТ телевизор - можно устроить полное погружение в детство подключив ещё и “мама” AV разъём к порту TV. У меня ЭЛТ телевизора нет, поэтому я не стал этим заморачиваться. Я проверил полностью собранное устройство и настроил MAX98357A по руководству. На этом закончил второй вечер сборки ретро-компьютера в клавиатуре.