Projekt 9 Gesichtsausdruck LED-Board

image-20250510090912741

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

image-20250510091309725

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.

image-20250510091407219

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

Img

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

Img

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

Img

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

image-20250510091438524

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

image-20250510091446519

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

image-20250510091457463

6. Komponenten

Development Board *1

8833 Motor Driver *1

USB-Kabel*1

img

img

img

USB-Kabel*1

HX-2.54 4P Dupont Kabel 200mm *1

image-20250512155818434

image-20250512155822969

7. Schaltplan

cec50fec4a335b6922e4c6694a133bc1

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.

95bb011957896b12285fc6763137bb9a

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.

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

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

cec50fec4a335b6922e4c6694a133bc1

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

image-20250512160131674image-20250512160135717image-20250512160139283