Arduino-читалка/записчик дискет Amiga — версия 2.2
Компоненты и материалы
- Arduino UNO — 1 шт.
- Arduino Pro Mini 328 (5V/16MHz) — 1 шт.
- Резистор 1 кОм — 1 шт.
- Беспаяльная макетная плата — 1 шт.
- Провода-перемычки — 1 комплект
- FTDI Basic Breakout 5V — 1 шт.
Программное обеспечение
- Arduino IDE
О проекте
Продолжение проекта: первая версия читалки дискет Amiga.
Подробности: amiga.robsmithdev.co.uk
Цель
Создать простое, дешёвое и открытое решение для чтения и записи данных на дискеты Amiga DD (Double Density) под Windows 10 (портируемо на другие ОС).
Почему это нужно
- Сохранение данных с старых дискет для будущих поколений.
- Обычный ПК не может читать/писать дискеты Amiga из-за особенностей формата записи (MFM, уникальная структура секторов).
История разработки: 7 попыток записи
Попытка 1: Программный контроль потока
После успешного чтения дисков, автор решил реализовать запись. Проблема: трек в формате AmigaDOS после MFM-кодирования занимает 14 848 байт, что не помещается в ОЗУ Arduino (2 КБ) ни в EEPROM (1 КБ).
Решение: передача данных побайтово из ПК с подтверждением (ACK). Скорость 2 Мбод → 5.5 мкс на байт. Arduino должен выдавать бит каждые 16 мкс (500 кГц). Казалось — достаточно времени.
Результат: полный провал. ОС (Windows) не успевала реагировать на подтверждения, данные терялись. Чтение работало за счет буферизации входящего потока, но запись требовала жёсткой синхронизации.
Попытка 2: Аппаратный контроль потока (CTS/DTR)
Использованы линии CTS (Clear To Send) и DTR на FTDI-плате. Arduino управляет CTS: «0» — можно слать, «1» — стоп. ПК отправляет блок данных целиком, управление на уровне ядра.
Цикл выдачи бита «развёрнут» в 8 последовательных команд для точности таймингов.
Результат: без записи на диск — байты приходят идеально. С записью — теряются байты. Вероятно, изменение CTS не останавливает передачу мгновенно — следующий байт уже в пути.
Попытка 3: Перехват «лишнего» байта в цикле
Между выдачей бит проверялся входной буфер UART. Идея: когда поднимается CTS, ПК уже передаёт следующий байт — его нужно перехватить и использовать в следующем цикле.
Результат: данные передались без потерь. Но при чтении записанного — ничего не обнаружилось. Голова не перемещалась при записи.
Причина: для перемещения головы нужно поднять сигнал /WRITE_GATE в HIGH. Добавлено управление этим сигналом — голова начала двигаться.
Но чтение всё равно не работало: либо данные записаны неверно, либо процесс записи некорректен. Проверка через декодер MFM показала — генерируемые данные верны. Значит, ошибка в «железе» записи.
Попытка 4: Осциллограф и поиск таймингов
Проверка сигнала /WRITE_DATA: импульсы, переключение, установка уровня — ничто не работало. Автор записал постоянный паттерн 0xAA (10101010) — идеальная меандра на осциллографе.
В режиме x10 («mag») обнаружилось: каждые ~12 бит появляется пауза (линия в HIGH). 12 бит — странное число для 8-битных байт.
Причина: несовершенный цикл ожидания байта. После приёма второго байта Arduino дергал CTS, но следующий байт уже уходил от ПК.
Исправление: после использования второго байта — кратковременно опускать и поднимать CTS, чтобы следующий байт уже ждал в буфере.
Результат: идеальная меандра без пауз. Но запись всё равно не читалась на Amiga — ошибка контрольной суммы.
Улучшение чтения (новая методика)
Старая методика чтения была нетерпима к джиттеру импульсов. Новый подход:
- Синхронизация по импульсу
/INDEX(метка начала трека). - Свободно бегущий счётчик (0–255), защёлкиваемый по фронту импульса от головки чтения.
- Минимальный интервал: 32 отсчёта (2 мкс), максимальный: 128 (три нуля подряд в MFM).
- Формула:
value = (COUNTER - 16) / 32, обрезаем к 0–3. - Декодирование: 00 — невозможно, 01 → «01», 10 → «001», 11 → «0001».
Результат: 100% успешное чтение множества дискет. Минимум повторных попыток.
Попытка 5: Точная запись с верификацией
С надёжным чтением стало возможно тестировать запись. Анализ показал: сдвиг бит из-за работы с таймером и UART.
Исправление таймера: не сбрасывать счётчик, а писать биты при значениях 16, 48, 80… (Timer2 8-битный, переполнение каждые 8 бит = точно 500 кбит/с).
Оптимизирован приём байта из UART — минимальный код между битами.
Добавлена верификация в Windows-приложении. 95% треков проходят с первой попытки, остальные — со второй.
Результат: диск загрузился на реальном Amiga 500+ идеально!
Попытка 6: Защита от ранней записи бита
Обнаружено: после записи байта цикл мог начать следующий до переполнения таймера → первый бит уходил раньше времени. Добавлено ожидание переполнения таймера перед стартом следующего байта.
Попытка 7: Команда стирания трека (Track Erase)
Жалобы на ошибки контрольных сумм у некоторых пользователей. Причина: недостаточная длина записанного сигнала — остаточный магнетизм портил начало следующего трека.
Решение: перед записью трека — заполнить его паттерном 0xAA (стирание), затем писать данные. XCopy Pro показал 100% качество.
Диагностика
Добавлен диагностический режим в прошивку: проверка проводки, датчиков, двигателей, связи с ПК. Помогает новичкам выявить ошибки сборки.
Что дальше?
- Проект открыт под GPL v3 — свободное использование и развитие.
- Порт на Arduino UNO с буфером 23K256 (SPI SRAM) для записи без отдельного FTDI.
- Поддержка формата FDI (универсальный, документированный, близкий к «сырым» данным трека) вместо ограниченного ADF.
- Изучение IPF (CAPS/SPS) — но формат закрыт, ориентирован на коммерческое железо.
Исходный код
Скетч Arduino + Windows-приложение (C#):
GitHub репозиторий
Схемы подключения
Производственный процесс
- Эволюция и мастерство анимации
- Эволюция дискет: от магнитных носителей к оптическим
- Интерактивный гироскопический LED-дисплей на NeoPixel Ring и Arduino
- Сборка Bluetooth-робота-шпиона на Arduino с управлением с телефона
- FlickMote: жестовое IR-пульт для умного дома на Arduino 101 и ультразвуковом датчике
- DIY Arduino TV-B-Gone: универсальный пульт для выключения любого телевизора
- DIY USB-геймпад на Arduino: собственный высокопроизводительный контроллер
- DIY-костюм «Облако»: LED-лента, Arduino Nano и детали SparkFun
- Создание пользовательских LED-часов с будильником — видно с 12 метров
- Чтение дискет Amiga на Arduino: открытое решение для восстановления данных