Review: MicroPython en het pyboard
Sinds de eerste release in 1991 is de programmeertaal Python in brede kring geadopteerd en het is tegenwoordig de favoriete taal van veel programmeurs. Hoewel Python bedoeld was voor PC toepassingen, is het een paar jaar geleden ook geport naar embedded systemen. MicroPython (uPy), zoals het werd gedoopt, is een deelverzameling van Python die draait op platforms zoals de BBC micro:bit en de ESP8266. Het draait ook op het pyboard, de officiële demonstratiekaart voor uPy.
Sinds de eerste release in 1991 is de programmeertaal Python in brede kring geadopteerd en het is tegenwoordig de favoriete taal van veel programmeurs. Hoewel Python bedoeld was voor PC toepassingen, is het een paar jaar geleden ook geport naar embedded systemen. MicroPython (uPy), zoals het werd gedoopt, is een deelverzameling van Python die draait op platforms zoals de BBC micro:bit en de ESP 8266. Het draait ook op het pyboard, de officiële demonstratiekaart voor uPy.
Het Micro Python-project (de naam werd destijds geschreven met twee woorden), inclusief het pyboard, stond eind 2013 op Kickstarter en er werd meer dan zes keer het benodigde startkapitaal van £15.000 mee opgehaald. Gezien dat grote succes besloot het team om ook de extra’s toe te voegen: ondersteuning voor de CC3000 WiFi-module, de WIZ820io Ethernet-module en de NRF24L01+ low-power draadloze module. We zijn nu vier jaar verder, een mooi moment om eens te kijken hoe de stand van zaken is. Laten we eens wat spelen met het pyboard en uPy.
Typ het onderstaande commando en druk op <Enter>.
Om een LED blijvend te laten knipperen hebben we een lus nodig, bijvoorbeeld een 'while'-lus. Om hem voor eeuwig te laten doorlopen, gebruiken we een voorwaarde die altijd waar is, bijvoorbeeld de Booleaanse constante True. Voer het volgende commando in (vergeet de ':' aan het einde niet)
U zult merken, dat de terminal geen commando’s accepteert, zolang de lus draait. We kunnen de lus afbreken en terugkomen bij de prompt door op Ctrl-C te drukken ('een lopend programma onderbreken'). Nu worden alle commando’s uitgevoerd die we hadden ingetypt terwijl de lus aan het draaien was, dus wees voorzichtig met wat u intypt tijdens het uitvoeren van een programma!
De oorzaak van die traagheid is dat het programma wordt geïnterpreteerd tijdens het uitvoeren. Het wordt dus niet eerst omgezet (gecompileerd) in machine-instructies en hoewel er maar één regel code is (als we het while-statement even negeren), gaat het in werkelijkheid om een behoorlijk ingewikkelde instructie. Het is mogelijk om de zaak te versnellen door zogenaamde frozen modules te maken, maar daarvoor moeten we de complete firmware voor het pyboard hercompileren, en dat valt buiten het kader van dit artikel.
Het pyboard is toegankelijk als een flash-drive en als u die opent in een bestandsvenster, ziet u het bestand main.py. Dit is het Python-bestand dat wordt uitgevoerd na een reset van het pyboard (hard met de RST-knop, of zacht met het Ctrl-D-commando). Open dit bestand in de teksteditor en voeg uw commando’s er aan toe. Sla het bestand daarna op en reset de kaart om uw programma te starten.
Factory reset gaat een stap verder dan safe mode. Het verwijdert alle files uit het interne geheugen van het pyboard (niet van de SD kaart) en brengt de files boot.py, main.py, README.txt en pybcdc.inf terug naar hun originele toestand. Druk nogmaals op RST om terug te komen waar u begon: het begin van dit artikel.
Naast problemen met het inspringen, kunt u ook compatibiliteitsproblemen met Python tegenkomen. MicroPython is een geporteerde versie van Python, maar het is geen perfecte afspiegeling. Op de uPy-website staat een lijst van verschillen tussen CPython (de Python referentie-implementatie) en uPy. Dus als u op een dag tegen een vreemde fout aanloopt waar code die zou moeten werken het toch niet doet, dan moet u misschien deze lijst er eens bij pakken.
Het Micro Python-project (de naam werd destijds geschreven met twee woorden), inclusief het pyboard, stond eind 2013 op Kickstarter en er werd meer dan zes keer het benodigde startkapitaal van £15.000 mee opgehaald. Gezien dat grote succes besloot het team om ook de extra’s toe te voegen: ondersteuning voor de CC3000 WiFi-module, de WIZ820io Ethernet-module en de NRF24L01+ low-power draadloze module. We zijn nu vier jaar verder, een mooi moment om eens te kijken hoe de stand van zaken is. Laten we eens wat spelen met het pyboard en uPy.
Aan de slag met het pyboard
Wat we nodig hebben is: een pyboard v1.1 (PYBv1.1), een micro-USB-kabel en een computer (ik gebruikte een Windows 10 laptop). Als we het board met de computer verbinden verschijnt meteen een venster dat de inhoud van drive E laat zien, met de naam PYBFLASH. Het besturingssysteem zou ook een seriële poort moeten vinden. Open nu een terminalprogramma (Tera Term), verbind dat met de poort waar het pyboard aan hangt en druk op een toets. Dan verschijnt de Python-prompt:
MicroPython v1.8.2 on 2016-07-13; PYBv1.1 with STM32F405RG
Type "help()" for more information.
>>>
>>>
Wauw, dat ging snel! Binnen een minuut na het inpluggen van de kaart kunnen we aan de slag. We hebben niet veel anders hoeven te doen dan met de muis bewegen om de juiste vensters te openen op de PC.
REPL
Wat u nu voor u ziet, is een eenvoudige, interactieve programmeeromgeving die formules accepteert, ze doorrekent en het resultaat laat zien. Zo’n omgeving staat bekend als een Read–Evaluate–Print lus of REPL. Het is belangrijk om dit acroniem te kennen, want als we met Python werken, zullen we dat vaak tegenkomen.De volgende stap: een knipperende LED
De prompt suggereert om ‘help()’ te typen en op de entertoets te drukken. Als we dat doen, zien we een lijst van mogelijke commando’s om mee op gang te komen. Het is de moeite waard om die lijst goed te bekijken, want die laat de mogelijkheden van de kaart zien. De kaart is opgebouwd rondom een STM32F405RG ARM Cortex-M4F-microcontroller en heeft blijkbaar een real-time klok (RTC), een analoog-naar-digitaal converter (ADC), een digitaal-naar-analoog converter (DAC), vier LED’s, druktoetsen, een versnellingsopnemer, een random number generator (RNG), I²C, SPI, UART, I/O-pennen en hij ondersteunt servo’s. Er staan ook enkele besturingsfuncties voor deze periferie in de lijst, het is echt een mooie, veelomvattende helpfunctie. Als we gewoon naar de kaart kijken, zien we ook nog een SD-kaartslot.Typ het onderstaande commando en druk op <Enter>.
>>> pyb.LED(1).on()
Nu licht een rode LED naast de USR-drukknop op. Als we het commando herhalen met een ‘2’ in plaats van de ‘1’ (gebruik de pijltoetsen om het vorige commando terug te halen en bewerk dat), licht er een groene LED op naast de rode. LED nummer drie is geel en nummer vier is blauw. Behalve de gele zijn de LED’s ongelooflijk fel; het is beter er niet recht in te kijken. Laten we dus doorgaan met LED(3). U mag zelf uitvinden hoe u de andere drie LED’s moet laten doven.Om een LED blijvend te laten knipperen hebben we een lus nodig, bijvoorbeeld een 'while'-lus. Om hem voor eeuwig te laten doorlopen, gebruiken we een voorwaarde die altijd waar is, bijvoorbeeld de Booleaanse constante True. Voer het volgende commando in (vergeet de ':' aan het einde niet)
>>> while True:
Voer dan een toggle-LED-commando in. De terminal zal de code laten inspringen, zoals verplicht is in Python. Dat wordt aangegeven met drie punten. Voer een delay-commando in om de knipperfrequentie vast te leggen, bijvoorbeeld 250 ms. Het moet er dan ongeveer zó uitzien:
>>> while True:
... pyb.LED(3).toggle()
... pyb.delay(250)
...
Om de lus te starten, moeten we eerst de inspringmodus verlaten. We doen dat door op backspace te drukken. Daarna drukken we op <Enter>. LED3 zou nu moeten knipperen in het gekozen tempo.U zult merken, dat de terminal geen commando’s accepteert, zolang de lus draait. We kunnen de lus afbreken en terugkomen bij de prompt door op Ctrl-C te drukken ('een lopend programma onderbreken'). Nu worden alle commando’s uitgevoerd die we hadden ingetypt terwijl de lus aan het draaien was, dus wees voorzichtig met wat u intypt tijdens het uitvoeren van een programma!
De versnellingsopnemer van het pyboard
Hier is een eenvoudig experiment om te zien of de versnellingsopnemer op de kaart goed werkt.
>>> while True:
... print(pyb.Accel().x(),pyb.Accel().y(),pyb.Accel().z())
De uitvoer moet een scrollende lijst van de drie waarden x, y en z zijn:
-1 -2 21
-1 -2 20
-2 -1 20
…
Druk weer op Ctrl-C om terug te komen bij de prompt. Dit is een interessante test, omdat we kunnen zien hoe snel een ogenschijnlijk eenvoudige lus wordt uitgevoerd. Hij doet niet meer dan een sensor uitlezen en drie getallen afdrukken. Ik mat ongeveer drie regels per seconde, dat is niet erg snel.De oorzaak van die traagheid is dat het programma wordt geïnterpreteerd tijdens het uitvoeren. Het wordt dus niet eerst omgezet (gecompileerd) in machine-instructies en hoewel er maar één regel code is (als we het while-statement even negeren), gaat het in werkelijkheid om een behoorlijk ingewikkelde instructie. Het is mogelijk om de zaak te versnellen door zogenaamde frozen modules te maken, maar daarvoor moeten we de complete firmware voor het pyboard hercompileren, en dat valt buiten het kader van dit artikel.
Mijn eerste programma
Na wat spelen in de REPL, gaat u zich misschien afvragen, hoe u van die vluchtige experimenten tot iets meer bestendigs moet komen. Dat is heel eenvoudig; alles wat u nodig hebt is een goede teksteditor.Het pyboard is toegankelijk als een flash-drive en als u die opent in een bestandsvenster, ziet u het bestand main.py. Dit is het Python-bestand dat wordt uitgevoerd na een reset van het pyboard (hard met de RST-knop, of zacht met het Ctrl-D-commando). Open dit bestand in de teksteditor en voeg uw commando’s er aan toe. Sla het bestand daarna op en reset de kaart om uw programma te starten.
Als de nood het hoogst is...
Wees niet bang om creatief te zijn, probeer gewoon van alles uit. Dat is de manier om meer te leren. En als u de zaak zó heeft verprutst dat er niets meer lijkt te werken, weet dan dat er twee manieren zijn om alles te herstellen: safe mode en factory reset. In safe mode worden de files boot.py en main.py niet uitgevoerd, zodat u bij het filesysteem kunt (de USB-drive komt dan weer beschikbaar). Dan kunt u boot.py en main.py bewerken om alle problemen op te lossen.Factory reset gaat een stap verder dan safe mode. Het verwijdert alle files uit het interne geheugen van het pyboard (niet van de SD kaart) en brengt de files boot.py, main.py, README.txt en pybcdc.inf terug naar hun originele toestand. Druk nogmaals op RST om terug te komen waar u begon: het begin van dit artikel.
Ik wil meer!
De MicroPython-website heeft mooi lesmateriaal dat laat zien hoe de periferie van het pyboard kan worden gebruikt. Het is sterk aan te raden om dit te lezen, want het kan u veel tijd besparen. Het behandelt ook enkele geavanceerde technieken zoals het combineren van assemblertaal met uPy. Houd wel in gedachten dat deze lessen gaan over het pyboard en dat de gepresenteerde technieken wellicht niet (hetzelfde) werken op andere kaarten.Het ligt niet altijd aan u
Als u gaat leren uPy-programma’s te schrijven, zult u natuurlijk tegen de nodige fouten en vergissingen aanlopen. Eén van de meest gemaakte, en meest frustrerende, fouten is vergeten de tab toets te gebruiken. Of denken dat u tabs hebt gebruikt, terwijl dat niet echt het geval was. In Python is inspringen van de code verplicht en dat werkt alleen met tab-tekens. Let er dus op, dat uw teksteditor tabs moet behouden en ze niet stiekem vervangt door spaties. De freeware-editor Notepad++ is een goede teksteditor die Python syntax-highlighting ondersteund en tabs behoudt.Naast problemen met het inspringen, kunt u ook compatibiliteitsproblemen met Python tegenkomen. MicroPython is een geporteerde versie van Python, maar het is geen perfecte afspiegeling. Op de uPy-website staat een lijst van verschillen tussen CPython (de Python referentie-implementatie) en uPy. Dus als u op een dag tegen een vreemde fout aanloopt waar code die zou moeten werken het toch niet doet, dan moet u misschien deze lijst er eens bij pakken.