Ausprobiert: CircuitPython auf dem Raspberry Pi

Seite 2: Loslegen mit CircuitPython

Inhaltsverzeichnis

Python-Skripte sind einfache Textdateien, die mit jedem beliebigen Texteditor erstellt werden können. Adafruit empfiehlt den Editor Mu, da dieser von Haus aus einen CircuitPython-Modus mitbringt. Unter Linux kann man problemlos auf dem Desktop mit Mu arbeiten und die Dateien per ssh auf dem Raspi speichern. Unter Windows braucht man dafür zusätzliche Software.Grundsätzlich tut es auch ein einfacher Editor wie Nano, der im Terminalfenster des Raspi läuft.

Der Beispielcode "blinkatest" ist ein einfacher Selbsttest, der GPIOs, SPI und I2C anspricht und Erfolg oder Misserfolg meldet. Dafür muss man zuvor die Schnittstellen I2C und SPI aktivieren, was am einfachsten mit Raspi-Config (sudo raspi-config) zu erledigen ist. Um den Selbsttest oder andere Skripte zu starten, führt man sie in der Kommandozeile mit Python 3 aus:

python3 blinkatest.py

Funktioniert das, steht weiteren Code-Beispielen nichts entgegen. Einfache Dinge wie eine LED blinken oder einen Button abfragen, also die Grundfunktion digitaler Ein- und Ausgänge liefen auf Anhieb problemlos. Wir wollten noch ein wenig mehr ausprobieren als das "Hallo Welt" des Bastelns. Deshalb haben wir unser Glück mit einem OLED-Display mit SSD1306 und einem Temperatur- und Luftfeuchtesensor des Typs DHT22 versucht.

Die Werte für Temperatur und Luftfeuchtigkeit werden aus dem Sensor ausgelesen und auf dem Display ausgegeben.

Das Display (128 × 64 Pixel) wird über I2C angesprochen. Damit CircuitPython etwas damit anfangen kann, muss erst noch das entsprechende Modul nachinstalliert werden:

pip3 install adafruit-circuitpython-ssd1306

Das folgende Beispiel zeigt, wie das Display in Python initialisiert wird. Das Modul board enthält die boardspezifischen Pin-Definitionen und busio kümmert sich um die I2C-Schnittstelle. Beide sind die Voraussetzung dafür, dass adafruit_ssd1306 seinen Dienst verrichten kann. Im unteren Teil wird das monochrome Display für zehn Sekunden komplett auf weiß geschaltet.

import time 
from board import SCL, SDA
import busio
import adafruit_ssd1306

i2c = busio.I2C(SCL, SDA)
oled = adafruit_ssd1306.SSD1306_I2C(128, 64, i2c)

oled.fill(1)
oled.show()
time.sleep(10)
oled.fill(0)
oled.show()

Grafikfunktionen wie Punkte oder Linien ließen sich ebenso einfach umsetzen. Etwas schwieriger wurde es, als wir Text auf dem Display haben wollten. Dafür mussten wir per Hand einen Bitmap-Font aus dem Internet herunterladen und in den Ordner des Python-Skripts kopieren. Die von Adafruit gelieferte Schrift hat eine Zeichengröße von 5 × 8 Pixeln – für 8 Pixel hohe LED-Anzeigen ist das ganz hübsch, auf unserem 0,96"-Zoll-Display sind die Buchstaben jedoch arg winzig. Andere Schriftgrößen kennt das adafruit_ssd1306-Modul derzeit nicht, da man auf möglichst geringen Speicherverbauch hin optimiert hat. Alternative Schriften sind möglich, doch muss man dazu die "normale" Python-Bibliothek PIL (Python Image Library) einbeziehen.

Per SSH-Verbindung lassen sich Python-Skripte auf dem Desktop schreiben und auf dem Raspi speichern und ausführen.

Als Nächstes probierten wir den DHT22. Das zugehörige Modul wird mit pip3 install adafruit-circuitpython-dht installiert und in Python mit import adafruit_dht eingebunden. Vorausgesetzt ist hier ansonsten nur board, da der DHT über einen einzelnen Digitalpin abgefragt wird, der zwischen Ein- und Ausgang wechselt. Hier mussten wir leider feststellen, dass nicht jede Messung gelingt. Manchmal führte das Auslesen der Temperatur zu einem Runtime Error, wodurch das Skript unterbrochen wurde. Die genaue Ursache konnten wir nicht ermitteln.

CircuitPython ist zunächst als einsteigerfreundliche Programmiersprache für Mikrocontroller entstanden. Dort punktet Adafruits Sprache mit geringer Komplexität und bastelfertigen Lösungen. Auf dem Raspi gehen einige dieser Vorteile, besonders für Anfänger, verloren. Zwar klappt das Ansprechen von unterstützter Hardware recht einfach, getrübt werden die Erfolgserlebnisse aber durch den noch relativ unfertigen Eindruck, den die ausprobierten Module in der Praxis hinterlassen. Wer auf dem Raspberry Pi bereits mit Python programmiert, bekommt die CircuitPython-Module hinzu, mehr aber auch nicht.

Spannend wird es jenseits des Raspi, denn Adafruit hat Blinka für verschiedene Hardware-Plattformen konzipiert. Dazu gehören einige Beagle-Boards, Nvidia Jetson und der 15 Dollar billige Orange Pi PC. Langfristig soll CircuitPython noch auf weiteren Bastelrechnern laufen. Ein Knackpunkt ist dabei die Ansteuerung der Pins, über die jeweils die Hardware angeschlossen wird. Da es bisher keinen Standard gibt, müssen die Pins verschiedener Boards in CircuitPython definiert werden. Adafruit hofft hier auf freiwillige, helfende Hände aus der Community. So könnte es eines Tages egal sein, ob man seinen Sensor gerade an einen Mikrocontroller oder Bastelrechner steckt, weil der CircuitPython-Code immer funktioniert. Ob und wann die Vision Wirklichkeit wird, ist derzeit noch unklar. Aus technischer Sicht sind die richtigen Puzzleteile dafür vorhanden. (hch)