IDE-Setup
In diesem Teil der Artikelserie greifen wir auf das Kommandozeilen-Tool Mpremote [8] zurück, um den Mikrocontroller mit MicroPython zu programmieren. Das Kommando pip install --user mpremote installiert das in Python geschriebene Werkzeug auf dem System. Um damit arbeiten zu können, benötigen Sie zunächst ein lokales Verzeichnis, in dem Sie die Dateien für Ihr Projekt ablegen. Die Projektdateien können Sie dann mit einem beliebigen Editor erstellen und bearbeiten.
Zum Ausführen eines Programms auf dem Mikrocontroller nutzen Sie den Befehl mpremote run Datei. Das Programm wird direkt ins RAM des Controllers geladen und sofort ausgeführt. Auf diese Weise lassen sich die Programme sehr schnell testen. Ein weiterer Vorteil liegt darin, dass der Programmcode nicht erst in den Flash-Speicher des Controllers geladen wird, um ihn danach auszuführen. Auf dieses Verfahren stützen sich viele IDEs. Das hat den Nachteil, dass Flash-Speicher nur eine begrenzte Anzahl an Schreibzyklen vertragen. Dementsprechend sollten Sie generell nicht zu oft darauf schreiben.
Mpremote stellt sehr viele Funktionen bereit, die Sie beim Entwickeln von MicroPython-Programmen unterstützen. Wir gehen hier nur auf einen kleinen Teil der Möglichkeiten ein. Eine komplette Übersicht sämtlicher Funktionen liefert das Kommando mpremote -help. Als extrem nützlich erweist sich beispielsweise die Funktion mpremote fs Anweisung. Sie gestattet Operationen auf dem MicroPython-Dateisystem des Geräts. Die Tabelle “Anweisungen auf dem MicroPython-FS” fasst die möglichen Anweisungen zusammen.
|
Kommando |
Beschreibung |
|---|---|
|
|
Zeigt den Inhalt einer Textdatei an. |
|
|
Listet die Dateien in einem Ordner auf. |
|
|
Kopiert Dateien. |
|
|
Löscht Dateien. |
|
|
Erstellt ein Verzeichnis. |
|
|
Löscht ein Verzeichnis. |
|
|
Erzeugt eine Datei. |
Ebenfalls interessant ist der Aufruf mpremote mount, mit dem Sie das Dateisystem des Mikrocontrollers in das Projektverzeichnis einhängen. Stoßen Sie dabei einmal an die Kapazitätsgrenzen der MCU, gibt mpremote df Auskunft über die Speicherbelegung des Flash-Mediums.
Für einfachen Test von Mpremote schreiben Sie ein Programm, das die LED des Raspberry Pi Pico blinken lässt (Listing 1), und starten es mit dem Kommando mpremote run blink.py. Bitte beachten Sie, dass Mpremote standardmäßig das erste freie MicroPython-Board auswählt. Solange lediglich ein Board am Rechner hängt, passiert nichts Unerwartetes. Arbeitet das Programm wie erwartet, übertragen Sie es in den Flash-Speicher. Dann können Sie das Programm zudem automatisch beim Anlegen der Betriebsspannung starten lassen.
Listing 1
blink.py
from machine import Pin from time import sleep led = Pin(25, Pin.OUT) while True: led.toggle() print(led.value()) sleep(1)
Testprogramm
Die Funktionsweise der I2C-Schnittstelle testen Sie, indem Sie einen BME680-Sensor daran anschließen. Zum Auslesen der Werte aus dem Sensor dient eine Bibliothek. Der Befehl aus Listing 2 bringt sie auf den Mikrocontroller.
Listing 2
Library laden
$ mpremote mip install github:robert-hh/BME680-Micropython/bme680.py
Um I2C in MicroPython zu nutzen (Listing 3), importieren Sie aus der Bibliothek machine die passenden Funktionen (zweite Zeile). Beim Erzeugen des I2C-Objekts (Zeile 4) müssen Sie die GPIO-Pins angeben, die Sie für die Schnittstelle verwenden möchten. Sämtliche Zugriffe auf die Schnittstelle erfolgen über das Objekt i2c.
Listing 3
i2c.py
from bme680 import * from machine import I2C, Pin import time i2c = I2C(0, sda=Pin(20), scl=Pin(21)) bme = BME680_I2C(i2c, address=0x76) print(bme.temperature, bme.humidity, bme.pressure)
Achten Sie bitte darauf, dass sich nicht alle GPIO-Pins für I2C eignen. Ein Blick auf das Pinout (Abbildung 3) bringt hier schnell Klarheit, welche Pins infrage kommen. Das Vorgehen gilt generell für alle Schnittstellen, nicht nur für I2C. Bei I2C besitzen sämtliche Geräte eine eindeutige Adresse am Bus, die Sie beim konkreten Zugriff auf ein Gerät mit angegeben (Zeile 5).

Abbildung 3: Das Pinout des Pi Pico verrät, welche Pins sich für die Schnittstellen eignen. Quelle: Raspberry Pi Foundation
Die Ausgabe der Messwerte gelingt über ein print() auf der Konsole. Bei den Messwerten für Temperatur und Luftfeuchte sollten Sie stets daran denken, dass sich der Sensor durch das Messen erwärmt und dadurch die Messwerte verfälscht. Versuchen Sie deshalb, zwischen den Messungen eine ausreichend lange Pause einzulegen, damit der Sensor sich wieder abkühlt. Prinzipiell könnten Sie stattdessen mit einem Kühlkörper arbeiten, um dem Effekt entgegenzuwirken. Das erweist sich allerdings bei einem so kleinen Bauteil als durchaus abenteuerlich, insbesondere, da sich die Öffnung zum Messen der Luftfeuchte auf der Oberseite befindet.
SPI-Testprogramm
Das Programm in Listing 4 zum Testen des SPI liest aus dem AD-Wandler MCP3008 den Wert für den Kanal 0 aus. Mithilfe des Datenblatts ermitteln Sie, welche Steuer-Bytes es dazu braucht. Diese Byte-Sequenz schreiben Sie in das Array buffer_out, das Array buffer_in empfängt den Messwert. Da der Wandler die 10-Bit-Werte liefert, verteilt sich ein Messwert immer auf zwei Bytes im Array. Die letzte Zeile im Programm setzt die Messwerte wieder zusammen und gibt sie aus. Dabei rangieren die Werte abhängig von der Position des Potentiometers zwischen 0 und 1023.
In der dritten Zeile konfigurieren Sie die Schnittstelle: Hier definieren Sie, auf welchen GPIO-Pins die einzelnen Datenleitungen liegen. Darüber hinaus legen Sie die Geschwindigkeit für die Kommunikation fest. Die maximal mögliche Übertragungsrate findet sich im Datenblatt der ausgewählten ICs. Über die CS-Leitung steuern Sie, ob ein SPI-Gerät am Bus aktiv ist oder nicht. Zeile 9 wickelt die komplette Datenübertragung ab: Der Ausgabepuffer wird gesendet und gleichzeitig der Eingabepuffer empfangen.





