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.
Es ist definitiv praktisch, ein ganzes Kit zu kaufen. Hier ist der Link:
Name |
ARTIKEL IN DIESEM KIT |
LINK |
|---|---|---|
Raphael Kit |
337 |
Sie können diese auch einzeln über die untenstehenden Links kaufen.
KOMPONENTEN BESCHREIBUNG |
KAUF LINK |
|---|---|
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 |
Experimentelle Verfahren
Schritt 1: Schalten Sie die Schaltung.
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.
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 (printfusw.).stdlib.h: Standardbibliotheksfunktionen (rand,srand,exit).time.h: Funktionen zur Bearbeitung von Datum und Uhrzeit (time,NULL).
Typdefinitionen:
#define uchar unsigned char: Definiertucharals Alias fürunsigned char.#define uint unsigned int: Definiertuintals Alias fürunsigned int.
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).
Globale Variablen:
int stage = 0;: Verfolgt die aktuelle Phase des Spiels (Anzeige des Pfeils oder Ergebnis).
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.
Funktion
void Delay_xms(uint x):Wrapper-Funktion für
delay(x), bereitgestellt von WiringPi.Verzögert die Programmausführung um
xMillisekunden.
Funktion
void Write_Max7219_byte(uchar DATA):Sendet ein einzelnes Byte (
DATA) an den MAX7219 über SPI.Verwendet
wiringPiSPIDataRWzur Durchführung der SPI-Datenübertragung.DATA: Das zu sendende Datenbyte.
Funktion
void Write_Max7219(uchar address1, uchar dat1):Sendet einen Befehl und Daten an den MAX7219.
Kombiniert
address1(Registeradresse) unddat1(Daten) in einen Puffer und sendet sie über SPI.address1: Adresse des MAX7219-Registers.dat1: Daten zum Schreiben in das Register.
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.
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.
Funktion
int get_index():Generiert einen zufälligen Index (0 oder 1), um zwischen dem linken und rechten Pfeil zu wählen.
Rückgabe:
0oder1.
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:
1bei korrekter Benutzereingabe.0bei 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.
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 Arraysarrowodercheck.
Funktionsweise:
Wenn
stage == 0, wird ein Pfeilmuster angezeigt.Wenn
stage == 1, wird ein Häkchen- oder Kreuzsymbol angezeigt.
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:
Einrichtung:
Initialisiert WiringPi und SPI.
Konfiguriert die Tasten-Pins und die MAX7219-Einstellungen.
Initialisiert den Zufallszahlengenerator.
Pfeil anzeigen:
Wählt zufällig eine Pfeilrichtung (links oder rechts).
Zeigt den entsprechenden Pfeil auf der LED-Matrix an.
Benutzerinteraktion:
Wartet darauf, dass der Benutzer entweder Taste A oder Taste B drückt.
Bestimmt, ob die gedrückte Taste der Pfeilrichtung entspricht.
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.
Wiederholen:
Kehrt zur Anzeige eines neuen Pfeils zurück und setzt das Spiel fort.