In diesem Beitrag möchte ich dir zeigen, wie du das 2fach Joystickshield HU-M16 am Raspberry Pi Pico via CircuitPython programmiert. Das Shield habe ich dir bereits für den Arduino UNO vorgestellt und auch am Arduino Leonardo gezeigt, wie du mit diesem Shield deine Maus ersetzen kannst. Hier möchte ich dir nun gerne zeigen, wie dieses Shield ebenso am Pi Pico programmiert wird.
Die Idee zu diesem Beitrag kommt von einem Kommentar zum YouTube-Video Arduino Joystick Shield Basics: Programmierung leicht gemacht für Anfänger wo ich gefragt wurde, wie dieses für den Pico bzw. ESP32 in Python umgesetzt wird.
Inhaltsverzeichnis
- ArduPico für den Formfaktor des Arduino UNO
- Programmieren des Shields HU-M16 in CircuitPython
- Einrichten des Pi Pico für die Programmierung in CircuitPython
- Download des Moduls Adafruit HID
- Auslesen der aktuellen Position der Joysticks
- Bewegen des Mauszeigers mit den Joysticks
- Taster der Joysticks auswerten
- Fertiges Programm zum Steuern des Mauszeigers mit dem Joystickshield HU-M16 in CircuitPython
- Fazit
ArduPico für den Formfaktor des Arduino UNO
Es gibt mit dem ArduPico von der Firma WisdPi die Möglichkeit den Raspberry Pi Pico in das Format des Arduino UNO R3 zu bringen.


Der Vorteil an diesem Board ist, dass du somit das Shield nicht mit Breadboardkabel anschließen musst, sondern einfach wie am Arduino dieses aufstecken und verwenden kannst. Der Preis für dieses Modul ist mit derzeit 9,51 $ (ca. 8,69 €) zzgl. Versandkosten recht erschwinglich.
Der WisdPi ArduPico verfügt ausschließlich über die analogen Pins A0 bis A2, was bedeutet, dass ein analoger Pin für die X-Koordinate des rechten Joysticks fehlt. Dennoch ist das Shield so konzipiert, dass es mit beiden Händen oder mit den Daumen bedient werden kann. In diesem Fall ist es akzeptabel, jeweils nur eine Achse mit einem Daumen zu steuern, wodurch auf die fehlende Achse verzichtet werden kann.
Auf der Vorderseite des ArduPico findest du die Beschriftungen für den Arduino und auf der Rückseite diese für den Pi Pico.
Programmieren des Shields HU-M16 in CircuitPython
Damit wir dieses Shield programmieren können, schauen wir uns zunächst das Pinout an.
Nachfolgend eine Tabelle mit den Pins am Raspberry Pi Pico.
HU-M16 | Arduino UNO R3 | Raspberry Pi Pico |
---|---|---|
Joystick (links) | ||
X | A0 | GP26 |
Y | A1 | GP27 |
Taster | D2 | GP2 |
Joystick (rechts) | ||
X | A3 | |
Y | A2 | GP28 |
Taster | D4 | GP4 |
LED | D3 | GP3 |
Einrichten des Pi Pico für die Programmierung in CircuitPython
Bevor wir das eigentliche Programm schreiben können, müssen wir unseren Mikrocontroller für CircuitPython flashen. In meinem Fall habe ich den Raspberry Pi Pico W und müsste nun die passende UF2 Datei suchen, herunterladen und auf den Mikrocontroller spielen.
Die Entwicklungsumgebung Thonny bietet hier einen sehr einfachen Weg den Mikrocontroller für CircuitPython zu flashen und das mit wenigen Klicks.
Bevor wir jedoch eine neue Firmware auf den Mikrocontroller flashen können, müssen wir diesen zunächst in den Modus bringen. Dazu trennen wir zunächst den Pi Pico vom Computer und halten den
Taster BOOTSEL gedrückt und verbinden diesen erneut mit dem Computer. Es sollte jetzt im Explorer ein neues Laufwerk erscheinen.
In dem Tool Thonny wählen wir unten rechts aus der Auswahlliste den Eintrag „Konfiguriere den Interpreter…“.
Im neuen Dialog wählen wir als erstes „CircuitPython (generic)“ (1) und unter Port das korrekte Board (2) aus. Um nun das Board für CircuitPython zu flashen, müssen wir unten rechts auf den Hyperlink „CircuitPython installieren oder aktualisieren (UF2)“ (3) klicken.
Jetzt müssen wir das Laufwerk auswählen (4) sollte ggf. bereits vorlegt sein und danach die Variante des Pi Pico wählen. In meinem Fall nutze ich den Raspberry Pi Pico mit WiFi Chip und wähle daher den Pico W aus. Zum Schluss nun noch die Version wählen (6) und auf die Schaltfläche „Installieren“ (7) klicken.
Wenn der Vorgang abgeschlossen ist, sollte der Text „Done“ bei der Position (8) erscheinen.
Wenn wir jetzt zur IDE zurückkehren, dann sollte der in der Grafik angezeigte Text erscheinen (ggf. einmal oben in der Menüleiste auf Stopp klicken).
Download des Moduls Adafruit HID
Zum Steuern des Mauszeigers habe ich sehr gute Erfahrung mit dem Modul Adafruit Mouse gesammelt, es gibt dazu auch eine sehr ausführliche Dokumentation mit einigen Beispielen. Zu den Beispielen findet man auch immer gleich das Modul und somit muss man nicht lange suchen, sondern lädt sich einfach das Beispiel als ZIP-Datei herunter und kann dann aus dem entpackten Ordner das Modul auf den Mikrocontroller kopieren.
Auslesen der aktuellen Position der Joysticks
Im ersten Abschnitt habe ich dir bereits gezeigt, an welche Pins die Joysticks und auch die LED angeschlossen sind. Zunächst lesen wir die x-Achse aus und geben die Werte in der Konsole aus.
import board from analogio import AnalogIn from time import sleep joystickLeftX = AnalogIn(board.A0) while True: print(joystickLeftX.value) sleep(0.125)
Wenn wir den Code ausführen und den linken Joystick nach rechts / links bewegen, dann ändert sich der gelesene analoge Wert, welchen wir aus dem Reiter Kommandozeile auslesen können.
Bewegen des Mauszeigers mit den Joysticks
Die Funktion move für das Bewegen des Mauszeigers erwartet 3 ganzzahlige Parameter.
move(x: int = 0, y: int = 0, wheel: int = 0)
Wenn wir nun den Mauszeiger in der X & Y Achse bewegen wollen, dann übergeben wir für die Bewegung nach oben eine 1 und nach unten eine -1, wenn wir jedoch die Achse nicht bewegen wollen eine 0.
Die Joysticks sind in der Mittelposition und wir lesen einen Wert zwischen 45000 & 48000 (jedenfalls bei meinem Modell). Ich definiere jetzt, dass Werte, kleiner als 45000 als -1 interpretiert werden und größer als 48000 als 1.
import board from analogio import AnalogIn from time import sleep import usb_hid from adafruit_hid.mouse import Mouse joystickLeftX = AnalogIn(board.A0) joystickRightY = AnalogIn(board.A2) m = Mouse(usb_hid.devices) while True: if joystickLeftX.value > 48000: posX = 1 elif joystickLeftX.value < 44000: posX = -1 else: posX = 0 if joystickRightY.value > 49000: posY = 1 elif joystickRightY.value < 45000: posY = -1 else: posY = 0 m.move(posX, posY, 0) sleep(0.01)
Taster der Joysticks auswerten
Beide analoge Joysticks haben jeweils einen zusätzlichen Taster, diese beiden Taster können wir als Maustasten einsetzen, jeweils als linke und rechte Maustaste. Wir benötigen dazu zwei Funktionsaufrufe, zum einen um den Taster zu drücken und zum anderen um diese wieder loszulassen.
Hintergrund ist, dass wir theoretisch per Drag’n Drop Objekte wie Dateien, Ordner verschieben können und dabei halten wir die Maustaste gedrückt. In meinem Fall möchte ich jedoch lediglich einen einfachen Klick ausführen.
import board from time import sleep import usb_hid from adafruit_hid.mouse import Mouse import digitalio led = digitalio.DigitalInOut(board.GP3) led.direction = digitalio.Direction.OUTPUT joystickLeftButton = digitalio.DigitalInOut(board.GP2) joystickLeftButton.switch_to_input(pull=digitalio.Pull.UP) joystickRightButton = digitalio.DigitalInOut(board.GP4) joystickRightButton.switch_to_input(pull=digitalio.Pull.UP) m = Mouse(usb_hid.devices) while True: if not joystickLeftButton.value: led.value = True m.press(Mouse.LEFT_BUTTON) sleep(0.010) m.release(Mouse.LEFT_BUTTON) if not joystickRightButton.value: led.value = True m.press(Mouse.RIGHT_BUTTON) sleep(0.010) m.release(Mouse.RIGHT_BUTTON) led.value = False sleep(0.01)
Fertiges Programm zum Steuern des Mauszeigers mit dem Joystickshield HU-M16 in CircuitPython
import board from analogio import AnalogIn from time import sleep import usb_hid from adafruit_hid.mouse import Mouse import digitalio led = digitalio.DigitalInOut(board.GP3) led.direction = digitalio.Direction.OUTPUT joystickLeftX = AnalogIn(board.A0) joystickRightY = AnalogIn(board.A2) joystickLeftButton = digitalio.DigitalInOut(board.GP2) joystickLeftButton.switch_to_input(pull=digitalio.Pull.UP) joystickRightButton = digitalio.DigitalInOut(board.GP4) joystickRightButton.switch_to_input(pull=digitalio.Pull.UP) m = Mouse(usb_hid.devices) while True: if not joystickLeftButton.value: led.value = True m.press(Mouse.LEFT_BUTTON) sleep(0.010) m.release(Mouse.LEFT_BUTTON) if not joystickRightButton.value: led.value = True m.press(Mouse.RIGHT_BUTTON) sleep(0.010) m.release(Mouse.RIGHT_BUTTON) led.value = False if joystickLeftX.value > 48000: posX = 1 elif joystickLeftX.value < 44000: posX = -1 else: posX = 0 if joystickRightY.value > 49000: posY = 1 elif joystickRightY.value < 45000: posY = -1 else: posY = 0 m.move(posX, posY, 0) sleep(0.01)
Fazit
Die Programmierung des Joystickshield HU-M16 in CircuitPython ist mit dem Modul von Adafruit deutlich einfacher als beim Arduino.
Eine Erweiterung des Codes könnte nun die Funktionalität für Drag’n Drop sein.
Solltest du Fragen zu diesem Programm / Beitrag haben, so kannst hier einen Kommentar hinterlassen oder mir eine E-Mail an info@draeger-it.blog senden.