Arduino persistencia de visión Mostrar

una persistencia de la pantalla de la visión (PoV) es una fila de LED que flash a columnas de un mensaje.  Cuando la matriz de LED se mueve, como cuando se monta en una rueda de bicicleta, el mensaje puede ser leído como si fuera todo de muchos LED, en lugar de una sola fila.

La configuración del hardware para una exhibición de PoV es bastante sencilla, pero este instructable contiene código en la pantalla puede ser controlada y programada fácilmente sobre la conexión en serie, y puede guardar configuración de la pantalla para que automáticamente se carga y ejecutar cuando se enciende de una batería.

Tendrá una placa de Microcontrolador AVR Arduino, como un Uno, Nano, mini.  Alrededor de 10 LED y 10 resistencias de alrededor de 100 a 220 ohms.

Para nuestro ejemplo, se asume que una pantalla LED de 10.  Cable del LED en serie con una resistencia a los pines de I/O digitales 3-10 y póngalos en una fila recta.

Cargar el dibujo adjunto.

Desde el serial monitor (o emulador de terminal), tipo h para obtener el menú de ayuda.  Esto le mostrará varios comandos.

Mi clase de lector Serial comprime espacios en blanco, por lo que se desea utilizar. representar a "off" en la configuración de la línea.  Vea el adjunto Quelab.dat muestra línea configuración archivo de entrada.  Las líneas de este archivo se pueden cortar y pegar en un emulador de terminal para configurar el mensaje de PoV.

Una vez se haya cargado la pantalla deseada, utilice el s) comando para guardar la configuración en EEPROM para ser utilizado en el próximo reinicio.

 int dummy=0; // this is to force sketch to put arduino include here #define MODE_UNKNOWN 0 #define MODE_PoV 1 #define MODE_RANDOM 2 #define MODE_CYLON 3 #define MAX_COLS 96 #define SERIAL_BUF_LEN (MAX_COLS+15) #include SerialLineBuffer LineBuf; struct { short nCols; // no. columns in buffer short spaceCols; // no. columns "space" time before repeat or reverse short mode; // MODE_ code from above short cylonCols; // no. cols of time for each cylon flash int colTime; // milliseconds/column int misc[3]; // reserved for future use short disp[MAX_COLS]; // display flags } State; // These are the DI/O pins used for the display #define NPINS 10 int ledPins[NPINS] = {12,11,10,9,8,7,6,5,4,3}; #include void loadState() { int n = sizeof(State); byte *bp = (byte *)(&State); for(int i=0; i < n; i++, bp++) *bp = EEPROM.read(i); if (!validState()) initState(); } void saveState() { int n = sizeof(State); byte *bp = (byte *)(&State); for(int i=0; i < n; i++, bp++) EEPROM.write(i,*bp); } // set state to a reasonable default void initState() { State.nCols = 2; State.spaceCols = 1; State.cylonCols = 10; State.mode = MODE_PoV; State.colTime = 10; // ms for (int i=0; i < MAX_COLS; i++) State.disp[i] = (i&1)?0x5555:0x2aaa; saveState(); } void setup() { int i; for (i=0;i { pinMode(ledPins[i],OUTPUT); } pinMode(13,OUTPUT); // use on-board LED // restore state from EEPROM loadState(); Serial.begin(9600); } void loop() { checkCommand(); int i,dt,k; dt = State.colTime; switch (State.mode) { case MODE_CYLON: dt *= State.cylonCols; for (i=0; i < NPINS; i++) { digitalWrite(ledPins[i],HIGH); delay(dt); digitalWrite(ledPins[(i+NPINS-1)%NPINS],LOW); delay(dt); } for (i=NPINS-2; i >= 0; i--) { digitalWrite(ledPins[i],HIGH); delay(dt); digitalWrite(ledPins[(i+1)%NPINS],LOW); delay(dt); } break; case MODE_PoV: for (i=0; i < State.nCols; i++) { short mask=1; for (k=0; k < NPINS; k++, mask <<= 1) digitalWrite(ledPins[k],(mask & State.disp[i])?HIGH:LOW); } for (k=0; k < NPINS; k++) digitalWrite(ledPins[k],LOW); delay(State.spaceCols*dt); break; default: // random default { dt *= 10; k = random(100); int lvl = (k<50)?LOW:HIGH; int j = random(NPINS); digitalWrite(ledPins[j],lvl); delay(dt); } } digitalWrite(13,digitalRead(13)?LOW:HIGH); // toggle heartbeat } // poll for commands from serial port void checkCommand() { short mask; if (!LineBuf.isComplete()) return; char key = lowCase(*(LineBuf.get())); switch(key) { //short mask; //int k; //char *b; case 'h' : Serial.println(" h) help (print this message)"); Serial.println(" s) save state"); Serial.println(" r) random lights mode"); Serial.println(" c) cylon mode"); Serial.println(" p) PoV sign mode"); Serial.println(" n) no. cols to display"); Serial.println(" t) col time, ms"); Serial.println(" b) blank cols between repeat"); Serial.println(" i) re-Initialize state"); Serial.print( " Lx) Set pattern for line x, 0<=x<="); Serial.println(NPINS); break; case 's' : saveState(); break; case 'r' : State.mode = MODE_RANDOM; break; case 'p' : State.mode = MODE_PoV; break; case 'c' : State.mode = MODE_CYLON; break; case 'i' : initState(); break; case 'n' : State.nCols =nextInt(LineBuf.get()+1); break; case 't' : State.colTime =nextInt(LineBuf.get()+1); break; case 'b' : State.spaceCols=nextInt(LineBuf.get()+1); break; case 'l' : { char *b = LineBuf.get()+1; int k = ((int)(*b)) - ((int)'0'); if ((k<0) || (k > 15)) break; b++; short mask = (short)(1< for (int i=0; i < State.nCols; i++, b++) { if (isOn(*b)) State.disp[i] |= mask; else State.disp[i] &= ~mask; } break; } default : Serial.print("Unrecognized Command : <"); Serial.print(LineBuf.get()); Serial.println(">"); Serial.println("Send command h for help."); } printState(); printMsg(); } void printState() { Serial.print(State.nCols); Serial.print(" Columns "); Serial.print(State.spaceCols); Serial.print(" "); Serial.print(State.colTime); Serial.println("ms/col"); Serial.flush(); } void printMsg() { int i,k; Serial.println(); for (i=0; i < State.nCols; i++) Serial.print("-"); short mask=1; for(k=0; k < NPINS; k++, mask <= 1) { for (i=0; i < State.nCols; i++) Serial.print(State.disp[k]&mask?"X":" "); Serial.println("|"); } Serial.println(); for (i=0; i < State.nCols; i++) Serial.print("-"); Serial.println(); Serial.flush(); } // parse next int from a string int nextInt(const char *s) { const char *c = s; int val = 0; for(;;) { int k = ((int)(*c)) - ((int)'0'); if ((k<0)||(k>9)) return val; val *= 10; val += k; c++; } } bool isOn(const char c) { if ((c=='0') || (c=='.') || (c==' ') || (c==0)) return false; //if ((c=='1')||(lowCase(c)=='x')) return true; return true; } bool validState() { // check for silly state, set to default if inconsistent if ((State.mode <= 0) || (State.mode > 3) || (State.nCols< 1) || (State.nCols>MAX_COLS)) return false; if ((State.spaceCols < 1) || (State.spaceCols > 10*MAX_COLS)) return false; if ((State.colTime < 1) || (State.colTime > 10000)) return false; if ((State.cylonCols < 1) || (State.cylonCols > 10000)) return false; return true; } 

---ioUtil.h

 class SerialLineBufferPrivates; class SerialLineBuffer { public: SerialLineBuffer(); //~SerialLineBuffer(); bool isComplete(); // reads from serial, return true if 0 or EOLN void clear(); void begin(); int length() const; int maxLength() const; char *get(); // retrieve current buffer and clear char buf[SERIAL_BUF_LEN+1]; protected: int _maxLength, _len; bool _complete; private: //class SerialLineBufferPrivates *Priv; }; char lowCase(const char a); int caseCmp(const char a0, const char b0); char *extractKey(char *cmdStr, char **val); bool keyMatch(const char *key, const char *key1); 

---ioUtil.cpp

 #include #define NULL 0 // don't want to depend on ctype.h, just for this! bool isBlank(int c) { if(c == 7) return(false); // bell return( (c <= ' ') || (c > '~') ); } #if defined(ARDUINO) && ARDUINO >= 100 #include #warning ARDUINO #else #error ARDUINO not >= 100 #include #endif void SerialLineBuffer::begin() { _maxLength = SERIAL_BUF_LEN; // AVR dynamic mem is tricky _len = 0; _complete = false; } SerialLineBuffer::SerialLineBuffer() { begin(); } bool isTerminator(int c) { if (c == 0) return(true); if (c == ';') return(true); // sending \n to serial is tricky. accept this too. //if ((c=='\n') || (c=='\r') || (c=='\m')) return(true); if ((c>=10) && (c<=13)) return(true); // \r, \n, form feed, vert tab return(false); } /// read from serial, return true if 0 or EOLN bool SerialLineBuffer::isComplete() { if (_complete) return(true); // don't read more until this line is consumed // add characters from serial while(Serial.available() > 0) { int nextByte = Serial.read(); //Serial.print("Got ");Serial.println(nextByte); if ((nextByte < 0) || (nextByte >= 256)) return(_complete); if (isTerminator(nextByte)) { //Serial.print("terminator ");Serial.println(nextByte); buf[_len] = 0; _complete = (_len > 0); return(_complete); } if (isBlank(nextByte)) { //Serial.print("blank ");Serial.println(nextByte); if (_len > 0) // ignore leading whitespace { if (buf[_len-1] != ' ') // compact space to 1 space { buf[_len++] = ' '; // convert all space to ' ' } } } else { buf[_len++] = (char)nextByte; } // don't allow overflow if (_len >= _maxLength) { Serial.println("\nOverflow. truncating command string"); _complete = true; } } return(_complete); } void SerialLineBuffer::clear() { _len = 0; _complete = false; } int SerialLineBuffer::length() const { return(_len); } int SerialLineBuffer::maxLength() const { return(_maxLength); } /// retrieve current buffer and clear char *SerialLineBuffer::get() { buf[_len]=0; clear(); return(buf); } //----------------------------------------------------------- /// split a keyword-value pair string into a key string and value string const char nullChar = 0; // static is scary on AVR char *extractKey(char *cmdStr, char **val) { *val = (char *)&nullChar; if (cmdStr == NULL) return(NULL); char *key = cmdStr; while (*key) // process comments { if (*key == '#') *key=0; // comment else key++; } key = cmdStr; while(*key && isBlank(*key)) key++; // trim leading space *val = key; while(**val && !isBlank(**val)) *val += 1; // skip key **val = 0; *val += 1; while(**val && isBlank(**val)) *val += 1; // skip whitespace return(key); } char lowCase(const char a) { if ((a >= 'A') && (a <= 'Z')) { int sft = ((int)'a') - ((int)'A'); int b = (int)a + sft; return((char)b); } return(a); } int caseCmp(const char a0, const char b0) { char a = lowCase(a0); char b = lowCase(b0); if (a < b) return(-1); return((a>b)?1:0); } bool keyMatch(const char *key0, const char *key1) { //Serial.print("keyMatch(");Serial.print(key0);Serial.print(",");Serial.print(key1);Serial.print(")="); while(*key0 || *key1) { if (caseCmp(*key0, *key1)) { //Serial.println("false"); return(false); } if (*key0) key0++; if (*key1) key1++; } //Serial.println("true"); return(true); } 

---Ejemplo entrada de datos

 L0..Q.............l......b.... L1.QQQ............l......b.... L2Q...Q...........l......b.... L3Q...Q.u..u..ee..l..a.a.b.b.. L4Q...Q.u..u.e..e.l.a.aa.bb.b. L5Q...Q.u..u.e..e.l.a..a.b..b. L6Q.Q.Q.u..u.eeee.l.a..a.b..b. L7Q..Q..u..u.e....l.a..a.b..b. L8.Q.Q..u..u.e..e.l.a.aa.bb.b. L9.QQ.Q..uu...ee..l..a.a.b.b.. 
Etiquetas: Arduino, POV, Pantalla, Serial

Artículos Relacionados

Mostrar vivo Arduino lecturas del sensor en una LCD de Nokia 5110

Mostrar vivo Arduino lecturas del sensor en una LCD de Nokia 5110

si has trabajado alguna vez con arduino, probablemente has querido para mostrar las lecturas del sensor.Usando al serial monitor está perfectamente bien, pero ser el macarra de arduino que se está convirtiendo rápidamente en, probablemente quiere que
HACER controlador de persistencia del efecto de la visión con LEDs

HACER controlador de persistencia del efecto de la visión con LEDs

Hola, este es mi primer instructivo y espero os guste. Es un proyecto simple, usando MAKE regulador (un muy útil de www.makezine.com), que hace un persistencia de visión-efecto con LEDs. Cuando se mueve el tablero rápidamente puedes ver dos líneas pa
POV con Arduino Nano

POV con Arduino Nano

Hola a todosYo estaba impresionado con dos artículos sobre Instructables.com Magic-POV-Wand-yet-another-POV-toy y varita persistencia de visión. Explican en gran detalle, para construir un POV LED y sobre todo mostrar un nombre o un mensaje.No he enc
Cwik Clock v1.0 - un reloj binario de Arduino

Cwik Clock v1.0 - un reloj binario de Arduino

ResumenEsta es una guía a la construcción de un reloj accionado Arduino que utiliza LEDs para mostrar un reloj de 24 horas (horas y minutos) como dígitos binarios, un medidor analógico para mostrar a los segundos, un interruptor para conmutar entre e
Hacer tu propio custom Arduino compatible

Hacer tu propio custom Arduino compatible

me encanta Ardunio. Me encanta las cosas que hacen con ellos y me encantaria hacer mi propio. En agosto pasado publiqué un Instructable sobre cómo hacer tu propio sello de correos de tamaño compatible con Arduino. Este Instructable le mostrará cómo p
Juego de Pong de matriz de LED de bi-color basados en Arduino

Juego de Pong de matriz de LED de bi-color basados en Arduino

Hemos creado dos instructables proyecto de juego hasta ahora con los kits jolliFactory de Bi-color LED matriz conductor módulo bricolaje que hemos diseñado. Este módulo de matriz de LED está diseñado para ser capaz de cadena así que usted puede encad
Arduino/Android BLUETOOTH Serial Monitor APP para arduino usando el HC-06 y ANDROID

Arduino/Android BLUETOOTH Serial Monitor APP para arduino usando el HC-06 y ANDROID

¡ Hola mundo! Hoy he hecho una aplicación para Android que simplemente Lee valores o texto que se imprimen en el arduino serial usando el módulo bluetooth HC-06/05 o cualquier otros módulos. No necesitas configurar nada en el código de arduino. Simpl
Entrada de Arduino Audio

Entrada de Arduino Audio

Enviar sonido a tu Arduino. Este Instructable le mostrará cómo preparar el audio para que puedan ser muestreado y procesada por un Arduino para hacer proyectos sensibles sonidos y efectos de audio. (Este artículo es un compañero de otro Instructable
El Arduino / TFT LCD conexión

El Arduino / TFT LCD conexión

¿Dices que quieres conectar una pantalla TFT a un Arduino? Son bromas?No! Por sobre el precio de un familiar 2 x 16 LCD, usted consigue una pantalla TFT de alta resolución. Para tan bajo como $4 (gastos de envío incluidos!), es posible comprar una pa
Arduino Kit de Sensor de temperatura

Arduino Kit de Sensor de temperatura

este kit está diseñado para tener la pantalla de 4 x 7 segmentos que muestra la temperatura montada directamente en la placa Arduino. El3 pines cables conectan un termistor a un pin analógico en el Arduino. Una vez este programado el Arduino, se pued
El Gizmo de Internet Arduino

El Gizmo de Internet Arduino

el Arduino Internet Gizmo es un dispositivo USB, Arduino y RFID para navegación web.  El cacharrito funciona mediante la colocación de una etiqueta RFID en la parte superior el gizmo.  El gizmo lee la etiqueta de RFID y envía el número de etiqueta ví
Arduino Powered Home

Arduino Powered Home

He hecho algunas actualizaciones a este instructable desde agosto de 2014 ***Decidí compartir esta información que podría ayudar a otras personas que han estado luchando para hacer cosas similares con su Arduino. Recientemente he conseguido con el Ar
¿Aprender contador ICs utilizando un Arduino

¿Aprender contador ICs utilizando un Arduino

han necesitado alguna vez contar algo? Claro, todos necesitamos contar cambio, contar las bendiciones, y de vez en cuando contar cartas, pero que no es el tipo de cuenta que estoy hablando. En este Instructable, yo dilucidar cómo ICs cuenta funcionar
Wireless Display Arduino con módulos RF de 315mhz

Wireless Display Arduino con módulos RF de 315mhz

Hola Instructables. Soy un estudiante canadiense Gr.9 es parte de mi proyecto final - la levitación magnética. Voy a publicar en diciembre o enero.Editar: está bien, así que mi proyecto falló, pero todavía sigo intentar hacer que funcione mi proyecto