domingo, 11 de junio de 2017

CONTROL DE PANELES P10 CON ARDUINO.

El panel P10 es un arreglo de 512 pixels que forman una matriz de 16 filas x 32 columnas, gracias a las librerías que disponemos para ARDUINO, resulta muy fácil que empecemos a experimentar con el. En este articulo se explican algunos detalles que te ayudaran a conectar y programar el panel P10 con la tarjeta ARDUINO UNO.


empecemos...

Materiales:
  • Arduino UNO R3 BOARD
  • Juego de cables DUPONT (macho-hembra)
  • Panel P10

PASO 1: Conectar el panel a la placa ARDUINO;

Puede utilizar cable DUPONT


Opcionalmente puede construirse un conector como se muestra en la figura siguiente:


La conexión entre el ARDUINO y la matriz se muestra en la figura siguiente:




PASO 2: Instalar las librerías DMD-master.h, DMD2.h y timerOne.h utilizando el IDE de ARDUINO; 


PASO 3: Abrir ejemplo DMD DEMO y grabarlo en ARDUINO UNO



Si todo salió bien la matriz deberá mostrar algunos caracteres números y figuras; como se ve en el siguiente vídeo:



PASO 4: Si nota que los LED en su matriz están parpadeando demasiado, ajuste mediante código el tiempo de desborde del timer1; experimente con valores entre 1000 y 5000 hasta encontrar el punto donde mejor trabaja su matriz



Como conectar más paneles para formar una matriz más grande

Puede seguir conectando más paneles uno detrás de otro. Sin embargo; debe tener en cuenta que le hará falta alimentar a las matrices con una fuente de alimentación externa de 5V y que la corriente necesaria para alimentar el circuito se calcula por cada matriz 2A. Por ejemplo si desea alimentar cuatro matrices P10 necesitara una fuente de alimentación externa de 5V/8A.


Algunas instrucciones soportadas por la librería DMD.h

1. Código para programar uno, dos, tres, etc. panéles horizontales
#define DISPLAYS_ACROSS 1 // para un panel horizontal
#define DISPLAYS_ACROSS 2 // para dos paneles horizontales
#define DISPLAYS_ACROSS 3 // para tres paneles horizontales, etc…
#define DISPLAYS_DOWN 1 // para un panel vertical
#define DISPLAYS_DOWN 2 // para dos paneles verticales
#define DISPLAYS_DOWN 3 // para tres paneles verticales, etc…
DMD dmd(DISPLAYS_ACROSS, DISPLAYS_DOWN);
2. Limpiar (Borrar) Pantalla
dmd.clearScreen(true); //Apaga todos los pixels
dmd.clearScreen(false); //Enciende todos los pixels
3. Seleccionar un Tipo de Letra
#include "SystemFont5x7.h"
#include "Arial_black_16.h"
dmd.selectFont(SystemFont5x7) //Para fuente pequeña
dmd.selectFont(Arial_Black_16); //Para fuente grande
4. Dibujar un carácter en la posición (x, y) 
dmd.drawChar(x,y,'B',GRAPHICS_NORMAL ); //Dibuja el carácter “B” en la posición (x,y)
dmd.drawChar( 10, 5, 'A', GRAPHICS_NORMAL ); //Dibuja el carácter “A” en la posición (10,5)
5. Dibujar N caracteres en la posición (x, y)
dmd.drawString( 0,0, "Hello,", 5, GRAPHICS_NORMAL ); //Escribe 5 caracteres empezando por la posición 0,0
dmd.drawString( 2,9, "world,", 5, GRAPHICS_NORMAL ); //Escribe 5 caracteres en la posición 2,9
6. Encender/Apagar un pixel en la posición (x, y)
dmd.writePixel( 5,6, GRAPHICS_NORMAL,1);// Enciende el pixel
dmd.writePixel( 5,6, GRAPHICS_NORMAL,0); // Apaga el pixel
7. Gráfico de Círculos, lineas y rectángulos
dmd.drawCircle( x, y, r, GRAPHICS_NORMAL ); //Dibujar un circulo con centro (x, y) y radio r
dmd.drawLine( x1, y1, x2, y2, GRAPHICS_NORMAL );// Dibujar una línea desde (x1, y1) hasta (x2, y2)
dmd.drawBox(x1, y1, x2, y2, GRAPHICS_NORMAL ); //Dibujar una caja rectangular con esquinas (x1, y1) y (x2, y2)
dmd .drawFilledBox (x1 , y1 , x2 , y2 , GRAPHICS_NORMAL ); //Dibujar un rectángulo relleno con esquinas (x1, y1) y (x2, y2)

Ejemplos  de programas para ARDUINO utilizando la libreria DMD.h

A continuación muestro un video conteniendo tres ejemplos que le permitirá iniciarse con la matriz y su respectivo código




Ejemplo 1. Gráfico de lineas, rectángulos y círculos.

/* Este código hace una demostración de como gráficar figuras utilizando una matriz P10 y ARDUINO UNO
//CONEXIONES
//ARDUINO________________DMD
//PIN9___________________OE
//PIN6___________________A
//PIN7___________________B
//PIN13__________________SLK
//PIN8___________________SCLK
//PIN11__________________SPI
*/

#include <DMD.h>
#include <TimerOne.h>

DMD display(1,1);    //Un panel horizontal 
//DMD display(2,1);  //Descomente si va utilizar dos paneles horizontales 
//DMD display(3,1);  //Descomente si va utilizar tres paneles horizontales

void ScanDMD()

  display.scanDisplayBySPI();
}

void setup() {
   Timer1.initialize( 3000 );           
   Timer1.attachInterrupt(ScanDMD);    
}

 void loop(){

    display.clearScreen(true);                        //borra pantalla  
    display.drawBox(14,7,17,9, GRAPHICS_NORMAL);      //dibuja un rectangulo en el centro
    delay(1000);

    for(int r=0;r<8;r++){
      display.clearScreen(true);                      //borra pantalla  
      display.drawCircle(15,8,r, GRAPHICS_NORMAL);    //dibuja un circulo en el centro y va creciendo su radio
      delay(1000);
      }
      
    display.clearScreen(true);                        //borra pantalla 
    display.drawLine(0,0,31,15, GRAPHICS_NORMAL);     //dibuja linea diagonal      
    display.drawLine(0,15,31,0, GRAPHICS_NORMAL);     //dibuja otra linea diagonal  
    delay(1000);
    }

Ejemplo 2. Escritura de Texto

/* Este codigo hace una demostracion de como escribir caracteres y cadenas de texto
//CONEXIONES:
//ARDUINO________________DMD
//PIN9___________________OE
//PIN6___________________A
//PIN7___________________B
//PIN13__________________SLK
//PIN8___________________SCLK
//PIN11__________________SPI
*/

#include <DMD.h>
#include <TimerOne.h>
#include "SystemFont5x7.h"
#include "Arial_black_16.h"
DMD display(1,1);    //Un panel horizontal 
//DMD display(2,1);  //Descomente si va utilizar dos paneles horizontales 
//DMD display(3,1);  //Descomente si va utilizar tres paneles horizontales

void ScanDMD()

  display.scanDisplayBySPI();
}

void setup() {
   Timer1.initialize( 3000 );           
   Timer1.attachInterrupt(ScanDMD);    
}

 void loop(){
   display.clearScreen(true);                          //borra pantalla  
   display.clearScreen( true );
   display.selectFont(Arial_Black_16);
   display.drawChar(  0,  1, '2', GRAPHICS_NORMAL );
   display.drawChar(  7,  1, '3', GRAPHICS_NORMAL );
   display.drawChar( 17,  1, '4', GRAPHICS_NORMAL );
   display.drawChar( 25,  1, '5', GRAPHICS_NORMAL );
   display.drawChar( 15,  1, ':', GRAPHICS_OR     );   // enciende puntos
   delay( 1000 );
   display.drawChar( 15,  1, ':', GRAPHICS_NOR    );   // apaga puntos
   delay( 1000 );
   display.drawChar( 15,  1, ':', GRAPHICS_OR     );   // enciende puntos 
   delay( 1000 );
   display.drawChar( 15,  1, ':', GRAPHICS_NOR    );   // apaga puntos
   delay( 1000 );
   display.drawChar( 15,  1, ':', GRAPHICS_OR     );   // enciende ppuntos
   delay( 1000 );
   display.clearScreen( true );
   display.selectFont(System5x7);                      // selecciona letra pequeña
   display.drawString(5,0,"hola",4,  GRAPHICS_NORMAL); // escribe una cadena de 4 letras
   display.drawString(1,9,"Mundo",5, GRAPHICS_NORMAL); // escribe una cadena de 5 letras
   delay( 2000 );
    }

Ejemplo 3. Desplazamiento del Display

/* Este codigo hace una demostracion de como escribir texto y rotar en pantalla
//CONEXIONES:
//ARDUINO________________DMD
//PIN9___________________OE
//PIN6___________________A
//PIN7___________________B
//PIN13__________________SLK
//PIN8___________________SCLK
//PIN11__________________SPI
*/
#include <SPI.h>        
#include <DMD.h>        
#include <TimerOne.h>   
#include "SystemFont5x7.h"
#include "Arial_black_16.h"
#define DISPLAYS_ACROSS 1 /// si desea que funcione con dos paneles tiene que cambiar a #define DISPLAYS_ACROSS 2
#define DISPLAYS_DOWN 1
char *MSG = "AZOGUES";
DMD dmd(DISPLAYS_ACROSS, DISPLAYS_DOWN);

void ScanDMD()

  dmd.scanDisplayBySPI();
}

void setup(void)
{
  Timer1.initialize(300);
  Timer1.attachInterrupt(ScanDMD); 
  Serial.begin(115200);
  //dmd.selectFont(SystemFont5x7); //letra pequeña
  dmd.selectFont(Arial_Black_16);  //letra grande
}

void loop(void)
{
  MSG = "Probando matrices P10 16x32Pixels, dinoelectro.blogspot.com...  1234567890...  ABCDEFGHIJKLMNOPQRSTUVWXYZ...     ";
  dmd.clearScreen(true);
  dmd.drawMarquee(MSG,strlen(MSG),(32*DISPLAYS_ACROSS)-1,0);
  long start=millis();
  long timer=start;
  
  while(1){
  if ((timer+20)< millis()){
  dmd.stepMarquee(-1,0);
  timer=millis();
  }
  
  }
}

No hay comentarios.:

Publicar un comentario

CONSTRUYA UN ANALIZADOR DE ESPECTRO CON ARDUINO Y WINAMP

Este articulo explica como hacer un analizador de espectro utilizando el reproductor de música WINAMP y el Plugin "gen_crownsoft_lcd...