In dit hoofdstuk laten we je zien hoe je een waterpas kunt maken met behulp van de Arduino. Daarbij maak je gebruik van de GY-521, daarop zitten twee type sensoren:
Een versnellingssensor
Een gyroscoop
Eerst gaan we in op deze twee sensoren en waarom je ze goed kunt combineren. Daarna laten we zien hoe je de GY-521 kunt aansluiten op een Arduino, zodat je een waterpas kunt maken.
Gyroscoop
In het filmpje hieronder uit 2010 zie je de presentatie van de iPhone 4. De vorige iPhone bevatte al een versnellingssensor, maar deze (toen nieuwe) iPhone bevat ook een gyroscoop.
Zoals je in het filmpje kunt zien heeft de toevoeging van de gyroscoop twee voordelen:
de bewegingen van de telefoon kunnen preciezer worden gemeten
het is mogelijk om een draaiing om te meten als je om je eigen as draait terwijl je rechtop staat.
De gyroscoop maakt het mogelijk om te bepalen onder welke hoek een object staat. Samen met de versnellingsensor krijg je dan 6 waarden:
Bij de versnellingsmeter gaat het dan om:
De versnelling van voor naar achteren.
De versnelling van links naar rechts.
De versnelling van boven naar beneden.
Door de meetgegevens van die 3 sensoren te combineren krijg je dus een beeld van de richting waarin de versnelling plaatsvindt.
Ook een gyroscoop, zoals we die straks gaan gebruiken, bevat 3 sensoren waarmee je draaiende bewegingen in drie richtingen meet. De draaiende bewegingen die je meet vinden plaats rond drie assen.
roll is de rotatie om de horizontale as van voor naar achteren
pitch is de rotatie om de horizontale as van links naar rechts
yaw is de rotatie om de verticale as
In het onderstaande filmpje wordt nogmaals uitgelegd hoe een versnellingssensor (accelerometer) en gyroscoop werken.
Combineren van versnellingssensor en gyroscoop
Als je wilt bepalen in wat voor stand het voorwerp zich bevindt ten opzichte van de zwaartekracht, kun je de waarden van drie versnellingssensoren gebruiken. Als je een versnellingsensor op een voorwerp (bijvoorbeeld een robot) vastmaakt om metingen te doen zul je vaak niet alleen de bedoelde bewegingen meten maar ook bijvoorbeeld trillingen. En die ruis kunnen het meetresultaat behoorlijk verstoren. Om meer nauwkeurig de stand van het object te bepalen kun je daarnaast gebruik maken van een gyroscoop. Die heeft echter weer een ander nadeel: drift.
Drift ontstaat omdat de gyroscoop geen continue waarde meet maar werkt met een eindig aantal snel na elkaar genomen waarden. Door deze benadering ontstaan er fouten. Wanneer de gegevens van de gyroscoop sneller veranderen dan de snelheid waarmee de waarden gemeten worden zullen we de fouten niet detecteren. Dit wordt drift genoemd omdat de grootte van de fout toeneemt in de tijd. Het resultaat is dan dat de sensormeting niet terugkeert naar 0 in de rustpositie. Kortom, de gyroscoop gegevens zijn alleen betrouwbaar op korte termijn omdat deze op de lange termijn door de drift gaan afwijken.
Door de meetwaarden van de versnellingssensor en de gyroscoop te combineren kun je dus de nauwkeurigheid vergroten. Het combineren van die waarden doe je met een zogenaamd filter.
Je kunt bijvoorbeeld gebruik maken van het Kalman filter. Maar die is erg ingewikkeld, lastig te implementeren en bovendien heb je er een behoorlijk krachtige processor voor nodig. Een eenvoudiger oplossing is het complementaire filter. Het complementaire filter combineert de gegevens van zowel de versnellingsmeter en de gyroscoop. Op de korte termijn gebruiken we de gegevens van de gyroscoop, omdat deze zeer precies is en niet gevoelig is voor externe krachten. Op de lange termijn gebruiken we de gegevens van de versnellingsmeter omdat deze geen last heeft van drift.
In zijn meest eenvoudige vorm ziet het filter er als volgt uit:
De gyroscoop gegevens worden op elk tijdsinterval geïntegreerd met de huidige hoekwaarde. Hierna wordt het gecombineerd met de lange termijn data van de accelerometer (al verwerkt met arctan2). De constanten (0,98 en 0,02) moeten samen 1 zijn maar kunnen worden gewijzigd om het filter juist af te stemmen.
Meer uitleg is op het internet te vinden, bijvoorbeeld ook hier.
Een vergelijking tussen het Kalman filter en het complementaire filter vind je hier.
Staat jouw sensor waterpas?
Wat kun je nu eigenlijk met de versnellingsmeter en de gyroscoop? Heel veel. Het lijkt er zelfs op dat nog lang niet alle mogelijkheden in de hedendaagse apparaten gebruikt worden.
Laten we eens beginnen met het bouwen van een waterpas.
Wat we steeds nodig zullen hebben is een sensor die een versnellingsmeter en een gyroscoop bevat. De versnellingsmeter en de gyroscoop hebben immers elkaar nodig voor het compenseren van de ruis (bij de versnellingsmeter) en de drift (bij de gyroscoop).
De sensor die we hier gaan gebruiken is de MPU-6050 die op een zogenaamd break-out board zit, de GY-521.
GY-521 break-out board
Deze chip bevat zowel een versnellingsmeter als ook een gyroscoop. Let daarbij op de pijltjes met de aanduiding x en y op het board. Daaraan kun je zien in welke richting of met welke draaiing de chip zijn metingen zal doen.
De I2C bus
Het aansluiten van de GY-521 op de Arduino is een beetje anders dan we tot nu toe gewend waren. De GY-521 heeft een zogenaamde I2C bus aansluiting. I2C staat voor inter-intergrated Circuit en is in 1982 ontwikkeld door Philips Semiconductor om op een goedkope manier communicatie tussen chips mogelijk te maken. Hieronder een schematische voorstelling van een I2C bus.
Schematische voorstelling van een I2c BUS
In onze situatie is de Arduino de master en kunnen daarop meerdere break-out boards worden aangesloten. Aangezien ieder break-out board zijn eigen adres heeft kan de Arduino ze via een gezamenlijke aansluiting afzonderlijk aanspreken.
Vaak functioneren de poorten A4 en A5 op de Arduino als de SDA en SCL aansluitingen maar er zijn ook Arduino’s die een aparte SDA en SCL aansluiting hebben.
Laten we eens onderzoeken wat het I2C adres is van het GY-521 board. Maar daarvoor moeten we eerst de sensor aansluiten.
De GY-521 aansluiten
De GY-521 sluit je als volgt aan.
Waarschijnlijk heb je de GY-521 met losse pinnetjes gekregen (zie afbeelding hieronder). Het mooiste is om de pinnen aan het printplaatje te solderen. Als dat niet kan, let dan op dat de pinnen goed verbinding maken met het printplaatje.
Opdracht: sluit GY-521 aan
Sluit de GY-521 aan volgens de afbeelding hierboven
Open de code in de Arduino software en start het uploaden naar de Arduino
Open, zodra het uploaden klaar is, de seriële monitor (rechtsboven )
Als het goed gegaan is zie je nu het volgende:
De I2C scanner
Niet alleen weten we nu dat de I2C aansluiting werkt maar ook wat het adres is van de GY-521.
De GY-521 is hier de slave en zoals je in het schema ziet, kun je er meerdere slaves op aan sluiten. Je kunt er zelfs ook een tweede master op aansluiten.
Om hiervan nog een voorbeeld te geven sluiten we er ook even een display op aan:
Twee I2C devices aangesloten
En als je dan opnieuw de I2CScanner laat draaien krijg je:
Zo’n display heeft normaal gesproken 16 aansluitingen. Maar door er een I2C kaartje aan toe te voegen (dat normaal gesproken achterop het display gesoldeerd zit) heb je nog maar 4 aansluitingen nodig. Super handig dus.
Willen we die software helemaal zelf gaan maken? Dat valt nog niet mee. En dus is het slimmer om gebruik te maken van bibliotheken. En gelukkig zijn die er in overvloed.
Een bibliotheek installeren
Het installeren van een bibliotheek hoeft niet al te ingewikkeld te zijn maar het hangt wel af van welke bibliotheek je kiest.
In ieder geval kiezen we hier voor de eenvoudige installatie.
Opdracht: installeer bibliotheek
Start de Arduino software
Kies voor Schets – Bibliotheek gebruiken – Bibliotheken beheren…
Typ dan in de zoekregel: mpu6050
Klik nu op MPU6050_tockn en daarna op installeren.
Klaar!
Vaak vind je bij zo’n bibliotheek ook voorbeelden van code waarmee je hem kunt gebruiken. En dat is hier gelukkig ook het geval.
Meer informatie over deze bibliotheek vind je hier.
De code
Opdracht: probeer de voorbeelden uit
Klik in de Arduino software op Bestand – Voorbeelden – MPU6050_tockn en kies GetAllData
Start het uploaden en als dat klaar is open dan de Seriële monitor
En wat je ziet is heel veel data:
Iedere seconde worden de gegevens geupdate.
De waarden accX, accY en accZ zijn de sensorwaarden van de versnellingssensor en de waarden gyroX, gyroY en gyroZ zijn de sensorwaarden van de gyroscoop.
Uit deze waarden worden de hoeken bepaald. Na corrigeren voor ruis en drift krijg je de onderste regel en dat zijn de waarden waarmee we aan de slag kunnen.
Zie je niets gebeuren of zie je vreemde karakters? Kijk dan eens rechtsonder in de Seriële monitor. Daar kun je namelijk de communicatiesnelheid instellen.
Wat is jouw baudsnelheid? In de code zie je het volgende staan:
Het getal tussen haakjes in de regel met Serial.begin moet gelijk zijn aan het getal dat onderaan de Seriële monitor staat. Is dat verschillend? Pas het dan aan. Dat kun je het eenvoudigst doen onderaan in de seriële monitor.
De tweede voorbeeldcode die je kunt vinden is GetAngle. Open ook deze, start het uploaden en als dat klaar is open dan de Seriële monitor
Nu zie je de hoeken die door de gyroscoop gemeten worden.
En dat kunnen we goed gebruiken voor de waterpas!
Dus test vast welke beweging je moet maken om de x-waarde te veranderen en welke beweging voor de y-as gevolgen heeft.
De waterpas
Een eenvoudige toepassing van zo'n versnellingsmeter/gyroscoop is een waterpas.
Opdracht Bouw een waterpas
Bouw de volgende schakeling. Uiteraard wordt het op deze manier een nogal lompe waterpas maar als prototype gaat het prima werken.
Het gaat er hier natuurlijk om dat de groene led gaat branden als hij goed horizontaal ligt. Bij afwijkingen daarvan gaat de gele of de rode branden.
Bepaal zelf welke as je gaat gebruiken (de x-as of de y-as).
Bepaal ook zelf waar jouw grenswaarden liggen dus wanneer de overgangen tussen rode, gele en groene led plaats zullen vinden.
Teken nu eerst het toestandsdiagram.
Schrijf de code waarbij je uit mag gaan van de code zoals die gebruikt wordt in het voorbeeld getAngle.
Twee dimensionale waterpas
Een waterpas is handig maar nog handiger is een twee dimensionale waterpas. Wil je bijvoorbeeld een tafel recht zetten dan moet je dat in twee richtingen meten. Je weet al dat je met de versnellingsmeter/gyroscoopsensor zowel de hoek in de x- als de y-richting kunt meten dus daarmee is het ook redelijk eenvoudig de vorige opdracht uit te breiden tot een twee dimensionale waterpas.
Natuurlijk hoeft dat niet zo mooi als hieronder:
Gewoon weer met ledjes maar nu haaks op de rij van de vorige opdracht opnieuw een gele en een rode led in beide richtingen. Misschien is dat wel wat lastiger bouwen maar bedenk dat je, als dat nodig is, breadboards ook aan elkaar kunt koppelen.
Opdracht Bouw een tweedimensionale waterpas
Teken weer eerst het toestandsdiagram. Je kunt ook twee toestandsdiagrammen tekenen en die aan elkaar koppelen.
Uiteraard maak je nu gebruik van zowel de x- als de y-as. Schrijf de code en test jouw waterpas.
Een stappenteller
Het lijkt heel eenvoudig, een stappenteller. Maar je kunt nu wel de nodige gegevens van bewegingen uit de sensor halen maar hoe ga je er dan verder mee aan de slag?
Gelukkig hebben er meerderen met dat probleem geworsteld. Een verslag van een groep die het probeerde vind je hier.
Opdracht Bestudeer de voorbeelduitwerking
Bestudeer hoe zij het opgelost hebben en geef dan antwoord op de volgende vragen:
Welk(e) gegeven(s) hebben zij gebruikt om de stappen te tellen?
Wat zijn de voor- en nadelen van hun keuze?
Wat hebben zij gebruikt als treshold (dus bij welke waarde(n) wordt er een stap geteld)?
Tot slot:
Opdracht Bouw een stappenteller
Ontwerp en bouw een eenvoudige stappenteller. Maak natuurlijk eerst weer een toestandsdiagram! Je kunt bijvoorbeeld het toestandsdiagram gebruiken dat je eerder maakte, zie: https://maken.wikiwijs.nl/135428/Cyclus_4#!page-4911616
De versnelling kun je berekenen door de 3 waarden (versnelling_x, versnelling_y, versnelling_z) te combineren, bijvoorbeeld als volgt:
versnelling = wortel van ((versnelling_x)² + (versnelling_y)² + (versnelling_z)²).
Het arrangement Cyclus 4 - Arduino is gemaakt met
Wikiwijs van
Kennisnet. Wikiwijs is hét onderwijsplatform waar je leermiddelen zoekt,
maakt en deelt.
Dit lesmateriaal is gepubliceerd onder de Creative Commons Naamsvermelding-GelijkDelen 4.0 Internationale licentie. Dit houdt in dat je onder de voorwaarde van naamsvermelding en publicatie onder dezelfde licentie vrij bent om:
het werk te delen - te kopiëren, te verspreiden en door te geven via elk medium of bestandsformaat
het werk te bewerken - te remixen, te veranderen en afgeleide werken te maken
voor alle doeleinden, inclusief commerciële doeleinden.