Niet kopen maar kijken: zo simuleer je een microcontrollerbordje
Het aansluiten en programmeren van elektronische componenten op een microcontrollerbordje kan flink wat werk zijn. Met Wokwi simuleer je eenvoudig een ESP32, Raspberry Pi Pico of Arduino met alle bijbehorende elektronica. Zo kun je al beginnen met programmeren en verschillende dingen testen, zonder dat je telkens je breadboardopstelling hoeft aan te passen.
Na het lezen van dit artikel weet je precies hoe je met Wokwi een microcontrollerbordje kunt simuleren.
- Start je project op
- Voeg componenten toe
- Plaats en verbind de componenten
- Schrijf de benodigde code
- Simuleren maar!
Ook interessant: Zo breid je met microcontrollers je computer uit met extra functies
Code downloaden In dit artikel worden wat voorbeelden van stukken code gegeven. Omdat overtikken van code erg foutgevoelig is, kun je die code beter downloaden en daarna bekijken of kopiëren. Zie het bestand wokwicode.txt voor de stukken code die in dit artikel genoemd worden.
Met Wokwi maak je een virtuele versie van een microcontrollerproject. Op de Wokwi-site simuleer je gratis een ESP32 (alle types), Raspberry Pi Pico, Arduino (Uno, Mega of Nano) of STM32. Maar ook allerlei elektronische componenten, zoals leds, drukknoppen, potentiometers, luidsprekers, sensors, motors en LC-displays. Bekijk voordat je begint eens de lijst met ondersteunde hardware.
Je kunt je projecten online programmeren in bijvoorbeeld MicroPython of Arduino. Je programma wordt op de gesimuleerde microcontroller uitgevoerd en het resultaat is ook in de gesimuleerde componenten te zien: leds gaan aan en uit, servomotors draaien, displays tonen de geprogrammeerde boodschappen enzovoort. Dat maakt experimenteren met elektronica wel heel eenvoudig. In dit artikel illustreren we dit met twee eenvoudige ESP32-projecten, die zelfs via internet met elkaar of andere IoT-apparaten kunnen communiceren.
1 Project starten
Wokwi is gratis te gebruiken zonder je te registreren. Je kunt bovenaan op de website eerst voor de processorfamilie kiezen of, als je even verder scrolt, eerst voor de programmeertaal. Wij scrollen naar onder en kiezen MicroPython. Daarna zie je onder Starter Templates twee miniprojectjes: Pi Pico Blink en ESP32 Blink. Beide zijn eenvoudige sjablonen om mee te beginnen.
Maar je kunt ook op New project klikken om met een volledig leeg project te beginnen. Daarna krijg je de keuze uit MicroPython op ESP32, Raspberry Pi Pico of Raspberry Pi Pico W. Wij kiezen MicroPython on ESP32.
Je krijgt links de MicroPython-code in het tabblad main.py te zien, met als inhoud een eenvoudige printopdracht. In dit tekstveld voeg je je MicroPython-code toe en erboven staat een knop waarmee je je code opslaat. Rechts zie je een ESP32-ontwikkelbordje. Hier kun je nu allerlei elektronische componenten toevoegen en met je microcontroller verbinden. Met het groene knopje bovenaan start je vervolgens de simulatie.
2 Componenten toevoegen
Voeg nu aan het canvas rechts componenten toe met het blauwe plusknopje. Scrol door de lijst om te zien welke componenten je allemaal kunt toevoegen. In het onderdeel Basic zijn dat leds, drukknoppen en weerstanden. Heel ruim toebedeeld is het onderdeel Display, met RGB-leds, een SSD1306 OLED-display, allerlei tft-schermpjes, een led-dotmatrix, NeoPixel-led en -ring, zevensegmentdisplays en zelfs een e-paperscherm.
Bij Input vind je allerlei soorten schakelaars, een joystick, infraroodontvanger, keypad en potentiometers. De sensors zijn wat minder ruim toebedeeld, maar je vindt er wel onder andere de ultrasone sensor HC-SR04, de temperatuursensors DHT22, DS18B20 en een NTC, en een PIR-bewegingssensor. Het onderdeel Output heeft een piëzoelektrische zoemer, enkele motors en relays. En er zijn ook enkele formaten breadboards.
Kies als eerste een half breadboard, dat op het canvas verschijnt. Doe dan hetzelfde voor een led en een weerstand. Als je op de weerstand klikt, kun je de waarde veranderen. Maak er 220 Ohm van. De banden op de weerstand veranderen naar rood, rood en bruin om de nieuwe waarde aan te duiden. Met een klik op de led verander je de kleur, maar laat die maar rood. We hebben de voorschakelweerstand immers gekozen in functie van de spanningsval over de led.
3 Componenten plaatsen en verbinden
We gaan alle componenten op de juiste plek plaatsen: klik op de ESP32 en druk dan enkele keren de R-toets in tot het ontwikkelbordje correct is georiënteerd. Sleep het boven het breadboard tot de pinheaders op de rijen b en j passen.
Plaats dan de led en de weerstand op het breadboard. Met de P-toets kun je de led eventueel nog spiegelen. Sluit dan het lange pootje (anode) van de led, wat Wokwi met een knik aanduidt, op GPIO23 aan. Als je boven de pootjes van de led blijft hangen met de muiscursor, krijg je een label te zien: A voor anode en C voor kathode.
Op dezelfde manier toont Wokwi bij elke pin van de ESP32 een label, zoals 23 voor GPIO23. De verbinding maken doe je in dit geval, omdat de led op een breadboard staat, door op a2 te klikken en dan op a28. Zo wordt GPIO23 via het breadbord verbonden met de anode van de led.
Sluit daarna het korte pootje (kathode) van de led via de voorschakelweerstand van 220 Ohm op GND van de ESP32 aan. Dat doe je door het ene pootje van de weerstand boven de kathode van de led te plaatsen. Het andere pootje verbind je met GND door erboven een verbinding met de blauwe rij te maken, en boven GND (het vakje a1) ook een verbinding met de blauwe rij te maken. Verander de kleur van die twee verbindingen naar zwart door er na het aanmaken op te klikken en dan op 0 te drukken.
4 Code schrijven
Nu de virtuele hardware klaar is, kun je aan de slag met de softwarekant. Schrijf links in het codevenster van het tabblad main.py de volgende code om de led te laten knipperen:
We tonen in deze code met print eerst de boodschap Blink LED op de terminal van MicroPython. Dan definiëren we een led op pin 23. De rest van de code bestaat gewoon uit een oneindige lus waarin we de led een seconde aan doen en een seconde uit.
Druk dan op Ctrl+S of de knop Save bovenaan en geef je project een naam. Dat kan in de gratis versie alleen als publiek project (zie kader ‘Gratis en betaalde versie’). Klik op Save. Vanaf nu heeft je project een publieke url.
Gratis en betaalde versie De gratis versie bevat al heel wat functionaliteit. De betaalde versie kost 7 dollar per maand en heet Wokwi Club. Je kunt dan aangepaste Arduino-bibliotheken vanaf je computer uploaden, evenals willekeurige bestanden (zoals afbeeldingen of audiobestanden) om op de microSD-kaart van de virtuele microcontroller te plaatsen. Een andere mogelijkheid is dat je vanaf je computer toegang krijgt tot een webserver die je op je virtuele microcontroller draait. Je hoeft je projecten dan ook niet meer publiek op te slaan; je kunt ze privé houden.
Enkele uitbreidingen van Wokwi, zoals de integratie in Visual Studio Code en de commandline-interface Wokwi CI, zijn momenteel in bèta maar worden daarna deels betaald.
5 Simuleren
Nu je zowel de hardware als de software klaar hebt, is het tijd voor actie. Klik rechts op het groene knopje om de simulatie te starten. Onderaan verschijnt een terminalvenster waarin je de ESP32 ziet opstarten en na enkele seconden krijg je de boodschap Blink LED. Bovenaan rechts begint een timer te lopen. Je ziet ook in een snelheid van hoeveel procent van de realiteit de simulatie wordt uitgevoerd.
Na de boodschap Blink LED in de terminal begint de led zoals verwacht te knipperen met een frequentie van een seconde. Op deze manier kun je controleren of je code werkt zonder dat je zelf ook maar enige elektronische component hebt moeten aanraken.
Met de knopjes linksboven in het simulatievenster kun je de simulatie overigens herstarten, stoppen of pauzeren. Als je ze pauzeert, toont het venster ook de toestand van elke pin. Je ziet hier dat de meeste pinnen als invoer zijn geconfigureerd en Floating (ongedefinieerde waarde). GPIO23 wordt als uitvoer getoond, met de waarde Low als je gepauzeerd hebt, terwijl de led uit is en High als je juist gepauzeerd hebt terwijl de led aan is.
Over simuleren gesproken
Met deze racestoel kun je virtueel meedoen in de Formule 1
6 Verbinden met internet
Wokwi simuleert ook een volledig wifi-netwerk, dat zelfs toegang heeft tot internet. Laten we een wifi-verbinding opzetten, deze met een MQTT-broker verbinden en wachten op een bericht om de led in of uit te schakelen:
We verbinden dus eerst met het gastnetwerk Wokwi-GUEST zonder wachtwoord. Tijdens het verbinden laten we de led knipperen en wanneer de verbinding tot stand is gekomen, gaat de led aan. Daarna verbinden we met de publieke MQTT-broker broker.hivemq.com en geven als client-ID het unieke ID van de ESP32.
We definiëren een functie mqtt_message die binnenkomende MQTT-berichten afhandelt: gaat het om het cijfer 0, dan doet de functie de led uit en bij een 1 gaat de led aan. Tot slot stellen we in dat de functie voor elk binnenkomend bericht wordt aangeroepen, verbinden we met de MQTT-broker en abonneren we ons op een topic dat gelijk is aan het client-ID. Daarna wachten we in een oneindige lus op binnenkomende berichten.
7 Schuifschakelaar
Maak nu een tweede project aan. Voor de eenvoud gebruiken we weer een ESP32 met MicroPython, maar ook andere combinaties zijn mogelijk, zoals het Arduino-framework in plaats van MicroPython, of een Raspberry Pi Pico W in plaats van een ESP32.
Plaats de ESP32 weer op een breadboard. Voeg deze keer een schuifschakelaar (Slide switch onder Input) en een weerstand van 10 kOhm toe.
De schuifschakelaar heeft drie pinnetjes. De linkse verbind je met GND en de rechtse met 5V. De middelste verbind je enerzijds met GPIO23 van de ESP32 en anderzijds via een pulldownweerstand van 10 kOhm naar GND. Zo is de invoer aan de GPIO-pin altijd gedefinieerd. We gaan deze schuifschakelaar gebruiken om de led op ons andere Wokwi-project in en uit te schakelen.
8 Berichten sturen
In de code op dit virtuele bordje verbinden we weer met wifi en de MQTT-broker, maar daarna gaan we de toestand van de schakelaar uitlezen. Elke keer dat die toestand verandert, sturen we de nieuwe toestand naar de MQTT-broker:
Het begin van de code is zo goed als hetzelfde. Maar in plaats van een led definiëren we een knop. We slaan ook onmiddellijk de huidige waarde van de knop op.
Bij de verbinding met de MQTT-broker moet je er wel op letten dat je het client-ID nu verandert. Blijkbaar gebruikt Wokwi voor elke simulatie die je draait (in ieder geval in onze tests met de ESP32) hetzelfde unieke hardware-ID. We hebben dit opgelost door in deze code gewoon ff aan het hardware-ID toe te voegen. Want als een tweede MQTT-client hetzelfde client-ID gebruikt om met de MQTT-broker te verbinden, wordt de eerste client afgesloten.
Na de verbinding lezen we in een oneindige lus de toestand van de schakelaar uit. Als die verschilt van de vorige, kijken we naar de waarde: is die aan, dan publiceren we 1 op het MQTT-topic van ons andere project, anders publiceren we 0.
9 Communicatie tussen virtuele ESP32’s
Start nu beide simulaties en zet de vensters naast elkaar, zodat je ze tegelijk kunt observeren. Kijk in de terminaluitvoer en wacht tot ze allebei met de MQTT-broker verbonden zijn. Mogelijk verloopt alles nu wat trager dan voorheen, want je browser moet nu met deze twee gelijktijdige simulaties heel wat rekenwerk verrichten.
Als je nu de schuifschakelaar naar links beweegt (gewoon klikken volstaat), zie je niet alleen in de terminal van het bordje OFF verschijnen, maar je ziet ook op het breadboard van het andere project de led uitgaan. En als je de schuifschakelaar naar rechts beweegt, dan gaat de led van het andere project aan. Je hebt beide virtuele microcontrollerbordjes met internet verbonden en ze kunnen via de publieke MQTT-broker met elkaar communiceren. Je zou een van de twee zelfs door een fysieke opstelling kunnen vervangen en dan zou de communicatie ook werken.
10 Arduino, CircuitPython en meer
We hebben hier nu MicroPython als voorbeeld gebruikt, maar met Wokwi kun je ook Arduino-projecten simuleren. Je kunt zelfs elke Arduino-bibliotheek installeren die in de Arduino Library Manager beschikbaar is. Om ook andere Arduino-bibliotheken te gebruiken, heb je het betaalde Wokwi Club-account nodig.
Op de Raspberry Pi Pico heb je ook nog enkele andere mogelijkheden. Je kunt er CircuitPython gebruiken, een fork van MicroPython. Dan kun je ook elke bibliotheek van de Adafruit CircuitPython Bundle gebruiken. Met een ander sjabloon programmeer je de Raspberry Pi Pico met de Pico SDK in C. Verder heb je op de ESP32 ook de keuze uit ESP-IDF en de programmeertaal Rust.
Beperkingen Elke simulatie breekt op een bepaald niveau met de realiteit. Dat is niet anders met Wokwi. Zo ligt de focus op digitale elektronica. De analoge aspecten van je schakeling worden dan ook maar beperkt gesimuleerd. Als je een voorschakelweerstand vergeet bij een led, krijg je geen waarschuwing en zal je virtuele led ook niet doorbranden. Dus als je denkt je schakeling veilig te hebben getest in Wokwi en dan op een fysiek breadboard opbouwt, is het goed mogelijk dat het daar mis gaat.
Je kunt ook geen condensatoren en complexere elektronische componenten toevoegen. Bovendien worden niet alle mogelijkheden van de microcontrollers ondersteund. Zo kun je geen bluetooth of deep sleep simuleren voor de ESP32. Betalende gebruikers mogen overigens wel stemmen op functies waaraan Wokwi gaat werken.