Python programmeren op microcontrollers

Door: koen-vervloesem | 22 juli 2021 06:06

How To

Python is een populaire programmeertaal, maar die wordt meestal alleen op computers gebruikt. Ook op het kleine computerbordje Raspberry Pi is de taal populair. Wil je microcontrollers programmeren, die nog minder krachtig zijn, dan is Python niet geschikt. Maar er is een versie van Python voor microcontrollers: MicroPython. Onder meer de Raspberry Pi Pico en de BBC micro:bit 2 worden ondersteund.

Python is een programmeertaal die bekendstaat om zijn leesbaarheid. Deze taal is relatief gemakkelijk te leren en je kunt met vrij weinig regels code al mooie resultaten verkrijgen. En tegelijk is het een krachtige taal, die veel in de industrie wordt gebruikt. Zo zijn de grootste projecten voor machinaal leren in Python geschreven.

01 Python voor microcontrollers

Terwijl Python heel efficiënt is voor de programmeur, is de taal niet efficiënt voor de processor. Op je computer en zelfs op een Raspberry Pi is dat doorgaans geen probleem, want die hebben voldoende rekenkracht en geheugen. Maar microcontrollers (zie het kader ‘Wat is een microcontroller?’) hebben geen gigahertzen en gigabytes tot hun beschikking. Daarom worden ze doorgaans geprogrammeerd in een taal zoals C.

MicroPython biedt hiervoor een oplossing: het is een efficiënte implementatie van de taal, geoptimaliseerd voor microcontrollers. Deze taal biedt bovendien een subset van de standaardbibliotheek van Python, zodat je de meestgebruikte Python-modules ook op microcontrollers kunt inzetten. Als je geen geavanceerde zaken of externe modules gebruikt, kun je gewoon Python-code die op je computer of Raspberry Pi draait, overzetten naar een ondersteunde microcontroller.

01 MicroPython is een uitgeklede versie van de populaire programmeertaal Python voor microcontrollers.

Wat is een microcontroller?

Een microcontroller is een chip die eigenlijk een hele computer in één pakket bevat. Daarin zitten een processor, geheugen (RAM en ROM) en allerlei poorten naar de buitenwereld. Microcontrollers zijn ontworpen om specifieke toepassingen uit te voeren, zoals in een magnetron, pinautomaat, wasmachine of een pacemaker. Een laag stroomverbruik en een lage kostprijs zijn voor die toepassingen belangrijk, en dat betekent dus ook lagere prestaties en minder geheugen. In de praktijk gebruik je niet de microcontroller zelf, maar een ontwikkelbordje, zoals de Raspberry Pi Pico met de RP2040-microcontroller of de BBC micro:bit 2 met de Nordic nRF52833-microcontroller. Overigens bevatten beide bordjes nog een tweede microcontroller, namelijk voor de usb-communicatie.

02 Ondersteunde microcontrollers

De ontwikkelaar van MicroPython heeft een ontwikkelbordje gemaakt dat officieel wordt ondersteund, het pyboard. Maar ondertussen is er ook ondersteuning toegevoegd voor talloze andere microcontrollerplatformen. We gebruiken twee populaire bordjes in deze masterclass: de Raspberry Pi Pico en de BBC micro:bit 2.

De Raspberry Pi Pico (of kortweg Pico) is een kaal printplaatje van de Raspberry Pi Foundation. Het hart bestaat uit de RP2040, een microcontroller die de stichting achter de Raspberry Pi zelf heeft ontwikkeld. Je zou het bordje als een krachtiger alternatief voor de Arduino-bordjes kunnen beschouwen. Soldeer je er een pinheader op, dan kun je allerlei elektronische componenten aansturen.

De BBC micro:bit 2 is een heel ander bordje: het heeft een ledmatrix ingebouwd, knoppen, een aanraaksensor, accelerometer, magnetometer, microfoon en een luidspreker. Daardoor is dit het ideale microcontrollerbordje om mee te experimenteren als je je nog niet comfortabel voelt om elektronische componenten te hanteren en te solderen. Als je nog de eerste versie van dit bordje hebt, kun je die ook nog met MicroPython gebruiken.

03 Zet MicroPython op de Pico

We gaan eerst aan de slag met de Raspberry Pi Pico. Eerst dien je MicroPython in het flashgeheugen te zetten. Download daarvoor het UF2-bestand van MicroPython voor dit bordje. Op het moment van schrijven was de recentste versie rp2-pico-20210202-v1.14.uf2, maar er staan ook enkele nieuwere ‘unstable’ versies. Laat je niet afschrikken door de term unstable: zelfs de website van de Raspberry Pi Foundation verwijst naar de unstable versies. Download gewoon de recentste.

Sluit daarna een usb-kabel aan op de micro-usb-poort van de Pico, houd de witte knop BOOTSEL op het bordje ingedrukt en steek dan de andere kant van de kabel in een usb-poort van je computer. Laat daarna de knop los. De interne opslag wordt nu aangekoppeld als opslagapparaat. Dat werkt zowel in Windows als Linux en macOS. Kopieer nu gewoon het UF2-bestand naar de schijf van je Pico. Daarna wordt de schijf ontkoppeld en reboot de microcontroller. Er draait nu MicroPython op.

03 De MicroPython-firmware kopieer je eenvoudig naar de Raspberry Pi Pico.

04 Installeer Thonny

De gemakkelijkste manier om Python-opdrachten op de Pico uit te voeren, is met een ontwikkelomgeving die MicroPython ondersteunt. Thonny is er daar één van en ook nog eens gebruiksvriendelijk voor beginners. Download wel de nieuwste versie. Heb je al een oudere versie, upgrade die dan. Gebruik je Linux, installeer dan niet de oudere versie uit de repository van je distributie, maar installeer de nieuwste met pip:

pip3 install thonny

Open in Thonny het menu Tools / Options en ga naar het tabblad Interpreter. Kies daar in de uitklaplijst MicroPython (Raspberry Pi Pico). Onder Port kies je in de uitklaplijst het herkende bordje. Onder Linux is dat bijvoorbeeld Board in FS mode - Board CDC (/dev/ttyACM0). Bevestig onderaan met OK.

04 De Python-ontwikkelomgeving Thonny herkent de Raspberry Pi Pico.

05 De interface van Thonny

Je ziet nu rechts onderaan in Thonny MicroPython (Raspberry Pi Pico) staan. Dat is het teken dat Thonny met je Pico is verbonden. Linksboven zie je een leeg tekstveld waar je een programma kunt intypen. Rechtsboven zie je in het tabblad Variables de modules machine en rp2 vermeld. Dat zijn de MicroPython-modules die toegang geven tot specifieke functionaliteit van de Pico.

Linksonder vind je het tabblad shell. Hier kun je Python-opdrachten invullen, die onmiddellijk uitgevoerd worden op de Pico. Dit venster is je rechtstreekse verbinding met de MicroPython-software die op de Pico draait. Je ziet dat aan de regel MicroPython v1.14 on 2021-03-10; Raspberry Pi Pico with RP2040. De regels ervoor gaf de shell je toegang tot Python op je computer.

05 In de shell van Thonny voer je Python-opdrachten op de Raspberry Pi Pico uit.

06 Schakel de led in

De regel >>> is de opdrachtprompt, die aanduidt dat je hierachter je Python-opdrachten kunt invoeren. Voer nu na die >>>-prompt achtereenvolgens de volgende opdrachten in:

from machine import Pin

led = Pin(25, Pin.OUT)

led.value(1)

Met de eerste opdracht importeer je de klasse Pin uit de module machine, waarna die ook in het tabblad Variables wordt toegevoegd. Daarna definieer je een variabele led die verwijst naar pin 25 die je als uitvoer configureert. GPIO25, zoals pin 25 ook wordt genoemd, is intern verbonden met de led die je naast de micro-usb-poort op het bordje ziet. Ook deze variabele wordt in het tabblad Variables toegevoegd.

De derde opdracht schrijft tot slot de waarde 1 naar pin 25, met als resultaat dat de led aan gaat. Als je de led nu weer wilt uitschakelen, typ je in de shell:

led.value(0)

06 Met drie Python-opdrachten schakel je de ingebouwde led van de Raspberry Pi Pico in.

07 Programma schrijven

Als de led aan is en je de Pico afkoppelt en weer aansluit, blijft de toestand niet behouden: de led is weer uit. Dat is zo omdat je handmatig opdrachten invoerde en er geen programma op de Pico draaide. Maar je kunt ook een programma in het flashgeheugen van de Pico schrijven, dat altijd draait zodra je het bordje opstart.

Typ daarvoor de volgende code in het tekstveld links bovenaan in:

from machine import Pin, Timer

led = Pin(25, Pin.OUT)

tim = Timer()

def tick(timer):

global led

led.toggle()

tim.init(freq=5, mode=Timer.PERIODIC, callback=tick)

Dit stukje code definieert een led, maar ook een timer. De functie tick die daarna komt, schakelt de led telkens over van aan naar uit en andersom. Omdat de toestand van de led bij opeenvolgende aanroepen behouden moet blijven, wordt de variabele led daar als global gedefinieerd. In de laatste regel start de code een timer die 5 keer per seconde de functie tick aanroept.

08 Programma op de Pico

Klik daarna op het icoontje van de groene cirkel met de witte driehoek (Run current script) en selecteer Raspberry Pi Pico als de plaats om het script in op te slaan. Kies als bestandsnaam main.py. De led op de Pico begint nu vijf keer per seconde te knipperen, en als je de usb-kabel uittrekt en weer aansluit, begint de led onmiddellijk weer te knipperen. Het programma staat nu in het flashgeheugen en wordt automatisch uitgevoerd.

Dit is een basisprogramma in MicroPython voor de Raspberry Pi Pico, maar uiteraard is er nog veel meer mogelijk als je elektronische componenten gaat aansluiten. Je kunt externe leds aansturen, knoppen inlezen, maar ook een schermpje en sensoren aansluiten. Je zult dan twee pinheaders aan de zijkanten van de Pico moeten solderen om het bordje in een breadboard te kunnen steken. Maar de BBC micro:bit 2 heeft standaard al heel wat componenten ingebouwd, dus laten we daar eens naar kijken.

08 Op de Raspberry Pi Pico kun je allerlei elektronische componenten aansluiten.

09 Zet MicroPython op de BBC micro:bit 2

Voordat je MicroPython op de BBC micro:bit 2 zet, download je het best de nieuwste firmware. Houd de resetknop naast de micro-usb-poort op de micro:bit 2 ingedrukt, sluit de usb-kabel op je computer aan en laat de knop dan los. Je computer ziet nu een schijf met de naam MAINTENANCE. Kopieer het hex-bestand met de firmware naar die schijf.

De eenvoudigste manier om MicroPython op de BBC micro:bit 2 te zetten, is om de site te bezoeken en de voorbeeldcode die er zichtbaar is naar het bordje te schrijven. Dat werkt overigens alleen in Chrome of een Chrome-gebaseerde browser, omdat die WebUSB gebruikt. Klik bovenaan links op Connect terwijl je micro:bit 2 is aangesloten. Kies dan het apparaat dat verschijnt. Als alles goed is, ben je nu verbonden en verandert de knop in Disconnect.

Klik daarna links bovenaan op Flash. Dit duurt de eerste keer lang omdat MicroPython zelf wordt weggeschreven. Daarna draait het voorbeeldprogramma, dat continu de tekst ‘Hello, World!’ laat scrollen en daarna een hartje laat zien.

09 Je dient de BBC micro:bit 2 eerst te flashen met de MicroPython-firmware.

10 Afbeeldingen

In de eerste regel van de voorbeeldcode importeer je alles uit de module microbit. Een van de belangrijkste onderdelen is het object display, waarmee je tekst kunt laten scrollen of afbeeldingen kunt tonen op de 5x5-ledmatrix. De micro:bit-module heeft al heel wat voorgedefinieerde afbeeldingen, zoals Image.HEART, Image.SMILE en Image.PACMAN.

Je kunt de ledmatrix ook meerdere afbeeldingen achter elkaar laten tonen, als een soort animatie. Dan geef je in MicroPython gewoon een lijst van de afbeeldingen door en de tijd tussen de afbeeldingen. De module heeft ook al enkele lijsten voorgedefinieerd, bijvoorbeeld van alle klokken:

from microbit import *

display.show(Image.ALL_CLOCKS, loop=True, delay=100)

Als je nu weer op Flash drukt bovenaan links in de webeditor voor de micro:bit 2, laat dit een wijzer van een klok ronddraaien.

11 Knoppen

De micro:bit 2 heeft ook twee knoppen: links de knop A en rechts de knop B. Je laat de micro:bit reageren op het indrukken van een knop door continu te controleren of beide knoppen zijn ingedrukt en dan iets anders op de ledmatrix te tonen. Dat gaat als volgt:

from microbit import *

while True:

if button_a.is_pressed():

display.show(Image.ARROW_W)

elif button_b.is_pressed():

display.show(Image.ARROW_E)

else:

display.clear()

Met while True: voer je een oneindige lus uit. Als knop A ingedrukt is, komt er een pijl naar links in beeld. Als knop B ingedrukt is, een pijl naar rechts. En als er niets ingedrukt is, dan blijft de ledmatrix leeg.

11 Druk op de knoppen voor een pijl in de juiste richting.

12 Dobbelsteen

Net zoals je in een while-lus kunt controleren of de knoppen zijn ingedrukt, kun je ook de ingebouwde sensoren van de micro:bit 2 uitlezen. Een interessante is de accelerometer. De micro:bit-module heeft zelfs enkele gebruiksvriendelijke methodes gedefinieerd die de ruwe waardes al interpreteren.

Zo kun je eenvoudig controleren of je met de micro:bit 2 schudt, en dan een muziekje afspelen en een willekeurig getal van 1 tot 6 tonen. Een elektronische dobbelsteen dus:

from microbit import *

import music

import random

while True:

if accelerometer.was_gesture('shake'):

display.clear()

music.play(music.POWER_UP)

display.show(random.randint(1, 6))

Een mooiere versie hiervan zet elk getal om in een afbeelding:

from microbit import *

import music

import random

numbers = [Image("00000:00000:00900:00000:00000"),

Image("00000:00000:90009:00000:00000"),

Image("00009:00000:00900:00000:90000"),

Image("90009:00000:00000:00000:90009"),

Image("90009:00000:00900:00000:90009"),

Image("90009:00000:90009:00000:90009")]

while True:

if accelerometer.was_gesture('shake'):

display.clear()

music.play(music.POWER_UP)

number = random.randint(1, 6)

display.show(numbers[number-1])

De lijst numbers bevat afbeeldingen van de cijfers 1 tot en met 6, waarbij je elke afbeelding led per led opbouwt. Een 0 schakelt de led uit en een 9 zet de led op maximale helderheid. Tussen elke regel van vijf pixels zet je een dubbele punt.

12 Met MicroPython maak je eenvoudig een digitale dobbelsteen van je BBC micro:bit 2.

13 PIR-sensor aansluiten

Aan de onderkant van de micro:bit 2 zit een goudgekleurde strook met delen 0, 1, 2, 3V en GND, waarop je met krokodillenklemmen externe componenten kunt aansluiten. Je hebt hier dus geen breadboard en jumperwires voor nodig. Hier sluit je bijvoorbeeld een PIR-sensor op aan, die beweging detecteert.

Een PIR-sensor heeft normaal drie pinnen. Bij de AM312, een kleine sensor die je voor enkele euro’s koopt, heten die pinnen VIN, OUT en GND. VIN sluit je met een krokodillenklem op 3V van de micro:bit aan, OUT op 0 en GND op GND. Zorg dat de krokodillenklemmen elkaar en/of de andere pinnen niet raken.

13 De AM312 is een PIR-sensor met drie pinnetjes: VIN, OUT en GND.

14 Bewegingsdetectie

Als je dit aangesloten hebt, kun je van je micro:bit 2 een bewegingsmelder maken. De code daarvoor is eenvoudig:

from microbit import *

while True:

if pin0.read_digital():

display.show(Image.SQUARE)

else:

display.clear()

Je leest in dit script continu de digitale waarde van pin 0 in. De PIR zet een spanning van 3,3 V op de pin als hij beweging detecteert en dan leest de micro:bit 2 een 1 in. De code toont dan een vierkant op het scherm (de ledmatrix). Wanneer er geen beweging is, zet de PIR een spanning van 0 V op de pin, en leest de micro:bit 2 een 0 in. In dat geval wordt het scherm leeggemaakt.

14 De BBC micro:bit 2 toont een vierkant als de PIR-sensor beweging detecteert.

CircuitPython

Er bestaat nog een andere versie van Python voor microcontrollers: CircuitPython. Dit is een afsplitsing van MicroPython die wordt ontwikkeld door Adafruit, bekend van allerlei elektronicaproducten. CircuitPython ondersteunt de microcontrollerbordjes van Adafruit gebaseerd op een Atmel SAMD21, Atmel SAMD51 of Nordic nRF52840. In de praktijk lijkt CircuitPython veel op MicroPython en je kunt veel kennis die je hebt opgebouwd met de ene versie ook gebruiken voor de andere. Als je hardware van Adafruit gebruikt, heeft CircuitPython als voordeel dat het modules bevat om alle Adafruit-hardware te gebruiken.

CircuitPython is gebaseerd op MicroPython maar met ondersteuning voor hardware van Adafruit.

0 Reactie(s) op: Python programmeren op microcontrollers

  • Om te reageren moet je ingelogd zijn. Nog geen account? Registreer je dan en praat mee!
  • Er zijn nog geen reacties op dit artikel.

Wanneer je een reactie plaatst ga je akoord
met onze voorwaarden voor reacties.