Servo-moottorin liikuttelu

Johdanto

Tähän mennessä olemme hyödyntäneet kytkiminä erilaisia mekanismeja, joilla laitteen voi laitteita päälle tai pois päältä. Ulostulona olemme kuitenkin käyttäneet melkein pelkästään ledejä. Mitä muuta kuin valoa kytkimillä voisi kontrolloida?

Tässä harjoituksessa pääset tuottamaan liikettä servomoottorin avulla. Servoihin perehdytään enemmän viidennessä luvussa “Liike”, mutta saat tässä harjoituksessa hieman esimakua niiden käytöstä.

Alla olevassa videossa on tehty robottikäsi neljän 180-asteen servomoottorin avulla. Minkälaisen servoprojektin sinä haluaisit tehdä?

Pinot: Micro Servo Robot

Tarvikkeet

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

OsaKuvaKuvaus
180-asteen servo-moottoriOttaa asennon välillä 0-180 astetta riippuen syötetystä arvosta. Servossa on kolme johdinta, jotka kytketään piikkiriman avulla digitaaliseen porttiin, 5 voltin jännitteeseen ja maahan. Huom: Maker Kitin servo on väriltään sininen!
PiikkirimaVoit taittaa piikkirimasta kolmen piikin palasen irti ja liittää sen servon johtimien päähän. Näin saat kiinnitettyä servon koekytkentälevyyn. HUOM! Mustaa muoviosaa voi painaa keskemmälle!
PainonappiMehackit Maker Kitin painonappi on valkoinen, ei ruskea.

Virtapiiri

  • Käytä servon kytkemisen apuna piikkirimaa. Taita siitä kolmen piikin rima ja paina musta muoviosa keskelle piikkejä. Liitä sitten piikkirivi servoon.
  • Kytke servon musta johdin maahan, punainen 5 voltin jännitteeseen ja keltainen porttiin 6.
  • Kytke painonapin toinen jalka porttiin 2 ja toinen jalka maahan.

Ohjelman tavoite

Kun nappia klikataan, servon viisari kääntyy viisi pykälää edemmäksi. Kun arvo on 180, servo palaa takaisin lähtötilaan. Tarvittavat komennot

Tutut komennot

Uudet komennot

Ohjelmointi 1/3

Servon liikuttaminen vaatii joukon omia komentoja. Näihin ehditään perehtyä tarkemmin myöhemmissä luvuissa! Alkuun pääsee seuraavalla komennolla:

  • Servo.write(kulma): Kulmaksi asetetaan arvo 0-180, ja servo kääntyy tähän kulmaan. Servo on tässä erikseen luotu Servo-tyypin muuttuja.
Tehtävä
Tee ohjelma joka liikuttaa servon ääriasennosta toiseen yhden sekunnin viiveellä. Kopioi alla oleva koodi, mutta kirjoita itse loop-metodin kaksi viimeistä riviä.
#include <Servo.h>  //Lisätään ohjelmaan Servo-kirjasto.
Servo myServo;      //Luodaan Servo-tyypin muuttuja nimeltä "myServo"

void setup() {
  myServo.attach(6); //Kerrotaan ohjelmalle, että servo on 
                     //kiinnitetty porttiin 6.
}

void loop(){
  myServo.write(0);
  delay(1000);
  // Aseta servo toiseen ääriasentoon (180).
  // Odota yksi sekunti.
}

Ohjelmointi 2/3 - Kytkin mukaan

Tehtävä
Ohjelmoi servolle kytkin, joka ohjaa liikettä! Kopioi jälleen alla oleva koodi ja kirjoita itse puuttuvat kohdat, joihin koodin kommenteissa on annettu vinkkejä.
#include <Servo.h>

// Luo muuttuja buttonState ja aseta sen alkuarvoksi 0
// Luo muuttuja lastButtonState ja aseta sen alkuarvoksi 0
// Luo muuttuja kulma ja aseta sen alkuarvoksi 0

Servo myServo;

void setup() {
  pinMode(2, INPUT_PULLUP);
  pinMode(6, OUTPUT);
  myServo.attach(6);
  Serial.begin(9600);
}

void loop(){
  buttonState = digitalRead(2);

  // Jos buttonState on erisuuri kuin lastButtonState ja jos buttonState on HIGH, lisää muuttujaan kulma arvo 5. 

  myServo.write(kulma);
  if(kulma >= 180){
    kulma = 0;
  }
  lastButtonState = buttonState;
  Serial.println(kulma);
}

Ohjelmointi 3/3 - Satunnainen kulma

Tutustu alempaa löytyvään ohjelmaan. Ohjelma on samantapainen kuin edellisellä sivulla kirjoittamasi ohjelma, mutta nyt servo ottaa sattumanvaraisen asennon, kun nappia klikataan. Tähän on käytetty yhtä uutta komentoa:

  • random(min, max): Arpoo sattumanvaraisesti luvun kahden arvon väliltä. Tämän luvun voi tallentaa esimerkiksi muuttujaan tulevaa käyttöä varten.
Tehtävä
Syötä alta löytyvä ohjelma Arduinolle. Pohdi, mihin rakentamaasi robottia voisi käyttää. Voitte pohtia servon käyttämistä ilman random-toiminnallisuutta tai sitten sen kanssa. Suunnitelkaa yksi käyttötarkoitus ja kirjatkaa se ylös osaksi aiempaa projektisuunnitelmaa. Saamanne idea voi liittyä tulevaan kurssiprojektiinne!
#include <Servo.h>

int buttonState = 0;
int lastButtonState = 0;
int kulma = 0;

Servo myServo;

void setup() {
  pinMode(2, INPUT_PULLUP);
  pinMode(6, OUTPUT);
  myServo.attach(6);
  Serial.begin(9600);
}

void loop(){
  buttonState = digitalRead(2);
  if(buttonState != lastButtonState){
    if(buttonState == LOW){
      kulma = random(0, 180); //Arvotaan luku väliltä 0-180 ja tallennetaan se muuttujaan kulma
      myServo.write(kulma);
    }
  }
  lastButtonState = buttonState;
  Serial.println(kulma);
}