En este laboratorio se usara una matriz de 8x8 de cátodo común para reemplazar la que se usaría en este laboratorio, la cual era una matriz de 8x5 de cátodo común. para controlar esta matrix de LEDs de 8x8 se cableara a través de un IC Maxim MAX7219, para mostrar un mensaje letra por letra, desplazándose de derecha a izquierda, y así poder ahorra puertos de salida en en sistema embebido arduino.
Matriz de leds mono color (esquema).
MATRIZ DE LEDS BICOLOR (esquema).
este es un ejempo de muestreo de desplazamiento de leds encendido en secuencia para mostrar la letra W.
MAX 7219
(esquema)
Es un multiplexor el cual utilizaremos para controlar la matriz de leds la cual recibirá la señales multiplezadas desde el IC, señal proveniente desde el arduino que estará conectado al computador, el cual trasmitira el texto a mostrar.
El MAX7219 impulsa ocho LEDs a la vez, y por los bancos con rapidez de conmutación de ocho ojos no ven los cambios. Cableado de una matriz es muy simple - si tiene una matriz común con el siguiente esquema:
El circuito es muy sencillo, excepto que tenemos una resistencia entre 5V y MAX7219 pin 18. El MAX7219 es un controlador de LED de corriente constante, y el valor de la resistencia se utiliza para establecer el flujo de corriente a los LEDs.
MATERIALES
- 1 arduino mega adk
- matriz de leds 8x8 catodo comun
- computador
- MAX7219
DIAGRAMA ESQUEMÁTICO
DIAGRAMA PARA MONTAJE EN TARJETA PERFORADA
FOTOS
foto 1
foto 2
foto 3
foto 4
foto 5
foto 6
foto 7
foto 8
CÓDIGO ARDUINO
#include <Sprite.h>
#include <Matrix.h>
int count = 0;
int x = 8;
int letra1 = 0;
int letra2 = 0;
int tiempoEspera = 0;
const int numChips = 1;
int DIN = 6;
int CLK = 7;
int LOAD = 8;
//DIN, CLK, LOAD, #chips
Matrix matrix = Matrix(DIN, CLK, LOAD, numChips);
void setup() {
pinMode(6,OUTPUT);
pinMode(7,OUTPUT);
pinMode(8,OUTPUT);
tiempoEspera = 150;
Serial.begin(9600);
}
void loop() {
if(Serial.available() > 0){
byte dato = Serial.read();
//si el dato esta entre A-Z o a-z
if((64 < dato && dato < 91) || (96 < dato && dato < 123)){
//pasamos a mayuscula el caracter
byte caracterMayuscula = toUpperCase(dato);
letra1 = caracterMayuscula-65;
mover();
}else {
//si hay espacio
if(dato == 32){
letra1 = 26;
mover();
}
}
}else{
letra1 = 26;
mover();
}
}
void mover(){
do{
delay(tiempoEspera);
count--;
x--;
pintar();
}while(x >= 0);
x = 8;
count = 6;
letra2 = letra1;
}
Sprite letras(int valor){
//creamos los sprite con 5 pixeles de ancho y 5 pixelex de alto
int _width = 5;
int _height = 5;
switch(valor){
case 0:
//A
return Sprite(_width, _height,
B10001, B10001, B11111, B10001, B11111
);
break;
case 1:
//B
return Sprite(5, 5,
B11110, B10001, B11110, B10001, B11110
);
break;
case 2:
//C
return Sprite(5, 5,
B11111, B10000, B10000, B10000, B11111
);
break;
case 3:
//D
return Sprite(5, 5,
B11110, B10001, B10001, B10001, B11110
);
break;
case 4:
//E
return Sprite(5, 5,
B11111, B10000, B11111, B10000, B11111
);
break;
case 5:
//F
return Sprite(5, 5,
B10000, B10000, B11110, B10000, B11110
);
break;
case 6:
//G
return Sprite(5, 5,
B11111, B10001, B11111, B10000, B11111
);
break;
case 7:
//H
return Sprite(5, 5,
B10001, B10001, B11111, B10001, B10001
);
break;
case 8:
//I
return Sprite(5, 5,
B11111, B00100, B00100, B00100, B11111
);
break;
case 9:
//J
return Sprite(5, 5,
B11100, B00100, B00100, B00100, B11111
);
break;
case 10:
//K
return Sprite(5, 5,
B10001, B10010, B11100, B10010, B10001
);
break;
case 11:
//L
return Sprite(5, 5,
B11111, B10000, B10000, B10000, B10000
);
break;
case 12:
//M
return Sprite(5, 5,
B10001, B10001, B10001, B10101, B11011
);
break;
case 13:
//N
return Sprite(5, 5,
B10001, B10011, B10101, B11001, B10001
);
break;
case 14:
//O
return Sprite(5, 5,
B11111, B10001, B10001, B10001, B11111
);
break;
case 15:
//P
return Sprite(5, 5,
B10000, B10000, B11110, B10001, B11110
);
break;
case 16:
//Q
return Sprite(5, 5,
B11111, B10011, B10001, B10001, B11111
);
break;
case 17:
//R
return Sprite(5, 5,
B10001, B10010, B11110, B10001, B11110
);
break;
case 18:
//S
return Sprite(5, 5,
B11110, B00001, B01110, B10000,B01110
);
break;
case 19:
//T
return Sprite(5, 5,
B00100, B00100, B00100, B00100, B11111
);
break;
case 20:
//U
return Sprite(5, 5,
B11111, B10001, B10001, B10001, B10001
);
break;
case 21:
//V
return Sprite(5, 5,
B00100, B01010, B10001, B10001, B10001
);
break;
case 22:
//W
return Sprite(5, 5,
B10001, B11011, B10101, B10001, B10001
);
break;
case 23:
//X
return Sprite(5, 5,
B10001, B01010, B00100, B01010, B10001
);
break;
case 24:
//Y
return Sprite(5, 5,
B00100, B00100, B01110, B10001, B10001
);
break;
case 25:
//Z
return Sprite(5, 5,
B11111, B01000, B00100, B00010, B11111
);
break;
case 26:
//Blanco
return Sprite(5, 5,
B00000, B00000, B00000, B00000, B00000
);
break;
}
}
void pintar(){
matrix.clear();
//se coloca el Sprite en pantalla
matrix.write(x, 0, letras(letra1));
if(count >= 0){
matrix.write(x - 8, 0, letras(letra2));
}
}
CÓDIGO PROCESSING
//se carga la libreria ControlP5
import controlP5.*;
//se carga la libreria Serial
import processing.serial.*;
// definir la variable cp5 del tipo ControlP5
ControlP5 cp5;
// definir la variable puerto del tipo Serial
Serial puerto;
// definir la variable text del tipo Textfield
Textfield text;
void setup(){
//tamaño de la ventana
size(250,160);
//se crea el objeto controlP5
cp5 = new ControlP5(this);
text = cp5.addTextfield("text")
.setPosition(20,30)
.setSize(200,40)
.setFont(createFont("arial",20))
.setAutoClear(false);
cp5.addButton("Enviar")
.setValue(1)
.setPosition(20,100)
.setSize(40,30)
.setId(2);
String COM = Serial.list()[0];
//comunicacion serial a 9600bps
puerto = new Serial(this, COM, 9600);
}
void draw(){
background(#000000);
}
void controlEvent(ControlEvent theEvent){
if(theEvent.isAssignableFrom(Button.class)){
//se envia cada caracter de la cadena
for(int i = 0; i < text.getText().length(); i++){
char dato = text.getText().charAt(i);
puerto.write(dato);
}
}
}