Projekt 9 Gesichtsausdruck LED-Board

1. Beschreibung
Wie lustig wäre es, wenn ein Ausdrucksboard zum Roboter hinzugefügt wird. Und das Keyestudio 8*16 LED-Board kann genau das ermöglichen. Mit seiner Hilfe könnt ihr Gesichtsausdrücke, Bilder, Muster und andere Anzeigen selbst gestalten.
Das 8*16 LED-Board verfügt über 128 LEDs. Die Daten des Mikroprozessors (Arduino) kommunizieren über eine Zwei-Draht-Busschnittstelle mit dem AiP1640. Dadurch kann es das Ein- und Ausschalten der 128 LEDs auf dem Modul steuern, um die Punktmatrix auf dem Modul so anzuzeigen, dass das gewünschte Muster dargestellt wird. Ein HX-2.54 4Pin-Kabel wird für eine bequeme Verkabelung mitgeliefert.
2. Spezifikation
Betriebsspannung: DC 3,3-5V
Leistungsverlust: 400mW
Oszillationsfrequenz: 450KHz
Ansteuerstrom: 200mA
Arbeitstemperatur: -40~80℃
Kommunikationsmodus: I2C
3. Schaltplan

4. Funktionsprinzip
Wie steuert man jede LED der 8*16 Punktmatrix? Es ist bekannt, dass jedes Byte 8 Bits hat und jedes Bit 0 oder 1 ist. Wenn es 0 ist, ist die LED aus, wenn es 1 ist, ist die LED an. Ein Byte kann eine Spalte der LEDs steuern, und natürlich können 16 Bytes 16 Spalten von LEDs steuern, das ist die 8*16 Punktmatrix.
5. Pin-Beschreibung und Kommunikationsprotokoll
Die Daten des Mikroprozessors (Arduino) kommunizieren über ein Zwei-Draht-Buskabel mit dem AiP1640.
Das Kommunikationsprotokoll-Diagramm ist wie folgt (SCLK) ist SCL, (DIN) ist SDA.

① Die Startbedingung für die Dateneingabe: SCL ist auf hohem Pegel und SDA wechselt von hoch nach niedrig.
② Für die Datenbefehls-Einstellung gibt es die im folgenden Bild gezeigten Methoden.
In unserem Beispielprogramm wählen wir die Methode, die Adresse automatisch um 1 zu erhöhen, der Binärwert ist 0100 0000 und der entsprechende Hexadezimalwert ist 0x40.

③ Für die Adressbefehls-Einstellung kann die Adresse wie unten gezeigt ausgewählt werden.
Im Beispielprogramm wird die erste 00H ausgewählt, und die Binärzahl 1100 0000 entspricht dem Hexadezimalwert 0xc0.

④ Die Anforderung für die Dateneingabe ist, dass wenn SCL auf hohem Pegel ist, während der Dateneingabe das Signal auf SDA unverändert bleiben muss. Nur wenn das Taktsignal auf SCL auf niedrigem Pegel ist, darf das Signal auf SDA geändert werden. Die Dateneingabe erfolgt zuerst mit dem niederwertigen Bit, dann mit dem höherwertigen Bit.
⑤ Die Bedingung für das Ende der Datenübertragung ist, dass wenn SCL auf niedrigem Pegel, SDA auf niedrigem Pegel und SCL auf hohem Pegel ist, der Pegel von SDA auf hoch wechselt.
⑥ Anzeige-Steuerung, verschiedene Pulsweiten einstellen, die Pulsweite kann wie im Bild unten ausgewählt werden.
Im Beispiel ist die Pulsweite 4/16, und der Hexadezimalwert, der 1000 1010 entspricht, ist 0x8A.

Anleitung zur Verwendung des Modultools
Das Punktmatrix-Tool verwendet die Online-Version, der Link ist: http://dotmatrixtool.com/#
① Link eingeben und die Seite erscheint wie unten gezeigt

② Die Punktmatrix ist 8*16, also Höhe auf 8 und Breite auf 16 einstellen, wie im Bild unten gezeigt.

③ Hexadezimale Daten aus dem Muster generieren
Wie im Bild unten gezeigt, mit der linken Maustaste auswählen, mit der rechten Maustaste abwählen; das gewünschte Muster zeichnen, auf Generate klicken, und die benötigten hexadezimalen Daten werden generiert.

6. Komponenten
Development Board *1 |
8833 Motor Driver *1 |
USB-Kabel*1 |
|---|---|---|
|
|
|
USB-Kabel*1 |
HX-2.54 4P Dupont Kabel 200mm *1 |
|
|
|
7. Schaltplan

Die GND, VCC, SDA und SCL des 8x16 LED-Lichtboards sind jeweils mit dem keyestudio Sensor-Erweiterungsboard verbunden – (GND), + (VCC), A4, A5 für die Zwei-Draht-Serienkommunikation.
(Hinweis: Obwohl es mit dem IIC-Pin des Arduino verbunden ist, ist dieses Modul nicht für die IIC-Kommunikation gedacht. Und der IO-Port hier dient zur Simulation der I2C-Kommunikation und kann mit beliebigen zwei Pins verbunden werden).
8. Testcode
Der Code zeigt ein lächelndes Gesicht.
//************************************************************************
/*
keyestudio 4wd BT Car
lesson 9.1
Matrix face
http://www.keyestudio.com
*/
//Daten vom Smile-Muster, erhalten mit dem Touch-Tool
unsigned char smile[] = {0x00, 0x00, 0x1c, 0x02, 0x02, 0x02, 0x5c, 0x40, 0x40, 0x5c, 0x02, 0x02, 0x02, 0x1c, 0x00, 0x00};
#define SCL_Pin A5 //Setze den Clock-Pin auf A5
#define SDA_Pin A4 //Setze den Daten-Pin auf A4
void setup() {
//Setze Pin als Ausgang
pinMode(SCL_Pin, OUTPUT);
pinMode(SDA_Pin, OUTPUT);
//löschen
//matrix_display(clear);
}
void loop() {
matrix_display(smile); //zeige das lächelnde Ausdrucksmuster an
}
//diese Funktion wird für die Punktmatrixanzeige verwendet
void matrix_display(unsigned char matrix_value[])
{
IIC_start(); //Funktion, die die Datenübertragungs-Startbedingung aufruft
IIC_send(0xc0); //Adresse auswählen
for (int i = 0; i < 16; i++) //Das Musterdaten sind 16 Bytes
{
IIC_send(matrix_value[i]); //Übertrage die Daten des Musters
}
IIC_end(); //Beende die Musterdatenübertragung
IIC_start();
IIC_send(0x8A); //Anzeige-Steuerung, wähle 4/16 Pulsbreite
IIC_end();
}
//Bedingungen, unter denen die Datenübertragung beginnt
void IIC_start()
{
digitalWrite(SDA_Pin, HIGH);
digitalWrite(SCL_Pin, HIGH);
delayMicroseconds(3);
digitalWrite(SDA_Pin, LOW);
delayMicroseconds(3);
digitalWrite(SCL_Pin, LOW);
}
//Zeigt das Ende der Datenübertragung an
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);
}
//Daten übertragen
void IIC_send(unsigned char send_data)
{
for (byte mask = 0x01; mask != 0; mask <<= 1) //Jedes Byte hat 8 Bits und wird bitweise vom niedrigsten Bit geprüft
{
if (send_data & mask) { //Setzt die Pegel von SDA_Pin je nachdem, ob jedes Bit des Bytes eine 1 oder 0 ist
digitalWrite(SDA_Pin, HIGH);
} else {
digitalWrite(SDA_Pin, LOW);
}
delayMicroseconds(3);
digitalWrite(SCL_Pin, HIGH); //Ziehe den Clock-Pin SCL_Pin hoch, um die Datenübertragung zu stoppen
delayMicroseconds(3);
digitalWrite(SCL_Pin, LOW); //Ziehe den Clock-Pin SCL_Pin runter, um das SIGNAL von SDA zu ändern
}
}
//************************************************************************
9. Testergebnis
Nach erfolgreichem Hochladen des Codes auf das V4.0 Board, verbinden Sie die Verkabelung gemäß dem Schaltplan, schalten Sie dann den DIP-Schalter auf ON, es wird ein lächelndes Muster auf dem LED-Board angezeigt.

10. Code-Erklärung
Wir verwenden das Modul-Tool, das wir gerade gelernt haben, http://dotmatrixtool.com/#, um die Punktmatrix das Startmuster anzeigen zu lassen, vorwärts zu gehen, anzuhalten und dann das Muster zu löschen. Das Zeitintervall beträgt 2000 ms.




Vom Modul-Tool erhaltene Codes:
Code für das Startmuster:
0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80,0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01
Code für das Vorwärtsmuster:
0x00,0x00,0x00,0x00,0x00,0x24,0x12,0x09,0x12,0x24,0x00,0x00,0x00,0x00,0x00,0x00
Code für das Rückwärtsmuster:
0x00,0x00,0x00,0x00,0x00,0x24,0x48,0x90,0x48,0x24,0x00,0x00,0x00,0x00,0x00,0x00
Code für das Linksdrehmuster:
0x00,0x00,0x00,0x00,0x00,0x00,0x44,0x28,0x10,0x44,0x28,0x10,0x44,0x28,0x10,0x00
Code für das Rechtsdrehmuster:
0x00,0x10,0x28,0x44,0x10,0x28,0x44,0x10,0x28,0x44,0x00,0x00,0x00,0x00,0x00,0x00
Code für das Stoppmuster:
0x2E,0x2A,0x3A,0x00,0x02,0x3E,0x02,0x00,0x3E,0x22,0x3E,0x00,0x3E,0x0A,0x0E,0x00
Code zum Bildschirm löschen:
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00

//************************************************************************
/*
keyestudio 4wd BT Car
lesson 9.2
Matrix face
http://www.keyestudio.com
*/
//Daten vom Smile-Muster, erhalten vom Touch-Tool
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 //Setze den Clock-Pin auf A5
#define SDA_Pin A4 //Setze den Daten-Pin auf A4
void setup() {
//Setze Pin als Ausgang
pinMode(SCL_Pin, OUTPUT);
pinMode(SDA_Pin, OUTPUT);
//löschen
//matrix_display(clear);
}
void loop() {
matrix_display(start01); //Zeige Startmuster
delay(2000);
matrix_display(front); //Zeige Vorwärtsmuster
delay(2000);
matrix_display(STOP01); //Zeige Stoppmuster
delay(2000);
matrix_display(clear); //Bildschirm löschen
delay(2000);
}
//Diese Funktion wird für die Punktmatrix-Anzeige verwendet
void matrix_display(unsigned char matrix_value[])
{
IIC_start(); //Funktion, die den Startzustand der Datenübertragung aufruft
IIC_send(0xc0); //Adresse auswählen
for (int i = 0; i < 16; i++) // die Musterdaten sind 16 Bytes
{
IIC_send(matrix_value[i]); // Übertrage die Daten des Musters
}
IIC_end(); // Beende die Musterdatenübertragung
IIC_start();
IIC_send(0x8A); // Anzeige-Steuerung, wähle 4/16 Pulsbreite
IIC_end();
}
// Bedingungen, unter denen die Datenübertragung beginnt
void IIC_start()
{
digitalWrite(SDA_Pin, HIGH);
digitalWrite(SCL_Pin, HIGH);
delayMicroseconds(3);
digitalWrite(SDA_Pin, LOW);
delayMicroseconds(3);
digitalWrite(SCL_Pin, LOW);
}
// Zeigt das Ende der Datenübertragung an
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);
}
// Daten übertragen
void IIC_send(unsigned char send_data)
{
for (byte mask = 0x01; mask != 0; mask <<= 1) // Jedes Byte hat 8 Bits und wird bitweise beginnend mit dem niedrigsten Bit geprüft
{
if (send_data & mask) { // Setzt die High- und Low-Pegel von SDA_Pin abhängig davon, ob jedes Bit des Bytes eine 1 oder 0 ist
digitalWrite(SDA_Pin, HIGH);
} else {
digitalWrite(SDA_Pin, LOW);
}
delayMicroseconds(3);
digitalWrite(SCL_Pin, HIGH); // Ziehe den Clock-Pin SCL_Pin auf High, um die Datenübertragung zu stoppen
delayMicroseconds(3);
digitalWrite(SCL_Pin, LOW); // Ziehe den Clock-Pin SCL_Pin auf Low, um das SIGNAL von SDA zu ändern
}
}
//************************************************************************
Nach dem Hochladen des Testcodes zeigt die Gesichtsausdrucksplatine diese Muster der Reihe nach an und wiederholt diese Sequenz.







