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 bedienen den Joystick und zeigen die Ergebnisse auf dem Bildschirm an.
Benötigte Komponenten
In diesem Projekt benötigen wir die folgenden 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 sie auch einzeln über die untenstehenden Links kaufen.
KOMPONENTENBESCHREIBUNG |
KAUFLINK |
|---|---|
- |
|
- |
Schaltplan
Beim Lesen der Daten des Joysticks 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, daher können sie direkt über die GPIOs oder ebenfalls über den ADC gelesen werden.
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: Bauen Sie die Schaltung auf.
Schritt 2: Richten Sie die SPI-Schnittstelle ein und installieren Sie die spidev-Bibliothek (siehe SPI-Konfiguration für detaillierte Anweisungen). Wenn Sie diese Schritte bereits abgeschlossen haben, können Sie diesen Schritt überspringen.
Schritt 3: Wechseln Sie in den Code-Ordner.
cd ~/raphael-kit/python-pi5
Schritt 4: Ausführen.
sudo python3 2.1.9-2_Joystick_zero.py
Nach dem Start des Codes bewegen Sie den Joystick, und die entsprechenden Werte für X, Y und Btn werden auf dem Bildschirm angezeigt.
Warnung
Wenn die Fehlermeldung RuntimeError: Cannot determine SOC peripheral base address angezeigt wird, lesen Sie bitte If gpiozero doesn’t work..
Code
Bemerkung
Sie können den untenstehenden Code Ändern/Zurücksetzen/Kopieren/Ausführen/Stoppen.
Vorher müssen Sie jedoch zum Quellcodepfad wie raphael-kit/python-pi5 wechseln.
Nach dem Ändern des Codes können Sie ihn direkt ausführen, um das Ergebnis zu sehen.
#!/usr/bin/env python3
from gpiozero import Button
import spidev
import time
# Initialisierung der Taste, die mit GPIO-Pin 22 (Joystick SW-Pin) verbunden ist
BtnPin = Button(22)
# Initialisierung der SPI-Kommunikation mit MCP3008
spi = spidev.SpiDev()
spi.open(0, 0) # SPI-Bus 0, Gerät CE0
spi.max_speed_hz = 1000000 # SPI-Geschwindigkeit auf 1 MHz einstellen
def read_adc(channel):
"""
Liest den analogen Wert vom angegebenen MCP3008-Kanal (0–7)
:param channel: ADC-Kanalnummer (0–7)
:return: 10-Bit-Integerwert (0–1023)
"""
if channel < 0 or channel > 7:
return -1
adc = spi.xfer2([1, (8 + channel) << 4, 0])
value = ((adc[1] & 0x03) << 8) | adc[2]
return value
try:
# Hauptschleife zum Lesen und Anzeigen der Joystick-Werte und des Tastenzustands
while True:
# X- und Y-Werte von MCP3008-Kanal 0 und 1 lesen
x_val = read_adc(0) # Joystick VRX an CH0 angeschlossen
y_val = read_adc(1) # Joystick VRY an CH1 angeschlossen
# Zustand der Joystick-Taste (SW) lesen
Btn_val = BtnPin.value # 0 = gedrückt, 1 = losgelassen
# Gelesene Werte ausgeben
print('X: %d Y: %d Btn: %d' % (x_val, y_val, Btn_val))
# 0,2 Sekunden warten, bevor erneut gelesen wird
time.sleep(0.2)
# Sauberes Beenden bei Ctrl+C
except KeyboardInterrupt:
spi.close()
Code-Erklärung
Dieser Abschnitt importiert die erforderlichen Bibliotheken:
gpiozero.Buttonwird verwendet, um den digitalen Zustand der Joystick-Taste (SW-Pin) zu lesen.spidevwird für die SPI-Kommunikation mit dem MCP3008-ADC-Chip verwendet.timewird für Zeitverzögerungen zwischen den Abfragen genutzt.
from gpiozero import Button import spidev import time
Initialisiert die Taste, die an GPIO22 (Joystick SW-Pin) angeschlossen ist, und richtet die SPI-Schnittstelle auf Bus 0, Chip Select 0 (CE0) ein. Die SPI-Geschwindigkeit wird auf 1 MHz eingestellt.
BtnPin = Button(22) spi = spidev.SpiDev() spi.open(0, 0) spi.max_speed_hz = 1000000
Definiert eine Funktion
read_adc(channel), um den analogen Wert eines bestimmten MCP3008-Kanals (0–7) zu lesen. Es werden drei Bytes gemäß dem SPI-Protokoll gesendet und ein 10-Bit-Wert (0–1023) zurückgegeben.def read_adc(channel): adc = spi.xfer2([1, (8 + channel) << 4, 0]) value = ((adc[1] & 0x03) << 8) | adc[2] return value
In der Hauptschleife werden die analogen Werte von VRX (CH0) und VRY (CH1) sowie der Tastenzustand gelesen. Die Werte werden alle 0,2 Sekunden auf der Konsole ausgegeben. Wenn Ctrl+C gedrückt wird, wird die SPI-Schnittstelle sauber geschlossen.
try: while True: x_val = read_adc(0) y_val = read_adc(1) Btn_val = BtnPin.value print('X: %d Y: %d Btn: %d' % (x_val, y_val, Btn_val)) time.sleep(0.2) except KeyboardInterrupt: spi.close()