erste schritte
Rundes 1.28-Zoll-IPS-LCD-Display
Anleitung für CircuitPython
Bildbox 1 (klick hier)
erste schritte
Rundes 1.28-Zoll-IPS-LCD-DisplayAnleitung für CircuitPython
Bildbox 1 (klick hier)
Hardware
- Rundes 1,28-Zoll-IPS-LCD-Display
- RP Pico 2040 (inclusive)
- USB-A zu USB-C Kabel
Sie haben sich für das runde LCD-Display von Waveshare entschieden und wollen es nun in Betrieb nehmen. Sehen Sie hier die ersten Schritte dazu.
Um in das Thema erfolgreich einzusteigen, können Sie die folgende
zip-Datei
herunterladen, entpacken und später auf den Pico übertragen, wenn es um die Beispiele geht. Enthalten sind auch die notwendigen
Module, welche im 'lib-Ordner' vorhanden sein müssen.
Los gehts
Das Display und der Pico sind von Hause aus verbunden. Es versteht sich, dass bisher keine Spannung angelegt ist!
Als erstes wird die Firmeware für den Pico benötigt.
1. Bevor Sie den Pico erstmalig an die Stromversorgung anschließen, muss zunächst die CircuitPython-Firmware mit der Ansteuerung
für das runde Pico Display übertragen werden. Ich nutze dazu die Seite von CircuitPython und lade die uf2-Datei für das runde
Display von hier herunter:
https://circuitpython.org/board/waveshare_rp2040_lcd_1_28/
2. Nach dem Download der uf2-Datei muss diese auf das Display mit dem Pico übertragen werden. Im ersten Schritt nehmen Sie den Pico im
ausgeschalteten Zustand zur Hand und drücken die Boot-Taste (siehe Beschriftung auf der Platinenrückseite). Die wird
gehalten und der Pico erst dann (!!) über das USB-A zu USB-C Kabel mit dem
Rechner verbunden. Nach dem Verbinden kann die Boot Taste losgelassen werden. Es öffnet sich im
Filesystem ein Explorer-Fenster mit einem neuen Massenspeicher RPI-RP2. Öffnen Sie jetzt auf dem Rechner den
Download-Ordner und ziehen die uf2-Datei mit der CircuitPython Firmware auf den Massenspeicher RPI-RP2. Sobald die Firmware-Datei auf den
Pico kopiert ist, wird die Firmware ausgeführt und ein neuer Massenspeicher 'CIRCUITPY' im Explorerfenster angezeigt.
Damit ist die Programmiersprache CircuitPython für die Ansteuerung des runden Pico-Displays installiert
und die Programmierung kann über Thonny beginnen.
3. Falls bei der ersten Benutzung von Thonny kein Board erkannt wird, muss in den Interpreter-Einstellungen die Port-Auswahl
überprüft werden und ggf. auf CircuitPython (generic) eingestellt werden. Auch wenn Sie mehrere Displays benutzen, wird
der Com-Port nicht immer richtig erkannt. Klicken Sie dann ganz unten rechts auf den 'Button'. Das Fenster sollte jetzt so aussehen:
In der unteren Kommandozeile wird der Controller z.B. mit "Adafruit CircuitPython 8.2.0 on 2023-07-05; Waveshare RP2040-LCD-1.28 with rp2040"
angezeigt.
Jetzt öffnen Sie über das Thonny-Menü die Datei 'display_mit_text.py' und können sie ausführen. Wenn Sie die noch nicht heruntergeladen haben (siehe oben),
sollten Sie das jetzt tun oder Sie kopieren den Code aus dem Kasten in die Zwischenablage indem Sie auf den Button 'Code kopieren' klicken
und in Thonny einsetzen.
Sehen wir uns das Programm an und erklären die Details, die für unsere eigenen Anwendungen später wichtig sind.
1 # SPDX-FileCopyrightText : 2023 Detlef Gebhardt, written for CircuitPython
2 # SPDX-FileCopyrightText : Copyright (c) 2023 Detlef Gebhardt
3 # SPDX-Filename :
4 # SPDX-License-Identifier: GEBMEDIA
5 import time
6 import board
7 import busio
8 import displayio
9 import terminalio
10 from adafruit_display_text import label
11 import gc9a01
12 import my_qmi8658
13
14 # Alle verwendeten Ressourcen freigeben
15 displayio.release_displays()
16 # Display initialisieren
17 spi = busio.SPI(clock=board.LCD_CLK, MOSI=board.LCD_DIN)
18 display_bus = displayio.FourWire(spi, command=board.LCD_DC, chip_select=board.LCD_CS, reset=board.LCD_RST)
19 display = gc9a01.GC9A01(display_bus, width=240, height=240, backlight_pin=board.LCD_BL)
20 group1 = displayio.Group()
21 display.rotation = 90
22 display.brightness = 0.8
23
24 display.show(group1)
25
26 # Sensor initialisieren
27 sensor=my_qmi8658.QMI8658()
28
29 # Hintergrundpalette
30 color_bitmap = displayio.Bitmap(240, 240, 1)
31 color_palette = displayio.Palette(1)
32 color_palette[0] = 0x800000
33 bg_sprite = displayio.TileGrid(color_bitmap, pixel_shader=color_palette, x=0, y=0)
34 group1.append(bg_sprite)
35
36 # Textausgabe
37 text_group = displayio.Group(scale=2, x=20, y=70)
38 text1 = " rundes Display\n\n" + "1.28-Zoll-IPS-LCD\n\n" + " 240x240 Pixel"
39 text_area = label.Label(terminalio.FONT, text=text1, line_spacing = 1, color=0xffffff)
40 text_group.append(text_area)
41 group1.append(text_group)
42
43 while True:
44 pass
In den Zeilen 5 bis 12 werden alle benötigten Module importiert. Wichtig ist, dass sich die Module 'adafruit_display_text'
und 'gc9a01' (Treiber für das runde Display) und 'my_qmi8658' (Treiber für den
ACC-Sensor) im lib-Ordner befinden, sonst kommt später eine
Fehlermeldung. Die Zeilen 14 bis 20 initialisieren das Display und kommen in der Form in jedem späteren Programm vor. In der Zeile 21 wird die
Drehung des Displays in 90 Grad Schritten festgelegt und in Zeile 22 die Displayhelligkeit. Hier sind Werte zwischen 0 (Display aus) und 1 (volle
Helligkeit) möglich. Beim Messen des Stroms habe ich festgestellt, dass bei voller Helligkeit ca. 65 mA fließen und im ausgeschalteten Zustand
ca. 30 mA. Das spielt z.B. eine Rollen, wenn man das Display mit einem kleinen Akku versorgt. Zeile 24 macht das Display für die Anzeige bereit.
Da wir auch gleich den Acc-Sensor nutzen wollen, muss dieser ebenfalls initialisiert werden. Das geschieht in Zeile 27.
Die Zeilen 29 bis 34 erzeugen das farbige Bitmap als Hintergrund und fügen es der Gruppe 'group1' hinzu. Jedes Objekt, welches auf dem Display dargestellt werden soll,
wird also zunächst defieniert und im Speicher abgelegt.
In gleicher Weise bin ich mit dem Text verfahren (Zeilen 36 bis 41).
Da in unserem Fall noch nichts weiter passiert, steht in der 'while' Schleife die Anweisung 'pass', damit kein Fehler erzeugt wird. Später
erfolgen hier weitere Befehle.
Z.B. könnten wird den Sensor lesen und je nach Richtung, wie wir das Display halten, den Bildschirm drehen. Man kennt das vom Smartphone.
43 while True:
44 #read QMI8658
45 reading=sensor.Read_XYZ()
46 # Display wird um die y-Achse gekippt
47 wert_y = (10)*reading[0]
48 wert_x = (10)*reading[1]
49 #print(wert_y,wert_x)
50 if wert_y < -6:
51 display.rotation = 0
52 if wert_y >= -6 and wert_y <= 6 and wert_x < -6:
53 display.rotation = 90
54 if wert_y >= -6 and wert_y <= 6 and wert_x > 6:
55 display.rotation = 270
56 if wert_y > 6:
57 display.rotation = 180
58
59 time.sleep(0.1)
Dazu ändern wir die 'while'-Schleife wie folgt ab. Vom Acc-Sensor lassen sich in x-, y- und z-Richtung Werte lesen (reading[0], reading[1] und
reading[2]). Wir nutzen in den Zeilen 47 und 48 den y- und den x-Wert. Die Werte werden mit 10 multipliziert. So sind die Unterschiede in den
verschiedenen Positionen größer und die Werte lassen sich besser vergleichen.In Zeile 49 schauen wir uns zunächst die angezeigten Werte
an und erkennen, dass wir als Intervall für die jeweilige Position wert_y < -6, wert_y >= -6 and
wert_y <= 6 und wert_y > 6 nehmen können. Um zwischen -6 und +6 die Richtung unterscheiden zu können, nehmen
wir zusätzlich den x-Wert hinzu, der entweder kleiner -6 oder größer als +6 sein muss.
Viel Spass und Erfolg beim Ausprobieren.
1. Bevor Sie den Pico erstmalig an die Stromversorgung anschließen, muss zunächst die CircuitPython-Firmware mit der Ansteuerung für das runde Pico Display übertragen werden. Ich nutze dazu die Seite von CircuitPython und lade die uf2-Datei für das runde Display von hier herunter:
https://circuitpython.org/board/waveshare_rp2040_lcd_1_28/
2. Nach dem Download der uf2-Datei muss diese auf das Display mit dem Pico übertragen werden. Im ersten Schritt nehmen Sie den Pico im ausgeschalteten Zustand zur Hand und drücken die Boot-Taste (siehe Beschriftung auf der Platinenrückseite). Die wird gehalten und der Pico erst dann (!!) über das USB-A zu USB-C Kabel mit dem Rechner verbunden. Nach dem Verbinden kann die Boot Taste losgelassen werden. Es öffnet sich im Filesystem ein Explorer-Fenster mit einem neuen Massenspeicher RPI-RP2. Öffnen Sie jetzt auf dem Rechner den Download-Ordner und ziehen die uf2-Datei mit der CircuitPython Firmware auf den Massenspeicher RPI-RP2. Sobald die Firmware-Datei auf den Pico kopiert ist, wird die Firmware ausgeführt und ein neuer Massenspeicher 'CIRCUITPY' im Explorerfenster angezeigt. Damit ist die Programmiersprache CircuitPython für die Ansteuerung des runden Pico-Displays installiert und die Programmierung kann über Thonny beginnen.
3. Falls bei der ersten Benutzung von Thonny kein Board erkannt wird, muss in den Interpreter-Einstellungen die Port-Auswahl überprüft werden und ggf. auf CircuitPython (generic) eingestellt werden. Auch wenn Sie mehrere Displays benutzen, wird der Com-Port nicht immer richtig erkannt. Klicken Sie dann ganz unten rechts auf den 'Button'. Das Fenster sollte jetzt so aussehen:
Jetzt öffnen Sie über das Thonny-Menü die Datei 'display_mit_text.py' und können sie ausführen. Wenn Sie die noch nicht heruntergeladen haben (siehe oben), sollten Sie das jetzt tun oder Sie kopieren den Code aus dem Kasten in die Zwischenablage indem Sie auf den Button 'Code kopieren' klicken und in Thonny einsetzen.
Sehen wir uns das Programm an und erklären die Details, die für unsere eigenen Anwendungen später wichtig sind.
1 # SPDX-FileCopyrightText : 2023 Detlef Gebhardt, written for CircuitPython 2 # SPDX-FileCopyrightText : Copyright (c) 2023 Detlef Gebhardt 3 # SPDX-Filename : 4 # SPDX-License-Identifier: GEBMEDIA 5 import time 6 import board 7 import busio 8 import displayio 9 import terminalio 10 from adafruit_display_text import label 11 import gc9a01 12 import my_qmi8658 13 14 # Alle verwendeten Ressourcen freigeben 15 displayio.release_displays() 16 # Display initialisieren 17 spi = busio.SPI(clock=board.LCD_CLK, MOSI=board.LCD_DIN) 18 display_bus = displayio.FourWire(spi, command=board.LCD_DC, chip_select=board.LCD_CS, reset=board.LCD_RST) 19 display = gc9a01.GC9A01(display_bus, width=240, height=240, backlight_pin=board.LCD_BL) 20 group1 = displayio.Group() 21 display.rotation = 90 22 display.brightness = 0.8 23 24 display.show(group1) 25 26 # Sensor initialisieren 27 sensor=my_qmi8658.QMI8658() 28 29 # Hintergrundpalette 30 color_bitmap = displayio.Bitmap(240, 240, 1) 31 color_palette = displayio.Palette(1) 32 color_palette[0] = 0x800000 33 bg_sprite = displayio.TileGrid(color_bitmap, pixel_shader=color_palette, x=0, y=0) 34 group1.append(bg_sprite) 35 36 # Textausgabe 37 text_group = displayio.Group(scale=2, x=20, y=70) 38 text1 = " rundes Display\n\n" + "1.28-Zoll-IPS-LCD\n\n" + " 240x240 Pixel" 39 text_area = label.Label(terminalio.FONT, text=text1, line_spacing = 1, color=0xffffff) 40 text_group.append(text_area) 41 group1.append(text_group) 42 43 while True: 44 pass
Da wir auch gleich den Acc-Sensor nutzen wollen, muss dieser ebenfalls initialisiert werden. Das geschieht in Zeile 27.
Die Zeilen 29 bis 34 erzeugen das farbige Bitmap als Hintergrund und fügen es der Gruppe 'group1' hinzu. Jedes Objekt, welches auf dem Display dargestellt werden soll, wird also zunächst defieniert und im Speicher abgelegt.
In gleicher Weise bin ich mit dem Text verfahren (Zeilen 36 bis 41).
Da in unserem Fall noch nichts weiter passiert, steht in der 'while' Schleife die Anweisung 'pass', damit kein Fehler erzeugt wird. Später erfolgen hier weitere Befehle.
Z.B. könnten wird den Sensor lesen und je nach Richtung, wie wir das Display halten, den Bildschirm drehen. Man kennt das vom Smartphone.
43 while True: 44 #read QMI8658 45 reading=sensor.Read_XYZ() 46 # Display wird um die y-Achse gekippt 47 wert_y = (10)*reading[0] 48 wert_x = (10)*reading[1] 49 #print(wert_y,wert_x) 50 if wert_y < -6: 51 display.rotation = 0 52 if wert_y >= -6 and wert_y <= 6 and wert_x < -6: 53 display.rotation = 90 54 if wert_y >= -6 and wert_y <= 6 and wert_x > 6: 55 display.rotation = 270 56 if wert_y > 6: 57 display.rotation = 180 58 59 time.sleep(0.1)
Viel Spass und Erfolg beim Ausprobieren.