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



Есть у меня аналог Спекки — персональный компьютер «Мастер». Он прошел несколько модернизаций, так что сейчас работает от обычного 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]='\0';
prevSubDir[subdir-1][0]='\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://github.com/maltsevda/TZXDuino_HF

Финал

Финальный вариант "магнитофона"
Финальный вариант "магнитофона"

Каких-то доработок в железной части я не планирую. Была мысль прикрутить усилитель, по рекомендациям от официального проекта TZXDuino. Но, ни спикеру/наушникам, ни моему «Мастеру» это оказалось не нужно. Все работает хорошо и без дополнительных костылей.

Ну и пора перетаскивать весь мой запас кассет на флешку. ???? Самая тяжелая часть. Оцифровывать их я, конечно, не буду. Но, даже каталогизация и поиск нужных файлов, чувствую, займет порядочно времени…

На этом все. Надеюсь, что-нибудь из статьи вам будет полезно. И спасибо за внимание!




Комментарии (54):

  1. Soorin
    /#23752797 / +6

    Когда мне было нужно грузить программы в "Спектрум", я записал нужные программы в mp3, слил в телефон и пользовался плеером...

    • maltsevda
      /#23753003 / +1

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

      Ну и скажу честно, я не искал простых путей. Просто хотелось попаять. :)

      • blackdiamondj
        /#23753107 / +2

        А может быть такое, что телефоны/планшеты не хочет понимать по причине их усилков Д-класса с несущей в сигнале на 40кГц или как-то так?

        • YMA
          /#23753403

          Теоретически, да. Хотя в моем экземпляре спектрума на входе стоял LC-фильтр, как я понял - режущий всё выше 3 кГц. Из-за этого имел проблемы с "ускоренными" способами загрузки :(

        • drWhy
          /#23753501 / +2

          Или дело в разделительном конденсаторе, теряющем постоянную составляющую.

      • iliasam
        /#23753147 / +5

        "я не искал простых путей"
        В таком случае можно было бы сделать нечто вроде usb-осциллографа, захватить звук с телефона и компаратора Спектрума, и сравнить данные с тем, что записано в файле.
        Таким образом, можно было бы выяснить причину проблемы, и сделать либо промежуточное устройство для коррекции звука, либо написать программу для обработки звука, которая бы меняла бы его так, чтобы на выходе телефона звук был подходящий.

        Самый красноглазый путь - скорректировать программу в ПЗУ Спектрума, чтобы она адекватно возпринимала сигнал с телефона)

        • VelocidadAbsurda
          /#23753369 / +1

          Самый красноглазый путь

          А как быть кастомными загрузчиками?

      • mistergrim
        /#23754543

        Я сварщик ненастоящий, маску нашёл. Но, насколько я помню, советские спектрумы очень нервно относились к высокой мощности сигнала (с импортных магнитофонов крайне сложно было их загружать, с выхода на наушники). Так что то, что вы усилитель не прикрутили, возможно, очень правильно.

        • maltsevda
          /#23754559

          Да, вполне возможно. Так как для тестирования у меня только одна железка, то и ориентировался я только на нее.

    • taras-spb
      /#23764229 / +1

      Сейчас уже есть решения, позволяющие вообще не тратить время на загрузку программ на Спектрум. Поищите по слову divmmc - можно самому спаять или купить готовый через известные "барахольные" площадки. Но если цель ностальгировать на полоски на бордюре, или погрузиться в звуки шума и каждый раз на 3-7 минут слушать пилот-тоны и весь этот цифровой поток сознания, то конечно же tzx-druino вам лучший помощник. :)

  2. k12th
    /#23753255 / +1

    Следующий шаг — встроить это все в корпус собственно компьютера. Или питания не хватит?

    • maltsevda
      /#23753373 / +1

      Места в корпусе не хватит, да и портить я его не хочу. Конечно можно сделать компактное устройство (у меня даже прототип был меньше), но мне очень нравятся эти большие кликающие кнопки и здоровенный дисплей. :) В выключенном виде - это отличная антистресс игрушка.

      • k12th
        /#23753391

        Да, насчет корпуса понимаю.

  3. vesper-bot
    /#23753311 / +1

    Отдельный плюс за вывод на скрипер. Некоторые треки имели любопытно звучащие сегменты.

  4. amarao
    /#23753455

    Хардкорная версия должна включать в себя микрофон с усилителем. Тогда его можно будет грузить просто включив на телефоне воспроизведение ZX-трека. Хардкор, фан, шипение и пилот-тоны в наших сердцах!

  5. HardWrMan
    /#23753935

    Есть один нюанс: это плеер а не магнитофон. :) А ведь существуют именно магнитофоны.

  6. da-nie
    /#23754299 / +4

    Интересную тенденцию с некоторых пор замечаю: «Я нашёл проект, развёл свою плату (а не ту, что была) и поменял какую-то ерунду. И всё, я сделал устройство.» Но нет ни слова о том, как именно работает это устройство. Эта магия осталась у того, кто сделал оригинальный проект. :)

    • maltsevda
      /#23754329 / -1

      Магия соединить ардуину, ридер, дисплей и пару кнопок? Хм... Ну а если про софт, то всегда можно сравнить с оригиналом и на сколько изменения пошли ему на пользу или вред.

      • da-nie
        /#23754385 / +6

        Вы поняли, как генерируется сигнал для ZX? Что там вообще за сигнал? Как сделано чтение с SD-карты, чтобы не происходило задержек? :) Ничего этого нет.

        • maltsevda
          /#23754427 / -4

          Загляните в исходники, изучите код. И напишите мне, понял ли я как генерируется сигнал, что это вообще за сигнал и как я переписал код для SD карты, чтобы не происходило задержек. И все это будет.

          • da-nie
            /#23754479 / +8

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

            • maltsevda
              /#23754511 / -5

              Почему вы к себе в множественном числе обращаетесь? :) Оригинально. Все эти действия я предложил сделать вам и только вам.

              • da-nie
                /#23754583 / +2

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

                • Sdima1357
                  /#23755051 / +8

                  Картинки с платками вызывают на Хабре больше интереса чем длинное описание возни со спецификациями форматов. Поэтому действительно красивые проекты с Хабра исчезают вместе с их авторами :(. Остаются светодиодики на ардуине с небольшими вариациями. Так что на общем фоне это ещё достойная статья. Человек хоть что то сделал сам.

            • ZaitsXL
              /#23758827 / +2

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

              • da-nie
                /#23759017 / +1

                Автор в данном случае банальный посредник, не потрудившийся даже познакомить читателей с техническим ядром взятого им не своего устройства, но расписавшим свои приключения на ниве внесения косметических изменений. И именно отсутствие самого главного в статье и вызывает удивление её поверхностностью — читатель ничего действительно интересного не узнает из статьи. Нет ядра. Нет сущности. Нет идеи. Остался лишь фасад.

                • ZaitsXL
                  /#23759135

                  Это статья-руководство как изготовить конечное устройство на базе существующего проекта. И я не вижу смысла в каждой статье скажем про Ардуино подробно описывать архитектуру оного, если это не связано непосредственно с темой статьи, это ненужная "вода" которая отвлекает от сути

                  • da-nie
                    /#23759201

                    Это статья лишь бы что-то написать с низким техническим уровнем. Потому что вся статья не о том, как изготовить (берём 1, соединяем с 2 и т.д.), а поток сознания, как автор героически преодолевал свои проблемы. Чтобы изготовить такую штуку достаточно взять оригинальный проект и всё.

                    • ZaitsXL
                      /#23760357

                      Разные есть статьи на разный технический уровень, и это прекрасно

    • leonidy85
      /#23761553

      Не смог пройти мимо, с ардуино знаком достаточно средненько, не совсем мой профиль, но глядя на фото готового устройства могу с точностью от 80 процентов сказать что там в софте, набор готовых библиотек, точнее драйвер fat, драйвер экрана, простенькая менюшка с парой if и что то типо плеера через встроенный цап.

      • da-nie
        /#23763743

        что то типо плеера через встроенный цап.


        В том-то и дело, что нет там плейера с ЦАП. :) Там довольно простая штука, но сделано это должно быть совершенно не так (говорю как автор, наверное, одной из первых, если вообще не первой подобной игрушки года эдак 2012-2013 (я уже сам забыл, когда)). И одной библиотекой fat там не обойдёшься — там требуется обеспечивать чтение без задержек (у меня для резерва повышения скорости до 4x, 16x и так далее, а так же чтобы проще всего написать ПО использовалась микросхема памяти на 64 К).

  7. axe_chita
    /#23754407

    Астрологи объявили на Хабре неделю DIY, и это хорошо.
    Кстати, а функционал записи программ/данных с компьютера на убер-девайс не планировали сделать?

    • maltsevda
      /#23754487

      Нет, в оригинальной версии прошивки такого функционала не было. А мне лезть внутрь TZX формата очень не хочется. Я и саму прошивку изначально не планировал править.

      Ну а если понадобится что-то сохранить с ZX, то для такого дела не грех развернуть и ноутбук.

  8. vvbob
    /#23754643

    У меня был магнитофон Союз, там была функция поиска следующей песни, нажимаешь и он ищет следующий фрагмент без записи, после чего включалось проигрывание. Искал в обе стороны. И вот я тогда мечтал по аналогии сделать убердевайс, в котором выбираешь номер программки на кассете, а он бы сам подматывал пленку в нужное место и включал проигрывание. Еще больше мечтал о дисководе, но денег у меня было мало, и купить его в нашем городе было сложно. Впрочем и этот супермагнитофон я не сделал, как-то быстро закончилась школа и началась армия, стало немного не до Спектрума. А когда вернулся, уже были другие игрушки.

    А сейчас вот пилят похожие по функционалу устройства, с процессором мощнее чем весь этот Спектрум :)

    • maltsevda
      /#23754679 / +1

      Я впервые увидел такое устройство на этом канале и очень был удивлен:

      https://youtu.be/M70AeNOIzMw

      А когда Мастер был моим основным компьютером, то даже представить не мог существование такой техники. :)

      • vvbob
        /#23755171

        Круто, прямо то о чем я тогда мечтал! Тоже не слышал даже о таком компьютере, интересная штука!

        Хотя, конечно, дисковод все равно был удобнее.

        После армии получил доступ к 486-му и тут уж Спектрум как-то совсем перестал привлекать, хотя до сих пор вспоминаю с ностальгией.

  9. tsvetkovpa
    /#23754891

    А нельзя ли подпаяться к RAM и грузить код прямо в память, минуя аудио модуляцию?

    • vvbob
      /#23755205 / +3

      Так смысл то тут не в удобстве, а в теплоте и ламповости.

      Если нужно удобство, то проще в эмуляторе играться.

  10. endrx
    /#23756493

    Ещё "мягкий" вариант: Андроид приложение, генерирующее нужные звуки по файлам TZX, TAP, ...

    https://baltazarstudios.com/playzx/

    • alextrof94
      /#23758471

      Эммм. Зачем писать комментарий под статьёй, которую не прочитал? Не работают у автора приложухи.

  11. jogick
    /#23758059

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

    Сам по себе VSCode почти ничего не умеет, но настроить его на программирование Arduino - несложная задача.

    Язык программирования у Arduino — это С++, но система сборки своя, избавляющая новичков от некоторых “неприятных” особенностей языка.

    По факту там avr-gcc, из особенностей, только свой дополнительный набор библиотек. Makefile, похоже, генерится автоматом, но это не точно. Всё это, при минимальном желании, можно подключить и писать программы хоть vi, хоть в sublime, хоть ещё в чём.

    • alextrof94
      /#23758477

      Думаю, автор работает под плагином PlatformIO IDE (или хуже - arduino IDE), и разбираться, что там как, не будет.

      Я и сам под платформио работаю, в миллион раз удобнее, чем под оригинальным блокнотом работать, который они гордо называют Arduino IDE.

  12. alextrof94
    /#23758465

    Цена всего этого дела уже полгода точно дороже шаурмы, не надо обманывать.

    Да и загрузчик китайцы новый юзают на нанках.

    • maltsevda
      /#23758835

      Да, вы правы. Закупался я года полтора назад, и с учётом текущей ситуации с полупроводниками цены могли неприятно измениться.

  13. MexVitas
    /#23760277

    А вместо перемычек (MISO, MOSI и SCK) поставить резисторы 10к не судьба?

    • Sdima1357
      /#23760461 / +1

      Не надо. Там на адапторе карточки стоит микросхема согласования уровней. Впрочем я бы там одну stm-ку поставил бы вместо ардуины и согласователя уровней . И дисплей другой. И вообще бы весь спектрум на одной STM-ке. Вместе с магнитофоном :)

  14. Kabron287
    /#23768011

    Есть же TRDOS

    • HardWrMan
      /#23768513 / +1

      Есть. А ещё есть игры с красивой загрузкой, вроде Locomotion:

      Это особый вид искусства.

  15. ChinChilla
    /#23768635 / +3

    Нет, серьезно? Вы сделали плату для впаивания платы?

    Но зачем впаивать плату в плату (я имею в виду нано - хоть и нано, но это таки прототипка!) Почему не развелись просто атмегой? Зачем эти куски текстолита на текстолите?...

    Ну ладно.... Но, тысяча чертей, где обещанные преферанс и куртизанки???

  16. Tuvic
    /#23773565

    А где-то есть оригинальная схема, которая с 5-ю кнопками, что то не могу найти