Чтение дискет Amiga на Arduino: открытое решение для восстановления данных
Необходимые компоненты
- Arduino UNO (или Pro Mini) — 1 шт.
- Флоппи-привод (3,5", из старого ПК) — 1 шт.
- IDE-кабель флоппи-привода — 1 шт.
- Платы для прототипирования (breadboard) — 1 шт.
- Перемычки — набор
- Резистор 1 кОм — 1 шт.
- Модуль питания для breadboard (5V/3.3V) — 1 шт.
- FTDI-адаптер (USB-UART) — 1 шт. (для высокоскоростной передачи данных)
Программное обеспечение
- Arduino IDE
- Windows-приложение для приёма и декодирования данных (исходный код на GitHub)
О проекте
Автор проекта Роб Смит (Rob Smith) создал дешёвое open-source решение для чтения дискет формата Amiga (DD, 880 КБ) на современном ПК. Коммерческие контроллеры вроде KryoFlux или Catweasel стоят дорого и часто закрыты, а стандартные ПК-флоппи-контроллеры не умеют читать специфическую запись Amiga (MFM, 11 секторов на дорожку, 512 байт/сектор, 300 об/мин).
Идея и подход
Arduino (ATmega328, 16 МГц) напрямую подключается к интерфейсу флоппи-привода. Главная сложность — частота данных 500 кГц (битовой поток MFM). Стандартные прерывания и digitalRead слишком медленны. Решение: использовать аппаратный таймер/счётчик ATmega328 для подсчёта импульсов от привода и программную фазовую автоподстройку частоты (PLL) для синхронизации с дрифтом скорости вращения диска.
Эволюция решения (кратко)
- Попытка 1: Два сдвиговых регистра 74HC594 для параллельного захвата 8 бит при 62,5 кГц. Не сработало — данные невалидны.
- Попытка 2: Прерывание (ISR) на каждом импульсе. Накладные расходы ISR + медленный
digitalReadпривели к потере тактов. - Попытка 3: Аппаратный счётчик Timer0 считает импульсы, Timer2 генерирует окно 2 мкс. Появились синхронизационные ошибки из-за нестабильной скорости диска.
- Попытка 4: Программная PLL: сброс счётчика Timer2 при каждом импульсе (фазовая коррекция). Данные стали читаться, но с ошибками контрольных сумм.
- Попытка 5: Перенос фазовой коррекции в «голое» прерывание (ISR_NAKED) на пине INT0. Минимизированы такты: всего 5 инструкций (0,3125 мкс). Качество чтения значительно выросло.
- Попытка 6: Добавлен триггер Шмитта (74HCT14) и подтяжка 1 кОм — заметного улучшения нет.
- Попытка 7: Проверка правил MFM-кодирования (не может быть двух «1» подряд, не более трёх «0» подряд) для исправления ошибок.
Декодирование MFM и формирование ADF
- Сырые импульсы от привода — это уже MFM-данные (переходы фазы).
- Поиск синхро-слова
0x44894489(или0x2AAAAAAA44894489с маской) — начало сектора. - Чтение заголовка и данных сектора, проверка CRC.
- Повторное чтение той же дорожки до получения 11 валидных секторов.
- Запись 512 байт × 11 секторов × 2 стороны × 80 дорожек = 901 120 байт в файл .ADF (Amiga Disk File).
Перспективы (V2 и дальше)
- V2 уже доступна: улучшенное чтение и поддержка записи.
- Планируется поддержка формата FDI (универсальный, документированный) для дисков с нестандартной защитой от копирования.
- Весь проект под GPL v3: GitHub репозиторий.
Ссылки
- Сайт проекта: amiga.robsmithdev.co.uk
- GitHub: ArduinoFloppyDiskReader
Производственный процесс
- Эволюция и мастерство анимации
- Эволюция дискет: от магнитных носителей к оптическим
- Сборка Bluetooth-робота-шпиона на Arduino с управлением с телефона
- FlickMote: жестовое IR-пульт для умного дома на Arduino 101 и ультразвуковом датчике
- DIY Arduino TV-B-Gone: универсальный пульт для выключения любого телевизора
- Создание пользовательских LED-часов с будильником — видно с 12 метров
- Find Me: Умный поисковик вещей на Arduino и Bluetooth
- Оптимизированные решения питания для проектов на Arduino
- Крестики-нолики на Arduino с матрицей MAX7219 и картонным корпусом
- Чтение дискет Amiga на Arduino: открытое решение для восстановления данных