11 Juli 2025 –
Vraag vanuit het onderwijs
Afgelopen week kreeg ik, vanuit mijn rol als onderwijs- en onderzoeks-ondersteuner bij Avans Hogeschool Engineering, de vraag of ik een bestaande basis PID-regelaar (Proportioneel Integrerend Differentiërend) om kan bouwen naar een illustratieve versie voor educatieve doeleinden. Het idee: een toegankelijke opstelling waarmee HBO AD Engineering studenten zelfstandig, intuïtief kunnen leren werken met een PID-regelaar. Zo’n uitdaging ga ik graag aan. Dit voorjaar viel mijn oog namelijk op een artikel in het Elektor Magazine over een Arduino PID-controller, inclusief HTML/JavaScript-gebaseerde GUI. Met vooruitziende blik heb ik dat artikel opgeslagen – en dat komt nu mooi van pas.

Benodigdheden en tools opzet van de regeling
De technische opzet is lekker overzichtelijk:
– Arduino Uno R3 – met USB stekker
– DC-motor met encoder – Makerblock SH 0.02.1700 25mm
– L298N Dual H-Bridge DC/Stepper Motor Driver
– HD44780 20×2 LCD I2C module
– 9V adapter 500mA
– Arduino IDE
– Visual Studio, Note++ of kladblok voor HTML editing
– Code example Elektor Magazine-artikel over een Arduino PID-controller april 2025



Het Elektor Magazine-artikel gebruikt de PID_v2 library van Brett Beauregard, een opvolger van de veelgebruikte Arduino PID-library. De opstelling stuurt de motor dynamisch naar een via webbrowser ingestelde positie. De GUI is gebouwd in HTML, CSS en JavaScript, en maakt gebruik van de Web Serial API: sinds 2021 kunnen webbrowsers direct communiceren met hardware als Arduino via de seriële poort.
Toepassingen van een PID-regelaar
PID-regelaars kom je in allerlei toepassingen tegen:
– Temperatuurregeling, denk aan thermostaten
– Snelheidsregeling van motoren
– Robotbalancering
– Niveau-, druk-, en flowregeling in industriële processen

Bouw en doel van deze opstelling
Ik besluit de PID-opstelling uit het magazine na te bouwen. Alle onderdelen heb ik al in huis en gebruik ik regelmatig in projecten. De aanpak in het artikel is solide, ik heb de opstelling zonder problemen werkend gekregen. Programmering verloopt via de Arduino IDE; de motor krijgt voeding via een externe adapter met H-bridge. Voor het onderwijs is het vooral belangrijk dat studenten kunnen zien hoe de motorsnelheid zich stabiliseert bij veranderende instellingen of belasting. Het hart van het regelcircuit is de PID-regelaar.
Hoe werkt een PID-regelaar?
De PID-regeling is standaard binnen industriële automatisering en mechatronica. Kort: de regelaar vergelijkt de gewenste waarde (setpoint/referentie) met de gemeten waarde (proceswaarde/output). Op basis van het verschil stuurt de PID de motor bij, zodat de fout zo klein mogelijk wordt. De standaard PID regelwet is als volgt:
U(t) = Kp * e(t) + Ki * ∫e(t)dt + Kd * de(t)/dt
waarbij:
– U(t) = uitgaand signaal (bijv. motortoerental)
– e(t): fout (setpoint – proceswaarde)
– Kp = proportionele versterking
– Ki = integrerende versterking
– Kd = differentiële versterking
Uitleg onderdelen
– Proportioneel (P): corrigeert direct op huidige fout
– Integrerend (I): werkt blijvende afwijkingen weg
– Differentiërend (D): dempt snelle veranderingen

Aanpassen naar snelheidsregeling
Het voorbeeld uit Elektor werkt met positiebereik, maar ik wil de regeling ombouwen naar actuele snelheid. Dat vraagt aanpassingen in zowel Arduino-code als de webinterface. Hier komt ChatGPT 4.1 om de hoek kijken, want het omzetten van absolute positie naar snelheidsregeling blijkt lastig. Variabelen wijzigen, PID_v2 aanroepen… telkens loop ik tegen kleine conflicten of onduidelijkheden aan. Er blijken verschillende populaire PID-libraries te zijn en de adviezen van ChatGPT slingeren soms van de ene naar de andere.
Andere aanpak: eigen PID-logica
Na ruim een uur uitproberen besluit ik het anders te doen. De originele PID-regelaar (zonder library, met heldere opbouw) die al binnen ons docententeam circuleert, vormt een beter startpunt. Geen ingewikkelde library-aanroepen, dus minder kans op variabele-conflicten. Ik gebruik de bestaande GUI-code als basis en bepaal een duidelijke strategie:
Voor de Arduino:
- Bepaal snelheid uit encoderwaarden per interval (clicks/seconde)
- Gebruik snelheid als input voor PID (sp=, kp=, ki=, kd=)
- Stel setpoint in via de seriële poort
- Stuur de motor direct aan op basis van de PID-uitgang
- Seriële poort toont iedere seconde referentie en proceswaarde
Voor de GUI:
- Interface-labels aanpassen naar snelheidsregeling
- Invoerveld voor gewenste snelheid toevoegen
- Invoervelden voor sp=, kp=, ki=, kd=
- Visualisatie van actuele snelheid in een grafiek
- Extra veld voor tijdsbereik grafiek
- Logo toevoegen
Integratie en verdere optimalisatie
In het Elektor-artikel staan PID-control en het menu los van elkaar. Voor mijn toepassing is het handiger om een alles-in-één .ino-bestand te maken, zonder bibliotheek, met alle berekeningen in de loop(). Mijn sketch is compact en helder gedocumenteerd; ik luister naar seriële input en stuur actuele instellingen direct terug via de poort. Zo is alles gestructureerd uit te lezen via de Web Serial API in de browser.


Gebruiksgemak in de browser
De basisopzet werkt prima: links de invoervelden (ook direct aanpasbaar), linksonder een seriële console voor live feedback, rechts een overzichtelijke grafiek met setpoint- en proceswaarde. In tegenstelling tot de originele versie kijk ik nu naar actuele snelheid, dus wil ik realtime weergave van de data. De tijdsduur van het grafiekvenster is aanpasbaar via een pull-down (2 tot 30 seconden), zodat studenten direct het effect zien van wijzigingen in kp, ki en kd.
Eindresultaat: inzicht, interactie en overzicht
Na wat optimalisaties loopt de dataflow precies zoals ik wil: snel, overzichtelijk en direct via de native serial interface met de Arduino Uno. De grafiek schaalt nu automatisch mee met het scherm van de gebruiker, zodat alles in één oogopslag zichtbaar blijft. Als finishing touch voeg ik een logo toe. Daarmee is de applicatie af.
Toepassing en leeropbrengst
Met deze aanpak kunnen bestaande motorcontroller-opstellingen direct voorzien worden van een overzichtelijke browserinterface. Studenten kunnen nu zelf de impact van kp, ki en kd live uitproberen, direct zien én horen wat er gebeurt. De motor draait, de invloed van de parameters is direct zichtbaar in de grafiek.

Reflectie en nieuwe kennis
Dit soort projecten maken vind ik leuk—vooral omdat ik nu praktisch heb geleerd hoe de native serial interface werkt tussen embedded processors en webgebaseerde GUIs. Ook het dynamisch aanpassen van de tijdsas is nieuw voor mij. Juist voor sensoring, anomaly testing en realtime machine learning toepassingen is dit een mooie uitbreiding van mijn toolkit.