9. Servomoottorin ohjaus

Julkaistu: sunnuntai 12.2.2017

Tässä osassa käytetään Prenta Oy:n Arduino elektroniikkasetistä löytyvää 5 voltin miniservoa. Kyseinen mikroservo on merkiltään Tower Pro SG90 ja painaa huikeat 9 grammaa. Kyseisiä servoja löytyy muiltakin myyjiltä ja netistä näitä voi ostaa erillisinä muistakin kaupoista. Toki nettikaupoista löytyy paljon muitakin servoja joita voi käyttää.

Servon datasivut.

SG90 mikroservo

Ohjattava servo on näppärä pieni moottori erilaisiin (vaikkapa ahtaisiinkin) paikkoihin ja moottorin pakkaus sisältää myös erilaisia vääntövarsia. Moottorin akseli pyörii 180 astetta (90 astetta suuntaansa) ja tämän pikkuruisen voimanpesän vääntömomentti on 1,8 kg/cm. Toisin sanottuna moottori jaksaa nostaa 1,8 kg:n painoisen punnuksen 1 cm:n vipuvarrella.

Kuinka servomoottori toimii?

Servomoottoria ohjataan PWM-ohjauksella ja ohjauksesta riippuen servomoottori kääntää akseliaan tiettyyn suuntaan. Servomoottoria käytetään esimerkiksi radio-ohjattavissa autoissa, lennokeissa, veneissä yms. Kun moottori tekee työtä, eli se pitää jotakin paikallaan, vetää tai nostaa jotakin, se ottaa virtalähteestä jonkun verran virtaa. Pienet moottorit ottavat enimmillään muutamia satoja milliampeereita ja jykevämmät servomoottori jopa useita ampeereita.

Servomoottorin 0-kohta, eli keskikohta tälläisella 180 astetta kääntyvällä moottorilla saadaan silloin, kun PWM-ohjauksessa pulssin pituus on 1,5 millisekuntia. Kun pulssin pituus on 1 millisekunti, niin moottorin akseli kääntyy vasemmalle. Vastaavasti 2 millisekunnin pulssi kääntää akselia oikealle. (Suunnat tietenkin riippuvat mistä päin moottoria tarkastelee). Tämä ohjausmenetelmä on yleensä vakio ja mitä tahansa servoa voidaan tällä periaatteella ohjata. Mikäli moottori ei tottele, kannattaa tarkistaa että se saa tarpeeksi virtaa kääntyäkseen ja että kyseessä ei ole mikään erikoismoottori (eli tarkistaa servon datasivut).

Esimerkiksi tässä osassa käytetyn servomoottorin datasivuilta löytyy ohjauksesta alla oleva tieto:

Servomoottorin PWM ohjaus

Kyseisestä kuvasta ilmenee myös moottorin kytkentäkaavio johtimille, eli punainen on  5:n voltin käyttöjännite, ruskea kytketään maahan ja keltainen kytketään Arduinon PWM-pinniin.

Datasivuista käy myös ilmi servomoottorin toimintanopeus. Se on ilmaistuna kohdassa "Operating Speed" ja arvona on 0,1s / 60 degree, eli 0,1 sekuntia 60 astetta kohden. Jos moottorin halutaan kääntyvän 180 astetta, niin siihen moottori tarvitsee aikaa 180 / 60 * 0,1 = 0,3 sekuntia.

Servomoottorin valmistelu ja kytkeminen Arduinoon

Ennen moottorin kytkemistä kiinnitetään moottoriin yksi mukana tulleista muovisista varsista. Käytä kiinnitykseen lyhintä ruuvia, mutta älä kiristä ruuvia liian tiukkaan, sillä varressa ja muovisessa akselissa on hammastukset, jotka pitävät vartta mukana pyörityksessä. Ruuvin tehtävänä on vain pitää varsi paikallaan, ettei se tipu mihinkään.

Varsien valinta ja kiinnitys

Moottori on nyt valmis kytkettäväksi Arduinoon. Alla fritzing-periaatekuva kytkennästä sekä kytkentäkaavio:

Servomoottorin kytkentä

Servomoottorin kytkentä

Arduino servomoottorin ohjauskoodi

Kytkentöjen tekemisen jälkeen koodi voidaan kirjoittaa. Alla oleva esimerkki kääntelee moottoria edestakaisin ensin nopeasti ja sitten funktion avulla hitaammin. Ohjelma on erittäin yksinkertainen ja todennäköisesti selittää itse itseään, varsinkin jos olet tätä opasta tänne asti seurannut. Niille jotka eivät ole seuranneet, niin lyhyt selitys toiminnasta löytyy koodin jälkeen.


#include <Servo.h>

// Luodaan servo
Servo munServo;

void setup() 
{
  // Kiinnitetään servoon pinni numero 11
  munServo.attach(11);
}

void loop() 
{
    delay(1000);
    // käännetään nopeasti toiseen laitaan...
    munServo.write(0); // käännetään 0-asteeseen...
    delay(1000);
    // ... ja käännetään nopeasti takaisin toiseen laitaan...
    munServo.write(180); // käännetään 180 asteeseen...
    delay(1000);
    // ...ja käännetään nyt hitaasti edestakaisin
    kaannaServoaHitaastiEdestakaisin(20);
}

void kaannaServoaHitaastiEdestakaisin(int nopeus)
{
  int sijainti = 180;
  // Käännetään ensin hitaasti toiseen suuntaan...
  while(sijainti > 0)
  {
    munServo.write(sijainti);
    sijainti--;
    delay(nopeus);  // delayn arvo määrittää nopeuden, kokeile muuttaa tätä!
  }
  // ... ja sitten hitaasti takaisin...
  while(sijainti < 180)
  {
    munServo.write(sijainti);
    sijainti++;
    delay(nopeus);
  }
}

Koodin selitys:

Ylläoleva koodi alustaa Servo-kirjaston avulla PWM-ohjauksen pinnin numeron 11 moottorin ohjaukselle. Tämä tapahtuu kohdassa:

munServo.attach(11);

Loop-lohkon sisällä on pääohjelma, joka suorittaa kunkin koodirivin yhden kerran ja kun kaikki rivit on suoritettu, niin toiminta alkaa jälleen loop-lohkon alusta toistaen äsken tehtyä:

void loop() 
{ 
   ...

Aluksi loopissa odotetaan 1000 millisekuntia eli yksi sekunti. Tämän jälkeen Servo-kirjaston write-funktiolle kerrotaan, että moottori tulisi kääntää toiseen laitaan (0-astetta). Tämän jälkeen odotellaan taas sekunti, jotta moottori kerkeää kääntymään käskettyyn asentoon ja annetaan kääntymiskäsky jälleen toiseen suuntaan (180-astetta).

Viimeisimmän sekunnin viiveen jälkeen käytetään kaannaServoaHitaastiEdestakaisin(20); -funktiota, mikä hoitaa servon kääntämisen hitaammin edestakaisin. Funktiolle annettu parametri nopeus välitetään delay-funktiolle, joka hidastaa moottorin kääntymistä. Voit kokeilla tässä erilaisia arvoja ja tarkastella mitä tapahtuu.

Muiden servojen käyttäminen

Mikäli haluat käyttää Arduinon ohjauksessa muita servomoottoreita, varmista mikä on näiden moottoreiden käyttöjännite. Arduino toimii 5 voltin käyttöjännitteellä, joten jos moottorille pitää olla esimerkiksi 12 voltin käyttöjännite, niin tulee moottorin sähkö syöttää erillisestä lähteestä (akku, muuntaja, laboratoriovirtalähde tms.). Moottorin datakirjasta kannattaa myös tarkistaa, että minkä tasoinen (eli millä jännitteellä) ohjaussignaali (PWM) toimii.

Seuraavassa osassa kokeillaan ohjata 8x8 LED-matriisia ja tutustutaan 74HC595 siirtorekisteriin.

Seuraava osa: led-matriisin ohjaus.