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é