De auteur beschrijft zijn projecten met de PineTime, een goedkope en hackbare smartwatch van Pine64. In plaats van de standaard C++ firmware, heeft de auteur gekozen voor wasp-os, een besturingssysteem gebaseerd op MicroPython.
Het project is uitgebreid gemoderniseerd op de volgende punten:
- Build-proces: De tooling is vernieuwd met
uv en het flashen via Bluetooth is versneld door het gebruik van bleak.
- Optimalisaties: Het vrije RAM-geheugen is verhoogd van 7,1 KB naar 12,4 KB door een efficiënter gebruik van de externe flash.
- Stabiliteit: Er is een watchdog toegevoegd tegen crashes en de I2C-bus wordt bij opstarten ontblokkeerd om hardware-fails te voorkomen.
- Mainline MicroPython: De auteur heeft drie pull requests ingediend bij de officiële MicroPython-repository, waardoor wasp-os nu op de actuele mainline versie (1.30) draait zonder dat er een fork nodig is.
Daarnaast zijn er diverse toevoegingen gedaan, waaronder een Nederlandstalige wijzerplaat, een retro 8-bit klok en een 'Guido-app' (met een portret van Guido van Rossum). Voor deze app is een eigen lichtgewicht afbeeldingsformaat met run-length encoding ontwikkeld om binnen de beperkte flashruimte te passen. De auteur kijkt tot slot uit naar de PineTime Pro voor toekomstige experimenten.
Python op mijn pols
Geen Apple Watch
Wanneer mensen hem zien, denken ze: dat ziet eruit als een smartwatch, dus het zal wel een smartwatch zijn. Zoals een Apple Watch. Dat is hij niet! Een Apple Watch kost rond de 700 USD, en deze 25. Zie het als een programmeerbare Casio met een kleurenbeeld, Bluetooth, een stappenteller en een hartslagmeter.
Het apparaat heeft echt niet veel CPU of geheugen: een 64 MHz ARM Cortex-M4, 64 KB RAM (ja, kilobytes), 512 KB flash voor de firmware en 4 MB extern flashgeheugen voor bestanden. Nadat de Bluetooth-stack en MicroPython zelf hun deel hebben opgeëist, blijft er ongeveer 12 KB RAM over voor de apps. Alles op dit horloge moet klein zijn.
Het scherm is echter prima: 240×240 pixels op 1,3 inch, ongeveer 260 pixels per inch. Als er in dit bericht iets blokkerig uitziet, is dat dus met opzet. Je kunt echter geen 'always-on' display hebben; de batterij zou dan te snel leegraken. Apple Watches hadden vroeger dezelfde beperking!
Het horloge beschikt over een app voor de genoemde monitor en stappenteller, en je kunt via Bluetooth meldingen naar het apparaat sturen.
Hoe ik hier kwam
Ik kocht mijn PineTime in maart 2023 voor 26,99 USD. Hij wordt geleverd met InfiniTime. Dat is prima, maar InfiniTime is geschreven in C++, en ik leid een Python-groep. Daarom gaf ik de voorkeur aan wasp-os, een watch-OS gebaseerd op MicroPython.
Zelfs in 2023 was dat project echter al vrij inactief. Het draaide op een MicroPython-versie uit 2019 en was vrij lastig te bouwen. Onlangs heeft de beheerder een notitie toegevoegd dat wasp-os op zoek is naar nieuwe beheerders.
Het OS nieuw leven inblazen
Toen ik mijn horloge weer in een lade vond, dacht ik dat het leuk zou zijn om er wat aan te werken. Ik heb het op me genomen om wasp-os weer in orde te maken. Naast de overstap naar mainline MicroPython (hierover meer later), is dit wat er is veranderd:
- Het bouwen werkt weer. De Python-tooling wordt beheerd met
uv, waardoor de installatie met één commando gebeurt en het volledige build-proces weer werkt, inclusief de bootloader-onderdelen.
- Sneller flashen. Het bijwerken van de firmware via Bluetooth maakt nu gebruik van
bleak in plaats van het verouderde gatttool. Dit duurt ongeveer drie en een half minuut in plaats van meer dan acht. Wanneer het mislukt, wordt nu aangegeven waarom, in plaats van dat fouten worden verborgen.
- Meer geheugen. Het bestandssysteem op de externe flash maakt nu gebruik van de werkelijke 4 KB blokken van de chip, waardoor een permanente buffer van 4 KB is weggevallen. Het vrije RAM bij het opstarten ging van 7,1 KB naar 12,4 KB. Op dit horloge is dat veel!
- Zelfherstel. Een watchdog reset het horloge nu wanneer het vastloopt, in plaats van dat het apparaat dood blijft terwijl Bluetooth nog actief is.
- Geen ongewenst gezoem. Een swipe kon ervoor zorgen dat de vibratiemotor bleef zoemen tot je het horloge resette. Dat is opgelost en de motor wordt nu correct aangestuurd.
- Betrouwbare swipes. De touchcontroller meldt nu wanneer je je vinger optilt, en in de instellingen kun je langs een schuifregelaar swipen om deze aan te passen.
- Overleeft een lege batterij. Na mijn vakantie, waarbij ik het horloge niet had meegenomen, legde ik hem aan de lader. Hij startte op en gaf aan:
INIT HARDWARE FAILED. Een chip had de I2C-bus geblokkeerd. Nu wordt de bus bij het opstarten ontblokkeerd, wordt de werkelijke fout getoond als er nog iets misgaat, en start de klok bij de build-datum in plaats van ergens in 2020.
Mainline MicroPython
wasp-os draaide op een fork van MicroPython uit 2019, met patches voor het horloge. Het porteren naar mainline MicroPython vereiste enkele wijzigingen in MicroPython zelf, dus ik heb drie pull requests ingediend:
- Frozen native code;
- een fix voor PWM-allocatie;
- en een ADC-sample-tijd optie.
Al deze drie zijn samengevoegd, waardoor wasp-os voor het eerst draait op een actuele versie van mainline MicroPython. Er is geen fork meer nodig! De wijzigingen zijn gericht op MicroPython 1.30, gepland voor december.
Twee nieuwe wijzerplaten
Natuurlijk wilde ik mijn eigen wijzerplaten. De eerste is eenvoudig: de bestaande weekklok, maar in het Nederlands. Het Nederlands abbreviationeert weekdagen met twee letters, dus er staat bijvoorbeeld: "ma 26 okt 2026". Houd er rekening mee dat het geheugen op dit horloge minuscuul is, dus er is geen ruimte voor een volledig meertalig OS. Je kunt echter gewoon een wijzerplaat vertalen, bouwen en je gelokaliseerde versie op het horloge zetten.
De tweede is leuker: een klok in 8-bit stijl. De cijfers komen uit een klein 6×7 pixel-lettertype, waarbij elke font-pixel wordt getekend als een blok van 7×7 schermpixels voor de tijd en 3×3 voor de rest. Dat geeft de retro-look en vereist helemaal geen font-data. Onder de tijd en de ISO 8601-datum (YYYY-MM-DD) wordt de Unix-epoch getoond, die elke seconde telt.
De Guido-app
Als finishing touch en om het Python-aspect te benadrukken, heb ik de Guido-app gemaakt. Deze toont een blokkerig portret van Guido van Rossum, de bedenker van Python. Door te swipen krijg je het Python-logo, daarna het MicroPython-logo en vervolgens het logo van onze eigen Python Leiden meetup. Nog een swipe en je bent terug bij de klok.
Het portret is 80×80 pixels in 16 kleuren, getekend op drievoudige grootte. Dat vult het 240×240 scherm en geeft het een mooie retro-look. De logo's worden scherp getekend, op volledige resolutie.
De flashruimte is beperkt op dit horloge. De firmware heeft ongeveer 330 KB om mee te werken, en één enkele afbeelding van het volledige scherm als ruwe pixels neemt 112 KB in beslag, een derde van het totaal. Daarom heb ik een klein afbeeldingsformaat gemaakt van maximaal 16 kleuren per afbeelding met run-length encoding, inclusief een decoder van ongeveer 40 regels die ze direct naar het display tekent. Alle vier de afbeeldingen samen nemen nu minder dan 12 KB in beslag. Toch is dat te veel om standaard op te nemen voor iets dat zo onzinnig is, dus de app is optioneel: je moet hem zelf aan je build toevoegen.
De originele foto is gemaakt door Kushal Das tijdens PyCon US 2024 en is gelicenseerd onder CC BY-SA 4.0; de blokkerige versie wordt onder dezelfde licentie gedeeld.
Toekomst: de PineTime Pro
Pine64 werkt aan een opvolger: de PineTime Pro. Deze krijgt een 410×502 AMOLED-scherm, GPS, een dual-core Cortex-M33 en een digitale kroon. Het is nog vroeg, er is nog geen releasedatum en de originele PineTime blijft geproduceerd worden. Maar dat zou een veel grotere speeltuin zijn voor MicroPython. Guido in AMOLED!
Probeer het zelf
Alles bevindt zich in de pinetime-upstream-micropython branch van mijn wasp-os fork.
Python op mijn pols
Geen Apple Watch
Wanneer mensen hem zien, denken ze: dat ziet eruit als een smartwatch, dus het zal wel een smartwatch zijn. Zoals een Apple Watch. Dat is hij niet! Een Apple Watch kost rond de 700 USD, en deze 25. Zie het als een programmeerbare Casio met een kleurenbeeld, Bluetooth, een stappenteller en een hartslagmeter.
Het apparaat heeft echt niet veel CPU of geheugen: een 64 MHz ARM Cortex-M4, 64 KB RAM (ja, kilobytes), 512 KB flash voor de firmware en 4 MB extern flashgeheugen voor bestanden. Nadat de Bluetooth-stack en MicroPython zelf hun deel hebben opgeëist, blijft er ongeveer 12 KB RAM over voor de apps. Alles op dit horloge moet klein zijn.
Het scherm is echter prima: 240×240 pixels op 1,3 inch, ongeveer 260 pixels per inch. Als er in dit bericht iets blokkerig uitziet, is dat dus met opzet. Je kunt echter geen 'always-on' display hebben; de batterij zou dan te snel leegraken. Apple Watches hadden vroeger dezelfde beperking!
Het horloge beschikt over een app voor de genoemde monitor en stappenteller, en je kunt via Bluetooth meldingen naar het apparaat sturen.
Hoe ik hier kwam
Ik kocht mijn PineTime in maart 2023 voor 26,99 USD. Hij wordt geleverd met InfiniTime. Dat is prima, maar InfiniTime is geschreven in C++, en ik leid een Python-groep. Daarom gaf ik de voorkeur aan wasp-os, een watch-OS gebaseerd op MicroPython.
Zelfs in 2023 was dat project echter al vrij inactief. Het draaide op een MicroPython-versie uit 2019 en was vrij lastig te bouwen. Onlangs heeft de beheerder een notitie toegevoegd dat wasp-os op zoek is naar nieuwe beheerders.
Het OS nieuw leven inblazen
Toen ik mijn horloge weer in een lade vond, dacht ik dat het leuk zou zijn om er wat aan te werken. Ik heb het op me genomen om wasp-os weer in orde te maken. Naast de overstap naar mainline MicroPython (hierover meer later), is dit wat er is veranderd:
- Het bouwen werkt weer. De Python-tooling wordt beheerd met
uv, waardoor de installatie met één commando gebeurt en het volledige build-proces weer werkt, inclusief de bootloader-onderdelen.
- Sneller flashen. Het bijwerken van de firmware via Bluetooth maakt nu gebruik van
bleak in plaats van het verouderde gatttool. Dit duurt ongeveer drie en een half minuut in plaats van meer dan acht. Wanneer het mislukt, wordt nu aangegeven waarom, in plaats van dat fouten worden verborgen.
- Meer geheugen. Het bestandssysteem op de externe flash maakt nu gebruik van de werkelijke 4 KB blokken van de chip, waardoor een permanente buffer van 4 KB is weggevallen. Het vrije RAM bij het opstarten ging van 7,1 KB naar 12,4 KB. Op dit horloge is dat veel!
- Zelfherstel. Een watchdog reset het horloge nu wanneer het vastloopt, in plaats van dat het apparaat dood blijft terwijl Bluetooth nog actief is.
- Geen ongewenst gezoem. Een swipe kon ervoor zorgen dat de vibratiemotor bleef zoemen tot je het horloge resette. Dat is opgelost en de motor wordt nu correct aangestuurd.
- Betrouwbare swipes. De touchcontroller meldt nu wanneer je je vinger optilt, en in de instellingen kun je langs een schuifregelaar swipen om deze aan te passen.
- Overleeft een lege batterij. Na mijn vakantie, waarbij ik het horloge niet had meegenomen, legde ik hem aan de lader. Hij startte op en gaf aan:
INIT HARDWARE FAILED. Een chip had de I2C-bus geblokkeerd. Nu wordt de bus bij het opstarten ontblokkeerd, wordt de werkelijke fout getoond als er nog iets misgaat, en start de klok bij de build-datum in plaats van ergens in 2020.
Mainline MicroPython
wasp-os draaide op een fork van MicroPython uit 2019, met patches voor het horloge. Het porteren naar mainline MicroPython vereiste enkele wijzigingen in MicroPython zelf, dus ik heb drie pull requests ingediend:
- Frozen native code;
- een fix voor PWM-allocatie;
- en een ADC-sample-tijd optie.
Al deze drie zijn samengevoegd, waardoor wasp-os voor het eerst draait op een actuele versie van mainline MicroPython. Er is geen fork meer nodig! De wijzigingen zijn gericht op MicroPython 1.30, gepland voor december.
Twee nieuwe wijzerplaten
Natuurlijk wilde ik mijn eigen wijzerplaten. De eerste is eenvoudig: de bestaande weekklok, maar in het Nederlands. Het Nederlands abbreviationeert weekdagen met twee letters, dus er staat bijvoorbeeld: "ma 26 okt 2026". Houd er rekening mee dat het geheugen op dit horloge minuscuul is, dus er is geen ruimte voor een volledig meertalig OS. Je kunt echter gewoon een wijzerplaat vertalen, bouwen en je gelokaliseerde versie op het horloge zetten.
De tweede is leuker: een klok in 8-bit stijl. De cijfers komen uit een klein 6×7 pixel-lettertype, waarbij elke font-pixel wordt getekend als een blok van 7×7 schermpixels voor de tijd en 3×3 voor de rest. Dat geeft de retro-look en vereist helemaal geen font-data. Onder de tijd en de ISO 8601-datum (YYYY-MM-DD) wordt de Unix-epoch getoond, die elke seconde telt.
De Guido-app
Als finishing touch en om het Python-aspect te benadrukken, heb ik de Guido-app gemaakt. Deze toont een blokkerig portret van Guido van Rossum, de bedenker van Python. Door te swipen krijg je het Python-logo, daarna het MicroPython-logo en vervolgens het logo van onze eigen Python Leiden meetup. Nog een swipe en je bent terug bij de klok.
Het portret is 80×80 pixels in 16 kleuren, getekend op drievoudige grootte. Dat vult het 240×240 scherm en geeft het een mooie retro-look. De logo's worden scherp getekend, op volledige resolutie.
De flashruimte is beperkt op dit horloge. De firmware heeft ongeveer 330 KB om mee te werken, en één enkele afbeelding van het volledige scherm als ruwe pixels neemt 112 KB in beslag, een derde van het totaal. Daarom heb ik een klein afbeeldingsformaat gemaakt van maximaal 16 kleuren per afbeelding met run-length encoding, inclusief een decoder van ongeveer 40 regels die ze direct naar het display tekent. Alle vier de afbeeldingen samen nemen nu minder dan 12 KB in beslag. Toch is dat te veel om standaard op te nemen voor iets dat zo onzinnig is, dus de app is optioneel: je moet hem zelf aan je build toevoegen.
De originele foto is gemaakt door Kushal Das tijdens PyCon US 2024 en is gelicenseerd onder CC BY-SA 4.0; de blokkerige versie wordt onder dezelfde licentie gedeeld.
Toekomst: de PineTime Pro
Pine64 werkt aan een opvolger: de PineTime Pro. Deze krijgt een 410×502 AMOLED-scherm, GPS, een dual-core Cortex-M33 en een digitale kroon. Het is nog vroeg, er is nog geen releasedatum en de originele PineTime blijft geproduceerd worden. Maar dat zou een veel grotere speeltuin zijn voor MicroPython. Guido in AMOLED!
Probeer het zelf
Alles bevindt zich in de pinetime-upstream-micropython branch van mijn wasp-os fork.