Промышленное производство
Промышленный Интернет вещей | Промышленные материалы | Техническое обслуживание и ремонт оборудования | Промышленное программирование |
home  MfgRobots >> Промышленное производство >  >> Manufacturing Technology >> Производственный процесс

Arduino-читалка/записчик дискет Amiga — версия 2.2

Компоненты и материалы

Программное обеспечение

О проекте

Продолжение проекта: первая версия читалки дискет Amiga.

Подробности: amiga.robsmithdev.co.uk

Цель

Создать простое, дешёвое и открытое решение для чтения и записи данных на дискеты Amiga DD (Double Density) под Windows 10 (портируемо на другие ОС).

Почему это нужно

История разработки: 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 — ошибка контрольной суммы.

Улучшение чтения (новая методика)

Старая методика чтения была нетерпима к джиттеру импульсов. Новый подход:

Результат: 100% успешное чтение множества дискет. Минимум повторных попыток.

Попытка 5: Точная запись с верификацией

С надёжным чтением стало возможно тестировать запись. Анализ показал: сдвиг бит из-за работы с таймером и UART.

Исправление таймера: не сбрасывать счётчик, а писать биты при значениях 16, 48, 80… (Timer2 8-битный, переполнение каждые 8 бит = точно 500 кбит/с).

Оптимизирован приём байта из UART — минимальный код между битами.

Добавлена верификация в Windows-приложении. 95% треков проходят с первой попытки, остальные — со второй.

Результат: диск загрузился на реальном Amiga 500+ идеально!

Попытка 6: Защита от ранней записи бита

Обнаружено: после записи байта цикл мог начать следующий до переполнения таймера → первый бит уходил раньше времени. Добавлено ожидание переполнения таймера перед стартом следующего байта.

Попытка 7: Команда стирания трека (Track Erase)

Жалобы на ошибки контрольных сумм у некоторых пользователей. Причина: недостаточная длина записанного сигнала — остаточный магнетизм портил начало следующего трека.

Решение: перед записью трека — заполнить его паттерном 0xAA (стирание), затем писать данные. XCopy Pro показал 100% качество.

Диагностика

Добавлен диагностический режим в прошивку: проверка проводки, датчиков, двигателей, связи с ПК. Помогает новичкам выявить ошибки сборки.

Что дальше?

Исходный код

Скетч Arduino + Windows-приложение (C#):
GitHub репозиторий

Схемы подключения

Arduino-читалка/записчик дискет Amiga — версия 2.2
Подключение к Arduino Pro Mini
Arduino-читалка/записчик дискет Amiga — версия 2.2
Подключение к Arduino UNO

Производственный процесс

  1. Эволюция и мастерство анимации
  2. Эволюция дискет: от магнитных носителей к оптическим
  3. Интерактивный гироскопический LED-дисплей на NeoPixel Ring и Arduino
  4. Сборка Bluetooth-робота-шпиона на Arduino с управлением с телефона
  5. FlickMote: жестовое IR-пульт для умного дома на Arduino 101 и ультразвуковом датчике
  6. DIY Arduino TV-B-Gone: универсальный пульт для выключения любого телевизора
  7. DIY USB-геймпад на Arduino: собственный высокопроизводительный контроллер
  8. DIY-костюм «Облако»: LED-лента, Arduino Nano и детали SparkFun
  9. Создание пользовательских LED-часов с будильником — видно с 12 метров
  10. Чтение дискет Amiga на Arduino: открытое решение для восстановления данных