Proyecto 9 Tablero LED 8*16

Descripción

Si añades un tablero LED 8*16 al robot, será increíble. La matriz de puntos 8*16 de Keyestudio puede cumplir este requisito. Con ella, puedes crear emoticones faciales, patrones u otras pantallas interesantes por ti mismo. Este tablero de luz LED 8*16 viene con 128 LEDs. Los datos del microprocesador (Arduino) se comunican con el AiP1640 a través de la interfaz de bus de dos hilos, para controlar los 128 LEDs del módulo, que producen los patrones que necesitas en la matriz de puntos. Para facilitar el cableado, se proporciona un cableado HX-2.54 de 4 pines.

Especificación

  • Voltaje de funcionamiento: CC 3.3-5V

  • Pérdida de potencia: 400mW

  • Frecuencia de oscilación: 450KHz

  • Corriente de conducción: 200mA

  • Temperatura de funcionamiento: -40~80℃

  • Método de comunicación: bus de dos hilos

Componentes

Pantalla de Matriz de Puntos 8*16

Diagrama del Circuito

El principio de la matriz de puntos 8*16:

¿Cómo controlar cada luz LED de la matriz de puntos 8*16? Sabemos que un byte tiene 8 bits, y cada bit es 0 o 1. Cuando un bit es 0, se apaga el LED y cuando un bit es 1, se enciende el LED. De esta manera, un byte puede controlar el LED en una fila de la matriz de puntos, por lo que 16 bytes pueden controlar 16 columnas de luces LED, es decir, una matriz de puntos 8*16.

Descripción de la Interfaz y Protocolo de Comunicación:

Los datos del microprocesador (Arduino) se comunican con el AiP1640 a través de la interfaz de bus de dos hilos.

El diagrama del protocolo de comunicación se muestra a continuación:

(SCLK) es SCL, (DIN) es SDA:

①La condición de inicio para la entrada de datos: SCL está en nivel alto y SDA cambia de alto a bajo.

②Para la configuración del comando de datos, hay métodos como se muestra en la figura a continuación:

En nuestro programa de ejemplo, selecciona la forma de añadir 1 a la dirección automáticamente, el valor binario es 0100 0000 y el valor hexadecimal correspondiente es 0x40.

③Para la configuración del comando de dirección, la dirección se puede seleccionar como se muestra a continuación.

El primer 00H se selecciona en nuestro programa de ejemplo, y el número binario 1100 0000 corresponde al hexadecimal 0xc0.

④El requisito para la entrada de datos es que SCL esté en nivel alto al introducir datos, y la señal en SDA debe permanecer sin cambios. Solo cuando la señal de reloj en SCL está en nivel bajo, la señal en SDA puede ser alterada. La entrada de datos es de orden bajo primero, orden alto después.

⑤ La condición para terminar la transmisión de datos es que cuando SCL está bajo, SDA está bajo, y cuando SCL está alto, el nivel de SDA también se vuelve alto.

⑥ Control de pantalla, establece diferentes anchos de pulso, el ancho de pulso se puede seleccionar como se muestra a continuación.

En este ejemplo, elegimos ancho de pulso 4/16, y el hexadecimal correspondiente a 1000 1010 es 0x8A.

4. Introducción a la Herramienta de Módulo

La versión en línea de la herramienta de módulo de matriz de puntos:

http://dotmatrixtool.com/#

①Abre el enlace para entrar en la siguiente página.

②La matriz de puntos es 8*16 en este proyecto, así que establece la altura a 8, ancho a 16, como se muestra a continuación.

③ Genera datos hexadecimales a partir del patrón

Como se muestra a continuación, presiona el botón izquierdo del ratón para seleccionar, el botón derecho para cancelar, dibuja el patrón que deseas, haz clic en Generate, y se producirán los datos hexadecimales que necesitamos.

Diagrama de Conexión

Nota de cableado: El GND, VCC, SDA y SCL del panel LED 8x16 están conectados respectivamente a -(GND), + (VCC), A4 y A5 de la placa de expansión de sensores keyestudio para comunicación serial de dos hilos. (Nota: Este pin está conectado a Arduino IIC, pero este módulo no es comunicación IIC. Puede vincularse con cualquier dos pines.)

Código de Prueba

El código que muestra una cara sonriente.

/*
 keyestudio Mini Tank Robot V2.1
 lección 9.1
 Cara de matriz
 http://www.keyestudio.com
*/ 
// Los datos de la cara sonriente de la herramienta de módulo
unsigned char smile[] = {0x00, 0x00, 0x1c, 0x02, 0x02, 0x02, 0x5c, 0x40, 0x40, 0x5c, 0x02, 0x02, 0x02, 0x1c, 0x00, 0x00};

#define SCL_Pin  A5  // Establece el pin de reloj a A5
#define SDA_Pin  A4  // Establece el pin de datos a A4

void setup()
{
  // Establece el pin como salida
  pinMode(SCL_Pin,OUTPUT);
  pinMode(SDA_Pin,OUTPUT);
  // Limpia la pantalla
  // matrix_display(clear);
}

void loop()
{
  matrix_display(smile);  // Muestra cara sonriente
}
// La función para la visualización de matriz de puntos

void matrix_display(unsigned char matrix_value[])
{
  IIC_start();  // Usa la función de la condición de inicio de transmisión de datos
  IIC_send(0xc0);  // Selecciona dirección
  
  for(int i = 0;i < 16;i++) // Los datos del patrón tienen 16 bits
  {
     IIC_send(matrix_value[i]); // Transmite los datos del patrón
  }

  IIC_end();   // Termina la transmisión de datos del patrón
  IIC_start();
  IIC_send(0x8A);  // Control de pantalla, establece ancho de pulso a 4/16 s
  IIC_end();
}

// La condición para comenzar a transmitir datos
void IIC_start()
{
  digitalWrite(SCL_Pin,HIGH);
  delayMicroseconds(3);
  digitalWrite(SDA_Pin,HIGH);
  delayMicroseconds(3);
  digitalWrite(SDA_Pin,LOW);
  delayMicroseconds(3);
}
// Transmite datos
void IIC_send(unsigned char send_data)
{
  for(char i = 0;i < 8;i++)  // Cada byte tiene 8 bits, 8 bits para cada carácter
  {
      digitalWrite(SCL_Pin,LOW);  // Baja el pin de reloj SCL_Pin para cambiar la señal de SDA
      delayMicroseconds(3);
      if(send_data & 0x01)  // Establece el nivel alto y bajo de SDA_Pin según 1 o 0 de cada bit
      {
        digitalWrite(SDA_Pin,HIGH);
      }
      else
      {
        digitalWrite(SDA_Pin,LOW);
      }
      delayMicroseconds(3);
      digitalWrite(SCL_Pin,HIGH); // Sube el pin de reloj SCL_Pin para detener la transmisión
      delayMicroseconds(3);
      send_data = send_data >> 1;  // Detecta bit a bit, desplaza los datos a la derecha por uno
  }
}

// El signo de terminar la transmisión de datos
void IIC_end()
{
  digitalWrite(SCL_Pin,LOW);
  delayMicroseconds(3);
  digitalWrite(SDA_Pin,LOW);
  delayMicroseconds(3);
  digitalWrite(SCL_Pin,HIGH);
  delayMicroseconds(3);
  digitalWrite(SDA_Pin,HIGH);
  delayMicroseconds(3);
}
//******************************************************

Resultado de la Prueba

Cableado según el diagrama de conexión. El interruptor DIP se gira hacia el extremo derecho y se enciende, aparece una cara sonriente en la matriz de puntos.

Práctica de Extensión

Usamos la herramienta de módulo (http://dotmatrixtool.com/#) para hacer que la matriz de puntos muestre alternativamente patrones de avance, retroceso y parada, luego limpie los patrones, y el intervalo de tiempo es de 2000 milisegundos.

Obtén el código gráfico a mostrar a través de la herramienta de módulo.

Inicio: 0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80,0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01

Avanzar: 0x00,0x00,0x00,0x00,0x00,0x24,0x12,0x09,0x12,0x24,0x00,0x00,0x00,0x00,0x00,0x00

Retroceder: 0x00,0x00,0x00,0x00,0x00,0x24,0x48,0x90,0x48,0x24,0x00,0x00,0x00,0x00,0x00,0x00

Girar a la izquierda: 0x00,0x00,0x00,0x00,0x00,0x00,0x44,0x28,0x10,0x44,0x28,0x10,0x44,0x28,0x10,0x00

Girar a la derecha: 0x00,0x10,0x28,0x44,0x10,0x28,0x44,0x10,0x28,0x44,0x00,0x00,0x00,0x00,0x00,0x00

Parar: 0x2E,0x2A,0x3A,0x00,0x02,0x3E,0x02,0x00,0x3E,0x22,0x3E,0x00,0x3E,0x0A,0x0E,0x00

Código para limpiar la pantalla:0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00

El código para múltiples patrones en desplazamiento:

/* keyestudio Mini Tank Robot V2.1
 lección 9.2
 Bucle de matriz
 http://www.keyestudio.com
*/ 
// Matriz, utilizada para almacenar los datos del patrón, puede ser calculada por ti mismo u obtenida de la herramienta de módulo
unsigned char start01[] = 
{0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80,0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01};
unsigned char front[] = 
{0x00,0x00,0x00,0x00,0x00,0x24,0x12,0x09,0x12,0x24,0x00,0x00,0x00,0x00,0x00,0x00};
unsigned char back[] = 
{0x00,0x00,0x00,0x00,0x00,0x24,0x48,0x90,0x48,0x24,0x00,0x00,0x00,0x00,0x00,0x00};
unsigned char left[] = 
{0x00,0x00,0x00,0x00,0x00,0x00,0x44,0x28,0x10,0x44,0x28,0x10,0x44,0x28,0x10,0x00};
unsigned char right[] = 
{0x00,0x10,0x28,0x44,0x10,0x28,0x44,0x10,0x28,0x44,0x00,0x00,0x00,0x00,0x00,0x00};
unsigned char STOP01[] = 
{0x2E,0x2A,0x3A,0x00,0x02,0x3E,0x02,0x00,0x3E,0x22,0x3E,0x00,0x3E,0x0A,0x0E,0x00};
unsigned char clear[] = 
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
#define SCL_Pin  A5  // Establece el pin de reloj a A5
#define SDA_Pin  A4  // Establece el pin de datos a A4
void setup(){
  // Establece los pines como salida
  pinMode(SCL_Pin,OUTPUT);
  pinMode(SDA_Pin,OUTPUT);
  // Limpia la pantalla
  matrix_display(clear);
}
void loop(){
  matrix_display(start01);  // Muestra patrón de inicio
  delay(2000);
  matrix_display(front);    // Patrón de avance
  delay(2000);
  matrix_display(STOP01);   // Patrón de parada
  delay(2000);
  matrix_display(clear);    // Limpia la pantalla
  delay(2000);
}
// Esta función se utiliza para la visualización de matriz de puntos
void matrix_display(unsigned char matrix_value[])
{
  IIC_start();  // Llama a la función de inicio de transmisión de datos
  IIC_send(0xc0);  // Elige dirección
  
  for(int i = 0;i < 16;i++) // Los datos del patrón tienen 16 bits
  {
     IIC_send(matrix_value[i]); // Datos para transmitir patrones
  }
  IIC_end();   // Termina la transmisión de datos del patrón
  IIC_start();
  IIC_send(0x8A);  // Control de pantalla, establece ancho de pulso a 4/16
  IIC_end();
}
// La condición para comenzar a transmitir datos
void IIC_start()
{
  digitalWrite(SCL_Pin,HIGH);
  delayMicroseconds(3);
  digitalWrite(SDA_Pin,HIGH);
  delayMicroseconds(3);
  digitalWrite(SDA_Pin,LOW);
  delayMicroseconds(3);
}
// Transmite datos
void IIC_send(unsigned char send_data)
{
  for(char i = 0;i < 8;i++)  // Cada byte tiene 8 bits
  {
      digitalWrite(SCL_Pin,LOW);  // Baja el pin de reloj SCL para cambiar las señales de SDA
      delayMicroseconds(3);
      if(send_data & 0x01)  // Establece el nivel alto y bajo de SDA_Pin según 1 o 0 de cada bit
      {
        digitalWrite(SDA_Pin,HIGH);
      }
      else
      {
        digitalWrite(SDA_Pin,LOW);
      }
      delayMicroseconds(3);
      digitalWrite(SCL_Pin,HIGH); // Sube el pin de reloj SCL para detener la transmisión de datos
      delayMicroseconds(3);
      send_data = send_data >> 1;  // Detecta bit a bit, desplaza los datos a la derecha por uno
  }}
// El signo de que la transmisión de datos termina
void IIC_end()
{
  digitalWrite(SCL_Pin,LOW);
  delayMicroseconds(3);
  digitalWrite(SDA_Pin,LOW);
  delayMicroseconds(3);
  digitalWrite(SCL_Pin,HIGH);
  delayMicroseconds(3);
  digitalWrite(SDA_Pin,HIGH);
  delayMicroseconds(3);} 
//*****************************************************

Carga el código en la placa de desarrollo, la matriz de puntos 8*16 muestra patrones de avance, retroceso y parada, alternativamente.