Autor: Leonard

  • Januar 2025

    Ein kleiner Braindump vom Januar 2025.

    Blobbadge und Embedded Rust

    Auf dem 38c3 habe ich das Blobbadge von Rough Rat electronics entdeckt, welches auf dem etwas obskuren PY32F002 Mikrocontroller basiert und eine Firmware in Rust mit Embassy verwendet. Rust möchte ich schon länger lernen, und von Embassy hatte ich kurz vorher im Talk Liberating Wi-Fi on the ESP32 gehört!

    Also habe ich angefangen, ein bisschen Rust zu lernen und bin ziemlich fasziniert von der Idee, Mikrocontroller asynchron zu programmieren. Macht eigentlich total Sinn, so häufig wie man nach einer Aktion z.B. auf einen Interrupt warten muss.

    Nachdem ich mich durch die ersten paar Kapitel The Rust Programming Language gekämpft habe, habe ich ein paar Beispiele für ein ESP32-C3 Dev-Board, dass ich aus einem alten Zigarettenautomaten habe, der auf dem 38c3 stand, zusammengebastelt. Den Code habe ich mit probe-rs geflasht, was ich vorher auch noch nicht kannte. Ziemlich cool, dass man jetzt einfach direkt per USB mit einem einfachen Tool den Mikrocontroller flashen und in VSCode debuggen kann, das ging mit ATMega8-Arduinos noch nicht!

    Danach habe ich die Firmware fürs Blobbadge kompilliert und versucht, mit probe-rs und einem DAPLink, den ich auf dem 38c3 geschenkt bekommen habe, zu flashen. Dazu habe ich zuerst versucht, einen 3D gedruckten Programmier-Clip zu verwenden. Leider hatte der keinen guten Kontakt, vielleicht lag es aber auch am Programmer oder den fehlenden Pogo Pins.

    Also habe ich ein bisschen zu kleine Federprüfspitzen besorgt und in Fusion 360 eine experimentelle Fixture zusammengebastelt, die ich dann 3D gedruckt habe. Die Konstruktion mit dem Gummiband ist allerdings noch nicht ganz optimal!

    Leider hat sich herausgestellt, dass der Programmer unter macOS nicht mit probe-rs funktioniert. Ich hab mir dann auf einem alten Laptop Ubuntu installiert, wo probe-rs und der Programmer problemlos zusammenarbeiten. Nach ein bisschen Debugging konnte ich dann ein Issue für probe-rs eröffnen. Für einen Bugfix fehlte es mir dann doch noch ein bisschen an Rust-Kenntnissen.

    PCB Design

    Die Badges vom c3 haben mich dazu motiviert, auch endlich mal wieder KiCad zu installieren und zu versuchen, ein einfaches Badge zu designen!

    Meine Idee war, als ersten Versuch Marbles Geheimbadge auf die Größe vom Blobbadge zu schrumpfen und ein kleines 4x4cm PCB in Herz-Form mit RGB LEDs zu bestücken. Nach endloser Recherche, wie ich am besten winzige WS2812 RGB LEDs mit 3.3V angesteuert bekomme (Antwort: Step-Up-Konverter), oder alternativ mit Shift-Registern / LED-Treibern einfache mini RGB LEDs verwenden kann, habe ich mich dazu entschieden, erstmal einfach rote LEDs mit Charlieplexing auszuprobieren.

    Anhand von dem Board konnte ich den ganzen Prozess von Idee über Bauteilrecherche, Schematic erstellen, Bauteil-Import, Bauteile platzieren, Routing bis zum Export für die Fertigung bei JLCPCB ausprobieren. Bestellt habe ich die Boards allerdings nicht!

    Artistic PCB Design

    Louisa hat mich gefragt, ob wir noch einen Arduino MIDI-Controller bauen können!

    Das hat mich natürlich an die Badges erinnert und den Drawing with circuits – creating functional and artistic PCBs together-Talk vom 38c3. Wir haben dann einen Nachmittag lang gebrainstormt und tausend Ideen gesammelt, wie man mal zusammen ein paar interessante MIDI-Controller und so bauen könnte!

    Besonders interessant fände ich, einen MIDI-Controller mit Touch-Flächen zu bauen. Darauf gekommen bin ich übers Touchwheel vom Tangara, den ich natürlich auch auf dem 38c3 entdeckt habe.

    CH32

    Bei der Recherche nach interessanten, günstigen Mikrocontrollern bin ich auch auf die WCH CH32 Reihe gestoßen, die RISC-V als Architektur verwendet. Da Teufelchen seit Jahren davon erzählt, wie cool RISC-V ist, und letztens einen RISC-V Emulator released hat, habe ich mir ein CH32V003 Dev-Board und Programmer besorgt und mit MounRiver Studio und danach mit ch32-hal ausprobiert.

    Ich hatte noch nicht so viel Zeit mich im Detail mit dem Chip zu beschäftigen, wie beim PY32 ist es aber super interessant, wie viel mit ultra günstigen Mikrocontrollern inzwischen out of the box geht!

    Außerdem habe ich herausgefunden, dass sich der WCH-Link Programmer auch als SWD-Programmer nutzen lässt, mit dem ich mit probe-rs erfolgreich unter macOS das Blobbadge programmieren konnte!

    Geheimbadge

    Marble hat zum 38c3 ein paar Geheimbadges mitgebracht. Da das Geheimbadge mit einem anderen ESP32-Modul als ursprünglich geplant gefertigt wurde, mussten wir auf dem 38c3 noch einige Kupferlackdraht-Verbindungen einlöten. Den Lackdraht haben wir von Rough Rat geschenkt bekommen, worüber ich überhaupt erst aufs Blobbadge gekommen bin!

    Das Geheimbadge basiert auf einem ESP32-C6 und hat integriertes Power Management zum Laden einer 3.7V LiPo-Batterie, 3.3V Step-Down für den ESP32 und 5V Step-Up für RGB LEDs. Auf dem Badge läuft Micropython.

    Da Marble von Bluetooth Low Energy und Micropython schwärmt, habe ich mich zuhause damit noch weiter beschäftigt und versucht, mit aioble Marbles BLE UART nachzubauen. Wie sich herausstellt, kann man auch mit Micropython asynchron Mikrocontroller programmieren, nur ohne die anstrengende Rust-Syntax! Bluetooth Low Energy hat eine ziemlich ähnliche Strukturierung wie LwM2M und Zigbee, was ich interessant fand, und lässt sich sehr leicht mit Web Bluetooth im Browser verwenden.

    Harz

    Ich war ein Wochenende mit Freunden in Hohegeiss im Harz. Anders als letztes Jahr im Januar lag zwar nicht genug Schnee zum Rodeln, es war aber trotzdem ein sehr schönes Wochenende! Leider sind meine Wanderstiefel nicht mehr ganz dicht und ich hab ziemlich nasse Füße bekommen.

    Micropython LoRaWAN Stack

    Irgendwie hat mich die ganze ESP32-Micropython-Thematik an meine LoRaWAN Gartensensoren erinnert. Also habe ich auf ein Heltec WiFi LoRa 32 V3 Micropython geflasht und angefangen, mit der Micropython LoRa-Library zu experimentieren.

    Auf GitHub habe ich ein paar alte Versuche gefunden, einen LoRaWAN-Stack mit Micropython zu implementieren, die offenbar alle aufeinander aufbauen.

    Also habe ich den Code von CircuitPython-LoRaWAN genommen und für Micropython umgebaut, indem ich möglichst alles durch Micropython-Bibliotheken und Funktionen ersetzt habe. Außerdem habe ich mich mit dem LoRaWAN 1.0.4 Standard beschäftigt um den Code anzupassen, sodass er standardkonformer ist.

    Der Stack funktioniert bisher überraschend gut mit dem The Things Network! Anders als meine bisherigen Versuche mit LMIC und Radiolib habe ich das Gefühl, dass die Micropython-Implementierung es mir sehr viel einfacher macht, LoRaWAN zu verstehen und den Stack selber anzupassen.

    Zum LoRaWAN-Micropython-Stack schreibe ich demnächst noch einen Beitrag und lade den Code auf Github hoch.

  • Integrierten USB-Debugger vom ESP32-S3 benutzen

    Ein sehr nützliches Werkzeug beim Programmieren ist der Debugger, mit dem das Programm an definierten Breakpoints angehalten und dann die aktuellen Werte der Variablen, der Weg durchs Programm zur aktuellen Position, genannt Call Stack, und noch vieles mehr angeschaut werden können. Dadurch lassen sich viele Fehler entdecken, ohne zusätzliche Ausgaben ins Programm einzubauen.

    Die meisten Programmiersprachen haben einen Debugger eingebaut, der zum Beispiel im Editor VS Code direkt aufgerufen werden kann.

    Nicht ganz so einfach ist es, wenn man ein Programm auf einem Mikrocontroller wie dem Arduino debuggen möchte: Um Mikrocontroller zu debuggen, ist für gewöhnlich ein externer Debugger notwendig, der an den Mikrocontroller angeschlossen wird.

    Deutlich einfacher ist es beim ESP32-S3 Mikrocontroller von Espressif, der auf der neuesten Version des Heltec WiFi LoRa 32 V3 Dev-Boards zum Einsatz kommt, mit dem ich meine Gartensensoren gebaut habe: Manawyrm hat mir den Tipp gegeben, dass der ESP32-S3 einen eingebauten USB JTAG Debugger hat.

    Leider ist der USB-Anschluss vom Heltec-Board nicht an die USB-Schnittstelle vom ESP32 angeschlossen, sondern stattdessen an einen zusätzlichen USB-TTL-Wandler. Um trotzdem den eingebauten USB-Debugger verwenden zu können, habe ich ein USB-Kabel direkt an die entsprechenden Pins gelötet.

    Im Folgenden erkläre ich, wie ich den internen USB JTAG Debugger vom ESP32-S3 auf dem Heltec WiFi LoRa 32 V3 verwendet habe.

    Material

    • Dev-Board mit ESP32-S3.
    • Ein altes USB-Kabel, alternativ ein USB Anschlussbuchse Breakout-Board.
    • Ein PlatformIO-Setup in Visual Studio Code.

    Schritte

    1. Ein altes USB-Kabel auftrennen.
    2. Die einzelnen Litzen vom USB-Kabel folgendermaßen an das Heltec-Board löten:
      • GPIO 19 an DATA- (weiß)
      • GPIO 20 an DATA+ (grün)
      • GND an GND (schwarz)
      • 5V an VUSB (rot)
    3. Den eingebauten USB-Port nicht verbinden! Stattdessen das zusätzlich ran gelötete USB-Kabel mit dem Computer verbinden. Es sollte ein USB-Gerät namens „USB JTAG/serial debug unit“ auftauchen.
    4. In der platformio.ini folgendes hinzufügen:
    debug_tool = esp-builtin
    build_type = debug
    1. Nicht vergessen, Breakpoints im Code zu setzen!
    2. Jetzt sollte der Debugger erfolgreich attachen, wenn man in VS Code unter Run and Debug oben auf das grüne Start Debugging Play-Icon klickt. Daneben sollte PIO Debug ausgewählt sein.

    Achtung: Der interne USB-Port vom Heltec-Board hat zwischen VBUS und 5V noch eine Fuse. Die wird hier übersprungen, da der interne VUSB-Pin nicht nach außen geführt wird. Der Hack kann also theoretisch dazu führen, dass das Board durch Spannungsspitzen zerstört wird.

    Der Hack sollte für alle ESP32-S3 basierten Boards funktionieren. Die Schritte sind dabei immer folgende: USB-Pinouts auf dem Dev-Board identifizieren, Kabel ran löten, debuggen.

    Darüber hinaus ist der interne USB-Anschluss vom ESP32 interessant, da darüber auch andere USB-Devices wie Eingabegerät, Massenspeicher und so weiter erzeugt werden können. Damit habe ich mich allerdings nicht beschäftigt. Details dazu gibt es in der Espressif-Dokumentation.

    Was ich noch nicht herausgefunden habe ist, wie ich Debugger und serielle Konsole zeitgleich verwenden kann.

    Viel Spaß beim Debuggen!

    Links