Arduino: ColecoVision cartucho lector (8 / 13 paso)

Paso 8: Sketch de Arduino archivo

El siguiente archivo de Arduino Sketch hace el Arduino esperar una línea desde el equipo host. Si la línea en es "Leer todos", el Arduino haga lo siguiente:

  • Envíe un "Inicio:" línea al ordenador.
  • Leer todos los datos del cartucho y enviarlo al ordenador en HEX, un byte por línea.
  • Enviar un ": fin" línea al ordenador.

Una vez que los datos del cartucho ha sido enviados al ordenador, el Arduino está listo para su siguiente comando desde el equipo host.

 // ColecoVision / ADAM Cartridge Reader // for the Arduino UNO // 2014-11-25 //---------------------------------------------------------------------------------- // Arduino Pins const int gcChipSelectLine[4] = { A0, A1, A2, A3 }; const int gcShiftRegisterClock = 11; const int gcStorageRegisterClock = 12; const int gcSerialAddress = 10; const int gcDataBit[8] = { 2, 3, 4, 5, 6, 7, 8, 9 }; // Shifts a 16-bit value out to a shift register. // Parameters: // dataPin - Arduino Pin connected to the data pin of the shift register. // clockPin - Arduino Pin connected to the data clock pin of the shift register. //---------------------------------------------------------------------------------- void shiftOut16(int dataPin, int clockPin, int bitOrder, int value) { // Shift out highbyte for MSBFIRST shiftOut(dataPin, clockPin, bitOrder, (bitOrder == MSBFIRST ? (value >> 8) : value)); // shift out lowbyte for MSBFIRST shiftOut(dataPin, clockPin, bitOrder, (bitOrder == MSBFIRST ? value : (value >> 8))); } // Select which chip on the cartridge to read (LOW = Active). // Use -1 to set all chip select lines HIGH. //---------------------------------------------------------------------------------- void SelectChip(byte chipToSelect) { for(int currentChipLine = 0; currentChipLine < 4; currentChipLine++) { digitalWrite(gcChipSelectLine[currentChipLine], (chipToSelect != currentChipLine)); } } // Set Address Lines //---------------------------------------------------------------------------------- void SetAddress(unsigned int address) { SelectChip(-1); // Disable shift register output while loading address digitalWrite(gcStorageRegisterClock, LOW); // Write Out Address shiftOut16(gcSerialAddress, gcShiftRegisterClock, MSBFIRST, address); // Enable shift register output digitalWrite(gcStorageRegisterClock, HIGH); int chipToSelect; if (address < 0xA000) { chipToSelect = 0; } else if (address < 0xC000) { chipToSelect = 1; } else if (address < 0xE000) { chipToSelect = 2; } else { chipToSelect = 3; } SelectChip(chipToSelect); } // Read data lines //---------------------------------------------------------------------------------- void ReadDataLines() { const char cHexLookup[16] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'}; int highNibble = 0; int lowNibble = 0; boolean dataBits[8]; char byteReadHex[4]; for(int currentBit = 0; currentBit < 8; currentBit++) { dataBits[currentBit] = digitalRead(gcDataBit[currentBit]); } highNibble = (dataBits[7] << 3) + (dataBits[6] << 2) + (dataBits[5] << 1) + dataBits[4]; lowNibble = (dataBits[3] << 3) + (dataBits[2] << 2) + (dataBits[1] << 1) + dataBits[0]; Serial.write(cHexLookup[highNibble]); Serial.write(cHexLookup[lowNibble]); Serial.println(); } // Read all of the data from the cartridge. //---------------------------------------------------------------------------------- void ReadCartridge() { unsigned int baseAddress = 0x8000; Serial.println("START:"); // Read Current Chip (cartridge is 32K, each chip is 8k) for (unsigned int currentAddress = 0; currentAddress < 0x8000; currentAddress++) { SetAddress(baseAddress + currentAddress); ReadDataLines(); } Serial.println(":END"); } // Returns the next line from the serial port as a String. //---------------------------------------------------------------------------------- String SerialReadLine() { const int BUFFER_SIZE = 81; char lineBuffer[BUFFER_SIZE]; int currentPosition = 0; int currentValue; do { // Read until we get the next character do { currentValue = Serial.read(); } while (currentValue == -1); // ignore '\r' characters if (currentValue != '\r') { lineBuffer[currentPosition] = currentValue; currentPosition++; } } while ((currentValue != '\n') && (currentPosition < BUFFER_SIZE)); lineBuffer[currentPosition-1] = 0; return String(lineBuffer); } // Indicate to remote computer Arduino is ready for next command. //---------------------------------------------------------------------------------- void ReadyForCommand() { Serial.println("READY:"); } void setup() { // Setup Serial Monitor Serial.begin(57600); // Setup Chip Select Pins for(int chipLine = 0; chipLine < 4; chipLine++) { pinMode(gcChipSelectLine[chipLine], OUTPUT); } // Setup Serial Address Pins pinMode(gcShiftRegisterClock, OUTPUT); pinMode(gcStorageRegisterClock, OUTPUT); pinMode(gcSerialAddress, OUTPUT); // Setup Data Pins for(int currentBit = 0; currentBit < 8; currentBit++) { pinMode(gcDataBit[currentBit], INPUT_PULLUP); } while (!Serial) { ; // wait for serial port to connect. Needed for Leonardo only. } // Reset Output Lines SetAddress(0); ReadyForCommand(); } void loop() { if (Serial.available() > 0) { String lineRead = SerialReadLine(); lineRead.toUpperCase(); if (lineRead == "READ ALL") { ReadCartridge(); } // lineRead = "Read All" ReadyForCommand(); } // Serial.available } 

Si tienes suerte que suficiente para usar una placa Arduino con 29 o más digital I/O pins (e.g. debido de Arduino, Arduino MEGA ADK, Arduino Mega 2560, etc.) y usted no está usando el cambio de registro de circuito, la función SetAddress en el archivo de dibujo anterior necesitará volver a escribir.

Artículos Relacionados

¡ Convierte tu Arduino en un lector de tarjeta magnética!

¡ Convierte tu Arduino en un lector de tarjeta magnética!

Todo el mundo ha utilizado un lector de tarjeta magnética, creo. ¿Quiero decir, que lleva en efectivo estos días? No son difíciles de tener en sus manos, ya sea, y durante un viaje a mi tienda de electrónica local favorito, encontré un cubo lleno de
RFIDuino - usando un lector de RFID y Arduino para hacer un rompecabezas GeoCache

RFIDuino - usando un lector de RFID y Arduino para hacer un rompecabezas GeoCache

disfruto de Geocaching y electrónica y han hecho un par de electrónico puzzle-caches utilizando un Arduino.Mi más reciente creación (con la ayuda de un compañero cacher del código) está utilizando un Arduino y RFID lector para hacer un geocaché de ro
Cableado y programación Arduino el lector Serial Parallax RFID

Cableado y programación Arduino el lector Serial Parallax RFID

recientemente completé un proyecto RFID utilizando un Arduino y el lector Serial Parallax RFID - aquí están las notas de hardware y software en lo que todos trabajan.Lista de partes:1 - Arduino (estoy usando un R3 de UNO para este demo)2 - lector tar
Tutoriales de Arduino (parte 3-17 Tutorial Pack)

Tutoriales de Arduino (parte 3-17 Tutorial Pack)

Se trata de Arduino Tutorial Pack parte 3.La 1ª parte está disponible aquí:La 2 º parte aquí:A diferencia de otros tutoriales aquí no doy ningún fondo en teoría funciona. Está orientada al resultado como lograrlo - para hacer mediciones de una gran c
Decodificador de la banda magnética de Arduino

Decodificador de la banda magnética de Arduino

este instructable muestra cómo utilizar código libremente disponible, un arduino y un lector de banda magnética estándar para analizar y mostrar los datos almacenados en tarjetas de banda magnética como tarjetas de crédito, ID de estudiante, etc..Me
Arduino tocando la melodía con la tarjeta Sd

Arduino tocando la melodía con la tarjeta Sd

Este proyecto es en la tarjeta SD cargada robada melodía por comandos enviados desde el monitor serie.Si desea agregar el archivo de aplicación var.siz 6-melodía melodía melodía debe ser el mismo que el nombre del nombre de código especificado.Se uti
Conectar el arduino con ethernet

Conectar el arduino con ethernet

El Arduino Ethernet Shield permite a una placa Arduino conectarse a internet. Se basa en el chip Wiznet W5100 ethernet (hoja de datos).El Wiznet W5100 proporciona una pila de red (IP) capaz de TCP y UDP. Soporta hasta cuatro conexiones de socket simu
Artista de la flor

Artista de la flor

El reto es crear una interfaz para permitir la interacción del objeto físico a virtual 3D model.Soy un apasionado de la impresión 3D y estoy pasando tiempo a investigar nuevos tipos de materiales como pasta de extrudado. Especialmente en arcilla, imp
Sistema de acceso RFID

Sistema de acceso RFID

En este instructable les mostraré cómo hacer un sistema de acceso de arduino powered RFID que puede ser fácilmente modificado para adaptarse a las necesidades de cualquier proyecto. Antes de entrar a la construcción me explico la tecnología detrás de
AirStamp - sellado interactivo

AirStamp - sellado interactivo

Sellado de física es diversión. En este proyecto, queremos física sellado en pantalla digital y permiten la manipulación del pantalla para hacer experiencia estampado diferente y más fresco como controlar el tamaño del texto con el movimiento de la m
Magia música mesa sin menús, sin los botones

Magia música mesa sin menús, sin los botones

Nota:Este instructable es ahora un poco viejo y una máquina mejor fabricada con partes bajas del costo y mucho mejor software que automáticamente le permite nuevas tarjetas "par" con temas nuevos se añaden a la lista de reproducción de iPod.sele
Controlado de radio del árbol de la raza

Controlado de radio del árbol de la raza

IntroducciónMi pack de cub scout, como la mayoría, ejecuta un evento de pinewood derby cada año. Estaba buscando una manera de hacer las cosas un poco más interesantes, por lo que me ocurrió con este árbol de la raza. Todo real arrastre han raza raza
Puerta de gato Twitter

Puerta de gato Twitter

Nota: para ver todo en una sola página, por favor diríjase a: www.tweetingcatdoor.com Después de recibir muchos correos electrónicos solicitando instrucciones y Kits para la construcción de la "Puerta de gato twitteando ", decidí hacer una versi
Plantas vs Zombies peluches interactivos!

Plantas vs Zombies peluches interactivos!

Brains!!OM nom NOM...¿Que siempre quisiste tener una versión de la vida real de los zombies del juego video?  Bien, ahora usted puede!Este zombie reacciona a los otros objetos-el cerebro, Wall-Nut y el guisante Shooter.El BRAAIIINNNSS del zombie es e