PicoBoy - Joystick und LED's steuern
technische Daten wie beim RPi Pico
MC RP2040 mit OLED-Display 128x64 Pixel
Anleitung für die Firmware CircuitPython
Hardware
- PicoBoy
- USB-A zu USB-C Kabel
PicoBoy - Joystick und LED's steuern
technische Daten wie beim RPi PicoMC RP2040 mit OLED-Display 128x64 Pixel
Anleitung für die Firmware CircuitPython
- USB-A zu USB-C Kabel
Im ersten Teil haben wir eine einfache Uhrfunktion unter CircuitPython auf dem Pico-Boy programmiert. Diese soll jetzt, wie angekündigt,
erweitert werden.
Los gehts
Um Eingaben vorzunehmen, soll der 5-Wege Joystick benutzt werden. Er belegt beim PicoBoy folgende GPIO's:
* nach oben - GPIO 1
* nach unten - GPIO 3
* nach links - GPIO 4
* nach rechts - GPIO 2
* Mitte pressed - GPIO 0
Die Syntax lautet dann so:
up = digitalio.DigitalInOut(board.GP1)
up.direction = digitalio.Direction.INPUT
up.pull = digitalio.Pull.UP
Ob der Joystick betätigt wurde, kann dann z.B. so abgefragt werden:
if up.value == False:
print("Stick nach oben")
Wir fügen in das Programm aus dem Teil 1 jetzt die Zeilen 60 bis 80 ein und in der while-Schleife die Zeilen 108 bis 119. Dazwischen
verschieben sich die Zeilennummern entsprechend. Der komplette Code ist im unteren Kasten abgebildet und kann in die Thonny-IDE kopiert
werden.
1 import time 2 import board 3 import busio 4 import rtc 5 import displayio 6 import fourwire 7 import digitalio 8 import terminalio 9 from adafruit_display_text import label 10 from adafruit_display_shapes.rect import Rect 11 from adafruit_display_shapes.circle import Circle 12 import adafruit_displayio_sh1106 13 import pwmio 14 15 # Compatibility with both CircuitPython 8.x.x and 9.x.x. 16 # Remove after 8.x.x is no longer a supported release. 17 try: 18 from fourwire import FourWire 19 except ImportError: 20 from displayio import FourWire 21 22 #DC = board.GP8 23 #Reset = board.GP9 24 #CS = board.GP10 25 #SCK = board.GP18 26 #MOSI = board.GP19 27 28 # built-in a display 29 displayio.release_displays() 30 # Make the displayio SPI bus and the sh1106 display 31 spi = busio.SPI(board.GP18, board.GP19) 32# 33 # Circuit 8.x.x 34 #display_bus = displayio.FourWire(spi, command=board.GP8, chip_select=board.GP10, reset=board.GP9, baudrate=1000000) 35 #display =adafruit_displayio_sh1106.SH1106(display_bus, width=132, height=64, rotation=0, brightness = 1) 36 # 37 # Circuit 9.x.x 38 display_bus = FourWire(spi, command=board.GP8, chip_select=board.GP10, reset=board.GP9, baudrate=1000000) 39 display =adafruit_displayio_sh1106.SH1106(display_bus, width=132, height=64, rotation=0, brightness = 1) 40 41 # Make the display contexts 42 splash = displayio.Group() 43 display.root_group = splash 44 45 # create the label 46 updating_text = label.Label(font=terminalio.FONT, text="it works", scale=2, color=0xffffff, line_spacing=1) 47 # set label position on the display 48 updating_text.anchor_point = (0, 0) 49 updating_text.anchored_position = (15, 20) 50 # add label to group that is showing on display 51 splash.append(updating_text) 52 53 updating_datum = label.Label(font=terminalio.FONT, text="", scale=1, color=0xffffff, line_spacing=1) 54 updating_datum.anchor_point = (0, 0) 55 updating_datum.anchored_position = (45, 3) 56 splash.append(updating_datum) 57 58 wotage = ["Montag", "Dienstag", "Mittwoch", "Donnerstag", "Freitag", "Samstag", "Sonntag"] 59 60 ## Joystick 61 #JOY_UP = GP1 62 up = digitalio.DigitalInOut(board.GP1) 63 up.direction = digitalio.Direction.INPUT 64 up.pull = digitalio.Pull.UP 65 #JOY_DOWN = GP3 66 down = digitalio.DigitalInOut(board.GP3) 67 down.direction = digitalio.Direction.INPUT 68 down.pull = digitalio.Pull.UP 69 #JOY_LEFT = GP4 70 left = digitalio.DigitalInOut(board.GP4) 71 left.direction = digitalio.Direction.INPUT 72 left.pull = digitalio.Pull.UP 73 #JOY_RIGHT = GP2 74 right = digitalio.DigitalInOut(board.GP2) 75 right.direction = digitalio.Direction.INPUT 76 right.pull = digitalio.Pull.UP 77 #JOY_CENTER = GP0 78 center = digitalio.DigitalInOut(board.GP0) 79 center.direction = digitalio.Direction.INPUT 80 center.pull = digitalio.Pull.UP 81 82 while True: 83 current_time = time.localtime() 84 hour = current_time.tm_hour 85 minute = current_time.tm_min 86 second = current_time.tm_sec 87 year = current_time.tm_year 88 month = current_time.tm_mon 89 day = current_time.tm_mday 90 tag = current_time.tm_wday 91 datum = str(day) + "." + str(month) + "." + str(year) 92 if hour < 10: 93 zeit = "0" + str(hour) 94 else: 95 zeit = str(hour) 96 if minute < 10: 97 zeit = zeit + ":0" + str(minute) 98 else: 99 zeit = zeit + ":" + str(minute) 100 if second < 10: 101 zeit = zeit + ":0" + str(second) 102 else: 103 zeit = zeit + ":" + str(second) 104 ## Datum und Zeit anzeigen 105 updating_text.text = zeit 106 updating_datum.text = wotage[tag] + "\n\n\n\n" + datum 107 108 ## Joystick abfragen 109 if up.value == False: 110 print("nach oben gedrückt") 111 if down.value == False: 112 print("nach unten gedrückt") 113 if right.value == False: 114 print("nach rechts gedrückt") 115 if left.value == False: 116 print("nach links gedrückt") 117 if center.value == False: 118 print("Center gepresst z.B. o.k.") 119 time.sleep(0.3)
Die Erläuterungen:
Die Zeilen 1 bis 59 bleiben unverändert. Neu sind jetzt die Zeilen 60 bis 80 mit den Definitionen der GPIO's für den Joystick.
Der Anfang der while-Schleife verschiebt sich dadurch auf Zeile 82. Die Zeilen 82 bis 106 stimmen mit dem ehemaligen Quellcode überein.
In den Zeilen 108 bis 119 wird bei jedem Schleifendurchlauf, wie oben erklärt, der Joystick abgefragt und wenn zutreffend in der Thonny-IDE
gedruckt. Vielleicht wundern Sie sich über die 'Pause' von 0.3 s in der Zeile 119. Die ist notwendig, um den Joystick zu entprellen. Bei einer
Betätigung würde er nämlich sonst mehrfach ansprechen, denn der Prozessor 'rast' ja doch schneller durch die Schleife, als wir
mit dem Finger sind. Wegen der Uhrzeit brauchen Sie sich dabei keine Sorgen machen, denn der 'Timer' läuft ja in der Pause weiter
und wird beim nächsten Schleifendurchlauf aktuell abgerufen. Auch bei einer längeren Pause würde unsere Uhr nicht nachgehen.
In dieser Zeit wäre nur keine Joystickaktion möglich.
Ich habe mich entschlossen hier auch gleich noch die Funktionsweise der drei SMD-LED's zu erklären. Sie belegen beim PicoBoy folgende
GPIO's:
* rot - GPIO 5
* gelb - GPIO 6
* grün - GPIO 7
Die Syntax für die Definition geht z.B. so:
led_yellow = digitalio.DigitalInOut(board.GP6)
led_yellow.direction = digitalio.Direction.OUTPUT
Ein- bzw. ausgeschaltet wird mit:
led_yellow.value = True bzw. led_yellow.value = False
Um sich das anzusehen, löschen Sie im bisherigen Programm die Zeilen 60 bis 80 und ersetzen sie durch die Zeilen 60 bis 70 aus dem
unteren Kasten.
60 #rote LED 61 led_red = digitalio.DigitalInOut(board.GP5) 62 led_red.direction = digitalio.Direction.OUTPUT 63 #gelbe LED 64 led_yellow = digitalio.DigitalInOut(board.GP6) 65 led_yellow.direction = digitalio.Direction.OUTPUT 66 #grüne LED 67 led_green = digitalio.DigitalInOut(board.GP7) 68 led_green.direction = digitalio.Direction.OUTPUT 69 70 zahl= 0
Sowie in der while-Schleife die Zeilen ab der Joystickabfrage in Zeile 108 durch die Zeilen 97 bis 109. Wenn das Programm jetzt gestartet wird, leuchten die LED's der Reihe nach für eine knappe Sekunde und die Uhr zählt die Zeit weiter.
97 zahl += 1 98 if zahl == 1: 99 led_red.value = True 100 if zahl == 2: 101 led_yellow.value = True 102 if zahl == 3: 103 led_green.value = True 104 time.sleep(0.9) 105 led_red.value = False 106 led_yellow.value = False 107 led_green.value = False 108 if zahl == 3: 109 zahl = 0
Viel Spass und Erfolg beim Ausprobieren.
Viel Spass und Erfolg beim Ausprobieren.