zurück zum Artikel

Ausprobiert: CircuitPython auf dem Raspberry Pi

Hintergrund
Grafik von Adafruits Python und der Raspberry Pi Himbeere.

(Bild: Adafruit)

Adafruits Einsteigersprache CircuitPython läuft jetzt auch auf dem Raspberry Pi. Wir haben es ausprobiert.

Seit einer Weile arbeitet Hardwarehersteller Adafruit daran, die hauseigene Programmiersprache CircuitPython auf dem Raspberry Pi [1] und anderen Linux-Rechnern lauffähig zu machen. Auf den ersten Blick irritiert das, denn CircuitPython ist ein Fork von MicroPython, einer abgespeckten Version von Python, die speziell für Mikrocontroller entwickelt wird – während Python selbst bereits prima auf den leistungsstärkeren Einplatinenrechnern läuft.

Doch Adafruit verfolgt ein höheres Ziel: In CircuitPython geschriebene Programme sollen auf möglichst vielen Hardwareboards laufen, ohne viel Anpassungsaufwand. Besonders das Zusammenstöpseln und Ansprechen verschiedener Sensoren, Motoren oder Leuchtdioden, also das klassische Maker-Terrain, soll einfacher werden. Weder Python, noch MicroPython werden derzeit mit diesem Ziel weiterentwickelt.

Vom Mikrocontroller zum Raspi

In der Welt der Mikrocontroller besteht CircuitPython zum einen aus dem Interpreter, der als Firmware auf dem Controller Python-Skripte ausführt. Zum anderen gibt es gut 150 Module, die viele Funktionen bereit stellen. Die meisten davon sind Treiber für populäre Bastel-Hardware [2].

Auf dem Raspberry Pi funktioniert CircuitPython etwas anders. Da Python 3 auf der Plattform schon läuft, muss das Rad nicht neu erfunden werden. Allerdings funktionieren die vielen nützlichen Treiber-Module nicht ohne Weiteres. Damit sie ihren Dienst tun, muss ein Kompatibilitätslayer hinzugefügt [3] werden. Dieser heißt wie das CircuitPython-Maskottchen "Blinka". Mit Blinka erhält man einen Raspberry Pi, der nach wie vor "normale" Python-Skripte versteht. Die CircuitPython-Module gibt es sozusagen als Bonus dazu. Es ist sogar möglich, beides in einem Skript zu vermischen, dabei kann es aber zu Konflikten mit anderen Modulen kommen und man verbaut sich den Weg zurück zu Mikrocontrollern.

Im Unterschied zu Mikrocontrollern hat der Raspberry Pi auch keine analogen Eingänge. Mit digitalen Ein- und Ausgängen sowie den Schnittstellen I2C und SPI kann aber ein großer Teil der üblichen Bastel-Hardware genutzt werden.

Aus dem Make-Testlabor

Die Make-Redaktion probiert viel mehr aus, als ins alle zwei Monate erscheinende Heft passt. Deshalb veröffentlichen wir auf unserer Webseite in loser Folge weitere Testberichte.

Raspi und Python einrichten

Adafruit selbst stellt auf Englisch eine detaillierte Installationsanleitung bereit [5]. Ausgangsbasis ist ein frisch installiertes und aktualisiertes Raspbian [6]. Für das Einspielen von Adafruits Blinka brauchen wir noch pip, eine Paketverwaltung für Python, die auf den Python-Package-Index (PyPI) zurückgreift. Dort findet man sämtliche Module für CircuitPython.

Um pip zu installieren führt man mit sudo, also als Administrator, die Befehle sudo apt install python3-pip und sudo pip3 install --upgrade setuptools aus. Damit hat man pip systemweit eingerichtet. Im Folgenden wird pip nur noch als normaler Benutzer ohne sudo ausgeführt. Alle so vorgenommenen Änderungen landen lokal im Home-Ordner des aktuellen Benutzers (standardmäßig "pi"). Mit pip wird erst eine Bibliothek zum Ansprechen der Pins pip3 install RPI.GPIO und schließlich Blinka installiert:

pip3 install adafruit-blinka

Damit ist die Installation fertig und wir können loslegen.

Loslegen mit CircuitPython

Python-Skripte sind einfache Textdateien, die mit jedem beliebigen Texteditor erstellt werden können. Adafruit empfiehlt den Editor Mu [7], 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 [8]. 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 [9], der GPIOs, SPI und I2C anspricht und Erfolg oder Misserfolg meldet. Dafür muss man zuvor die Schnittstellen I2C und SPI aktivieren [10], 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 [11] versucht.

Raspberry Pi neben Breadboard mit Temperatursensor und OLED, auf dem die aktuelle Temperatur angezeigt wird.
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.

Screenshot Python-Skripte auf Rechner.
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.

Fazit

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 [12]. 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.


URL dieses Artikels:
http://www.heise.de/-4436550

Links in diesem Artikel:
[1] https://learn.adafruit.com/circuitpython-on-raspberrypi-linux/circuitpython-raspi
[2] https://github.com/adafruit/Adafruit_CircuitPython_Bundle/blob/master/circuitpython_library_list.md
[3] https://github.com/adafruit/Adafruit_Blinka
[4] https://www.heise.de/make/artikel/Kurztests-2772998.html
[5] https://learn.adafruit.com/circuitpython-on-raspberrypi-linux/overview
[6] https://www.heise.de/make/artikel/Raspberry-Pi-einrichten-3327906.html
[7] https://www.heise.de/meldung/Mu-Neuer-Python-Editor-fuer-Einsteiger-4119566.html
[8] https://www.heise.de/tipps-tricks/Raspberry-Pi-SSH-einrichten-so-geht-s-4190645.html
[9] https://learn.adafruit.com/circuitpython-on-raspberrypi-linux/installing-circuitpython-on-raspberry-pi#install-python-libraries-3-10
[10] https://learn.adafruit.com/adafruits-raspberry-pi-lesson-4-gpio-setup/configuring-i2c
[11] https://www.heise.de/make/artikel/Internet-of-Things-Sensoren-zur-Umweltanalyse-3641125.html
[12] https://github.com/adafruit/Adafruit_Python_PlatformDetect