Bemerkung
Hallo, willkommen in der SunFounder Raspberry Pi & Arduino & ESP32 Enthusiasten-Community auf Facebook! Tauchen Sie tiefer in Raspberry Pi, Arduino und ESP32 mit anderen Enthusiasten ein.
Warum beitreten?
Expertenunterstützung: Lösen Sie Probleme nach dem Kauf und technische Herausforderungen mit Hilfe unserer Community und unseres Teams.
Lernen & Teilen: Tauschen Sie Tipps und Tutorials aus, um Ihre Fähigkeiten zu verbessern.
Exklusive Vorschauen: Erhalten Sie frühzeitigen Zugriff auf neue Produktankündigungen und exklusive Einblicke.
Spezielle Rabatte: Genießen Sie exklusive Rabatte auf unsere neuesten Produkte.
Festliche Aktionen und Giveaways: Nehmen Sie an Verlosungen und Feiertagsaktionen teil.
👉 Bereit, mit uns zu forschen und zu kreieren? Klicken Sie auf [hier] und treten Sie noch heute bei!
2.1.9 Joystick (MCP3008)
Bemerkung
Abhängig von Ihrer Kit-Version identifizieren Sie bitte, ob Sie ADC0834 oder MCP3008 haben, und fahren Sie mit dem entsprechenden Abschnitt fort.
Einführung
In diesem Projekt lernen wir, wie ein Joystick funktioniert. Wir bewegen den Joystick und zeigen die Ergebnisse auf dem Bildschirm an.
Benötigte Komponenten
Für dieses Projekt benötigen wir folgende Komponenten.
Es ist definitiv bequem, ein komplettes Kit zu kaufen, hier ist der Link:
Name |
ELEMENTE IN DIESEM KIT |
LINK |
|---|---|---|
Raphael Kit |
337 |
Sie können die Teile auch einzeln über die folgenden Links kaufen.
KOMPONENTENBESCHREIBUNG |
KAUFLINK |
|---|---|
- |
|
- |
Schaltplan
Beim Auslesen der Joystick-Daten gibt es Unterschiede zwischen den Achsen: Die Daten der X- und Y-Achse sind analog und müssen mit dem MCP3008 in digitale Werte umgewandelt werden. Die Daten der Z-Achse sind digital, sodass Sie diese direkt über ein GPIO auslesen können (oder auch über den ADC).
T-Board-Name |
physikalisch |
WiringPi |
BCM |
|---|---|---|---|
SPICE0 |
pin24 |
10 |
8 |
SPIMOSI |
pin19 |
12 |
10 |
SPIMISO |
pin21 |
13 |
9 |
SPISCLK |
pin23 |
14 |
11 |
GPIO22 |
pin15 |
3 |
22 |
Experimentelle Verfahren
Schritt 1: Schließen Sie den Stromkreis an.
Schritt 2: Gehen Sie in den Code-Ordner.
cd ~/raphael-kit/c/2.1.9-2/
Schritt 3: Kompilieren Sie den Code.
gcc 2.1.9_Joystick.c -o joystick -lwiringPi
Schritt 4: Führen Sie die ausführbare Datei aus.
./joystick
Nach dem Start des Programms bewegen Sie den Joystick. Die entsprechenden Werte von x, y und Btn werden auf dem Bildschirm angezeigt.
Bemerkung
Wenn es nach dem Ausführen nicht funktioniert oder die Fehlermeldung „wiringPi.h: No such file or directory“ angezeigt wird, lesen Sie bitte Installieren und Überprüfen von WiringPi.
Code
#include <wiringPi.h>
#include <wiringPiSPI.h>
#include <stdio.h>
#define SPI_CHANNEL 0
#define SPI_SPEED 1000000 // 1 MHz
#define BtnPin 3 // WiringPi 3 = BCM GPIO22
// Auslesen vom MCP3008-Kanal (0–7)
int read_ADC(int channel) {
if (channel < 0 || channel > 7) return -1;
unsigned char buffer[3];
buffer[0] = 1; // Startbit
buffer[1] = (8 + channel) << 4; // Kanalkonfiguration
buffer[2] = 0;
wiringPiSPIDataRW(SPI_CHANNEL, buffer, 3);
int result = ((buffer[1] & 0x03) << 8) | buffer[2];
return result;
}
int main(void) {
if (wiringPiSetup() == -1) {
printf("WiringPi setup failed!\n");
return 1;
}
if (wiringPiSPISetup(SPI_CHANNEL, SPI_SPEED) == -1) {
printf("SPI setup failed!\n");
return 1;
}
pinMode(BtnPin, INPUT);
pullUpDnControl(BtnPin, PUD_UP);
while (1) {
int x_val = read_ADC(0); // VRX an CH0
int y_val = read_ADC(1); // VRY an CH1
int btn_val = digitalRead(BtnPin); // SW-Taste
printf("x = %d, y = %d, btn = %d\n", x_val, y_val, btn_val);
delay(100);
}
return 0;
}
Code-Erklärung
Dieser Abschnitt initialisiert die für GPIO- und SPI-Kommunikation benötigten Bibliotheken.
#include <wiringPi.h> #include <wiringPiSPI.h> #include <stdio.h> #define SPI_CHANNEL 0 #define SPI_SPEED 1000000 // 1 MHz #define BtnPin 3 // WiringPi 3 = BCM GPIO22
Definiert eine Funktion
read_ADC(), um analoge Daten vom MCP3008 auszulesen. Die Kommunikation erfolgt über SPI, um Daten von einem bestimmten Kanal (0–7) anzufordern und die Antwort zu einem 10-Bit-ADC-Wert zu verarbeiten.int read_ADC(int channel) { if (channel < 0 || channel > 7) return -1; unsigned char buffer[3]; buffer[0] = 1; buffer[1] = (8 + channel) << 4; buffer[2] = 0; wiringPiSPIDataRW(SPI_CHANNEL, buffer, 3); int result = ((buffer[1] & 0x03) << 8) | buffer[2]; return result; }
Die Hauptfunktion initialisiert WiringPi und die SPI-Schnittstelle, konfiguriert den Button-Pin des Joysticks und liest kontinuierlich die Joystick-Werte aus, die auf der Konsole ausgegeben werden.
int main(void) { if (wiringPiSetup() == -1) { printf("WiringPi setup failed!\n"); return 1; } if (wiringPiSPISetup(SPI_CHANNEL, SPI_SPEED) == -1) { printf("SPI setup failed!\n"); return 1; } pinMode(BtnPin, INPUT); pullUpDnControl(BtnPin, PUD_UP); while (1) { int x_val = read_ADC(0); // VRX an CH0 int y_val = read_ADC(1); // VRY an CH1 int btn_val = digitalRead(BtnPin); // SW an GPIO22 printf("x = %d, y = %d, btn = %d\n", x_val, y_val, btn_val); delay(100); } return 0; }
In diesem Programm:
VRX des Joysticks ist an CH0 des MCP3008 angeschlossen.
VRY ist an CH1 angeschlossen.
Die Taste (SW) ist an GPIO22 (WiringPi-Pin 3) angeschlossen.
Die Funktion
read_ADC()wird verwendet, um analoge Werte von VRX und VRY zu lesen.Der digitale Wert der Joystick-Taste wird mit
digitalRead()ausgelesen.Alle Werte werden alle 100 Millisekunden kontinuierlich ausgegeben.