Manufactura industrial
Internet industrial de las cosas | Materiales industriales | Mantenimiento y reparación de equipos | Programación industrial |
home  MfgRobots >> Manufactura industrial >  >> Manufacturing Technology >> Proceso de manufactura

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

Sobre el proyecto

Continuación del proyecto anterior: Lector de discos Amiga v1

Más información: amiga.robsmithdev.co.uk

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.

Lector/escritor de disquetes Amiga con Arduino – Versión 2.2

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:

  1. Sincronizar con pulso /INDEX.
  2. Contador libre (0-255) mediendo tiempo entre pulsos de flujo.
  3. MFM permite máx. tres ceros seguidos → valores entre 32 (2 µs) y 128 (8 µs).
  4. Fórmula: value = (CONTADOR - 16) / 32 recortado a 0-3.
  5. 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: Lector/escritor de disquetes Amiga con Arduino – Versión 2.2

Circuito para Arduino UNO: Lector/escritor de disquetes Amiga con Arduino – Versión 2.2

Proceso de manufactura

  1. La Evolución y Oficio de la Animación
  2. La Evolución de los Discos Flexibles: De Medios Magnéticos a Almacenamiento Óptico
  3. Pantalla LED Interactiva con Giroscopio, Anillo NeoPixel y Arduino
  4. Construye un Spybot controlado por Bluetooth con Arduino
  5. FlickMote: Mando IR por gestos para Smart Home
  6. TV‑B‑Gone DIY con Arduino: Mando universal para apagar cualquier TV
  7. Mando USB para juegos DIY con Arduino – Construye tu propio gamepad de alto rendimiento
  8. Disfraz de nube DIY: Tira LED, Arduino Nano y componentes SparkFun
  9. Construye un Reloj Maestro LED Personalizado con Alarma – Visible desde 12 Metros
  10. Pixie: Reloj de pulsera NeoPixel basado en Arduino – Elegante reloj LED DIY
  11. Lector de Discos Flexibles Amiga Basado en Arduino: Recuperación de Datos Open Source de Bajo Costo