Lector/escritor de disquetes Amiga con Arduino – Versión 2.2
Componentes y materiales
| Arduino UNO | ×1 |
| Arduino Pro Mini 328 - 5V/16MHz | ×1 |
| Resistencia 1 kΩ | ×1 |
| Protoboard | ×1 |
| Cables jumpers | ×1 |
| Conversor FTDI Basic 5V | ×1 |
Aplicaciones y servicios online
- Arduino IDE
Sobre el proyecto
Continuación del proyecto anterior: Lector de discos Amiga v1
Más información: amiga.robsmithdev.co.uk
- Objetivo: Crear una forma sencilla, barata y open-source para recuperar y reescribir datos de disquetes Amiga DD (doble densidad) desde Windows 10.
- Solución: Sketch de Arduino + aplicación Windows (portable a otros SO) que funciona realmente.
- Por qué: Preservar datos para el futuro. Un PC estándar no puede leer/escribir discos Amiga por su codificación MFM propietaria.
Escritura de datos – Intento 1
Tras lograr la lectura, quise implementar escritura. Empecé por el software: convertir archivos ADF (imagen de disco Amiga) a datos MFM codificados. Añadí clases para leer ADF y codificar sectores por pista. Mientras, reparé mi Amiga 500+ (batería filtrada, limpieza, Retr0brite, resoldado conector de alimentación).
El problema: una pista Amiga codificada en MFM ocupa ~14.848 bytes, imposible de guardar en la RAM (2 KB) o EEPROM (1 KB) del Arduino. Intenté envío byte a byte con handshake software a 2 Mbaud, pero el SO (Windows) no respondía lo suficientemente rápido y se perdían datos.
Intento 2: Control de flujo por hardware
Usé las líneas CTS/DTR del conversor FTDI. Conecté CTS a GND desde Arduino para controlar el flujo: CTS=0 (enviar datos), CTS=1 (pausa). Esto permitió envío en bloque a nivel kernel, pero aún se perdían bytes al activar la escritura real en el disco.
Intento 3: Captura de byte extra en el bucle
Entre cada bit escrito (500 kHz → 16 µs/bit), la CPU tiene ciclos libres. Decidí comprobar si llegaba un byte extra tras subir CTS y almacenarlo. Funcionó: no se perdieron datos. Pero el cabezal no se movía al escribir. Descubrí que hay que subir /WRITE_GATE antes de mover el cabezal. Al corregirlo, el cabezal se movió, pero al leer el disco escrito... ¡nada detectable!
Intento 4: Análisis con osciloscopio
Escribí patrón 0xAA (onda cuadrada perfecta) y medí con osciloscopio. Los tiempos eran correctos, pero cada ~12 bits aparecía un nivel alto sostenido. Sospeché nuevo problema de control de flujo: el bucle esperaba bytes y al subir CTS ya se había enviado otro. Solución: tras usar el segundo byte recibido, bajar y subir CTS momentáneamente para permitir el siguiente byte antes** de necesitarlo. Resultado: onda cuadrada perfecta.

Pero al escribir datos reales, solo grababa en una cara del disco. Resultó que /WRITE_GATE activaba el cabezal de borrado si se mantenía bajo. Lo cambié: solo activo durante el bucle de escritura real. ¡Ahora grababa en ambas caras!
Probé con imagen ADF real: ¡funcionó! Pero la lectura era lenta y costaba encontrar sectores. Lo probé en el Amiga 500+ reparado: arrancaba pero daba checksum error. Escribía algo válido, pero no consistente.
Mejora de la lectura
La lectura original no toleraba variaciones en el tiempo entre pulsos. Nueva estrategia:
- Sincronizar con pulso
/INDEX. - Contador libre (0-255) mediendo tiempo entre pulsos de flujo.
- MFM permite máx. tres ceros seguidos → valores entre 32 (2 µs) y 128 (8 µs).
- Fórmula:
value = (CONTADOR - 16) / 32recortado a 0-3. - Decodificación: 01→'01', 10→'001', 11→'0001' (00 imposible en MFM).
Resultado: lectura 100% fiable en todos los discos probados. Ya no hacía falta análisis de fase ni reintentos masivos.
Intento 5: Escritura con verificación
Con lectura fiable, probé escribir 0x55 y leer: a veces bits desplazados → problema de temporización. Cambié la gestión del timer: en lugar de resetearlo, escribo bits en valores acumulados (16, 48, 80...). Timer2 de 8 bits desborda cada 8 bits → sincronía perfecta a 500 kbps. Optimicé lectura serie entre bits. Añadí verificación en software Windows: 95% pistas OK a la primera, 5% reescritas una vez. ¡Disco funcionando perfecto en Amiga real!
Intento 6: Corrección de desbordamiento de byte
Reportes de errores de checksum en Amiga aunque el software los leyera bien. Posible causa: tras escribir un byte completo, el bucle podía reiniciar antes del desbordamiento del timer, adelantando el primer bit del siguiente byte. Añadí pequeño bucle de espera para evitarlo.
Intento 7: Borrado de pista previo
Muchos reportes de errores de checksum (códigos 4 y 6 en XCopy Pro: cabecera y datos). Reducí padding post-pista de 256 a 8 bytes → ¡montones de errores en verificación! El problema: **no escribía suficiente datos**. Añadí comando Track Erase: escribe 0xAA en toda la pista antes de escribir los datos reales. Resultado: XCopy Pro da 100% OK.
Diagnóstico
Módulo de diagnóstico integrado con comandos extra y secuencia de pruebas para verificar cableado y funcionamiento.
¿Qué sigue?
- Proyecto completo GPL v3. Código abierto para preservar el legado Amiga.
- Adaptar escritura a Arduino UNO (requiere buffer externo como 23K256).
- Soporte formato FDI (universal, documentado, almacena datos cerca del original) para discos con protecciones/no estándar.
- Evitar formato IPF (Software Preservation Society) por ser cerrado y comercial.
Código
Sketch Arduino + Aplicación Windows: GitHub Repository
Esquemáticos
Circuito para Arduino Pro Mini: 
Circuito para Arduino UNO: 
Proceso de manufactura
- La Evolución y Oficio de la Animación
- La Evolución de los Discos Flexibles: De Medios Magnéticos a Almacenamiento Óptico
- Pantalla LED Interactiva con Giroscopio, Anillo NeoPixel y Arduino
- Construye un Spybot controlado por Bluetooth con Arduino
- FlickMote: Mando IR por gestos para Smart Home
- TV‑B‑Gone DIY con Arduino: Mando universal para apagar cualquier TV
- Mando USB para juegos DIY con Arduino – Construye tu propio gamepad de alto rendimiento
- Disfraz de nube DIY: Tira LED, Arduino Nano y componentes SparkFun
- Construye un Reloj Maestro LED Personalizado con Alarma – Visible desde 12 Metros
- Pixie: Reloj de pulsera NeoPixel basado en Arduino – Elegante reloj LED DIY
- Lector de Discos Flexibles Amiga Basado en Arduino: Recuperación de Datos Open Source de Bajo Costo