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

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.