Welke microcontrollers bestaan er en waar zijn ze goed voor?
Ze zitten in je auto, in je magnetron, in je wasmachine, maar ook in je pc, en ze vormen het hart van de Arduino- en ESP32-ontwikkelbordjes: microcontrollers. Onzichtbaar op de achtergrond wordt bijna ons hele leven erdoor draaiende gehouden. Welke microcontrollers bestaan er en hoe werken ze precies?
Als je een maaltijd in je magnetron zet, kies je de juiste tijd en instellingen en zet je hem aan. Aan het einde zegt je magnetron ‘ping!’ en is je maaltijd opgewarmd.
Heb je je al eens afgevraagd hoe dat werkt? Eigenlijk zit er in je magnetron een hele (kleine) computer die een programmaatje afwerkt dat enerzijds reageert op de knoppen en anderzijds, als je dat hebt, op het lcd-scherm. Ook stuurt de computer de elektronenbuis aan die de maaltijd met microgolven verwarmt. Die kleine computer is een microcontroller. Je hebt er waarschijnlijk tientallen in huis.
Een microcontroller is een chip die eigenlijk een hele computer in één pakket behuist. Daarin zitten een processor, geheugen (ram en rom) en allerlei poorten naar de buitenwereld. Terwijl je bij een gemiddelde processor voor je desktopcomputer dus nog een heel moederbord, ram-geheugen en storage nodig hebt om er iets nuttigs mee te doen, heb je bij een microcontroller slechts een beperkt aantal externe componenten nodig. Wat weerstanden en condensatoren zijn doorgaans voldoende voor een werkende microcontroller-opstelling.
Die verregaande integratie in een microcontroller is mogelijk omdat dit geen chip is voor flexibele apparaten, zoals pc’s. Microcontrollers zijn ontworpen om specifieke toepassingen uit te voeren, zoals in een magnetron, een pinautomaat, een wasmachine of een pacemaker. Een laag stroomverbruik en een lage kostprijs zijn voor die toepassingen belangrijk.
Lage prestaties met hoge impact
Low-end microcontrollers hebben dan ook een processorsnelheid van maar enkele MHz en slechts enkele kilobytes ram-geheugen. Kijk bijvoorbeeld naar de Arduino Uno, een populair ontwikkelbordje om mee te experimenteren. De microcontroller op dat bordje is de AVR ATmega328P. Die werkt op een kloksnelheid van 16 MHz, heeft 2 KB sram, 1 KB eeprom en 32 KB flashgeheugen.
Vergeleken met de gigahertzen, gigabytes en terabytes die we op onze pc’s gewend zijn, lijken die specificaties ondermaats. Maar toch kun je hiermee ongelooflijk veel projecten aansturen: muziekinstrumenten, robotautootjes, weerstations, je planten automatisch water geven... Je kunt het zo gek niet bedenken of iemand heeft het al weleens met die kleine ATmega328P gedaan.
Microcontroller of SoC? Waarschijnlijk heb je ook al gehoord van een system-on-a-chip (SoC), wat op het eerste gezicht hetzelfde lijkt: een processor geïntegreerd met andere componenten. De grens tussen wat we als een microcontroller beschouwen en wat als een SoC is nogal vaag. Maar doorgaans is een SoC met een snellere processor uitgerust, heeft die meer ram en bevat hij mogelijk radiochips (wifi en/of mobiel netwerk) of een ingebouwde gpu. Alle smartphones en tablets zijn dan ook gebouwd rond een SoC, maar ook de Raspberry Pi, apparaten zoals een nas en slimme luidsprekers. Ook de Apple M1 is een SoC: deze integreert een arm-processor, ram, gpu, image-signal-processor, Secure Enclave (een coprocessor voor veilige opslag van sleutels) en controllers voor NVMe en thunderbolt 4.
Pinnetjes
Als je een low-end microcontroller zoals een ATmega328P van een Arduino Uno ziet, is het eerste wat opvalt de pinnetjes die eruit steken. Elk van die pinnetjes heeft een functie. Sommige sluit je aan op een voeding, zodat de chip stroom krijgt, maar de meeste dienen om met de omgeving te communiceren.
Komt de chip in een dip-behuizing, dan kun je die pinnetjes eenvoudigweg in een breadboard prikken. Door dan jumperwires in een gaatje in dezelfde rij als een pin te steken, verbind je het draadje met die pin. Op die manier bouw je eenvoudig elektronische schakelingen op met componenten die met de microcontroller kunnen communiceren.
Een Arduino Uno-bordje is dan eigenlijk gewoon een printplaatje waarop de ATmega328P is geplaatst en alle pinnetjes verbonden zijn met ofwel de headers op het bordje, ofwel met andere componenten van het printplaatje, zoals de spanningsregelaar, statusleds en de resetknop. Je kunt het eigenlijk vergelijken met een moederbord voor een processor: een Arduino Uno maakt een ATmega328P-microcontroller alleen wat handiger om te gebruiken en om andere componenten op aan te sluiten.
©PXimport
De eenvoudigste manier om met een microcontroller te communiceren is wat we GPIO noemen (general-purpose input/output). Elke GPIO-pin kunnen we aansturen door een bit op een specifiek adres in het geheugen van de microcontroller op 1 of 0 te zetten. Schrijven we er 1 naar, dan wordt een spanning van bijvoorbeeld 5 V over de pin gelegd; schrijven we er 0 naar, dan wordt de spanning 0 V.
Als je dan bijvoorbeeld tussen die pin en 0 V een led en een weerstand plaatst, gaat de led aan wanneer je 1 naar de pin schrijft en uit wanneer je er 0 naar schrijft. Bij een 1 vloeit er immers een stroom van 5 V naar 0 V. De weerstand dient om de stroom te beperken tot wat de led aankan.
Ook in de andere richting werkt dat. Als je de GPIO-pin als invoer configureert, zal de microcontroller de spanning die je aan de pin aanlegt (5 V of 0 V) interpreteren als een 1 of 0. Op die manier sluit je een knop aan op de pin. Druk je de knop in, dan maakt die intern een verbinding tussen 5 V en de pin van de microcontroller, waardoor die een 1 registreert.
Laat je de knop los, dan wordt er doorgaans via een pull-downweerstand voor gezorgd dat de pin verbonden is met 0 V en dus een 0 registreert. Op dezelfde manier sluit je een PIR-sensor voor aanwezigheidsdetectie aan: de pin registreert dan 1 als de sensor iemand waarneemt en anders 0.
Protocols en bussen
Telkens 1 bit in of uit de microcontroller sturen, is voldoende voor eenvoudige toepassingen, maar vaak heb je complexere vormen van communicatie nodig. Daarvoor zijn er allerlei protocollen ontwikkeld. Bijvoorbeeld UART (universal asynchronous receiver-transmitter), een protocol voor seriële communicatie waarbij je bytes in twee richtingen kunt sturen.
Het protocol beschrijft hoe je de opeenvolgende bits moet sturen. Zo bestaan er UART-modules die je in een usb-poort van je pc kunt steken. Communiceren met de microcontroller doe je dan door de RX-pin van de microcontroller met de TX-pin van de UART-module te verbinden en andersom: RX staat voor receive en TX voor transmit.
Voor communicatie met meerdere componenten, zoals sensoren, externe geheugens en schermen, maak je meestal gebruik van een bus zoals I²C (Inter-Integrated Circuit, uitgevonden door Philips) en SPI (Serial Peripheral Interface). I²C wordt ook wel Two-Wire genoemd, omdat er twee pinnen worden gebruikt: SDA om de seriële data door te sturen en SCL om een kloksignaal te sturen.
SPI (ook weleens Four-Wire genoemd) heeft vier pinnen: SCLK voor de klok, MOSI voor communicatie van de master (meestal de microcontroller) naar de slave en MISO voor de andere richting, en SS om te selecteren met welke slave de master spreekt. Voor elke slave heb je een extra pin SS nodig. Bij de meeste microcontrollers zijn er specifieke pinnen aanwezig voor UART, I²C en SPI.
©PXimport
Digitaal of analoog
Tot nu toe hebben we het alleen maar over 0 en 1 gehad, digitale gegevens dus. Maar heel wat sensoren geven analoge gegevens door, bijvoorbeeld een temperatuursensor of druksensor waarvan de weerstand varieert met de gemeten waarde. Met een spanningsdeler haal je uit die variabele weerstand een variabele spanning, die dus een analoge voorstelling van de meetwaarde is.
Gelukkig bestaat er een component die een analoge waarde (bijvoorbeeld een spanning) kan omzetten naar een digitale waarde (bijvoorbeeld een 10bit-getal): de ADC (analoog-digitaalomzetter).
ADC’s bestaan als losse componenten (bijvoorbeeld via I²C of SPI aan te sluiten), maar veel microcontrollers hebben ook zelf een of meer ADC’S ingebouwd. Ook in de andere richting bestaat er een component: de DAC (digitaal-analoogomzetter) zet een digitale waarde (bijvoorbeeld een 10bit-getal) om in een analoge waarde (bijvoorbeeld een spanning van 0 tot de voedingsspanning).
Sommige microcontrollers hebben ook een DAC ingebouwd. Al met al zijn microcontrollers dus de perfecte componenten om de digitale en analoge wereld te verenigen. Een Raspberry Pi bijvoorbeeld heeft geen ADC ingebouwd, terwijl een Arduino-bordje er meerdere heeft.
Microcontroller-behuizingen Dezelfde microcontroller kun je vaak in meerdere types behuizingen kopen. Op breadboards zul je vaak DIP-behuizingen tegenkomen: dual in-line package. De chip zit dan in een rechthoekig blokje met aan twee tegenovergelegen zijden pinnetjes die naar onderen uitsteken. Standaard liggen de pinnetjes 2,54 mm (een tiende inch) van elkaar, waardoor ze op een breadboard passen. In massaproductie vind je eerder varianten van QFP (quad flat package), waarbij een vierkante behuizing aan elke zijde een rij pinnetjes heeft, met een afstand van 0,4 tot 1 mm, die op de printplaat worden gesoldeerd. Een soortgelijke behuizing is QFN (quad-flat no-leads), waarbij er geen pinnetjes uitsteken maar er onderaan de chip aan de vier zijden rijen kopersporen zijn die rechtstreeks op de banen van de printplaat aansluiten. Deze zijn moeilijk met de hand te solderen.
Microcontrollerfamilies
Net zoals er voor pc’s allerlei processorfamilies bestaan, heb je ook diverse families van microcontrollers. De belangrijkste onderverdeling is op basis van de processorarchitectuur. Populair bij hobbyisten zijn de 8bit-AVR-microcontrollers van Atmel (in 2016 overgenomen door Microchip). Ze zijn onderverdeeld in twee subfamilies: de ATtiny-serie met minder pinnen, geheugen en functies (de basismodellen hebben zelfs geen ram-geheugen, UART, I²C en SPI) en de krachtigere ATmega-serie die in de meeste Arduino-bordjes zit.
Een familie die zowel bij hobbyisten als industriële ontwikkelaars populair is, zijn de PIC-microcontrollers, die al sinds 1976 meegaan. Hun populariteit is te danken aan hun lage kostprijs, brede beschikbaarheid en heel wat bestaande code.
Een andere populaire low-end microcontroller in de industrie is de 8051. Oorspronkelijk werd deze in 1980 door Intel ontwikkeld onder de naam MCS-51. In 2007 is Intel met de productie gestopt, maar tientallen andere chipfabrikanten produceren nog altijd hun eigen klonen van de 8051, vaak met een snellere klok en extra functies. Ze worden gebruikt in auto’s, meetsystemen, transceivers voor bluetooth, Zigbee en andere draadloze protocollen, in usb-sticks enzovoort.
©PXimport
Als je naar de krachtigere microcontrollers gaat, kom je bij 32- en 64bit-families uit. De laatste jaren hebben vooral de Xtensa-processors van Tensilica (in 2013 overgekocht door Cadence) een flinke opmars gemaakt. Het zijn immers de processors in de ESP8266- en ESP32-microcontrollers van het Chinese Espressif. Deze zijn populair bij hobbyisten door hun geïntegreerde wifi en (voor de ESP32) bluetooth, en omdat ze eenvoudig te programmeren zijn in de Arduino IDE of via frameworks als ESPHome. De bordjes gebouwd rond de microcontrollers van Espressif zijn dan ook populair voor doe-het-zelf-domotica.
Tot de krachtigste en flexibelste microcontrollers behoren die gebouwd rond de ARM-architectuur. De high-end versies daarvan vind je in je smartphone en ook in computerbordjes zoals een Raspberry Pi, al spreken we dan meer van een SoC.
ARM kent veel subfamilies, maar voor de klassieke microcontrollertoepassingen zijn vooral de ARM Cortex-M-processors (32 bit) gebruikt. Die vind je bijvoorbeeld in de AT SAM-serie van Atmel die in de krachtigere Arduino-bordjes zitten, in de populaire STM32-familie van STMicroelectronics, en in de nRF-serie van Nordic Semiconductor voor draadloze toepassingen, zoals bluetooth en thread.
Ontwikkelbordjes
Voor industriële toepassingen wordt een printplaat op maat ontworpen, waarop een microcontroller staat. Maar wie zelf aan de slag wil met een microcontroller, heeft een ontwikkelbordje nodig. Dat geeft eenvoudig toegang tot de pinnen van de microcontroller via standaard pinheaders en voegt zaken zoals een spanningsregelaar en usb-naar-UART-omzetter toe, zodat je het bordje eenvoudig op je pc kunt aansluiten.
Voor elke microcontrollerfamilie bestaan er wel ontwikkelbordjes in allerlei vormen en groottes. Voor de AVR-familie zijn de Arduino-bordjes populair. Sommige daarvan, zoals de Arduino Nano, prik je op een breadboard, maar de meeste komen in een groter formaat met vrouwelijke pinheaders waarin je jumperwires steekt.
Voor de Espressif-microcontrollers is het kleinere formaat dat je op een breadboard prikt alomtegenwoordig. Voor de nRF-serie heeft Nordic Semicondictor grote ontwikkelborden, maar ook versies in de vorm van een stick die je in de usb-poort van je pc schuift. Ook de BBC micro:bit en micro:bit v2 zijn leuke ontwikkelbordjes voor de nRF-microcontrollers.
©PXimport
Microcontroller programmeren
Kijken we tot slot nog even naar hoe het programmeren van een microcontroller werkt. Als je gewend bent om voor een pc of een computerbordje zoals een Raspberry Pi te programmeren, krijg je zeker een cultuurschok wanneer je voor het eerst een microcontroller programmeert. Doorgaans draait er immers geen besturingssysteem op een microcontroller. Er draait slechts één programma op: wat jij schrijft.
Dat programma schrijf je in het ingebouwde flash-geheugen. Als je de stroom uitschakelt en weer inschakelt, begint de microcontroller het programma onmiddellijk uit te voeren. Dat maakt een microcontroller betrouwbaarder in werking dan een processorbordje zoals een Raspberry Pi.
De best ondersteunde programmeertalen op microcontrollers zijn C of C++, maar die zijn niet het toegankelijkst. Het Arduino-ecosysteem lost dat op door een standaardbibliotheek en allerlei uitbreidingen aan te bieden. Die vormen een laag bovenop het onderliggende C++.
Andere oplossingen zijn MicroPython en CircuitPython die een afgeslankte versie van Python op microcontrollers aanbieden, en Espruino dat het mogelijk maakt om JavaScript op een microcontroller te gebruiken. Voor industriële toepassingen gebruik je eerder een realtime besturingssysteem zoals Zephyr, dat je in C programmeert.
Ontwikkelomgevingen
Om het proces van code programmeren en de firmware naar je microcontroller flashen te vereenvoudigen, bestaan er allerlei ontwikkelomgevingen. Die tonen bijvoorbeeld fouten in je code, compileren met één druk op een knop je code tot machinecode in de instructieset van de processor, en flashen de firmware naar je ontwikkelbordje.
Programmeer je een Arduino-bordje, dan doe je dat doorgaans in de Arduino IDE (wat staat voor integrated development environment). Maar dankzij de ondersteuning van andere bordjes kun je met de Arduino IDE ook ESP8266- of ESP32-bordjes programmeren.
Ook populair is PlatformIO, een opensource-plug-in die van Microsofts ontwikkelomgeving Visual Studio Code een ontwikkelomgeving voor microcontrollers maakt. Het voordeel van PlatformIO is dat je met één ontwikkelomgeving voor diverse platforms en frameworks voor microcontrollers kunt ontwikkelen, inclusief Arduino, Espressifs framework en Zephyr.
Visual Studio Code is bovendien ook bruikbaar om voor een Raspberry Pi of je pc te programmeren. Op deze manier verenig je dus al je programmeerprojecten in één omgeving.