Python gehört schon seit Jahren zu den beliebtesten Programmiersprachen überhaupt. Die von Python zur Verfügung gestellten Eigenschaften stellen Anforderungen an die Hardware, die von Mikrocontrollern nicht ohne Weiteres erfüllt werden können. Ein PC kann das. Ein Raspberry Pi mit Linux als Betriebssystem kann das, ein Mikrocontroller wie ein Espressif ESP32, ein Nordic nRF52840, ein STM32 oder eines der verschiedenen Arduino-Boards hingegen nicht.
Das hat Damien P. George, einen Physiker und Softwareentwickler aus Cambridge (UK), im Jahr 2013 dazu bewogen, MicroPython zu entwickeln. Ziel der Entwicklung von MicroPython war, eine voll funktionsfähige, aber kompakte Version von Python 3 zu schaffen, die auf Mikrocontrollern (wie STM32, ESP8266, ESP32, RP2040 usw.) läuft. Mit diesem Buch werden Sie die Gemeinsamkeiten und Unterschiede von Python und MicroPython kennenlernen und schließlich in der Lage sein, mit MicroPython auf recht kleinen Mikrocontrollern zu arbeiten.
Schon heute setzen wir uns mit zunehmender Tendenz mit automatisierten Abläufen, Algorithmen und vernetzten Gegenständen im Alltag auseinander. Künstliche Intelligenz wird Prozesse unterstützen und möglicherweise auch irgendwann autonom übernehmen.
Auf diese Entwicklungen vorbereitet zu sein, um sie zu beherrschen, zu gestalten und weiter zu entwickeln bedarf es mehr als einen IT-Grundkurs im Gymnasium oder Studium. Wichtig ist es, die Chance zu haben, in diese Welt und das damit verbundene Denken hineinzuwachsen.
In einigen Ländern wurde das frühzeitig erkannt und durch entsprechende Initiativen gefördert. Die Idee ist, jedes Kind zu inspirieren, seine digitale Zukunft zu gestalten und die Maker-Bewegung in den Unterricht zu bringen.
Im Schweizer Lehrplan 21 wird der heutigen Lebenswelt von Kindern und Jugendlichen entsprochen, die „durchdrungen (ist) von traditionellen und digitalen Medien sowie von Werkzeugen und Geräten, die auf Informations- und Kommunikationstechnologien basieren und die durch ihre Omnipräsenz neue Handlungsmöglichkeiten und neue soziale Realitäten schaffen“ (https://v-fe.lehrplan.ch/index.php?code=e|10|2). Abgestimmt mit dem Lehrplan 21 steht mit der Oxocard ein mit WiFi ausgestatteter Computer zur Verfügung, der auch bereits über den Browser programmiert werden kann. Auch in Deutschland und Grossbritannien werden solche Aktivitäten durch Hard- und Software für den Einsatz in der Schule unterstützt.
„Unser Anspruch ist, dass jeder Schüler und jede Schülerin in der dritten Klasse in Deutschland so ein Ding in die Hände bekommt“, sagt Stephan Noller, einer der Gesellschafter von Calliope. „Es soll nicht irgendein Leuchtturmprojekt in Berlin-Wedding werden, sondern wir wollen in die Fläche – und zwar jedes Jahr von Neuem.“
So unterschiedlich die Angebote sind, eines haben sie gemeinsam: Sie werden von Menschen organisiert, die mit großer Begeisterung ihr Wissen rund um Programmierung und digitale Themen an Kinder und Jugendliche weitergeben. Bei den Machern um BBC micro:bit, Calliope mini und Oxocard ist diese Begeisterung zu spüren.
Ich möchte mich hier auf den technischen Bereich beschränken. Für ideologische Auseinandersetzungen sind andere besser geeignet.
Die folgende Tabelle zeigt eine Gegenüberstellung der technischen Merkmale der drei hier betrachteten Mikrocontrollerboards.
Mikrocontroller Board
BBC micro:bit
Calliope mini
Oxocard
Herkunft
UK
D
CH
Hauptmerkmale
Nordic nRF52833, BLE, Radio Motion Sensor (ST LSM303AGR) 5×5 LED Matrix Display (rot) 2 Taster 19 GPIO Piezo-Lautsprecher MEMS Mikrofon USB Micro B Anschluss (Programmierung und Stromversorgung) JST Batterieanschluss (3.3V) Temperatursensor (on-chip NRF52)
Nordic nRF51822, BLE, Radio Motion Sensor (Bosch BMX055) 5×5 LED Matrix Display (rot) DC Motortreiber (TI DRV8837) Piezo-Lautsprecher MEMS Mikrofon Neopixel (WS2812b) 2 Taster 8-11 GPIOs, PWM, 4 x analog UART + SPI + I2C USB Micro B Anschluss (Programmierung und Stromversorgung) JST Batterieanschluss (3.3V) 2 Grove Stecker (I2C + Seriell/Analog)
Espressif ESP32, BLE, WiFi Motion Sensor (ST LIS3DE) 8×8 Neopixel Matrix Kopfhörerbuchse für 8bit-Audioausgabe (mono) Mikrofon (PDM) NeoPixel Data-Out 6 Taster 6 GPIOs UART + SPI + I2C USB Micro B Anschluss (Programmierung und Stromversorgung) LiPo-Akku Anschluss für Grove I2C-Hub Temperatursensor (on-chip LIS3DE)
Programmier- umgebungen
MakeCode, MicroPython, JavaScript
MakeCode, Swift, abbozza! Calliope (basiert auf Blockly), C/C++ (Segger), MicropPython
Blockly, Oxoscript, Arduino (C/C++), MicroPython.
BBC micro:bit, Calliope mini, Oxocard – im Vergleich
Wie aus den Hauptmerkmalen abzuleiten ist, stellen alle drei Boards eine vergleichbare Infrastruktur bereit. Auf markante Unterschiede will ich im Folgenden eingehen. Eine Betrachtung der Ausgangsversionen von BBC micro:bit und Calliope mini hatte ich in einer früheren Veröffentlichung (https://www.elektroniknet.de/embedded/hardware/mikrocontroller-nicht-nur-fuer-die-schule.150415.html) bereits vorgenommen.
Herausstechendes Merkmal beim BBC micro:bit ist seine an der Unterkante des Boards befindliche als Goldfinger bezeichnete Anschlussleiste. Hier können zahlreiche Erweiterungsboard direkt angeschlossen werden. Einen guten Überblick zu diesen Erweiterungen finden Sie unter https://shop.pimoroni.com/collections/micro-bit-uk.
BBC mirco:bit v2
Beim Calliope mini wollte man den Goldfinger nicht übernehmen, da wegen der viel zu eng liegenden Kontakte im Schuleinsatz mit ständigen Kurzschlüssen durch die Schüler gerechnet werden müsste. Es wurden auf dem Board Erweiterungen, wie RGB-LED (Neopixel) und Motortreiber (H-Brücke) u.a., vorgesehen. Zusätzlich stellen die beiden Grove-Connectoren einen I2C-Bus, einen UART-Anschluss sowie einen analogen Eingang zur Kontaktierung von Sensoren oder Aktoren des umfangreichen Grove-Systems zur Verfügung. Eine gute Übersicht zum Grove-System bietet ein Grove Wiki von Seeedstudio (https://wiki.seeedstudio.com/Grove_System/).
Calliope mini v2
Die Oxocard geht einen etwas anderen Weg. Die elektronischen Interna sind gut verpackt in einem Kartongehäuse. Durch den Einsatz eines ESP-32 steht neben BLE auch WiFi zur Verfügung, wodurch Internet-Konnektivität gegeben ist. Durch diese Option ist es möglich IoT-Projekte zu realisieren. Der LiPo-Akku sorgt dann für einen gewissen Zeitraum sogar für autonome Einsatzmöglichkeiten ohne externe Spannungsversorgung.
Nach außen hin stehen die sechs Taster und die 8×8 Neopixel Matrix für Experimente zur Verfügung. Durch die Verwendung der internen Sensoren kommt der Anwender erstmal vollkommen ohne elektrische Verbindungen nach außen aus.
Kommuniziere Meldungen zwischen Oxocards, hol dir Daten aus dem Internet oder stelle deine Karte als Sensor anderen zur Verfügung. All das ist ohne Erweiterungen möglich.
Oxocard mit Kartongehäuse
Für den Maker von Interesse sind natürlich die Erweiterungsmöglichkeiten. Ergänzend zum Lieferumfang der Oxocard ist der OXOCARD i2C-Hub-Erweiterungsport verfügbar.
Lieferumfang Oxocard
Der Oxocard I2C Hub ist ein kleiner Bausatz, um der Oxocard relativ einfach das Anschließen von beliebigen I2C-Grove- Komponenten zu ermöglichen. Mit diesem I2C-Hub können Sie die Oxocard mit zusätzlichen GROVE-kompatiblen Sensoren und Aktoren erweitern. Außerdem kann über eine Buchsenleiste der SPI-Port nach außen geführt werden.
SPI- und I2C-Bus an der Oxocard
Mit diesen Erweiterungsmöglichkeiten ist die Oxocard ein für den Schulbetrieb geeigneter, komplett ausgestatteter und erweiterbarer Mikrocontroller, der als einziger Internet-Zugriff aufweist.
Allen drei vorgestellten Boards gemeinsam ist neben der grafischen Programmierung in MakeCode resp. Blockly die Programmierung in MicroPython.
Auf Grund der abweichenden Pinbelegungen zwischen BBC micro:bit und Calliope mini ist die Programmierung in Python gerade für I/O-Operationen nicht immer ohne Probleme. Die folgende Tabelle zeigt die Unterschiede:
nRF51822
micro:bit
Calliope mini
P0.00
SCL
P0
P0.01
P2
P1
P0.02
P1
P2
P0.03
P0
P3 (MIC)
P0.04
COL1
P4 (LED_C1)
P0.05
COL2
P5 (LED_C2)
P0.06
COL3
P6 (LED_C3)
P0.07
COL4
P7 (LED_C4)
P0.08
COL5
P8 (LED_C5)
P0.09
COL6
P9 (LED_C6)
P0.10
COL7
P10 (LED_C7)
P0.11
COL8
P11 (LED_C8)
P0.12
COL9
P12 (LEDC_9)
P0.13
ROW1
P13 (LED_R1)
P0.14
ROW2
P14 (LED_R2)
P0.15
ROW3
P15 (LED_R3)
P0.16
P16
P16 (TAST_B)
P0.17
BTN A
P17 (TAST_A)
P0.18
P18
P18 (RGB LED)
P0.19
TGT nRST
P19 (SCL)
P0.20
P20
P20 (SDA)
P0.21
MOSI
P21 (BMX055 INT)
P0.22
MISO
P22
P0.23
SCK
P23
P0.24
TGT TxD
P24 (TxD)
P0.25
TGT RxD
P25 (RxD)
P0.26
BTN B
P26 (Rx)
P0.27
ACC INT2
P27 (Tx)
P0.28
ACC INT1
P28
P0.29
MAG INT1
P29
P0.30
SDA
P30
Zur Temperaturmessung möchte ich von folgendem Setup ausgehen.
Dezentrale Temperaturerfassung mit Calliope
Ein abgesetzter Calliope mini wird über ein Steckernetzteil am USB-Anschluss mit Spannung versorgt. Ein Temperatursensor LM35 erfasst die Temperatur im Bereich von 0 bis 150 °C. Hat man eine LM35 nicht zur Verfügung, dann kann anfangs auch mit dem internen Temperatursensor der CPU gearbeitet werden. Der Sensor sendet über die Radio-Verbindung die erfasste Temperatur an einen zweiten Calliope mini, der über USB mit einem PC verbunden ist.
Auf dem PC läuft ein Terminalprogramm (z.B. PuTTY) und erfasst die hier mit 9600 Baud seriell übertragenen Daten und bringt diese zur Anzeige.
Die beiden Calliope mini sind mit den folgenden Programmen zu flashen.
Sender:
# Measuring chip temperature on CPU & output to console
# works unchanged for micro:bit & Calliope mini
from microbit import *
import radio
# The radio won't work unless it's switched on.
radio.on()
while True:
temp = temperature() - 3 # offset to ambient temperature
display.scroll(str(temp)+" *C")
radio.send(str(temp))
sleep(60000) # sleep a minute
Bei Einsatz eines LM35 Temperatursensors ist das Erfassen der Temperatur anzupassen:
temp = pin1.read_analog() * 330 / 1024
Der Ausgang des LM35 ist, wie in der Abbildung gezeigt, mit P2 am Calliope mini zu verbinden (sh. auch in der Tabelle oben).
Empfänger:
# Receiving chip temperature from a second board & output to console
# works unchanged for micro:bit & Calliope mini
from microbit import *
import os
import radio
uart.init()
uart.write(os.uname().machine + "\r\nGet chip temperature by radio connection\r\n")
# The radio won't work unless it's switched on.
radio.on()
while True:
# Read any incoming messages.
temp = radio.receive()
if str(temp) != "None":
display.scroll(str(temp)+" *C")
uart.write("Received chip temperature = "+str(temp)+" *C\r\n")
sleep(1000)
Die Reichweite der Radio Verbindung des Calliope mini liegt bei ca. 20 m, so dass dem Test im Wohnraum wenig Grenzen gesetzt sind.
Will man den Calliope mini nicht im Schulkontext verwenden, dann bietet sich, wie beim micro:bit, die Programmierung in Micro-Python an.
Einen Editor findet man beispielsweise unter http://python.microbit.org/editor.html. In diesen Editor pastet man dann einfach den Python-Quelltext, wie z.B. das folgende Programmbeispiel zur Temperaturmessung.
# Measuring chip temperature on Calliope mini & output to console
from microbit import *
import os
uart.init()
uart.write(os.uname().machine +" measuring chip temperature\r\n")
while True:
temp = temperature() - 3 # offset to ambient temperature
display.scroll(str(temp)+" C")
uart.write("Calliope mini chip temperature = "+str(temp)+" C\r\n")
sleep(5000)
Nach dem Compilieren kann das erstellte File microbit.hex einfach in das Laufwerk kopiert werden, als das sich der Calliope mini beim Anschluss über USB meldet.
Zum Beobachten der seriellen Ausgaben kann bspw. mit PuTTY auf das betreffende COM-Port zugegriffen werden. Die Baudrate beträgt hier 9600 Bd. Die LED-Matrix zeigt die Ausgabe als Laufschrift an.
Zugang zu den verschiedenen Ressourcen des eingesetzten Mikrocontrollers erhält man über die micro:bit Python API.