Bemerkung

Hallo und willkommen in der SunFounder Raspberry Pi & Arduino & ESP32 Enthusiasten-Gemeinschaft auf Facebook! Tauchen Sie tiefer ein in die Welt von Raspberry Pi, Arduino und ESP32 mit anderen Enthusiasten.

Warum beitreten?

  • Expertenunterstützung: Lösen Sie Nachverkaufsprobleme und technische Herausforderungen mit Hilfe unserer Gemeinschaft und unseres Teams.

  • Lernen & Teilen: Tauschen Sie Tipps und Anleitungen aus, um Ihre Fähigkeiten zu verbessern.

  • Exklusive Vorschauen: Erhalten Sie frühzeitigen Zugang zu neuen Produktankündigungen und exklusiven Einblicken.

  • Spezialrabatte: Genießen Sie exklusive Rabatte auf unsere neuesten Produkte.

  • Festliche Aktionen und Gewinnspiele: Nehmen Sie an Gewinnspielen und Feiertagsaktionen teil.

👉 Sind Sie bereit, mit uns zu erkunden und zu erschaffen? Klicken Sie auf [hier] und treten Sie heute bei!

3.1.13 GAME - NichtNicht

Einführung

In diesem Projekt werden wir ein interessantes Spielgerät erstellen, das wir „Nicht Nicht“ nennen.

Während des Spiels wird das Punktmatrix zufällig einen Pfeil aktualisieren. Ihre Aufgabe ist es, innerhalb einer begrenzten Zeit die Taste in die entgegengesetzte Richtung des Pfeils zu drücken. Wenn die Zeit abgelaufen ist oder die Taste in die gleiche Richtung wie der Pfeil gedrückt wird, sind Sie aus dem Spiel.

Dieses Spiel kann wirklich Ihr umgekehrtes Denken schulen. Sollen wir es mal versuchen?

Benötigte Komponenten

Für dieses Projekt benötigen wir die folgenden Komponenten.

../_images/list_GAME_14_NotNot.png

Es ist definitiv praktisch, ein ganzes Kit zu kaufen. Hier ist der Link:

Name

ARTIKEL IN DIESEM KIT

LINK

Raphael Kit

337

Raphael Kit

Sie können diese auch einzeln über die untenstehenden Links kaufen.

KOMPONENTEN BESCHREIBUNG

KAUF LINK

GPIO Extension Board

KAUFEN

Steckbrett

KAUFEN

Jumper-Kabel

KAUFEN

LED Matrix Modul

KAUFEN

Taste

KAUFEN

Schaltplan

T-Board Name

physical

wiringPi

BCM

GPIO22

Pin 15

3

22

GPIO23

Pin 16

4

23

SPIMOSI

Pin 19

12

MOSI

SPICE0

pin 24

10

CE0

SPISCLK

Pin 23

14

SCLK

../_images/Schematic_notnot.png

Experimentelle Verfahren

Schritt 1: Schalten Sie die Schaltung.

../_images/3.1.14game_notnot.png

Schritt 2: Aktivieren Sie das SPI, bevor Sie das Experiment starten. Weitere Details finden Sie unter SPI-Konfiguration.

Schritt 3: Navigieren Sie zum Ordner des Codes.

cd ~/raphael-kit/c/3.1.13/

Schritt 4: Kompilieren Sie den Code.

make

Schritt 5: Führen Sie die ausführbare Datei aus.

sudo ./3.1.13_GAME_NotNot

Nachdem das Programm gestartet ist, wird auf dem Punktmatrix zufällig ein linker oder rechter Pfeil angezeigt. Ihre Aufgabe ist es, die Taste in die entgegengesetzte Richtung des Pfeils zu drücken. Dann erscheint ein „√“ auf dem Punktmatrix. Wenn Sie die Taste in die gleiche Richtung wie der Pfeil drücken, sind Sie aus dem Spiel und das Punktmatrix zeigt ein „x“ an. Sie können auch 2 neue Tasten hinzufügen oder sie durch Joystick-Tasten für oben, unten, links und rechts - 4 Richtungen ersetzen, um die Schwierigkeit des Spiels zu erhöhen.

Bemerkung

Wenn es nach dem Start nicht funktioniert oder eine Fehlermeldung erscheint: "wiringPi.h: Datei oder Verzeichnis nicht gefunden", beachten Sie bitte Installieren und Überprüfen von WiringPi.

Code-Erklärung

Dieses C-Programm ist darauf ausgelegt, auf einem Raspberry Pi unter Verwendung der WiringPi-Bibliothek ausgeführt zu werden. Es kommuniziert mit einem 8x8-LED-Matrix-Display, das über den MAX7219-Treiberchip gesteuert wird, und verwendet zwei Tasten zur Benutzerinteraktion. Das Programm zeigt zufällig einen Pfeil nach links oder rechts auf der LED-Matrix an, und der Benutzer muss die entsprechende Taste drücken. Anschließend wird ein Häkchen für eine richtige Antwort oder ein Kreuz für eine falsche angezeigt.

  1. Header-Dateien:

    • wiringPi.h: Bietet Funktionen zur GPIO-Steuerung mit der WiringPi-Bibliothek.

    • wiringPiSPI.h: Bietet Funktionen für die SPI-Kommunikation.

    • stdio.h: Standard-Ein-/Ausgabefunktionen (printf usw.).

    • stdlib.h: Standardbibliotheksfunktionen (rand, srand, exit).

    • time.h: Funktionen zur Bearbeitung von Datum und Uhrzeit (time, NULL).

  2. Typdefinitionen:

    • #define uchar unsigned char: Definiert uchar als Alias für unsigned char.

    • #define uint unsigned int: Definiert uint als Alias für unsigned int.

  3. Konstanten und Makros:

    • SPI_CHANNEL: SPI-Kanal für die Kommunikation (0 oder 1).

    • SPI_SPEED: SPI-Kommunikationsgeschwindigkeit auf 1 MHz gesetzt.

    • AButtonPin: WiringPi-Pin-Nummer für Taste A (GPIO 22).

    • BButtonPin: WiringPi-Pin-Nummer für Taste B (GPIO 23).

  4. Globale Variablen:

    • int stage = 0;: Verfolgt die aktuelle Phase des Spiels (Anzeige des Pfeils oder Ergebnis).

  5. Daten-Arrays:

    • uchar arrow[2][8]: Enthält zwei 8-Byte-Muster, die einen rechten und linken Pfeil für die LED-Matrix darstellen.

      • arrow[0]: Muster für den rechten Pfeil.

      • arrow[1]: Muster für den linken Pfeil.

    • uchar check[2][8]: Enthält zwei 8-Byte-Muster für die Symbole „Richtig“ (Häkchen) und „Falsch“ (Kreuz).

      • check[0]: Muster für das Häkchen-Symbol.

      • check[1]: Muster für das Kreuz-Symbol.

  6. Funktion void Delay_xms(uint x):

    • Wrapper-Funktion für delay(x), bereitgestellt von WiringPi.

    • Verzögert die Programmausführung um x Millisekunden.

  7. Funktion void Write_Max7219_byte(uchar DATA):

    • Sendet ein einzelnes Byte (DATA) an den MAX7219 über SPI.

    • Verwendet wiringPiSPIDataRW zur Durchführung der SPI-Datenübertragung.

    • DATA: Das zu sendende Datenbyte.

  8. Funktion void Write_Max7219(uchar address1, uchar dat1):

    • Sendet einen Befehl und Daten an den MAX7219.

    • Kombiniert address1 (Registeradresse) und dat1 (Daten) in einen Puffer und sendet sie über SPI.

    • address1: Adresse des MAX7219-Registers.

    • dat1: Daten zum Schreiben in das Register.

  9. Funktion void Init_MAX7219():

    • Initialisiert den MAX7219-Display-Treiber mit den erforderlichen Konfigurationen.

    • Konfiguriert Decode-Modus, Intensität, Scan-Limit, Shutdown-Modus und Display-Test.

    • Löscht vorherige Daten auf dem Display.

  10. Funktion void Init_WiringPi():

    • Initialisiert die WiringPi-Bibliothek und die SPI-Schnittstelle.

    • Konfiguriert die Tasten-Pins als Eingänge mit Pull-up-Widerständen.

    • Überprüft, ob die Initialisierung erfolgreich war und beendet das Programm bei einem Fehler.

  11. Funktion int get_index():

    • Generiert einen zufälligen Index (0 oder 1), um zwischen dem linken und rechten Pfeil zu wählen.

    • Rückgabe: 0 oder 1.

  12. Funktion int get_key(uint num):

    • Wartet darauf, dass der Benutzer eine Taste drückt, und bestimmt, ob die Eingabe mit dem angezeigten Pfeil übereinstimmt.

    • Parameter:

      • num: Der Index des angezeigten Pfeils (0 für rechts, 1 für links).

    • Rückgabe:

      • 1 bei korrekter Benutzereingabe.

      • 0 bei falscher Benutzereingabe.

    • Funktionsweise:

      • Tritt in eine Endlosschleife ein und überprüft den Zustand der Tasten.

      • Verwendet digitalRead, um Tastendrücke zu erkennen (aktiv LOW).

      • Vergleicht die gedrückte Taste mit der erwarteten Eingabe basierend auf num.

  13. Funktion void display(uint index):

    • Zeigt entweder einen Pfeil oder ein Ergebnissymbol auf der LED-Matrix an, basierend auf der stage.

    • Parameter:

      • index: Index zur Auswahl des Musters aus den Arrays arrow oder check.

    • Funktionsweise:

      • Wenn stage == 0, wird ein Pfeilmuster angezeigt.

      • Wenn stage == 1, wird ein Häkchen- oder Kreuzsymbol angezeigt.

  14. Hauptfunktion:

    • Initialisierung:

      • Initialisiert den Zufallszahlengenerator mit srand((unsigned)time(NULL)).

      • Ruft Init_WiringPi() auf, um GPIO und SPI einzurichten.

      • Ruft Init_MAX7219() auf, um das LED-Matrix-Display zu initialisieren.

      • Führt eine kurze Verzögerung mit Delay_xms(50) ein.

    • Spielschleife (``while (1)``):

      • Stufe 0 (Pfeil anzeigen):

        • Ruft get_index() auf, um zufällig eine Pfeilrichtung auszuwählen.

        • Ruft display(direction) auf, um den Pfeil auf der LED-Matrix anzuzeigen.

        • Setzt stage = 1, um zur nächsten Stufe zu wechseln.

      • Stufe 1 (Benutzereingabe abwarten und Ergebnis anzeigen):

        • Ruft get_key(direction) auf, um die Benutzereingabe abzuwarten und die Richtigkeit zu bestimmen.

        • Ruft display(key) auf, um das Ergebnissymbol (Häkchen oder Kreuz) anzuzeigen.

        • Wartet 1 Sekunde mit Delay_xms(1000), damit der Benutzer das Ergebnis sehen kann.

        • Setzt stage = 0, um die Schleife neu zu starten.

Programmfluss-Zusammenfassung:

  1. Einrichtung:

    • Initialisiert WiringPi und SPI.

    • Konfiguriert die Tasten-Pins und die MAX7219-Einstellungen.

    • Initialisiert den Zufallszahlengenerator.

  2. Pfeil anzeigen:

    • Wählt zufällig eine Pfeilrichtung (links oder rechts).

    • Zeigt den entsprechenden Pfeil auf der LED-Matrix an.

  3. Benutzerinteraktion:

    • Wartet darauf, dass der Benutzer entweder Taste A oder Taste B drückt.

    • Bestimmt, ob die gedrückte Taste der Pfeilrichtung entspricht.

  4. Ergebnis anzeigen:

    • Zeigt ein Häkchen an, wenn die Benutzereingabe korrekt ist.

    • Zeigt ein Kreuz an, wenn die Benutzereingabe falsch ist.

    • Wartet 1 Sekunde vor der nächsten Runde.

  5. Wiederholen:

    • Kehrt zur Anzeige eines neuen Pfeils zurück und setzt das Spiel fort.