Ayuda con POV Arduino

Hola,

Hace poco empecé con Arduino y estoy intentando programar un POV-display. El montaje lo he realizado usando una protoboard con 5 leds, 5 resistencias de un 1K y una arduino duemilanove. Los 5 leds dispuestos de forma vertical, conectados a las resistencias de 1K y a las entradas digitales 12-8. El código del programa es el siguiente:

/*
 * POVarduino
 *
 */

//constantes
#define NPINS   5
#define VEL 1

void hacerFila(int data);
void writeASCII(int dir);

const int Pins[] = {12,11,10,9,8}; //LEDs
const int letras[4][7] = {
            {0,17,10,4,10,17,0}, //X
            {0,30,5,5,5,30,0},  //A
            {0,7,8,16,8,7,0},   //V
            {0,0,31,31,31,0,0}, //I

};

void setup()
{
  int n;
  for (n = 0; n < NPINS; ++n) { //Iniciamos los pines de salida
    pinMode(Pins[n], OUTPUT); 
  }
}

void loop()
{
    writeASCII(1);
    //writeASCII(0);
}


void hacerFila(int data)
{
  int output;
  int mask;
  int n;
  
  for (mask = 1, n = 0; mask < 32; mask = mask << 1, ++n) { //Macara para cada pin
    output = mask & data;
     while(output != 0 && output != 1) { //Buscamos el resultado de la AND, 0 o 1
           output = output >> 1;
     }
     digitalWrite(Pins[n], output);
  }
}

void writeASCII(int dir)
{
  int n;
  int i;
  
  if(dir == 0) { //Hacia la derecha
    for(n = 0; n < 4; n++) { //Recorremos la matriz 
      for (i = 0; i < 7; ++i) {
        hacerFila(letras[n][i]);
        delay(VEL);
      }
    }
    delay(VEL);
  }
  
  else if(dir == 1) { //hacia la izquierda
    for(n = 3; n>=0; --n) {
      for (i = 0; i < 7; ++i) {
        hacerFila(letras[n][i]);
        delay(VEL);
      }
    }
    delay(VEL);
  }
}

El funcionamiento del programa es el siguiente:
En la matriz letras tengo en forma decimal la representación en filas de una letra, por ejemplo la X seria

0 0 0 0 0 - 0
1 0 0 0 1 - 17
0 1 0 1 0 - 10
0 0 1 0 0 - 4
0 1 0 1 0 - 10
1 0 0 0 1 - 17
0 0 0 0 0 - 0

Con la función hacerFila creo una mascara para cada Led, 00001, 00010, 00100 etc, y hago la AND de cada mascara con cada fila, esto me da un número con todo 0s o 4 0s y un 1, lo transformo a 0 o 1 para saber si el led esta encendido o apagado en ese momento.

Con la función writeASCII dibujo las letras correspondiente recorriendo la matriz, se pueden recorrer en los dos sentidos (para ello esta el 0 o 1). Para apreciar el efecto hay que mover la protoboard de un lado para otro.

El caso es que las letras se distinguen bastante bien, pero es difícil llegar a leer entero lo que pone (en este caso mi nombre, xavi). Alguien sabe de que manera puedo mejorarlo? Algún truco para que funcione mejor?

Gracias

PD: El programa es una versión muy muy basica con solo 4 letras, en breve lo mejoraré :slight_smile:

¿Y por qué es difícil leer lo que pone?

Hola yo ando pensando realizar algo parecido pero para acoplar a la rueda de la bici , si algun año lo hago lo pondre por aqui .
En mi opinion para mostrar unos pocos bytes por los leds has complicado un poquito el codigo .
De todas maneras te comento/pregunto , tienes 5 leds verticales que mueves de lado , pero tus letras si no he visto mal estan horizontales
Deberias corregir las letras o mover el pov de ariba a abajo
Vel = 1.... ¿ El tiempo de retardo entre letras no deberia ser mayor ?
Te dejo un par de links que yo he consultado

http://www.spikenzielabs.com/SpikenzieLabs/Povard.html