«Магнитофон» для ZX Spectrum на базе Arduino

в 11:00, , рубрики: arduino, c++, diy или сделай сам, speccy, zx spectrum, Железо, периферия, Разработка под Arduino, ретро, С++, спектрум, старое железо

Есть у меня аналог Спекки — персональный компьютер «Мастер». Он прошел несколько модернизаций, так что сейчас работает от обычного USB и с любым телевизором по SCART.

Аутентичный вариант с ковром и одним из "работающих" планшетов.
Аутентичный вариант с ковром и одним из "работающих" планшетов.

Но вот с загрузкой программ есть небольшие сложности. Магнитофона у меня уже нет (зато кассеты остались и зачем храню?). Ноут для этих целей разворачивать лениво. Удобного софта для телефонов не нашел, да и по какой-то причине Мастер не воспринимает мой телефон и один из планшетов. Я склоняюсь к тому, что какие-то «улучшалки» звука сигнал портят. В общем, хочется чего-то серьезного. На века. Залить всю библиотеку софта и игр, положить на полочку и не бояться, что лет через 10 это дело протухнет.

На просторах интернета ходит такой проект как TZXDuino, в самых разнообразных вариациях. Но суть у него одна: к ардуинке подключается дисплей, кард-ридер и несколько кнопок, а сигнал выводится с 9-го пина сразу в Спектрум или на простенький усилитель.

Прототип

Вот и я решил сварганить нечто подобное, но с преферансом и куртизанками. В качестве сердца выступает китайский аналог Arduino Nano. Дисплеем будет обычный LCD1602 без I2C модуля. Для карточки использовал MicroSD Card Adapter (на самом деле полный ноунейм) от товарищей из поднебесной. Плюс россыпь резюков и кнопок. Цена всего этого дела не превышает похода в шаурмячную.

Схема прототипа из Easy IDA
Схема прототипа из Easy IDA

Для начала подготовил схему в Easy IDA. Ничего экстраординарного: сверяемся с распиновкой элементов, смотрим кто и какой протокол использует, убеждаемся, что всем всего хватает. Для перестраховки перепроверил по отдельности каждый элемент на макетной плате (той которая без пайки). И начал разводить дорожки.

Разводка дорожек и общий макет расположения элементов
Разводка дорожек и общий макет расположения элементов

Пока нет отлаженного софта, решил ограничится макетной платой 8х5 сантиметров. На ней распаять все элементы и проводить тесты. Так как соединяем все проводами, то особого смысла в разводке на два слоя нет. Просто визуальное разграничение пересечений проводов. Ну и элементы постарался расположить так, чтобы не создавать себе лишних проблем при пайке. Результат получился страшненьким, но вполне реализуемым.

Фронтальная часть красивая
Фронтальная часть красивая
Все макароны скопились на нижней части макетки
Все макароны скопились на нижней части макетки

На удивление больше всего проблем при пайке создали кнопки. В первый раз я неправильно нарисовал схему. А во второй раз неправильно их распаял. Но ничего не спалил и не взорвал, так что работу можно считать выполненной на отлично. 😁

Софт

Первым делом нужно было обновить ядро, так как на свои клоны Nano китайцы ставят старый загрузчик. Я протестировал этот процесс на «чистой» плате, все прошло успешно. Попробовал накатить на ардуинку из прототипа и... ничего не получилось. Домучал ее до такого состояния, что она на всё перестала реагировать.

Причина предсмертного состояния ардуинки
Причина предсмертного состояния ардуинки

Оказалось, что пины для подключения программатора (я обвел их оранжевым) дублируются и на основной гребенке. И так получилось, что на этих пинах висела и SD карточка. Пришлось отпаивать контакты обведенные красненьким, прошивать новое ядро и припаивать контакты заново. Урок мне на будущее: все программируемые части макетных плат должны быть в «кроватках», для удобного извлечения и замены.

Я было расстроился, что не смогу работать через программатор (это существенно ускоряет заливку скетчей в ардуинку), но, как оказалось, VSCode тоже не умеет с ним работать (никак баг не починят). Так что по итогу, я не так много и потерял.

Теперь о софте. План был простой и приятный: ищу прошивку, правлю в ней пару моментов под себя, прошиваю и радуюсь жизни. А теперь о том, как все получилось в реальности.

Прошивок для подобных проектов несколько: классический TZXDuino, MAXDuino, ArduiTape, CASDuino и т.п. Вот тут человек посвятил им целый блог:

http://arduitape.blogspot.com/

Я решил остановиться на классическом варианте. Очевидно, что без исправлений не обойдется: у меня четыре кнопки, у них пятикнопочное управление. Но я же у мамы программист, что может пойти не так? 😁

Беспокоиться я начал, когда увидел, что об обновлениях ребята пишут на фейсбуке, а скачивать исходники предлагают с mega.nz. А когда открыл архив, передо мной разверзлась настоящая бездна ада и я понял, что застрял всерьез и надолго. Просто для примера, кнопка Stop умеет переходить в родительскую папку (правда, максимальный уровень вложенности равен трем) и выглядит этот код так:

fileName[0]='';
prevSubDir[subdir-1][0]='';
subdir--;
switch(subdir){
case 1:
   //sprintf(fileName,"%s%s",prevSubDir[0],prevSubDir[1]);
   sd.chdir(strcat(strcat(fileName,"/"),prevSubDir[0]),true);
   break;
case 2:
   //sprintf(fileName,"%s%s/%s",prevSubDir[0],prevSubDir[1],prevSubDir[2]);
   sd.chdir(strcat(strcat(strcat(strcat(fileName,"/"),prevSubDir[0]),"/"),prevSubDir[1]),true);
   break;
case 3:
   //sprintf(fileName,"%s%s/%s/%s",prevSubDir[0],prevSubDir[1],prevSubDir[2],prevSubDir[3]);
  sd.chdir(strcat(strcat(strcat(strcat(strcat(strcat(fileName,"/"),prevSubDir[0]),"/"),prevSubDir[1]),"/"),prevSubDir[2]),true);
   break;
default:
   //sprintf(fileName,"%s",prevSubDir[0]);
   sd.chdir("/",true);
}

Кстати, пятая кнопка Root была введена именно из-за того, что ранее этого кода не было. 

В итоге, я вычистил все, что хардварно не поддерживается: кнопку Root и пару видов дисплеев. Язык программирования у Arduino — это С++, но система сборки своя, избавляющая новичков от некоторых “неприятных” особенностей языка. Я все перевел на нормальный С++, структурировал и разбил код на логические блоки. Переписал всю логику меню, работу с дисплеем, с SD картой и т.п. Обработчик кнопок взял у AlexGyver Technologies, кстати настоятельно рекомендую ознакомиться с его творчеством на YouTube.

На текущий момент, по софту осталась мелочевка. Я решил, что код для работы с форматом TZX исправлять не буду, так как нет ни желания, ни железа, ни тестовых данных, чтобы все нормально написать и протестить. Поэтому, из глобального остались только настройки для проигрывателя и немного рефакторинга/чистки.

Релиз

Схема в KiCad
Схема в KiCad

Плату для финального варианта я начал разводить в KiCad, так как он мне показался удобнее, чем онлайн программа Easy IDA. Что изменилось по сравнению со старой макетной платой? Во-первых, я сделал два выхода: один на компьютер, а другой, опциональный, на спикер. Во-вторых, перешел от PULL DOWN подтяжки кнопок, к PULL UP подтяжке, встроенной в ардуинку. Тем самым избавился от четырех резюков. Ну и в-третьих, изменилась распиновка, хотя это произошло уже в момент разводки дорожек платы.

Скажу честно, несмотря на минимум различий, работа заняла много времени. Причем я в основном боролся с редактором. Ну да не будем жаловаться на бесплатные программы. 😉

Разводка дорожек для финального варианта
Разводка дорожек для финального варианта

Так как от лазерно-утюжной технологии решил сразу отказаться и делать заказ у тов. из поднебесной, то плату проектировал двухслойной. На верхнем слое все дорожки для "перегонки данных" — они красного цвета. Нижняя часть отвечает за "питание" — зеленые дорожки +5V, а вся остальная поверхность залита землей.

Модули ардуинки и LCD1602 были в библиотеке KiCad, со всеми размерами, распиновкой и т.п. Модуль механической кнопки пришлось искать на просторах интернета. А вот модулей SD-карточки и 3,5 мм джека я не нашел и пришлось разводить их самостоятельно. Ничего сложного, просто, очень много работы с линейкой.

По мелочам естественно перерабатывал все и не раз. Но глобальных изменений в плате практически не было. Из самого интересного могу отметить разве что «систему питания», да вспомнил про перепрошивку ардуинки и добавил на плату перемычки (MISO, MOSI и SCK).

Фронтальный рендер платы
Фронтальный рендер платы
Рендер оборотной части платы
Рендер оборотной части платы
Плата с расположенными на ней модулями
Плата с расположенными на ней модулями

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

Все подошло идеально и я отправил заказ в JLCPCB. Размеры моей платы меньше 10х10 сантиметров и она в два слоя. Попал по всем параметрам в их акцию — заказ на 5 штук мне обошелся в джва бакса! Правда, доставка вышла в семь с мелочью, но кто это считает? 😁 А через месяц пришла посылка с платками в коммунистической раскраске:

Пятая платка уже собрана и не попала на групповой снимок
Пятая платка уже собрана и не попала на групповой снимок

Пайка никаких проблем не доставила, сплошное удовольствие. Отмыл, залил прошивку, вставил флешку, включил и все завелось с первого раза! С одной стороны было очень приятно, а с другой грустновато — все самое интересное закончилось.

Ссылки

Ссылка на «железную» часть проекта для программы KiCad. Если не хотите париться с этим софтом, то в Release'ах репозитория лежит готовый к отправке архив с gerber-файлами. Он точно подходит для JLCPCB, но скорее всего подойдет и для других производителей. Чуть позднее приведу описание репозитория в порядок: дам ссылки на необходимые модули, рекомендации и т.п.

https://github.com/maltsevda/TZXDuino_HFHW

А это ссылка на мою прошивку. Так как заливать ее надо через IDE от Arduino, то поставляется только в виде исходных кодов. Зависимости: TimerOne (версия 1.1.0 или новее) и SdFat (версия 1.1.4, версия 2.Х.Х не поддерживается!).

Автор: Денис

Источник


* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js