Bildbox 1 (klick hier)
Ich stelle hier eine kleine Bildershow
auf dem Raspberry Pi Pico mit Pimoroni-Display dar.
Verwendet wird dieses Projekt als Werbetafel auf der Modelleisenbahn.
Bildbox 1 (klick hier)
Ich stelle hier eine kleine Bildershow
auf dem Raspberry Pi Pico mit Pimoroni-Display dar.
Verwendet wird dieses Projekt als Werbetafel auf der Modelleisenbahn.
Hardware / Software
- Raspberry Pi Pico
- Raspberry Pi Pico Display Rack von Pimoroni
- Micro USB Kabel
- Micropython
- Thonny IDE auf Windows PC
Falls Sie schon das vorangegangene Projekt kennen, dort wurden einige Grundlagen zum Umgang mit dem Pi Pico erklärt,
können Sie sofort loslegen. Wenn Sie durch vorherige Tests mit dem Pico die Firmware flashen wollen und somit
den Pico komplett zurücksetzen, emphiehlt sich die Datei
flash_nuke.uf2
. Die laden Sie herunter, speichen sie auf der Festplatte und übertragen Sie genau wie bei der Erstinbetriebnahme auf
den Pico. Nach dem Flashen muss dann natürlich die MicroPython Firmware erneut aufgespielt werden.
Grundlagen
Es gibt eine Reihe von Herausforderungen beim Lesen, Betrachten und Anzeigen von Bildern auf dem Pico mit dem Pimoroni-Display.
Dazu gehören
die Leistung (da der Pico ein Mikrocontroller ist, hat er viel weniger Rechenleistung als ein PC) und die geringe
Speicherkapazität. Deshalb ist es nicht möglich, die standardmäßigen Python-PNG-Bibliotheken zu verwenden.
Infolgedessen werde ich benutzerdefinierte Bilddateien außerhalb des Pico auf einem Linuxrechner (geht auch mit einem Raspberry Pi)
erstellen.
Wenn Sie den Vorgang selbst nachvollziehen wollen, brauchen Sie zunächst entsprechende Bilddateien im PNG-Format
mit der exakten Größe 240x135 Pixel. Die kann man mit einem geeigneten Bildbearbeitungsprogramm (wie z.B. Gimp)
erzeugen. Nun müssen die RGB Werte jedes Bildes in eine RGB565-Zwei-Byte Liste konvertiert werden. Anschließend
sind die Bilder mit der Extension *.raw auf den Pico zu kopieren. Dazu braucht es zwingend einen Linux-Rechner (z.B. Raspberry Pi)
, auf dem 'rshell' in der Konsole ausgeführt wird. Um die PNG-Bilddateien zu konvertieren hier das leicht anzupassende
Python Script zum Download. Wer sich das nicht selber zutraut,
hier vier
Beispieldateien
, die schon konvertiert sind. Auch die müssen
allerdings unter 'Linux' auf den Pico kopiert werden. Speichern Sie die Bilder auf einem USB-Stick und stecken ihn am Raspberry an.
Jetzt wird der Pi Pico ebenfalls über einen USB-Anschluss mit dem Raspberry verbunden. Dann geben Sie folgende Kommandos ein:
1
2
3
4
rshell
cd /media/pi/USB_Stick/
cp werbe*.raw /pyboard
Wenn Sie den Namen ihres USB-Sticks nicht kennen, geben Sie evtl. vor Zeile 3 folgenden Befehl ein:
ls -l /media/pi/
Dort wird der USB-Stick als Ordner angezeigt und den setzen Sie dann in Zeile 3 anstelle von 'USB_Stick' ein.
Wenn alle vier Bilddateien fehlerfrei kopiert wurden, beenden Sie rshell mit 'exit'.
Pythonscript
Nun folgt das Pythonscript zur Darstellung der Bilder. Zunächst wollen wir nur ein Bild darstellen, um das Prinzip zu verstehen.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import picodisplay as display
import time
width = display.get_width()
height = display.get_height()
display_buffer = bytearray(width * height * 2)  # 2-bytes per pixel (RGB565)
display.init(display_buffer)
display.set_backlight(1.0)
display.set_pen(255,0,0)
display.clear()
display.set_pen(255,255,255)
display.text("Lade Bild ...", 25,110,240,3)
display.update()
Damit ist das Display initialisiert, die Hintergrundbeleuchtung auf 1.0 (volle Helligkeit) gestellt und der Hinweis,
dass ein Bild geladen wird an das Display übertragen. Es folgen nun zwei Funktionen, welche die Bytes in den Displaypuffer
speichern.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
def setup1():
blit_image_file (name1)
display.update()
def blit_image_file (filename):
global display_buffer
with open (filename, "rb") as file:
position = 0
while position < (width * height * 2):
current_byte = file.read(1)
if len(current_byte) == 0:
break
display_buffer[position] = ord(current_byte)
position += 1
file.close()
Achten Sie bei der Eingabe wieder auf die Einrückungen um jeweils 4 Leerzeichen, wie sie die Python Syntax verlangt. Fehlt jetzt nur noch
die Schleife, welche die obigen Funktionen aufruft und das Bild darstellt.
32
33
34
35
while True:
name1="werbe1.raw"
setup1()
time.sleep(3)
Die drei Sekunden Warteschleife wären hier nicht notwendig und könnten durch ein 'break' ersetzt werden, damit das Programm beendet wird, denn es
passiert ja nach dem einen Bild eh nichts mehr.
Um alle vier Bilder der Reihe nach anzuzeigen, fügen Sie in der 'while'-Schleife analog zu den Zeilen 33, 34 und 35 die entsprechenden Dateinamen und
'Setup'-Aufrufe ein. Die Funktionen 'Setup2', 'Setup3' und 'Setup4' müssen natürlich ebenfalls entsprechend der Zeilen 16, 17, und 18
ergänzt werden.
Sie finden hier noch den Link, um das
Pythonscript
zur Darstellung der vier PNG-Bilder herunter zu laden. Entpacken Sie es und legen es auf dem Pico oder ihrem Rechner ab, der mit dem Pico
verbunden ist. Die Bilddateien müssen sich auf dem Pi Pico befinden!!
Viel Spass und Erfolg beim Ausprobieren.
Zurück
Wenn Sie den Vorgang selbst nachvollziehen wollen, brauchen Sie zunächst entsprechende Bilddateien im PNG-Format mit der exakten Größe 240x135 Pixel. Die kann man mit einem geeigneten Bildbearbeitungsprogramm (wie z.B. Gimp) erzeugen. Nun müssen die RGB Werte jedes Bildes in eine RGB565-Zwei-Byte Liste konvertiert werden. Anschließend sind die Bilder mit der Extension *.raw auf den Pico zu kopieren. Dazu braucht es zwingend einen Linux-Rechner (z.B. Raspberry Pi) , auf dem 'rshell' in der Konsole ausgeführt wird. Um die PNG-Bilddateien zu konvertieren hier das leicht anzupassende Python Script zum Download. Wer sich das nicht selber zutraut, hier vier Beispieldateien , die schon konvertiert sind. Auch die müssen allerdings unter 'Linux' auf den Pico kopiert werden. Speichern Sie die Bilder auf einem USB-Stick und stecken ihn am Raspberry an. Jetzt wird der Pi Pico ebenfalls über einen USB-Anschluss mit dem Raspberry verbunden. Dann geben Sie folgende Kommandos ein:
1
2
3
4
|
rshell
cd /media/pi/USB_Stick/
cp werbe*.raw /pyboard
|
Wenn Sie den Namen ihres USB-Sticks nicht kennen, geben Sie evtl. vor Zeile 3 folgenden Befehl ein:
ls -l /media/pi/
Dort wird der USB-Stick als Ordner angezeigt und den setzen Sie dann in Zeile 3 anstelle von 'USB_Stick' ein.
Wenn alle vier Bilddateien fehlerfrei kopiert wurden, beenden Sie rshell mit 'exit'.
Pythonscript
Nun folgt das Pythonscript zur Darstellung der Bilder. Zunächst wollen wir nur ein Bild darstellen, um das Prinzip zu verstehen.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import picodisplay as display
import time
width = display.get_width()
height = display.get_height()
display_buffer = bytearray(width * height * 2)  # 2-bytes per pixel (RGB565)
display.init(display_buffer)
display.set_backlight(1.0)
display.set_pen(255,0,0)
display.clear()
display.set_pen(255,255,255)
display.text("Lade Bild ...", 25,110,240,3)
display.update()
Damit ist das Display initialisiert, die Hintergrundbeleuchtung auf 1.0 (volle Helligkeit) gestellt und der Hinweis,
dass ein Bild geladen wird an das Display übertragen. Es folgen nun zwei Funktionen, welche die Bytes in den Displaypuffer
speichern.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
def setup1():
blit_image_file (name1)
display.update()
def blit_image_file (filename):
global display_buffer
with open (filename, "rb") as file:
position = 0
while position < (width * height * 2):
current_byte = file.read(1)
if len(current_byte) == 0:
break
display_buffer[position] = ord(current_byte)
position += 1
file.close()
Achten Sie bei der Eingabe wieder auf die Einrückungen um jeweils 4 Leerzeichen, wie sie die Python Syntax verlangt. Fehlt jetzt nur noch
die Schleife, welche die obigen Funktionen aufruft und das Bild darstellt.
32
33
34
35
while True:
name1="werbe1.raw"
setup1()
time.sleep(3)
Die drei Sekunden Warteschleife wären hier nicht notwendig und könnten durch ein 'break' ersetzt werden, damit das Programm beendet wird, denn es
passiert ja nach dem einen Bild eh nichts mehr.
Um alle vier Bilder der Reihe nach anzuzeigen, fügen Sie in der 'while'-Schleife analog zu den Zeilen 33, 34 und 35 die entsprechenden Dateinamen und
'Setup'-Aufrufe ein. Die Funktionen 'Setup2', 'Setup3' und 'Setup4' müssen natürlich ebenfalls entsprechend der Zeilen 16, 17, und 18
ergänzt werden.
Sie finden hier noch den Link, um das
Pythonscript
zur Darstellung der vier PNG-Bilder herunter zu laden. Entpacken Sie es und legen es auf dem Pico oder ihrem Rechner ab, der mit dem Pico
verbunden ist. Die Bilddateien müssen sich auf dem Pi Pico befinden!!
Viel Spass und Erfolg beim Ausprobieren.
Zurück
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
import picodisplay as display
import time
width = display.get_width()
height = display.get_height()
display_buffer = bytearray(width * height * 2)  # 2-bytes per pixel (RGB565)
display.init(display_buffer)
display.set_backlight(1.0)
display.set_pen(255,0,0)
display.clear()
display.set_pen(255,255,255)
display.text("Lade Bild ...", 25,110,240,3)
display.update()
|
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
|
def setup1():
blit_image_file (name1)
display.update()
def blit_image_file (filename):
global display_buffer
with open (filename, "rb") as file:
position = 0
while position < (width * height * 2):
current_byte = file.read(1)
if len(current_byte) == 0:
break
display_buffer[position] = ord(current_byte)
position += 1
file.close()
|
32
33
34
35
|
while True:
name1="werbe1.raw"
setup1()
time.sleep(3)
|
Viel Spass und Erfolg beim Ausprobieren.
Zurück