Progetto 9 Pannello LED con Espressione Facciale

image-20250510090912741

1.Descrizione

Quanto è divertente aggiungere un pannello di espressioni al robot. E il pannello LED Keyestudio 8*16 può fare al caso vostro. Con il suo aiuto, potrete progettare espressioni facciali, immagini, motivi e altre visualizzazioni da soli.

Il pannello LED 8*16 è dotato di 128 LED. I dati del microprocessore (Arduino) comunicano con l’AiP1640 tramite un’interfaccia bus a due fili. Pertanto, può controllare l’accensione e lo spegnimento dei 128 LED sul modulo, in modo da far visualizzare al display a matrice di punti sul modulo il motivo desiderato. È fornito un cavo HX-2.54 a 4 pin per facilitare il cablaggio.

2.Specifiche

  • Tensione di lavoro: DC 3.3-5V

  • Perdita di potenza: 400mW

  • Frequenza di oscillazione: 450KHz

  • Corrente di pilotaggio: 200mA

  • Temperatura di lavoro: -40~80℃

  • Modalità di comunicazione: I2C

3.Diagramma Circuitale

image-20250510091309725

4.Principio di Funzionamento

Come controllare ogni LED della matrice a punti 8*16? Si sa 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 di LED, e naturalmente 16 byte possono controllare 16 colonne di LED, questa è la matrice a punti 8*16.

5.Descrizione dei Pin e Protocollo di Comunicazione

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

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

image-20250510091407219

①Condizione di inizio per l’input dei dati: SCL è a livello alto e SDA cambia da alto a basso.

②Per l’impostazione del comando dati, ci sono i metodi mostrati nella figura sottostante.

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

Img

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

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

Img

④La richiesta per l’input dei dati è che quando SCL è a livello alto durante l’input dei dati, il segnale su SDA deve rimanere invariato. Solo quando il segnale di clock su SCL è a livello basso, il segnale su SDA può essere cambiato. L’input dei dati avviene dal bit basso prima, e dal bit alto dopo.

⑤La condizione per la fine della trasmissione dati è che quando SCL è a livello basso, SDA a livello basso e SCL a livello alto, 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 sottostante.

Nell’esempio, la larghezza di impulso è 4/16, e l’esadecimale corrispondente a 1000 1010 è 0x8A.

Img

Istruzioni per l’uso dello strumento modulo

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

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

image-20250510091438524

②La matrice a punti è 8*16, quindi regolare l’altezza a 8 e la larghezza a 16, come mostrato nella figura sottostante.

image-20250510091446519

③Generare dati esadecimali dal motivo

Come mostrato nella figura sottostante, premere il tasto sinistro del mouse per selezionare, cliccare con il tasto destro per annullare; disegnare il motivo desiderato, cliccare su Generate, e verranno generati i dati esadecimali necessari.

image-20250510091457463

6.Componenti

Scheda di Sviluppo *1

Driver Motore 8833 *1

Cavo USB*1

img

img

img

Cavo USB*1

Filo Dupont HX-2.54 4P 200mm *1

image-20250512155818434

image-20250512155822969

7.Diagramma di Collegamento

cec50fec4a335b6922e4c6694a133bc1

Il GND, VCC, SDA e SCL della scheda LED 8x16 sono rispettivamente collegati 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 comunicazione IIC. E la porta IO qui serve a simulare la comunicazione I2C e può essere collegata a qualsiasi due pin).

8.Codice di Test

Il codice mostrerà una faccina sorridente.

//************************************************************************
/*
 keyestudio 4wd BT Car
  lezione 9.1
  Faccia a matrice
  http://www.keyestudio.com
*/
//Dati del pattern sorriso ottenuti dallo strumento touch
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 clock su A5
#define SDA_Pin  A4  //Imposta il pin dati su A4
void setup() {
  //Imposta i pin come output
  pinMode(SCL_Pin, OUTPUT);
  pinMode(SDA_Pin, OUTPUT);
  //pulisci
  //matrix_display(clear);
}
void loop() {
  matrix_display(smile);  //mostra il pattern dell'espressione sorridente
}
//questa funzione è usata per la visualizzazione a matrice di punti
void matrix_display(unsigned char matrix_value[])
{
  IIC_start();  //funzione che chiama la condizione di inizio trasferimento dati
  IIC_send(0xc0);  //seleziona indirizzo

  for (int i = 0; i < 16; i++) //i dati del pattern sono 16 byte
  {
    IIC_send(matrix_value[i]); //Trasmette i dati del pattern
  }
  IIC_end();   //Termina la trasmissione dei dati del pattern
  IIC_start();
  IIC_send(0x8A);  //Controllo display, seleziona larghezza impulso 4/16
  IIC_end();
}
//Condizioni in cui inizia la trasmissione dati
void IIC_start()
{
  digitalWrite(SDA_Pin, HIGH);
  digitalWrite(SCL_Pin, HIGH);
  delayMicroseconds(3);
  digitalWrite(SDA_Pin, LOW);
  delayMicroseconds(3);
  digitalWrite(SCL_Pin, LOW);
}
//Indica la fine della trasmissione dati
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);
}
//trasmette dati
void IIC_send(unsigned char send_data)
{
  for (byte mask = 0x01; mask != 0; mask <<= 1) //Ogni byte ha 8 bit e viene controllato bit per bit a partire dal meno significativo
  {
    if (send_data & mask) { //Imposta i livelli alto e basso di SDA_Pin a seconda che ogni bit del byte sia 1 o 0
      digitalWrite(SDA_Pin, HIGH);
    } else {
      digitalWrite(SDA_Pin, LOW);
    }
    delayMicroseconds(3);
    digitalWrite(SCL_Pin, HIGH); //Alza il pin clock SCL_Pin per fermare la trasmissione dati
    delayMicroseconds(3);
    digitalWrite(SCL_Pin, LOW); //Abbassa il pin clock SCL_Pin per cambiare il SEGNALE di SDA 
  }
}
//************************************************************************

9.Risultato del Test

Dopo aver caricato con successo il codice sulla scheda V4.0, collegare i fili secondo il diagramma di collegamento, quindi impostare l’interruttore DIP su ON, verrà visualizzato un pattern a forma di sorriso sulla scheda LED.

95bb011957896b12285fc6763137bb9a

10.Spiegazione del Codice

Utilizziamo lo strumento modulo che abbiamo appena imparato, http://dotmatrixtool.com/#, per far visualizzare al display a matrice di punti il pattern di avvio, andare avanti, fermarsi e poi cancellare il pattern. L’intervallo di tempo è di 2000 ms.

image-20250512155957415image-20250512160002378image-20250512160006841image-20250512160010543

Codice ottenuto dallo strumento modulo:

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 andare avanti:

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

Codice per il pattern fare un passo indietro:

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

Codice per il pattern girare a sinistra:

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

Codice per il pattern girare a destra:

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

Codice per il pattern stop:

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

Codice per cancellare lo schermo:

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

cec50fec4a335b6922e4c6694a133bc1

//************************************************************************
/*
 keyestudio 4wd BT Car
  lezione 9.2
  Faccia matrice
  http://www.keyestudio.com
*/
//Dati del pattern sorriso ottenuti dallo strumento touch
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 clock su A5
#define SDA_Pin  A4  //Imposta il pin dati su A4
void setup() {
  //Imposta i pin come output
  pinMode(SCL_Pin, OUTPUT);
  pinMode(SDA_Pin, OUTPUT);
  //cancella
  //matrix_display(clear);
}
void loop() {
    matrix_display(start01);  //Mostra il pattern di avvio
    delay(2000);
    matrix_display(front);    //Mostra il pattern andare avanti
    delay(2000);
    matrix_display(STOP01);   //Mostra il pattern stop
    delay(2000);
    matrix_display(clear);    //Pulisce lo schermo
    delay(2000);
}
//questa funzione è usata per la visualizzazione sulla matrice di punti
void matrix_display(unsigned char matrix_value[])
{
  IIC_start();  //funzione che chiama la condizione di start per il trasferimento dati
  IIC_send(0xc0);  //seleziona indirizzo

  for (int i = 0; i < 16; i++) // i dati del pattern sono 16 byte
  {
    IIC_send(matrix_value[i]); //Trasmetti i dati del pattern
  }
  IIC_end();   //Termina la trasmissione dei dati del pattern
  IIC_start();
  IIC_send(0x8A);  //Controllo display, seleziona larghezza impulso 4/16
  IIC_end();
}
//Condizioni in cui inizia la trasmissione dei dati
void IIC_start()
{
  digitalWrite(SDA_Pin, HIGH);
  digitalWrite(SCL_Pin, HIGH);
  delayMicroseconds(3);
  digitalWrite(SDA_Pin, LOW);
  delayMicroseconds(3);
  digitalWrite(SCL_Pin, LOW);
}
//Indica la fine della trasmissione dei dati
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 dati
void IIC_send(unsigned char send_data)
{
  for (byte mask = 0x01; mask != 0; mask <<= 1) //Ogni byte ha 8 bit e viene controllato bit per bit a partire dal livello più basso
  {
    if (send_data & mask) { //Imposta i livelli alto e basso di SDA_Pin a seconda che ogni bit del byte sia 1 o 0
      digitalWrite(SDA_Pin, HIGH);
    } else {
      digitalWrite(SDA_Pin, LOW);
    }
    delayMicroseconds(3);
    digitalWrite(SCL_Pin, HIGH); //Porta alto il pin clock SCL_Pin per fermare la trasmissione dei dati
    delayMicroseconds(3);
    digitalWrite(SCL_Pin, LOW); //Porta basso il pin clock SCL_Pin per cambiare il SEGNALE di SDA 
  }
}
//************************************************************************

Dopo aver caricato il codice di test, la scheda con espressioni facciali mostra questi pattern in ordine e ripete questa sequenza.

image-20250512160131674image-20250512160135717image-20250512160139283