Skip to content

Technik Blog

Programmieren | Arduino | ESP32 | MicroPython | Python | Raspberry Pi | Raspberry Pi Pico

Menu
  • Smarthome
  • Arduino
  • ESP32 & Co.
  • Raspberry Pi & Pico
  • Solo Mining
  • Über mich
  • Deutsch
  • English
Menu

Programmierung des 2fach Joystickshield HU-M16 am Raspberry Pi Pico mit CircuitPython

Posted on 15. März 202414. März 2024 by Stefan Draeger

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.

Programmieren des 2fach Joystickshield HU-M16 in CircuitPython am Raspberry Pi Pico
Dieses Video auf YouTube ansehen.

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.

Aufbau des Joystick Shields für den Arduino
Aufbau des Joystick Shields für den Arduino

Nachfolgend eine Tabelle mit den Pins am Raspberry Pi Pico.

HU-M16Arduino UNO R3Raspberry Pi Pico
Joystick (links)
XA0GP26
YA1GP27
TasterD2GP2
Joystick (rechts)
XA3
YA2GP28
TasterD4GP4
LEDD3GP3

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.

Thonny - lesen von analogen Werten
Thonny – lesen von analogen Werten

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.

  • Mouse.press,
  • Mouse.release

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.

Schreibe einen Kommentar Antworten abbrechen

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Fragen oder Feedback?

Du hast eine Idee, brauchst Hilfe oder möchtest Feedback loswerden?
Support-Ticket erstellen

Newsletter abonnieren

Bleib auf dem Laufenden: Erhalte regelmäßig Updates zu neuen Projekten, Tutorials und Tipps rund um Arduino, ESP32 und mehr – direkt in dein Postfach.

Jetzt Newsletter abonnieren

Unterstütze meinen Blog

Wenn dir meine Inhalte gefallen, freue ich mich über deine Unterstützung auf Tipeee.
So hilfst du mit, den Blog am Leben zu halten und neue Beiträge zu ermöglichen.

draeger-it.blog auf Tipeee unterstützen

Vielen Dank für deinen Support!
– Stefan Draeger

Kategorien

Tools

  • Unix-Zeitstempel-Rechner
  • ASCII Tabelle
  • Spannung, Strom, Widerstand und Leistung berechnen
  • Widerstandsrechner
  • 8×8 LED Matrix Tool
  • 8×16 LED Matrix Modul von Keyestudio
  • 16×16 LED Matrix – Generator

Links

Blogverzeichnis Bloggerei.de TopBlogs.de das Original - Blogverzeichnis | Blog Top Liste Blogverzeichnis trusted-blogs.com

Stefan Draeger
Königsberger Str. 13
38364 Schöningen

Tel.: 01778501273
E-Mail: info@draeger-it.blog

Folge mir auf

  • Impressum
  • Datenschutzerklärung
  • Disclaimer
  • Cookie-Richtlinie (EU)
©2025 Technik Blog | Built using WordPress and Responsive Blogily theme by Superb
Cookie-Zustimmung verwalten
Wir verwenden Technologien wie Cookies, um Geräteinformationen zu speichern und/oder darauf zuzugreifen. Wir tun dies, um das Surferlebnis zu verbessern und um personalisierte Werbung anzuzeigen. Wenn Sie diesen Technologien zustimmen, können wir Daten wie das Surfverhalten oder eindeutige IDs auf dieser Website verarbeiten. Wenn Sie Ihre Zustimmung nicht erteilen oder zurückziehen, können bestimmte Funktionen beeinträchtigt werden.
Funktional Immer aktiv
Die technische Speicherung oder der Zugang ist unbedingt erforderlich für den rechtmäßigen Zweck, die Nutzung eines bestimmten Dienstes zu ermöglichen, der vom Teilnehmer oder Nutzer ausdrücklich gewünscht wird, oder für den alleinigen Zweck, die Übertragung einer Nachricht über ein elektronisches Kommunikationsnetz durchzuführen.
Vorlieben
Die technische Speicherung oder der Zugriff ist für den rechtmäßigen Zweck der Speicherung von Präferenzen erforderlich, die nicht vom Abonnenten oder Benutzer angefordert wurden.
Statistiken
Die technische Speicherung oder der Zugriff, der ausschließlich zu statistischen Zwecken erfolgt. Die technische Speicherung oder der Zugriff, der ausschließlich zu anonymen statistischen Zwecken verwendet wird. Ohne eine Vorladung, die freiwillige Zustimmung deines Internetdienstanbieters oder zusätzliche Aufzeichnungen von Dritten können die zu diesem Zweck gespeicherten oder abgerufenen Informationen allein in der Regel nicht dazu verwendet werden, dich zu identifizieren.
Marketing
Die technische Speicherung oder der Zugriff ist erforderlich, um Nutzerprofile zu erstellen, um Werbung zu versenden oder um den Nutzer auf einer Website oder über mehrere Websites hinweg zu ähnlichen Marketingzwecken zu verfolgen.
Optionen verwalten Dienste verwalten Verwalten von {vendor_count}-Lieferanten Lese mehr über diese Zwecke
Einstellungen anzeigen
{title} {title} {title}