### 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/#]( 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.)
```C
/*
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/#](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.)
```C
/*
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.


