Pyörillä ajeleva robotti

Johdanto

Liikkuvia robotteja voi tehdä monella tekniikalla, mutta tietenkin kaiken liikkeen tuottamiseen tarvitaan moottoreita.

Arduinolla voi ohjata kaikkia tavallisia sähkömoottoreita: solenoideja, servoja, stepper-moottoreita, värinämoottoreita sekä DC-moottoreita. Tavallisin pyörivä moottori on DC eli Direct Current -moottori. Tässä harjoituksessa voit käyttää liikkuvan robotin rakentamiseen joko Maker kitistäsi löytyviä mustia vaihteistettuja DC-moottoreita tai sinisiä pyöriviä servomoottoreita.

Ensin rakennetaan pyörillä liikkuva menopeli, joka huristelee automaattisesti ympäriinsä. Seuraaavassa harjoituksessa ohjelmoidaan laitteeseen hieman tolkkua, eli lisätään anturi, jonka avulla robotti voi aistia ympäristöään.

Tarvikkeet

Mehackit boardin (tai Arduinon), USB-johdon, koekytkentälevyn ja johtimien lisäksi tarvitset seuraavat komponentit.

OsaKuvaKuvaus
2 x Vaihdemoottori tai 2 x Pyörivä servomoottoriMaker kitissäsi on joko kaksi mustaa vaihteistettua moottoria tai kaksi sinistä pyörivää servomoottoria. Vaihdemoottorit ovat tavallisia DC-moottoreita, joissa on sisällä hammasrattailla toteutettu vaihteisto. Servomoottorin sisällä on moottorin ja vaihteiston lisäksi hieman ohjauselektroniikkaa.
Moottoriohjain L293D eli "h-silta" (engl. h bridge).Tarvitset tätä osaa, jos käytät mustia DC-moottoreita. Jos käytät servomoottoreita, et tarvitse moottoriohjainta. Ohjain on useista komponenteista koostuva mikropiiri. Se pystyy vahvistamaan Arduinolta tulevaa virtaa ja torjumaan moottoreiden tuottamia virtapiikkejä ja siten suojelemaan Arduinon portteja. Ja mikä tärkeintä, mikropiirillä voi muuttaa moottorin pyörimissuuntaa ja nopeutta.
9V-Paristo ja neppariliitin9V paristoa käytetään Arduinon virtalähteenä.
4 X AA paristo (6 V) ja liitinTätä käytetään moottoreiden ulkoisena virtalähteenä. Jos sinulla ei ole liitintä tai paristoa, voit hyvin käyttää moottoreita lyhyen aikaa myös Arduinon kanssa samalla 9V virtalähteellä!
Maker kitistä löytyvän autonrakennussarjan osat.Maker kitin mukana tulee akryylilevyistä, valkoisista muoviprikoista, pulteista ja muttereista koostuva rakennussarja. Jos sinulla ei ole käsillä rakennussarjaa, voit improvisoida ja rakentaa kulkupelin vaikka pahvista tai leegoista!

Rungon kokoaminen

Maker kitin mukana tulee akryylilevyistä, valkoisista muoviprikoista, pulteista ja muttereista koostuva rakennussarja. Alta löytyvällä videolla on ohjeet tämän rakennussarjan kokoamiseksi.

Videolla rakennussarjaan liitetään kaksi sinistä servomoottoria. Jos sinulla on käytössäsi mustat vaihteistetut DC-moottorit, liitä kumpikin niistä akryylilevyihin kahdella pitkällä pultilla alla olevan kuvan mukaisesti. Muilta osin voit noudattaa videon ohjeita!

Mehackit Maker kit - The Robot Vehicle

Virtapiiri - DC-moottorit

Jos sinulla on käytössäsi mustat vaihteistetut DC-moottorit, rakenna virtapiiri tämän kohdan ohjeilla. Jos käytössäsi on siniset servomoottorit, voit siirtyä seuraavan kohdan kytkentäohjeisiin.

Tässä kytkennässä tarvitaan paljon johtoja ja jonkin verran kärsivällisyyttä. Edetään vaiheittain - kaikkea ei tarvitse ymmärtää vielä!

1. Mikropiirin kytkeminen jännitteeseen ja maahan

  • Tarkista, että L293D on oikein päin (kolo ylöspäin)
  • Kytke Arduinon 5V ja GND kytkentälevyyn
  • Kytke Arduinosta tuleva 5V jännite mikropiirin oikeaan yläpinniin
  • Jaa maadoitus kytkentälevyn oikeaan laitaan johdolla
  • Maadoita mikropiiri neljästä kohtaa

2. Moottoreiden kiinnitys

HUOM!
Kuvassa on kaksi tavallista DC-moottoria, kun taas tehtävässä käytetään mustia vaihdemoottoreita. Jos kurkistaisit mustan muovikuoren sisään, löytäisit sieltä kuitenkin kuvassa näkyvän harmaan DC-moottorin. Kuvittele siis, että kuvissa näkyvät harmaat moottorit ovat mustia vaihteistettuja DC-moottoreita.
  • Kytke moottorit molemmin puolin kuten kuvassa

3. Moottoreiden pääkytkimet

  • Kytke mikropiirin vasen ylänurkka ja oikea alanurkka Arduinosta tulevaan 5V jännitteeseen.
  • Nyt moottoreita ohjaava mikropiiri on toimintavalmiudessa. Moottoreiden virtalähde kytketään seuraavassa vaiheessa.

4. Ulkoinen virtalähde ja moottoreiden ohjauspinnit

  • Kytke 6V ulkoinen virtalähde mikropiirin vasempaan alanurkkaan ja Arduinon kanssa jaettuun maahan. Nyt moottorit käyttävät tätä jännitelähdettä ja saavat tarpeeksi virtaa. Ilman ulkoista jännitelähdettä moottorit toimivat todennäköisesti epäluotettavasti, koska ne eivät saa tarpeeksi virtaa.
  • Lisätietoja moottoreiden virtalähteen valinnasta löydät tämän harjoituksen lopusta.
  • Kytke mikropiirin molemmilta puolilta toiseksi ylin ja toiseksi alin pinni Arduinoon portteihin kuvan osoittamalla tavalla (portit 3, 9, 10 ja 11). Nämä pinnit ohjaavat moottorien pyörimissuuntaa ja -nopeutta.

Virtapiiri - Servomoottorit

Jos käytät sinisiä servomoottoreita, rakenna seuraava virtapiiri.

  • Yhdistä servomoottorit digitaaliseen porttiin, maahan sekä 6V ulkoiseen jännitteeseen. Käyttämällä ulkoista jännitettä Arduinon 5V-portin sijaan varmistat, että moottorit saavat tarpeeksi virtaa.
  • Lisätietoa moottoreiden virtalähteen valinnasta löydät harjoituksen lopusta.
  • Muista kytkeä ulkoinen virtalähde Arduinon kanssa yhteiseen maahan!

Ohjelmointi - DC-moottorit

Tällä sivulla annetaan ohjeita mustien DC-moottoreiden ohjelmointiin. Jos käytössäsi on siniset servomoottorit, voit siirtyä ohjeissa seuraavaan kohtaan.

Ohjelman tavoite

Robotti toistaa sattumanvaraisesti seuraavia toimintoja: käännös oikealle tai vasemmalle (1,5 sekunnin ajan), peruutus (1,5 sekuntia) tai ajo eteenpäin (4 sekuntia). Jos molemmat moottorit pyörivät eteenpäin tai taaksepäin, robotti kulkee suoraan. Käännöksissä vain toinen moottori pyörii. Ohjelma tehdään tutuilla komennoilla.

Tutut komennot:

  • pinMode(portti, asetus)
  • If/else
  • int-muuttujan luominen
  • random(min, max): Arpoo sattumanvaraisesti luvun kahden arvon väliltä. Tämän luvun voi tallentaa esimerkiksi muuttujaan tulevaa käyttöä varten.
  • analogWrite(portti, arvo): Tällä komennolla voidaan syöttää arvo 0-255 digitaalisiin portteihin, jotka on merkattu symbolilla ~ . Arvo 255 vastaa digitalWrite-käskyllä annettua arvoa HIGH ja arvo 0 vastaavasti arvoa LOW. Arvot näiden väliltä vaikuttavat esimerkiksi lediin sitä himmentävästi.
Tehtävä
Seuraa ohjeita ja rakenna tarvittava ohjelma pala kerrallaan!

1. Moottoripinnien määrittelyt

Olet nyt kytkenyt neljä mikropiirin pinniä neljään Arduinon porttiin (3, 9, 10 ja 11). Voit ohjata moottoreiden nopeutta ja pyörimissuuntaa näiden neljän Arduino-portin kautta!

Määrittele ensin, mitkä Arduino-portit on kytketty mikropiirin pinneihin. Tee tämä neljän kokonaislukumuuttujan avulla ohjelman ylälaidassa.

// moottorin kontrollointipinnit ja niitä vastaavat Arduino-portit:
int oikeaMot1 = 3; //Oikean moottorin pyörimisnopeus eteenpäin
int oikeaMot2 = 9; //Oikean moottorin pyörimisnopeus taaksepäin
int vasenMot1 = 11; //Vasemman moottorin pyörimisnopeus eteenpäin
int vasenMot2 = 10; //Vasemman moottorin pyörimisnopeus taaksepäin

Määrittele sitten kaksi muuttujaa, joiden avulla moottorien toimintaa ohjaillaan.

int nopeus = 100;   // moottoreiden pyörimisnopeus
int toiminto = 1;   // muuttuja saa arvoja välillä 1-4.
					// robotilla on siis neljä eri toimintoa.

Määrittele Setup-osassa Arduino-portit ulostuloiksi:

void setup(){     
  pinMode(oikeaMot1, OUTPUT); 
  pinMode(oikeaMot2, OUTPUT);
  pinMode(vasenMot1, OUTPUT);
  pinMode(vasenMot2, OUTPUT);
}

Seuraavaksi päästään ohjelmoimaan moottoreiden toimintaa.

2. Moottorit pyörimään

Loop-osassa arvotaan, minkä toiminnon robotti tekee seuraavaksi. Vaihtoehdot ovat:

  • Toiminto 1: kulku eteenpäin
  • Toiminto 2: kulku taaksepäin
  • Toiminto 3: käännös vasempaan
  • Toiminto 4: käännös oikeaan
void loop() {
  toiminto = (random(1,5)); // arvotaan luku välillä 1-4 
  // Huom: random-funktio ei ota mukaan ylärajaa eli lukua 5!
  delay(1000);
  // Tähän kirjoitetaan seuraavaksi robotin eri toiminnot
}

Muuttujalle toiminto arvotaan yksi arvo neljästä, ja jokainen arvo tarkoittaa eri toimintoa. Kopioi alla olevat toiminnot loop-osan loppuun jotta ne käydään läpi osana ohjelmaa.

if (toiminto == 1) { 				// Eteenpäin
    analogWrite(oikeaMot1, nopeus);	// oikea moottori pyörii eteenpäin
    analogWrite(oikeaMot2, 0);  	// oikean moottorin nopeus taaksepäin on 0
    analogWrite(vasenMot1, nopeus); // pyörii eteenpäin nopeudella "nopeus"
    analogWrite(vasenMot2, 0);      // vasen moottori pyörii eteenpäin
    delay(4000);   					// robotti kulkee eteenpäin 4 sekuntia
  }

if (toiminto == 2) { 				// Taaksepäin
    analogWrite(oikeaMot1, 0);      // oikean moottorin nopeus eteenpäin on 0
    analogWrite(oikeaMot2, nopeus); // oikea moottori pyörii taaksepäin
    analogWrite(vasenMot1, 0);   	// vasemman moottorin nopeus eteenpäin on 0
    analogWrite(vasenMot2, nopeus); // vasen moottori pyörii taaksepäin
    delay(1500);      				// robotti kulkee taaksepäin 1,5 sekuntia
  }

if (toiminto == 3) { 				// Käännös vasemmalle
    analogWrite(oikeaMot1, nopeus); // oikean moottori pyörii eteenpäin
    analogWrite(oikeaMot2, 0);      // oikean moottorin nopeus taaksepäin on 0
    analogWrite(vasenMot1, 0); 		// vasemman moottorin nopeus eteenpäin on 0
    analogWrite(vasenMot2, 0);      // vasemman moottorin nopeus taaksepäin on 0
    delay(1500);       				// käännös kestää 1,5 sekuntia
  }

if (toiminto == 4) {   				// Käännös oikealle
    analogWrite(oikeaMot1, nopeus); // oikea moottori pyörii eteenpäin 
    analogWrite(oikeaMot2, 0);      // oikean moottorin nopeus taaksepäin on 0
    analogWrite(vasenMot1, 0);      // vasemman moottorin nopeus taaksepäin on 0
    analogWrite(vasenMot2, 0);      // vasemman moottorin nopeus taaksepäin on 0
    delay(1500);      				// käännös kestää 1,5 sekuntia
}
Tehtävä
Syötä ohjelma Arduinolle ja testaa sitä! Muuta halutessasi toimintojen kestoa.
Tehtävä
Sen sijaan että robotti arpoisi satunnaisia toimintoja, koita ohjelmoida sille valmis reitti. Koita saada robotti esimerkiksi kiertämään pöytäsi ja palaamaan lähtöpisteeseen!

Tätä robottia voi hyvin käyttää pohjana loppuprojektiin: sen voi naamioida, siihen voi lisätä osia aina lattialuutusta siveltimeen ja katapulttiin, sitä voi ohjata erilaisten antureiden avulla, sille voi ohjelmoida erilaisia reittejä…

Jos sinulla on haasteita robotin ohjelmoinnin tai muun toiminnan kanssa, siirry ohjeissa eteenpäin kohtaan Haasteita robotin kanssa?

Ohjelmointi - Servomoottorit

Ohjelman tavoite

Robotti toistaa sattumanvaraisesti seuraavia toimintoja: käännös oikealle tai vasemmalle (1,5 sekunnin ajan), peruutus (1,5 sekuntia) tai ajo eteenpäin (4 sekuntia). Jos molemmat moottorit pyörivät eteenpäin tai taaksepäin, robotti kulkee suoraan. Käännöksissä vain toinen moottori pyörii.

Kaikki käytettävät komennot ovat sinulle tuttuja, jos käytit kääntyvää servomoottoria jo kolmannessa luvussa. Jos et, opit lisää tässä harjoituksessa.

Tutut komennot

Uudet komennot

Tehtävä
Seuraa ohjeita ja rakenna ohjelma pala kerrallaan!

1. Moottoripinnien määrittelyt

  • Lisää mukaan Servo-kirjasto.
  • Luo Servo-objektit servo1 ja servo2.
  • Määrittele setup-osassa, mihin portteihin servot on kytketty.
#include <Servo.h>

Servo servo1;
Servo servo2;

void setup() {
  servo1.attach(3);
  servo2.attach(11);
}

Servomoottoreita ohjataan servo.write-komennolla. Servoille annettavan arvon tulee olla välillä 0-180, esim. servo1.write(150). Logiikka on seuraavanlainen:

  • Arvo 0: Servo pyörii täydellä vauhdilla
  • Arvo 90: Servo on pysähtynyt
  • Arvo 180: Servo pyörii täydellä vauhdilla toiseen suuntaan

Tässä harjoituksessa käyetään servojen ohjaamiseen arvoja 150 ja 30. Ne ovat periaatteessa sama nopeus, mutta vastakkaisiin suuntiin.

Asiaa mutkistaa hieman se, että moottorit ovat autossa väistämättä eri päin. Kun annat toiselle moottorille käskyn 150, tulee sinun antaa toiselle moottorille käsky 30, jotta ne pyörisivät samaan suuntaan. Mutta älä huoli - löydät sopivat pyörimissuunnat ja nopeudet kokeilemalla.

int nopeus1 = 150;  // moottoreiden pyörimisnopeus
int nopeus2 = 30;   // moottoreiden pyörimisnopeus toiseen suuntaan
int toiminto = 1;   // muuttuja saa arvoja välillä 1-4: robotilla on neljä eri toimintoa.

2. Moottorit pyörimään

Loop-osassa arvotaan, minkä toiminnon robotti tekee seuraavaksi. Vaihtoehdot ovat:

  • Toiminto 1: kulku eteenpäin
  • Toiminto 2: kulku taaksepäin
  • Toiminto 3: käännös vasempaan
  • Toiminto 4: käännös oikeaan
void loop() {
  toiminto = (random(1,5)); // arvotaan luku välillä 1-4 
  // Huom: random-funktio ei ota mukaan ylärajaa eli lukua 5!
  delay(1000);
  // Tähän kirjoitetaan seuraavaksi robotin eri toiminnot
}

Muuttujalle toiminto arvotaan yksi arvo neljästä, ja jokainen arvo tarkoittaa eri toimintoa. Kopioi alla olevat toiminnot loop-osan loppuun, jotta ne käydään läpi osana ohjelmaa.

if (toiminto == 1) {         //Eteenpäin
    servo1.write(nopeus1); 
    servo2.write(nopeus2);  
    delay(4000);
  }

if (toiminto == 2) {         //Taaksepäin
    servo1.write(nopeus2);
    servo2.write(nopeus1);  
    delay(4000);
  }
if (toiminto == 3) {  		 //Käännös vasemmalle
    servo1.write(nopeus1); 
    servo2.write(nopeus1); 
    delay(1500);             
  }

if (toiminto == 4) { 		 //Käännös oikealle
    servo1.write(nopeus2); 
    servo2.write(nopeus2); 
    delay(1500);             
}
Tehtävä
Syötä ohjelma Arduinolle ja testaa sitä! Muuta halutessasi toimintojen kestoa.
Tehtävä
Sen sijaan että robotti arpoisi satunnaisia toimintoja, koita ohjelmoida sille valmis reitti. Koita saada robotti esimerkiksi kiertämään pöytäsi ja palaamaan lähtöpisteeseen!

Haasteita robotin kanssa?

Robotin pyörät luistavat alustalla

Lisää kitkaa laittamalla pyörien ympärille esimerkiksi ilmastointiteippiä tai sinitarraa.

Robotti ajaa 1,5 sekuntia eteenpäin (tai taaksepäin) ja pyörii 4 sekuntia

Tällöin robotti toimii juuri päinvastoin kuin on tarkoitus. Muokkaa moottoreiden ohjauskomentoja eri toimintojen alla. Aloita toiminnosta 1. Kun se on kunnossa, siirry toimintoon 2…

Moottori tai moottorit eivät pyöri missään tilanteessa

Jos käytät servomoottoreita, käy kytkentä huolellisesti läpi. Jos käytät vaihteistettuja DC-moottoreita, kokeile seuraavia asioita.

  • Tarkista, että h-bridge on kytketty oikein päin (puolipallon muotoinen kolo samaan suuntaan kuin kaaviossa)
  • Tarkista kytkentäkaaviosta, että johdot on varmasti kytketty oikein.
  • Irroita h-bridge ja laita se takaisin.
  • Irroita johdot toimimattoman moottorin puolelta h-bridgeä ja kytke ne takaisin
  • Vihoviimeinen vaihtoehto: irrota kaikki komponentit kytkentäalustalta, siirrä h-bridge eri kohtaan alustaa ja kytke johdot uudelleen

Moottoreiden virtalähteistä

Kaikki elektroniset komponentit tarvitsevat sopivan käyttöjännitteen ja sopivan sähkövirran toimiakseen luotettavasti. Monilla Arduinon kanssa käytettävillä komponenteilla käyttöjännite on joko 5 V tai 3.3 V, ja näitä jännitteitä voikin turvallisesti johtaa Arduinon porteista. Virta ei yleensä muodostu ongelmaksi, koska 5 V-portistakin sitä saa jaettua riittävästi.

Miksi sähkömoottoreiden kanssa sitten ohjattiin käyttämään ulkoista virtalähdettä? Tutustutaanpa hieman moottoreiden vaatimuksiin. Sekä vaihteistettu DC-moottori että pyörivä servo-moottori vaativat toimiakseen seuraavalaisen jännitteen ja sähkövirran.

Jännite: 4.8V-6V Sähkövirta: 100-800mA

Sähkövirran suuri vaihtelu (100-800 mA) johtuu siitä, että vapaana pyöriessään moottori käyttää huomattavasti vähemmän virtaa kuin silloin, jos pyörimisessä on kitkaa esimerkiksi maata vasten.

Mitä jännitteestä ja virrasta voi sitten päätellä? Arduinon 5V portti sopisi kahdenkin moottorin ohjaamiseen jännitteen puolesta. Se ei kuitenkaan pysty tarjoamaan tarpeeksi virtaa kahdelle sähkömoottorille: jo yksi moottori voi käyttää yli 500mA virtaa, joten kahdella moottorilla lukema voi olla jopa yli 1000 mA. Esimerkiksi tässä Adafruitin tutoriaalissa on laskettu, että Arduino ei pysty jatkuvasti tarjoamaan yli 500 mA virtaa.

Hyvä ulkoinen virtalähde on neljästä 1.5V paristosta koostettu 6V paketti. Tällöin jännite on sopiva, ja sähkövirtaa on riittävästi. Huomaa, että ulkoinen virtalähde on tällöin varattu pelkästään servo-moottoreille. Arduino saa virtansa eri lähteestä, esimerkiksi USB-johdon kautta tai 9V-paristosta.

Toinen vaihtoehto olisi kytkeä Arduino 9V-paristoon, ja käyttää moottoreiden virtalähteenä Arduinon Vin-porttia. 5V-portista saatu jännite on aina tasan 5V, koska Arduino laskee sen tälle tasolle jänniteregulaattorin avulla. Vin-portista saatu jännite on kuitenkin sääntelemätön: se on periaatteessa sama kuin jännite, johon Arduino on kytketty. Jos Arduinoa käytetään 9V paristolla, saadaan Vin-portista lähellä 9 V oleva jännite. Jännite on aina hieman alhaisempi, koska se tulee esimerkiksi Arduinon sisäisen diodin läpi.

Tämä kytkentä on kuitenkin ongelmallinen, koska moottoreita ei tulisi käyttää yli 6V jännitteellä. Moottorit voivat toimia luotettavasti jonkin aikaa, mutta pidemmässä käytössä ne voivat mennä rikki. Siksi sopiva ulkoinen jännitelähde on paras vaihtoehto moottoreita käytettäessä.

Lisätietoja:

https://learn.adafruit.com/ladyadas-learn-arduino-lesson-number-0/power-jack-and-supply

http://rcarduino.blogspot.com/2012/04/servo-problems-with-arduino-part-1.html

https://electronics.stackexchange.com/questions/67201/maximum-current-draw-on-vin-pin

Lisätietoa

H-bridge
H-Bridge L293D on erityisesti moottorien ohjaamiseen tarkoitettu IC (integrated circuit, mikropiiri), joka koostuu useista eri komponenteista. H-Bridge vahvistaa Arduinolta tulevaa virtaa ja torjuu moottoreiden tuottamia virtapiikkejä ja suojelee siten Arduinon portteja. Ja mikä tärkeintä, mikropiirillä voi muuttaa moottorin pyörimissuuntaa ja nopeutta
Funktiot
Halutessasi voit kirjoittaa robotin toiminnot myös funktioiksi. Tämä tekee koodista siistimpää: loop-osasta on helpompi päätellä, mikä ohjelman logiikka on, ja funktioista käyvät ilmi robotin eri liikkeet.