HOOFDSTUK 3 Motor programmeren De chip van de Arduino UNO

advertisement
HOOFDSTUK 3
Motor programmeren
De chip van de Arduino UNO kan signalen onderzoeken, de gegevens verwerken en moet
daarna opdrachten geven om de robot dat te laten doen wat we willen.
Maar als we een draaistroommotor willen laten draaien, dan vraagt dat een te grote
stroom. De UNO kan die niet leveren. We moeten een versterker hebben.
Ook willen we soms, dat de motor twee richtingen op kan draaien. Dan moeten we de
'draadjes' omdraaien. Eigenlijk: de spanning omdraaien.
Een chip, de LM293D, een H-brug ons daarbij. Er kunnen twee draaistroommotors worden
bediend. We gebruiken de Arduino om ' de draadjes om te draaien'.
Hieronder is een tekening van die chip.
Aan een kant zit op de bovenkant een uitgespaard rondje, de aansluitingen zijn
genummerd 1 tot 16.
Aansluitingen 1 tot 7 zijn voor de ene motor, 9 tot 15 voor de andere.
Vs is de energiespanning, VSS vraagt 5 volt, de logica-spanning, die kan worden afgetakt
van de Arduino UNO. Sluit VS (punt 8) aan met een oranje draadje. Betekent: wees hier
voorzichtig mee, want de poorten van de UNO kunnen niet tegen een hogere spanning
dan 5 Volt.
GND is dus weer de aarde, zwart draadje. Ook in deze chip wordt energie verbruikt. Via de
vier GND-aansluitingen wordt de chip gekoeld. Ze zijn inwendig met elkaar
doorverbonden. De ene motor wordt aangesloten op Output 1 en 2, de andere op Output 3
en 4.
19-01-2016
Hst 3 – 1
HOOFDSTUK 3
Hieronder staat een waarheidstabel, waarin wordt aangegeven hoe het werkt. Ena,
Enable zet de H-brug in werking. Als Input 1 gelijk 0 is en Input 2 ook 0, dan stopt de
motor. Als een van beide 1 is, dus van de Arduino HIGH krijgt, dan draait de motor. En zo
verder, zoals in de waarheidstabel is te zien.
Ena 1 (of 2)
Input 1 (of 3)
Input 2( of 4)
motor
1
0
0
stopt
1
0
1
draait rechtsom
1
1
0
draait linksom
1
1
1
stopt
0
stopt
0 is dus LOW, 1 is HIGH. Als de draadjes omgedraaid zijn, dan moet in de tabel Links- en
Rechtsom worden verwisseld . Helemaal niet erg. Corrigeren doen we in het programma.
De snelheid moeten we nu nog regelen. Dat gaat met PWM. Als de hele tijd spanning op
de motor staat, dan draait de motor op maximale snelheid. Met PWM kun je voor telkens
een korte periode de spanning uitschakelen. Er ontstaat een spanningspuls. Dan krijgt de
motor minder energie en zal daardoor langzamer draaien.
PWM staat voor Pulse Width Modulation, puls-breedte modulatie. De breedte van de puls
kun je variëren in 256 stappen van 0 tot 255. Daarmee bereik je 256 verschillende
snelheden. Dat kan met een aantal aansluitingenpoorten van de Arduino UNO. Met een ~
bij de poort wordt aangegeven of met welke.
Jammer genoeg is er geen voorbeeld in de Arduino-serie beschikbaar. Daarom wordt
hieronder het benodigde deel van de sketch gegeven.
Eerst weer de aansluitingen op de Arduino aanwijzen. Doe dat in het eerste blok van de
sketch.
//Voor motor 1:
const int enableM1 = 5; // PWM voor motor 1.
const int input1M1 = 9;
const int input2M1 = 10;
//En voor Motor 2:
const int enableM2;
// PWM voor motor 2, de linker.
const int input1M2 = 11;
const int input2M2 =12;
Let op! Verwar input en output niet. Bij de Arduino worden de motors aangestuurd door de
aansluiting als OUTPUT te definiëren. Voor de LM293D worden dat INPUT's. Dus UIT de
Arduino en IN de LM293D-chip. Kies verschillende kleuren draad bij het aansluiten.
19-01-2016
Hst 3 – 2
HOOFDSTUK 3
Voor de duidelijkheid hier nog eens de aansluitingen:
Motor 1, M1
Motor 2, M2
LM293D
Arduino-poort
LM293D
Arduino-poort
EnableM1: 1
5
EnableM2: 9
11
Input1M1: 2
9
Input1M2: 10
12
Input2M1: 7
10
Input2M2: 15
13
Het tweede blok, void setup() moet worden aangevuld met:
pinMode(enableM1,OUTPUT); // voor de eerste motor.
pinMode (input1M1, OUTPUT);
pinMode(input2M1, OUTPUT);
pinMode(enableM2,OUTPUT);
pinMode(input1M2,OUTPUT);
pinMode(input2M2,OUTPUT); // M2 voor de tweede motor.
Motor1 sluiten we aan op de LM293D-punten 3 en 6, motor 2 op 11 en 14.
Zo, er is veel voorbereid en nu kunnen we uitzoeken hoe snel de motors moeten draaien.
cm1 en cm2 zijn de uitkomsten van de sensors (uit Hoofdstuk 2). Ik heb sensor 1 rechts
opgesteld en sensor 2 links.
Is de afstand cm1 groter dan 10 (cm), dan is er rechts geen probleem. Als ook cm2 groter
is dan 10 cm, dan links ook niet. De robot kan dan versnellen of met volle snelheid verder.
Versnellen doen we door telkens 3 op te tellen bij de snelheid. In C++:
snelheid = (snelheid +=3). Het = – teken moet je hierbij lezen als ' wordt'.
Om de snelheid uit te rekenen en op te slaan in het geheugen reserveren we ruimte door
in het eerste deel van de sketch op te nemen:
long snelheidrechts;
long snelheidlinks;
We maken gebruik van de volgende regels:
> betekent 'groter dan'
< betekent ' kleiner dan'
&& wil zeggen EN, zowel cm 1 als cm 2 moeten groter dan 10 zijn.
Soms kunnen de motors sneller gaan tot 255. En de minimale snelheid is 0. Dat regelen
we met constrain(snelheid,0,255).
if ((cm1 > 10) && (cm2 > 10)) {
snelheidrechts = constrain((snelheidrechts +=3),0,255);
snelheidlinks = constrain((snelheidlinks +=3),0,255);
}
Als ergens verderop de afstand rechts kleiner wordt dan 10 cm, dan moet er worden
bijgestuurd:
19-01-2016
Hst 3 – 3
HOOFDSTUK 3
if ((cm1 =< 10 && (cm2 > 10)){ // robot dreigt te veel naar rechts te gaan.
// dan moet het linkerwiel wat langzamer draaien
// want dan gaat de robot meer naar links.
snelheidrechts = constrain((snelheidrechts +=3),0,255);
snelheidlinks = constrain((snelheidlinks -=3),0,255);
}
We laten de linker snelheid afnemen met drie. Dat is niet zo veel, maar na het doorlopen
van de volgende keer van de lus wordt deze correctie zo nodig nog een keer gemaakt,
enzovoort.
if ((cm1 > 10) && (cm2 < 10)){ // robot te veel naar links
snelheidrechts = constrain((snelheidrechts -=3),0,255);
snelheidlinks = constrain((snelheidlinks +=3),0,255);
En, als je daarvoor kiest, als beide sensors dichtbij een obstakel zien, dan stoppen:
if ((cm1 < 10) && (cm2 < 10)){ // alle twee sensors meten dichterbij 10 cm.
snelheidrechts = 0;
snelheidlinks = 0;
}
Nu moeten we alleen nog de motors activeren met deze snelheden.
De motors laten rijden via de LM293D:
analogWrite(enableM1,snelheidrechts);
digitalWrite(input1M1, HIGH);
// zonodig aansluitdraadjes verwisselen
digitalWrite(input2M1,LOW);
analogWrite(enableM2,snelheidlinks);
digitalWrite(input1M2, LOW);
digitalWrite(input2M2,HIGH);
}
// hier ook, als de motor de verkeerde kant draait.
// En dit is de afsluitende accolade van de hele sketch!
In de bijlage 3 staat de hele sketch nog een keer. Maar je hebt dat eigenlijk niet meer
nodig, je maakte die sketch zelf al!
EN DAT IS HET DAN VOOR DEZE 'WINTER WORKSHOP ROBOTBOUW CCFZ 2015
In hoofdstuk 4 staat nog een aantal veranderingen die je ook nog kunt maken. Maar dat
lukt waarschijnlijk niet in deze drie halve dagen. Wil je hiervoor ook hulp, kom dan een
keertje naar de maandbijeenkomst CCFZ, telkens de tweede zaterdag van de maand.
Wordt je geholpen. Kijk op www.robotics-ccfz.nl en op www.ccfz.nl.
19-01-2016
Hst 3 – 4
Download