Progetto 9: Matrice LED per Espressioni Facciali 8*16

(1)Descrizione:

Non sarebbe divertente aggiungere un pannello per le espressioni al robot? La matrice LED 8*16 di Keyestudio può fare al caso nostro. Con il suo aiuto, puoi progettare espressioni facciali, immagini, pattern e altri display da solo.

La scheda LED 8*16 è dotata di 128 LED. I dati del microprocessore (Arduino) comunicano con l’AiP1640 attraverso un’interfaccia bus a due fili. Pertanto, può controllare l’accensione e lo spegnimento dei 128 LED sul modulo, in modo da far visualizzare alla matrice di punti sul modulo il pattern desiderato. È fornito un cavo HX-2.54 4Pin per la comodità del collegamento.

(2)Parametri:

  • Tensione di lavoro: DC 3.3-5V

  • Dissipazione di potenza: 400mW

  • Frequenza di oscillazione: 450KHz

  • Corrente di pilotaggio: 200mA

  • Temperatura di lavoro: -40~80℃

  • Modalità di comunicazione: bus a due fili

(3)Nozioni:

Principio della matrice LED 8*16

Come controllare ogni LED della matrice di punti 8*16? È noto che ogni byte ha 8 bit e ogni bit è 0 o 1. Quando è 0, il LED è spento, mentre quando è 1 il LED è acceso. Un byte può controllare una colonna del LED, e naturalmente 16 byte possono controllare 16 colonne di LED, questa è la matrice di punti 8*16.

Descrizione dei pin e protocollo di comunicazione

I dati del microprocessore (Arduino) comunicano con l’AiP1640 attraverso un cavo bus a due fili.

Il diagramma del protocollo di comunicazione è il seguente: (SCLK) è SCL, (DIN) è SDA

①La condizione iniziale per l’ingresso dei dati: SCL è ad alto livello e SDA passa da alto a basso.

②Per l’impostazione del comando dati, esistono i metodi mostrati nella figura seguente

Nel nostro programma di esempio, seleziona il metodo per aggiungere automaticamente 1 all’indirizzo, il valore binario è 0100 0000 e il corrispondente valore esadecimale è 0x40

③Per l’impostazione del comando di indirizzo, l’indirizzo può essere selezionato come mostrato di seguito.

Nel nostro programma di esempio viene selezionato il primo 00H, e il numero binario 1100 0000 corrisponde all’esadecimale 0xc0

④Il requisito per l’ingresso dei dati è che quando SCL è ad alto livello durante l’ingresso dei dati, il segnale su SDA deve rimanere invariato. Solo quando il segnale di clock su SCL è a basso livello, il segnale su SDA può essere modificato. L’ingresso dei dati avviene prima con il bit meno significativo e poi con il bit più significativo.

⑤La condizione per la fine della trasmissione dei dati è che quando SCL è a basso livello, SDA a basso livello e SCL ad alto livello, il livello di SDA diventa alto.

⑥Controllo del display, impostare diverse larghezze di impulso; la larghezza di impulso può essere selezionata come mostrato nella figura seguente. Nell’esempio, la larghezza di impulso è 4/16, e l’esadecimale corrispondente a 1000 1010 è 0x8A

Istruzioni per l’uso dello strumento di modulazione

Lo strumento per la matrice di punti utilizza la versione online, e il link è: http://dotmatrixtool.com/#

①Inserisci il link e la pagina appare come mostrato di seguito

②La matrice di punti è 8*16, quindi regola l’altezza a 8 e la larghezza a 16, come mostrato nella figura seguente

③Genera dati esadecimali dal pattern

Come mostrato nella figura seguente, premi il tasto sinistro del mouse per selezionare, fai clic destro per annullare; disegna il pattern che desideri, fai clic su Generate, e verranno generati i dati esadecimali necessari.

(4)Schema di Collegamento:

GND, VCC, SDA e SCL della scheda LED 8x16 sono collegati rispettivamente alla scheda di espansione sensori keyestudio -(GND), +(VCC), A4, A5 per la comunicazione seriale a due fili.

(Nota: sebbene sia collegato al pin IIC di Arduino, questo modulo non è per la comunicazione IIC. La porta IO qui serve per simulare la comunicazione I2C e può essere collegata a qualsiasi due pin)

(5)Codice di Test:

Il codice per mostrare la faccina sorridente

(Nota: Non collegare il modulo Bluetooth prima di caricare il codice, perché il caricamento del codice utilizza anche la comunicazione seriale, e potrebbero esserci conflitti con la comunicazione seriale Bluetooth, che possono causare il fallimento del caricamento.)

/*
  Keyestudio Mini Tank Robot V3 (Popular Edition)
  lesson 9.1
  Matrix face
  http://www.keyestudio.com
*/
// ottieni i dati dell'immagine sorridente da uno strumento di modulazione
unsigned char smile[] = {0x00, 0x00, 0x1c, 0x02, 0x02, 0x02, 0x5c, 0x40, 0x40, 0x5c, 0x02, 0x02, 0x02, 0x1c, 0x00, 0x00};

#define SCL_Pin  A5  // imposta il pin del clock su A5
#define SDA_Pin  A4  // imposta il pin dei dati su A4

void setup() {
  // imposta il pin su OUTPUT
  pinMode(SCL_Pin, OUTPUT);
  pinMode(SDA_Pin, OUTPUT);
  // pulisci lo schermo
  //matrix_display(clear);
}
void loop() {
  matrix_display(smile);  // visualizza l'immagine sorridente
}
// questa funzione è utilizzata per il display della matrice di punti
void matrix_display(unsigned char matrix_value[])
{
  IIC_start();  // usa la funzione per iniziare la trasmissione dei dati
  IIC_send(0xc0);  // seleziona un indirizzo

  for (int i = 0; i < 16; i++) // i dati dell'immagine hanno 16 caratteri
  {
    IIC_send(matrix_value[i]); // dati per trasmettere le immagini
  }

  IIC_end();   // termina la trasmissione dei dati delle immagini

  IIC_start();
  IIC_send(0x8A);  // mostra il controllo e seleziona la larghezza di impulso 4/16
  IIC_end();
}

// la condizione che i dati inizino a trasmettere
void IIC_start()
{
  digitalWrite(SDA_Pin, HIGH);
  digitalWrite(SCL_Pin, HIGH);
  delayMicroseconds(3);
  digitalWrite(SDA_Pin, LOW);
  delayMicroseconds(3);
  digitalWrite(SCL_Pin, LOW);
}

// il segnale che la trasmissione dei dati è terminata
void IIC_end()
{
  digitalWrite(SCL_Pin, LOW);
  digitalWrite(SDA_Pin, LOW);
  delayMicroseconds(3);
  digitalWrite(SCL_Pin, HIGH);
  delayMicroseconds(3);
  digitalWrite(SDA_Pin, HIGH);
  delayMicroseconds(3);
}

// trasmetti i dati
void IIC_send(unsigned char send_data)
{
  for (byte mask = 0x01; mask != 0; mask <<= 1) // ogni carattere ha 8 cifre, che vengono rilevate una per una
  {
    if (send_data & mask) { // imposta livelli alti o bassi in base a ogni bit (0 o 1)
      digitalWrite(SDA_Pin, HIGH);
    } else {
      digitalWrite(SDA_Pin, LOW);
    }
    delayMicroseconds(3);
    digitalWrite(SCL_Pin, HIGH); // alza il pin del clock SCL_Pin per terminare la trasmissione dei dati
    delayMicroseconds(3);
    digitalWrite(SCL_Pin, LOW); // abbassa il pin del clock SCL_Pin per cambiare i segnali di SDA
  }
}

(6)Risultati del Test:

Dopo aver caricato con successo il codice di test, collegato secondo il diagramma di cablaggio, posizionato il selettore DIP verso destra e alimentato il dispositivo, sulla matrice di punti appare un pattern a forma di faccina sorridente.

(7)Progetto di Espansione:

Utilizziamo lo strumento di modulazione appena appreso, http://dotmatrixtool.com/#, per far visualizzare alla matrice di punti i pattern di avvio, avanzamento e arresto, e poi pulire il pattern. L’intervallo di tempo è di 2000 ms.

Codice ottenuto dallo strumento di modulazione:

Codice per il pattern di avvio:

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

Codice per il pattern di avanzamento:

0x00,0x00,0x00,0x00,0x00,0x24,0x12,0x09,0x12,0x24,0x00,0x00,0x00,0x00,0x00,0x00

Codice per il pattern di retromarcia:

0x00,0x00,0x00,0x00,0x00,0x24,0x48,0x90,0x48,0x24,0x00,0x00,0x00,0x00,0x00,0x00

Codice per il pattern di svolta a sinistra:

0x00,0x00,0x00,0x00,0x00,0x00,0x44,0x28,0x10,0x44,0x28,0x10,0x44,0x28,0x10,0x00

Codice per il pattern di svolta a destra:

0x00,0x10,0x28,0x44,0x10,0x28,0x44,0x10,0x28,0x44,0x00,0x00,0x00,0x00,0x00,0x00

Codice per il pattern di arresto:

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

Codice per pulire lo schermo:

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00

Codice di Test

(Nota: Non collegare il modulo Bluetooth prima di caricare il codice, perché il caricamento del codice utilizza anche la comunicazione seriale, e potrebbero esserci conflitti con la comunicazione seriale Bluetooth, che possono causare il fallimento del caricamento.)

/*
  keyestudio Mini Tank Robot V3 (Popular Edition)
  lesson 9.2
  Matrix face
  http://www.keyestudio.com
*/

// Array, utilizzato per salvare i dati delle immagini, può essere calcolato manualmente o ottenuto dallo strumento di modulazione
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  // imposta il pin del clock su A5
#define SDA_Pin  A4  // imposta il pin dei dati su A4

void setup() {
  // imposta il pin su OUTPUT
  pinMode(SCL_Pin, OUTPUT);
  pinMode(SDA_Pin, OUTPUT);
  // pulisci lo schermo
  matrix_display(clear);
}
void loop() {
  matrix_display(start01);  // mostra l'immagine "Start"
  delay(2000);
  matrix_display(front);    // mostra l'immagine "front"
  delay(2000);
  matrix_display(STOP01);   // mostra l'immagine "STOP01"
  delay(2000);
  matrix_display(clear);    // mostra l'immagine "clear"
  delay(2000);
}
// questa funzione è utilizzata per il display della matrice di punti
void matrix_display(unsigned char matrix_value[])
{
  IIC_start();  // usa la funzione per iniziare la trasmissione dei dati
  IIC_send(0xc0);  // seleziona un indirizzo

  for (int i = 0; i < 16; i++) // i dati dell'immagine hanno 16 caratteri
  {
    IIC_send(matrix_value[i]); // dati per trasmettere le immagini
  }

  IIC_end();   // termina la trasmissione dei dati delle immagini

  IIC_start();
  IIC_send(0x8A);  // mostra il controllo e seleziona la larghezza di impulso 4/16
  IIC_end();
}

// la condizione che i dati inizino a trasmettere
void IIC_start()
{
  digitalWrite(SDA_Pin, HIGH);
  digitalWrite(SCL_Pin, HIGH);
  delayMicroseconds(3);
  digitalWrite(SDA_Pin, LOW);
  delayMicroseconds(3);
  digitalWrite(SCL_Pin, LOW);
}

// il segnale che la trasmissione dei dati è terminata
void IIC_end()
{
  digitalWrite(SCL_Pin, LOW);
  digitalWrite(SDA_Pin, LOW);
  delayMicroseconds(3);
  digitalWrite(SCL_Pin, HIGH);
  delayMicroseconds(3);
  digitalWrite(SDA_Pin, HIGH);
  delayMicroseconds(3);
}

// trasmetti i dati
void IIC_send(unsigned char send_data)
{
  for (byte mask = 0x01; mask != 0; mask <<= 1) // ogni carattere ha 8 cifre, che vengono rilevate una per una
  {
    if (send_data & mask) { // imposta livelli alti o bassi in base a ogni bit (0 o 1)
      digitalWrite(SDA_Pin, HIGH);
    } else {
      digitalWrite(SDA_Pin, LOW);
    }
    delayMicroseconds(3);
    digitalWrite(SCL_Pin, HIGH); // alza il pin del clock SCL_Pin per terminare la trasmissione dei dati
    delayMicroseconds(3);
    digitalWrite(SCL_Pin, LOW); // abbassa il pin del clock SCL_Pin per cambiare i segnali di SDA
  }
}

Dopo aver caricato il codice di test, il pannello per le espressioni facciali mostra questi pattern in ordine e ripete questa sequenza.