.. note:: 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 [|link_sf_facebook|] und treten Sie noch heute bei! .. _2.1.9_py_pi5_mcp3008: 2.1.9 Joystick (MCP3008) ========================= .. note:: .. image:: ../img/mcp3008_and_adc0834.jpg :width: 25% :align: left 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: .. image:: ../python_pi5/img/image317-copy.png Es ist definitiv bequem, ein komplettes Kit zu kaufen. Hier ist der Link: .. list-table:: :widths: 20 20 20 :header-rows: 1 * - Name - ELEMENTE IN DIESEM KIT - LINK * - Raphael Kit - 337 - |link_Raphael_kit| Sie können sie auch einzeln über die untenstehenden Links kaufen. .. list-table:: :widths: 30 20 :header-rows: 1 * - KOMPONENTENBESCHREIBUNG - KAUFLINK * - :ref:`cpn_gpio_board` - |link_gpio_board_buy| * - :ref:`cpn_breadboard` - |link_breadboard_buy| * - :ref:`cpn_wires` - |link_wires_buy| * - :ref:`cpn_resistor` - |link_resistor_buy| * - :ref:`cpn_joystick` - \- * - :ref:`cpn_mcp3008` - \- 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. .. list-table:: :widths: 30 30 30 30 :header-rows: 1 * - 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 .. image:: ../python_pi5/img/schematic_2.1.9_joystick_mcp3008.png Experimentelle Verfahren -------------------------- **Schritt 1:** Bauen Sie die Schaltung auf. .. image:: ../python_pi5/img/july24_2.1.9_joystick_mcp3008.png **Schritt 2:** Richten Sie die SPI-Schnittstelle ein und installieren Sie die ``spidev``-Bibliothek (siehe :ref:`spi_configuration` 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. .. raw:: html .. code-block:: cd ~/raphael-kit/python-pi5 **Schritt 4:** Ausführen. .. raw:: html .. code-block:: 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. .. warning:: Wenn die Fehlermeldung ``RuntimeError: Cannot determine SOC peripheral base address`` angezeigt wird, lesen Sie bitte :ref:`faq_soc`. **Code** .. note:: 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. .. raw:: html .. code-block:: python #!/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.Button`` wird verwendet, um den digitalen Zustand der Joystick-Taste (SW-Pin) zu lesen. * ``spidev`` wird für die SPI-Kommunikation mit dem MCP3008-ADC-Chip verwendet. * ``time`` wird für Zeitverzögerungen zwischen den Abfragen genutzt. .. code-block:: python 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. .. code-block:: python 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. .. code-block:: python 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. .. code-block:: python 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()