News CircuitPython 8.0b2 erschienen – browserbasierter Workflow und andere Neuerungen


von Tam H. (Firma: Tamoggemon Holding k.s.) (tamhanna)


Angehängte Dateien:

Lesenswert?

AdaFruit leistet sich mit CircuitPython seit längerer Zeit einen auf “einsteigerfreundlichere Bedienung” optimierten Fork von MicroPython. Die derzeit in Betaphase befindliche Beta 8.0 erweitert die Hardwareunterstützung (Stichwort WLAN am Pico W) und bietet neben einigen Komfortsteigerungen einen browserbasierten Workflow an. Diese Newsmeldung stellt besonders interessante Neuerungen en Detail vor.

(Bildquelle: AdaFruit)

Eine Frage der Zielhardware

CircuitPython unterstützt diverse Zielboards – vollständig stabil sind dabei die folgenden Portierungen:

1
    atmel-samd: Microchip SAMD21, SAMx5x
2
    cxd56: Sony Spresense
3
    espressif: Espressif ESP32-S2
4
    nrf: Nordic nRF52840, nRF52833
5
    raspberrypi: Raspberry Pi RP2040
6
    stm: ST STM32F4 chip family

Im Beta- bzw Instabile-Status werden einige weitere Plattformen angeboten:

1
These ports are considered alpha and will have bugs and missing functionality:
2
    broadcom: Raspberry Pi boards such as RPi 4, RPi Zero 2W
3
    espressif: ESP32-S3, ESP32-C3
4
    litex: fomu
5
    mimxrt10xx: NXP i.MX RT10xxx
6
    stm: ST non-STM32F4 chip families

Der Autor wird in den folgenden Schritten einen Adafruit CLUE und einen Raspberry Pi Pico W verwenden. Unter der URL https://circuitpython.org/board/clue_nrf52840_express/ findet man ein downloadfertiges Archiv der aktuellsten Beta (adafruit-circuitpython-clue_nrf52840_express-en_US-8.0.0-beta.1.uf2), die sich wie gewohnt auf den CLUE installieren lässt.

Fortgeschrittener .env-Parser erleichtert Konfiguration

CircuitPython 8.0 bringt – siehe auch https://docs.circuitpython.org/en/latest/docs/environment.html – einen .env-Dateiparser mit, der an Linux und Co erinnernde Umgebungsvariablen realisiert. Der wichtigste Anwendungsfall dafür ist die Konfiguration eines WLANs, unter dem ein unkonfiguriertes Board Kontakt zu Funknetzen aufzunehmen sucht. Die im Rahmen des Start-Prozesses eingelesene Datei muss dabei nach folgendem Schema im Stammverzeichnis entstehen:

1
tamhan@TAMHAN18:/media/tamhan/CIRCUITPY$ sudo touch .env
2
tamhan@TAMHAN18:/media/tamhan/CIRCUITPY$ sudo gedit .env

Für eine grundlegende Exponierung des Web-Interfaces reicht folgender Inhalt aus:

1
CIRCUITPY_WIFI_SSID='Tamoggemon Holding k.s. WiFi BA2'
2
CIRCUITPY_WIFI_PASSWORD='pwhierrein'
3
CIRCUITPY_WEB_API_PORT='80'
4
CIRCUITPY_WEB_API_PASSWORD='hallotam'

Nach dem Abspeichern empfiehlt sich ein beherzter Druck auf den Reset-Knopf, um den Prozessrechner neu zu starten. Er präsentiert dann das in Abbildung eins gezeigte Schirmbild.

Bildquelle: Tamoggemon Holding KS.

Auffällig ist hier die am oberen Bildschirmrand eingeblendete Statusleiste, die über den Zustand des Boards informiert.

Browserbasierte Interaktion mit dem Evaluationsboard

Das Ausliefern und Ausführen von Code wird in der Welt von CircuitPython als „Workflow“ bezeichnet. Unter der URL https://docs.circuitpython.org/en/latest/docs/workflows.html finden sich weitere Informationen zu den verschiedenen möglichen Workflows. Wir wollen hier - schon im Interesse der Lustigkeit - den neuen, browser basierten Workflow verwenden. Er setzt eine WLAN-Verbindung voraus, die durch Nutzung der .env-Datei konfiguriert werden kann. Da der Clue kein WLAN-Modul mitbringt, müssen wir an dieser Stelle auf den Raspberry Pi Pico W umstellen. Der „für ihn“ vorgesehene Python-Port liegt unter der URL https://circuitpython.org/board/raspberry_pi_pico_w/, und lässt sich wie jede andere .UF 2-Datei installieren. Nach einem Neustart kann ein Nmap-Lauf für Klarheit sorgen - zum Zeitpunkt der Abfassung dieses Artikels scheint der Raspberry Pi Pico W allerdings noch nicht im WLAN auf. Nach dem Starten des Mu-Editors können Sie in der REPL nach folgendem Schema die IP-Adresse überprüfen:

1
>>> import wifi
2
>>> print("My IP address is", wifi.radio.ipv4_address)
3
My IP address is 0.0.0.0

Das Zurückgeben von 0.0.0.0 informiert uns dann darüber, dass der automatische Verbindungsaufbau fehlgeschlagen ist. Dies lässt sich auf der Kommandozeile nach folgendem Schema beheben:

1
>>> wifi.radio.connect("Tamoggemon Holding k.s. WiFi BA2", "passhier")
2
>>> print("My IP address is", wifi.radio.ipv4_address)
3
My IP address is 192.168.2.133

Leider funktioniert der Workflow zum Zeitpunkt der Drucklegung überhaupt nicht - ein Nmap-Scan zeigt nun wie in der Abbildung gezeigt, dass keine offenen Ports zur Verfügung stehen.

Bildquelle: Tamoggemon Holding K. S.

Unter der URL https://www.youtube.com/watch?v=Lgo6Eq1EIuc&t=550s bietet Adafruit allerdings ein Video an, das die Nutzung des Webeditors auf einem ESP32-Board demonstriert. Besonders interessant ist daran, dass der Codeeditor – analog zu Threema Web – den Gutteil der Ressourcen nicht aus dem Speicher des Boards, sondern aus dem Internet beschafft.

Bildquelle: AdaFruit

Wer die URL https://code.circuitpython.org/ aufruft, findet ausserdem schon jetzt den in der Abbildung gezeigten Codeeditor.

Bildquelle: Screenshot

DMA-AD und DMA-DA

Dass DMA-Modi bei AD- und DA-Konvertern insbesondere im Zusammenspiel mit emulierten Sprachen zu einer Performance-Steigerung führen, dürfte bekannt sein - Interaktionen mit der HAL sind und bleiben nun mal Performance-ineffizient. Mit dem unter https://docs.circuitpython.org/en/latest/shared-bindings/analogbufio/index.html#module-analogbufio im Detail beschriebenen analogbufio-Feature bekommt CircuitPython nun eine neue Funktion, die - derzeit nur am RP 2040 - nach folgendem Schema ganze Puffer ein- oder ausliest:

1
import analogbufio
2
import array
3
from board import *
4
5
length = 5000000
6
mybuffer = array.array("H", 0x0000 for i in range(length))
7
adc_in = analogbufio.BufferedIn(GP26, mybuffer, length)
8
analogbufio.read()
9
print(*mybuffer)
10
adc_in.deinit()

Mehr erfahren

Die in den Release Notes angeführten Änderungslisten fallen im Allgemeinen sehr kompakt aus. Unter der URL https://docs.circuitpython.org/en/latest/ findet der geneigte Leser allerdings eine Version der Onlinedokumente, die auf die aktuellste Betaversion der Runtime zugeschnitten sind.


: Bearbeitet durch NewsPoster
von N. M. (mani)


Lesenswert?

>adc_in = analogbufio.BufferedIn(

Edit: siehe unten.
In der Beschreibung werden einmal die Attribute für BufferedIn mit 
Pin,Buffer,length angegeben. Weiter unten mit Pin, Buffer, rate. Ich 
vermute zweites ist richtiger, oder? Buffer beinhaltet im Normalfall ja 
die Länge bereits. Außerdem muss ja irgendjemand auch den ADC richtig 
einstellen. Wenn das die Klasse analogbufio nicht macht, fehlt es im 
Beispiel auch.

Was in meinem Augen auch etwas ungeschickt ist: ich sehe keine Methode 
wie man an den aktuellen Füllstand rankommt. Wie erkennt man denn das 
überhaupt schon ein Wert gesampelt wurde? In Beispiel 2 auf dem Link 
kein Problem, da rate==500ksps. Was passiert mit dem Beispiel aber wenn 
man da Mal eine 1 als rate einträgt? Dann greift das Print doch in den 
leeren Puffer.
Oder ist das alles blockieren?

Edit:
OK, beim ersten Beispiel habe ich mich verlesen. Da wird nur ein Pin und 
Buffer übergeben. Rate ist Default 500k. Die restlichen Fragen bleiben 
trotzdem.

: Bearbeitet durch User
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.