DC-motoren (DC = gelijkstroom), zijn zowat de meestgebruikte motoren bij Arduino. Je vindt ze in alle maten.
De werking: Hun werking is eenvoudig: er zijn twee contactpunten of draden die verbonden worden met de voeding en met GND. Je mag die draden wisselen en dan verandert de richting waarin je motor draait. Hoe meer spanning de voeding levert, hoe sneller je motor gaat draaien.
Op een gewone Arduino zoals de Uno mag je nooit meteen een DC-motor aansluiten. Je gaat zo je Arduino overbelasten. Je gebruikt dan een motor-driver om je motor aan te sturen.
Op de Brainbox mag je wel meteen twee kleine DC-motoren aansluiten. De Brainbox heeft immers een H-bridge. Je moet dan wel een externe voeding (adapter of batterij) gebruiken.
Zoals gezegd gebruiken we bij een gewone Arduino steeds een motor-driver om onze DC-motoren aan te sturen. Hier gebruiken we de L298N.
De werking:
De L298N is een eenvoudige en overzichtelijke motor-driver. 3 pins sturen telkens een motor aan.
2 digitale pins voor de draairichting en één PWM pin voor de snelheid. De voeding voor de motoren mag niet van een Arduino komen en mag tussen 7V en 35V liggen. De externe voeding sluit je aan op +12V en GND. Omdat je nu twee toestellen laat samenwerken moet je ook een verbinding maken tussen de GND op je L298N en je Arduino. Kijk goed na dat je hier de juiste draad verbindt.
De motordrive heeft ook een ingebouwde 5V voeding.
De aansluitingen:
Out 1 & Out 2: Op deze klemmen kan je de eerste motor aansluiten (motor A).
Out 3 & Out 4: Op deze klemmen kan je de tweede motor aansluiten (motor B).
12V: Deze aansluiting verbind je met de rode draad van een externe spanningsbron of batterij (7V – 35V).
GND: Hierop sluit je de zwarte draad van de externe spanningsbron aan. Belangrijk, deze ground verbind je ook met de GND van de arduino.
5V: De motordrive heeft een ingebouwde 5V bron. Deze kunnen we gebruken om de arduino te voeden (Vin pin).
ENA: Enable A, deze pin wordt gebruikt om de eerste motor (motor A) in te schakelen en zijn draaisnelheid te bepalen. Hiervoor gebruik je een pwm output (0-255).
Standaard is er een jumper verbonden op deze ingang en wordt de motor maximaal aangestuurd. Voor onze linefollower moeten we de draaisnelheid van de motor laten variëren. Dus wij moeten deze jumper eraf halen en deze pin verbinden met de arduino.
IN1 & IN2: Deze ingangen bepalen de draairichting van de eerste motor (motor A)
Deze moeten beide gestuurd worden in de code.
Draairichting 1: IN1: HIGH, IN2: LOW
Draairichting 2: IN1: LOW, IN2: HIGH
Test zelf welke draairichting overeenkomt met vooruit en achteruit.
Dit kan bij elk team verschillen afhankelijk van de elektrische aansluiting van de motor.
ENA: Enable B, deze aansluiting wordt gebruikt om de tweede motor (motor B) in te schakelen en zijn draaisnelheid te bepalen. Hiervoor gebruik je een pwm output (0-255).
Let ook hier op dat je de jumper eraf haalt, en de pin verbind met de arduino.
IN3 & IN4: Deze ingangen bepalen de draairichting van de tweede motor (motor B).
Deze moeten beide gestuurd worden in de code.
Draairichting 1: IN3: HIGH, IN2: LOW
Draairichting 2: IN4: LOW, IN2: HIGH
Test zelf welke draairichting overeenkomt met vooruit en achteruit.
Dit kan bij elk team verschillen afhankelijk van de elektrische aansluiting van de motor.
De Schakeling:
Overzicht van de pins op de L298N.
Jumpers op ENA & ENB
Voorbeeldcode:
Hieronder kan je een testcode vinden om 1 motor aan te sluiten op de L298N.
Test de driver en pas vervolgens de code aan zodat je de 2 motoren kan laten draaien.
Je hebt misschien al gezien dat er bij robotwieltjes vaak ook een plastic wieltje met gaatjes wordt meegeleverd. Natuurlijk heeft dat wieltje een functie, al is het wat zoeken als je wil vinden hoe je 't moet gebruiken.
Dat wieltje kan je gebruiken met een 'optische snelheidssensor'. Dat is eigenlijk een infrarood (IR) lichtsensor met twee uitsteeksels. Aan de ene kant heb je de sensor aan de andere kant een lampje. Telkens er IR-licht op de sensor valt geeft die een HIGH signaal door. Als je nu het aantal signalen per seconde gaat tellen, dan kan je dat omrekenen naar 'toeren per minuut'. Op basis van de omtrek van je wiel zou je (net als bij de EV3-robot) ook kunnen omrekenen naar Km/uur.
De schakeling: De schakeling is erg vanzelfsprekend. Er zijn drie pins: VCC gaat naar 5V op de Arduino, GND gaat naar GND, OUT gaat naar een digitale IN-pin.
De code: Het basis idee is erg eenvoudig: tel het aantal openingen in het wieltje, tel het aantal flitsen per seconde en reken dat om naar toeren per minuut.
Moeilijkheid: Zodra onze Arduino een HIGH-signaal heeft gekregen moet hij even wachten met tellen tot hij weer een LOW-signaal krijgt. Daarom gebruiken we hier een boolean 'sensorstop'. Zodra een HIGH-signaal gemeten wordt blokkeert die de telling tot de Arduino weer een LOW-signaal krijgt.
We meten telkens 1 seconde. Van startT tot stopT. Na 1000 millis (1 seconde) wordt de meting doorgestuurd naar de Serial Monitor en begint er een nieuwe meting.
Het aantal flitsen per seconde omrekenen. We hebben 20 gaatjes in een wiel, dus 20 flitsen = 1 rotatie. Er zijn 60 seconden in een minuut. Stel dat ons wiel één maal rondgaat op 1 seconde, dan zijn dat 20 flitsen per seconde. Na 1 minuut zijn er zo 60 rotaties afgelegd. We mogen het aantal flitsen per seconde dus gewoon x3 doen om het aantal rotaties per minuut (RPM) te weten.
Wat meer uitleg
Op de Brainbox Arduino zit een H-bridge ingebouwd. Daardoor moet je geen aparte motor-driver gebruiken. Toch moet je wel zien dat je de Arduino niet te zwaar belast.
De schakeling: Er zijn meerdere opties mogelijk.
1) Indien je de motor enkel in één richting wil gebruiken dan kan je voor elke motor één draad naar een PWM-pin laten lopen en één draad naar GND.
2) Indien je de motor in beide richtingen wil kunnen laten draaien, dan verbind je de twee draden van de motor telkens met een PWM-pin (5,6,9 of 10).
Hier zie je de H-bridge van de Brainbox
Optie 1: wanneer je de motoren enkel in één richting wil gebruiken.
Optie 2: wanneer je de motoren in beide richtingen wil gebruiken.
Vergeet de jumper niet te versteken naar de gebruikte bron.
Aansluitpunten voor externe voeding:
Door functies te gebruiken maak je het programmeren van je robot veel eenvoudiger.
De code: Je kan in je code zowel digitalWrite (aan of uit) als analogWrite (snelheid aanpassen) gebruiken.
Hieronder vind je een voorbeeld om je motoren te testen met een potmeter.
Je kan je motor in elke richting doseren door gebruik te maken van analogWrite. Let wel op dat je dan de andere PWM-pin van die motor op 0 zet.
Je zal merken dat je motor al een zekere spanning nodig heeft voor die begint te draaien. Vaak zal je al rond de 100 zitten voor je motor in beweging komt.
Je kan in Arduino net als in Processing functies maken. Dat maakt het programmeren van je robot meteen een pak eenvoudiger.
Omdat we voorlopig niet met onze robots kunnen werken gaan we toch proberen om onze functies al voor te bereiden. We hebben het daar in de klas al even over gehad. Normaal zou elk team nu wel klaar moeten zijn met de functies die ervoor zorgen dat je je robot kan besturen op basis van de tijd (met de delay-functie).
Je gaat nu ook proberen om functies te maken op basis van de sensor die de omwentelingen meet door de flitsen te tellen. Een eerste stap is een vereenvoudigde versie van wat we willen hebben:
Opdracht vereenvoudigde functie met optocoupler (flitsteller) voorbereiden:
Maak een schakeling met een Arduino, een drukknop, een groene led en een rode led.
Maak nu twee functies: vooruit() en achteruit()
In de functie vooruit brandt een groene lamp, in de functie achteruit brandt een rode lamp.
Maak nu de code zodat je je functie zo in void loop kan gebruiken:
void loop () {
vooruit (5);
achteruit (3);
}
Wanneer je de code gebruikt, dan brandt de groene led tot je 5 keer op de knop gedrukt hebt, daarna brandt de rode tot je 3 keer op de rode led gedrukt hebt.
Je maakt dit best eerst stap voor stap in Tinkercad, daarna pas op je Arduino.
Er bestaan nogal wat types stepper-motors, we beginnen hier met de stepper-motor die je in de Arduino-box vindt, de 28BYJ-48. Deze 5V motor wordt aangestuurd door een stepper-motor driver, bij ons is dat de ULN2003. Het verschil tussen een stepper-motor en een gewone DC-motor bestaat erin dat een stepper motor erg nauwkeurig bestuurd kan worden en met hele kleine stapjes kan bewegen als dat nodig is. Het is dan ook een motor die bijvoorbeeld gebruikt wordt in een 3D-printer waar hij de printkop aanstuurt die een heel precies traject moet afleggen. Doorgaans zijn het ook erg krachtige motoren.
Binnenin deze motor bevindt zich een mechanisme van tandwielen dat de snelheid vertraagt en de kracht verhoogt.
De aandrijving van de motor gebeurt door 4 geleidende spoelen die door elektrische spanning magnetisch worden. Elke keer de volgende spoel magnetisch wordt door de stroom die er doorheen stroomt, verplaatst de motor zich met één stap. De 5 draden die naar de driver lopen zijn dan ook de draden die de verschillende spoelen aansturen. Op de driver staan ook vier leds, die oplichten wanneer er spanning naar de overeenkomende spoel stoomt.
Onze stappenmotor moet 64 stappen afleggen voor een volledige rotatie, maar door het tandwielsysteem wordt dat aantal nog eens gedeeld door 64. Zo moeten we dus uiteindelijk 64x64 (=4096) stappen afleggen om een volledige rotatie te maken.
Moest nauwkeurigheid erg belangrijk zijn, in de praktijk blijken de meeste tandwielkasten van deze motor 4076 stappen af te leggen voor een volledige omwenteling. Eventueel kan je dit dus aanpassen in je code.
Illustratie van een stepper motor van Wikipedia.
De schakeling:
Onze stepper-motor wordt aangestuurd door een ULN2003 stepper-motor driver. De voeding van de motor verloopt via de driver, maar de voeding van de driver mag niet van de Arduino komen. Dat zou deze te zwaar belasten. We schakelen de driver dus aan op batterijen of een adapter (tussen 5V en 12V) via de rode en de zwarte draad. De GND van onze voeding verbinden we ook met de GND van onze Arduino.
De vier draden van IN1 tot IN4 kunnen met gelijk welke digitale OUT pins verbonden worden. Wij kiezen hier voor pin 8 tot 11. De motor kan maar op één manier verbonden worden met de driver, via de witte connector met de vijf draden.
In de Arduino IDE vind je een library en enkele voorbeelden die je kan gebruiken bij de meeste stepper-motors. Die vind je bij Bestand > Voorbeelden > Stepper
In de illustratie boven zie je al dat beweging van de stepper-motor wordt aangestuurd door vier spoelen die door een korte stroomstoot magnetisch worden. Niet elke driver stuurt de spoelen op dezelfde manier aan, wat maakt dat de voorbeeldcode niet voor elke driver bruikbaar is.
We baseren onze voorbeeldcode daarom op de voorbeeldcode van Bas_on_tech. Daarvoor zal je ook even de AccelStepper library moeten installeren.
Wanneer je de stepper-motor met al zijn mogelijkheden wil gebruiken, dan is wat extra infromatie zeker handig.
Hieronder vind je alvast twee plekken waar je wat meer uitleg kan krijgen over deze motor.
Bij Makerguides vind je nog wat extra voorbeeldcode die je wat meer mogelijkheden geven.
Hiernaast zie je een veel eenvoudiger voorbeeld waarbij je de steppermotor met een vaste snelheid laat draaien.
Je hoeft hier enkel de parameter na setSpeed aan te passen om de snelheid te veranderen.