Progetto 9 Pannello LED con Espressione Facciale

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

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.

①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.

③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.

④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.

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

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

③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.

6.Componenti
Scheda di Sviluppo *1 |
Driver Motore 8833 *1 |
Cavo USB*1 |
|---|---|---|
|
|
|
Cavo USB*1 |
Filo Dupont HX-2.54 4P 200mm *1 |
|
|
|
7.Diagramma di Collegamento

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.

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.




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

//************************************************************************
/*
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.







