Elektroniikka ja ohjelmointi

Johdanto

Tehtävä: Laita servo liikkumaan ja kehitä sille hyvä mekanismi

Ohjelmoitavan elektroniikan tärkeä sovellusalue on robotiikka ja liikkeen tuottaminen ylipäätään. Liikettä vain pitäisi pystyä muuttamaan muodosta toiseen: Arduino-kiteistä löytyvät moottorit pyörivät ympäri tai liikkuvat edestakaisin - mutta niiden liike ei sovi ihan kaikkeen. Kun liikettä täytyy muuttaa toisenlaiseksi - vaikka pyörimisliikkeestä edestakaiseksi - tai jos liike halutaan välittää paikasta toiseen, kuten polkupyörän polkimista takarenkaan pyörimiseksi, tarvitaan mekanismeja.

Koska perusmekanismien keksiminen tyhjästä voi olla työlästä, kannattaa ehdottomasti tutkia mitä muut ovat tehneet sekä kehittää omia liikkuvia härpäkkeitä toisten jakamien projektien pohjalta. Onneksi maailma on väärällään ideoita ja niitä mielellään jakavia ihmisiä! Servoilla saa aikaan vaikka mitä, myös yksinkertaisilla tykötarpeilla.

Tehtävä pähkinänkuoressa:

  • Kytke servo ja ohjelmoi se liikkumaan parilla eri tavalla
  • Kontrolloi servoa potentiometrin eli säätövastuksen avulla
  • Kehitä yksinkertainen mekanismi - millaista liikettä saat aikaan servolla ja käytössäsi olevilla materiaaleilla?

Millaista liikettä servolla voi tuottaa? Klikkaa alapuolen kuvaa ja paina välilyöntiä!

Tässä muutetaan servon liike ryömimiseksi! Kuinka systeemiä voisi parantaa, jotta se liikkuisi paremmin eteenpäin?

Tehtävässä mekanismiksi lasketaan myös tämäntyyppinen vekotin - onhan liikerataa saatu hienosti laajennettua:

Tarvikkeet

Arduinon, USB-johdon, johtimien ja koekytkentälevyn lisäksi tarvitset:

OsaKuvaSelitys
180 asteen servomoottoriServo on sähkömoottori, jonka voi asettaa ohjelmoimalla asentoon 0-180 astetta. Huom: Tällainen servo on usein väriltään sininen! On olemassa myös servoja, jotka pyörivät 360 astetta - tällaisen kyljessä lukee "Continuous servo".
PiikkirimaTaita piikkirimasta kolmen piikin pala irti ja liitä se servon johtimien päähän. Näin saat kiinnitettyä servon koekytkentälevyyn. Jos sinulla ei ole piikkirimaa, käytä kytkentäjohtoja.
PotentiometriPotentiometri on säätövastus, jonka resistanssia muutellaan kääntämällä nuppia. Arduino-kiteissä olevien potentiometrien  maksimiresistanssi on yleensä 10 kilo-ohmia.
Kiinnitys- ja askartelutarvikkeita - ks. vinkit tehtävän loppupuolelta

Kytkentä

Vaihe 1
  • Kiinnitä 180 asteen servoon lapa (joko ristin muotoinen tai yksisiipinen kuten kytkentäkaaviossa) pienellä ruuvilla
  • Käytä servon kytkemisen apuna piikkirimaa. Taita siitä kolmen piikin pätkä. Paina piikkejä yhdessä pitävää muoviosaa niin, että piikit ovat yhtä pitkät molemmilta puolilta (pysyy paremmin paikoillaan). Liitä sitten piikkirivi servoon. Jos piikkirimaa ei ole käsillä, käytä kytkentäjohtoja! Voit katsoa tämän vaiheen videolta sivun alalaidassa.
  • Servoissa voi olla eriväriset johdot. Punainen johto löytyy aina, ja se kytketään 5V jännitteeseen. Maajohto on yleensä musta tai ruskea, ja se yhdistetään GND-porttiin. Viimeinen johto on usein oranssi, keltainen tai valkoinen, ja se kytketään Arduinon porttiin 9.
  • Potentiometri kytketään 5V jännitteeseen, maahan ja A0-porttiin.

Potentiometri eli säätövastus toimii anturina samaan tapaan kuin LDR viime viikon harjoituksessa.  Se tarvitsee jännitettä, ja säätövastuksen lukemat luetaan A0-portista. Erillistä vastusta ei nyt tarvita.

Myös servo tarvitsee jännitettä toimiakseen. Lisäksi servolle täytyy syöttää ohjaussignaali portista 9, jotta moottori osaa asettua oikeaan asentoon. Ohjaussignaalia muutellaan ohjelmoimalla!

Potentiometrejä on erimallisia

Laitimmaiset pinnit kytketään aina jännitteeseen ja maahan, ja keskimmäinen kytketään A0-porttiin - riippumatta siitä miten potentiometri asettuu kytkentäalustalle!

Servon kytkeminen piikkirimalla ja ilman

Tällä videolla näkyy vähän muitakin komponentteja kuin ne joita tehtävässä tarvitaan. Kiinnitä siis huomiota vain servoon…


Ohjelmointi 1/3

Vaihe 2
Ohjelmointi 1/3: Servo liikkeelle
Servon liikuttamiseen tarvitaan paketti muiden ihmisten kirjoittamaa koodia, jota sanotaan kirjastoksi. Servo-kirjaston myötä saadaan käyttöön monta kätevää komentoa, joiden avulla liikettä on helppo tuottaa. Liikutellaan aluksi moottoria puolelta toiselle.

Huom: koodin lopussa on kaksi kommenttia, joiden tilalle sinun täytyy itse kirjoittaa puuttuvat komennot!

Lataa ohjelma Arduinolle! Servo liikkuu edestakaisin kahden ohjelmassa määritellyn kulman välillä. Jos moottori ei ala liikkua, tarkista kytkennät. 
Älä väännä servon lapoja väkisin äläkä estä servoa liikkumasta, jotta sen rattaat eivät hajoa. 

Mitä uutta ohjelmassa on?

  • #include <Servo.h>
    Komennolla otetaan käyttöön kirjasto nimeltä Servo.h, eli paketti moottorin ohjelmointia helpottavaa, valmista koodia. 
  • Servo munServo;Tässä määritellään munServo-niminen olio. Olio-ohjelmointia ei tällä kurssilla opetella - riittää, kun ajattelet, että munServo toimii vähän niinkuin muuttujat. Sillä on nimi (munServo) ja tyyppi, joka on tällä kertaa muotoa Servo. Moottoria komennellaan jatkossa käyttäen sille annettua nimeä munServo.
    Kaikki komennot, joilla munServo-oliota ohjataan, on määritelty Servo.h-kirjastossa. 
  • munServo.attach(9);Setup-osassa kerrotaan Arduinolle, että porttiin 9 on kiinnitetty munServo-moottori. 
  • munServo.write(0);Käsketään munServo-moottoria asettamaan itsensä kulmaan 0. 

Kokeile:

  • Muuttele munServo.write -komennossa määriteltyjä kulmia sekä delay-arvoja.

  • Lisää servon lapaan ja/tai runkoon sinitarraa, muovailuvahaa tai jotain muuta töhnää, josta syntyy kitkaa. Yritä saada servo ryömimään eteenpäin! Muuta munServo.write -komennossa määriteltyjä kulmia tarvittaessa, ja testaa liikuttelua erilaisilla pinnoilla.

  • Jos sinulla on myös jatkuvaliikkeinen servo (eli continuous servo), kokeile kytkeä se aiemman moottorin tilalle. Kuinka moottori käyttäytyy? Saatko sen pysähtymään munServo.write -komennon lukemia muuttelemalla?

  • Jos servo ei liiku: muistithan täydentää koodia ohjeen mukaan (ks. alla)?

void loop(){
  munServo.write(0); //Aseta servo kulmaan 0.
  delay(1000);   // Odota 1 sekunti
  // Lisää itse puuttuva komento: Aseta servo toiseen ääriasentoon.
  // Lisää itse puuttuva komento: Odota yksi sekunti.
}

Ohjelmointi 2/3

Vaihe 3
Ohjelmointi 2/3: Potentiometri toimintaan
Tutkitaan potentiometrin arvoja sarjamonitorista ja määrätään, että servo saa heilua vasta, kun potentiometri on väännetty toiseen ääripäähän.

Lataa ohjelma Arduinolle! Avaa sarjamonitori (suurennuslasi IDE:n oikeassa yläkulmassa) ja katso, mitä lukemia saat käännellessäsi potentiometria.

Tarkista sitten, mitä lukemia sarjamonitoriin tulee, kun potentiometri on ääriasennoissa. Jos lukemat eivät muutu kun kääntelet potentiometriä, tarkista kytkennät. Jos suurin saamasi lukema on vähemmän kuin 1020,  aseta if-lauseen ehtoon oikeasti suurin lukema miinus kolme (esim. jos suurin lukema on 1015:  potArvo > 1012).

Uutta ohjelmassa:

  • int potArvo;Luodaan kokonaislukumuuttuja potArvo (potentiometrin arvon tallentamista varten)
  • Serial.begin(9600);
    Käynnistetään sarjaliikenne, jotta potentiometrin arvoa voi tarkastella sarjamonitorista. 9600 on sarjaliikenteen nopeus, jonka yksikkö on baud (9600 baudia = 9600 bittiä sekunnissa). Nopeutta on joskus tarpeellista muutella esimerkiksi silloin, kun käytetään erimallista Arduinoa.
  • potArvo = analogRead(A0);
    Annetaan potArvo-muuttujalle arvoksi lukema, jonka Arduino saa A0-portista. 
  • Serial.println(potArvo);
    Tulostetaan potArvo-muuttujan lukema sarjamonitoriin. Komennon loppuosa println määrää, että jokainen potArvo tulostuu omalle riville. Serial.print(potArvo); tuottaisi pitkän, vaikeasti luettavan pötkön lukuja.
  • if(potArvo > 1020) 
    Ehtolause määrää, että sen sisällä (eli kaarisulkeiden { ja } välissä) olevat käskyt suoritetaan vain, jos potArvo on suurempi kuin 1020.

Ohjelmointi 3/3: Kulman säätö

Vaihe 4
Ohjelmointi 3/3: Potentiometri määrää kulman
Nyt ohjelmaan tehdään kaksi erilaista toimintoa: kun potentiometri on väännetty täysille, servo heiluu edestakaisin. Muussa tapauksessa servon kulma muuttuu aina sen mukaan, mihin asentoon  potentiometri väännetään.

Lataa ohjelma Arduinolle! Tutki sarjamonitorista, kuinka servon kulma vaihtelee.

Uutta ohjelmassa:

  • int kulma;Ohjelmassa tarvitaan muuttuja, johon voi tallettaa moottorin kulman. Kulma on kokonaisluku (int, integer).
  • elseMerkkien { ja } välissä oleva else-osa suoritetaan aina kun edeltävän if-lauseen ehto EI ole voimassa. Eli silloin kun potArvo on pienempi kuin 1020.
  • kulma = map(potArvo, 0, 1019, 0, 180); potArvo muutetaan lukemaksi, jonka voi syöttää servolle. Potentiometri voi periaatteessa tuottaa arvoja välillä 0-1023. Mutta tämä map-komento sijaitsee else-osassa, joka suoritetaan vain kun potArvo on alle 1020. Tiedetään siis, että suurin mahdollinen map-komennon sisälle joutuva arvo on 1019.
    Servolle voi antaa arvoja välillä 0-180.
    map-komennon tuottama luku tallennetaan muuttujaan kulma.
  • Serial.println(kulma);Tulostetaan muuttujan kulma arvo sarjamonitoriin - on ihan kiva pystyä seuraamaan, kuinka potentiometri vaikuttaa servon asentoon.
  • munServo.write(kulma);
    Muuttuja kulma määrittelee, mihin asentoon servo menee.
  • delay(200);Pieni viive on kätevä, jotta sarjamonitorin lukemat eivät vilistä ohi liian nopeasti. Servo tarvitsee myös hieman aikaa, jotta se ehtii siirtyä asennosta toiseen.

Kehitä mekanismi

Vaihe 5
Kehitä mekanismi tai kokeile esimerkkiä!
Voit laatia mekanismin eteenpäin liikkuvaa härveliä varten, tai ihan jotain muuta ajatellen. Mitä kaikkea servo voisi liikuttaa?
  • Kokeile millaista liikettä saat aikaan YHDELLÄ 180 asteen servolla. Servo voi liikuttaa itse itseään (pieni, liikkuva robotti) tai siihen kiinnitettyjä lisäosia. 
    Systeemisi saa olla hassu ja tarpeeton, tai sitten erittäin käytännöllinen ja kerrassaan välttämätön.
  • Muuttele Arduinon ohjelmaa tarvittaessa
  • Keep it simple: hyödynnä surutta tällä sivulla esiteltyjä tai itse googlaamiasi mekanismeja, jos et keksi ihan omaa ratkaisua. Työn touhussa saatatkin hoksata ainutlaatuisen variaation! Aloita yksinkertaisesta, jotta saat tehtävän palautettua. 

Silmäile läpi oheiset diat ja tuumi, mitä tarvikkeita voisit käyttää tehtävässä:

Voit saada ideoita myös Kati Hyypän ja Niklas Royn Rapid Robots -työpajan huimista servomekanismeista!


Lisätietoa

Servo on helppokäyttöinen moottori, jolla voi toteuttaa monenlaisia projekteja. Myös muunlaisia moottoreita voi kytkeä Arduinoon:

  • DC-moottori
    Tällainen "tavallinen" sähkömoottori löytyy myös servon sisältä. DC-  eli tasavirtamoottorin sisällä on käämi, johon johdettu virta indusoi muuttuvan magneettikentän. Magneettikenttä saa roottorin pyörimään. 
    DC-moottoria ei saa kytkeä suoraan Arduinoon, sillä se vie paljon virtaa ja tuottaa haitallisia virtapiikkejä. DC-moottori kytketään joko transistorin tai erillisen moottorinohjainpiirin avulla.
  • Vaihteistettu DC-moottori
    DC-moottori, jossa on sisäänrakennettu vaihderattaisto. Vaihteiden ansiosta moottori pyörii hitaammin kuin vaihteeton, melkoisen nopea DC-moottori.
  • Solenoidi
    Solenoidi ei ehkä tarkalleen ottaen ole moottori, vaan sähkömagneetti. Se kuitenkin tuottaa sähkön avulla liikettä ja saa siksi liittyä listalle. Solenoidi ei pyöri, vaan liikkuu eteen ja taakse. Myöskään solenoideja ei voi kytkeä suoraan Arduinoon, vaan niitä käytetään esimerkiksi transistorien avulla. Solenoideja käytetään mm. sähköllä ohjattavissa venttiileissä ja auton starttimoottorissa.
  • Värinämoottori
    Sähkömoottori alkaa väristä, kun se on epätasapainossa. Värinämoottori on saatettu tarkoituksella epätasapainoon kiinnittämällä sen pyörivään akseliin epätasaisesti jakautuva paino eli epäkesko. Pienimmät värinämoottorit ovat samaa kokoluokkaa kuin kännykän tai sähköhammasharjan moottorit. Tällaisen voi turvallisesti kytkeä Arduinoon ilman moottoriajuria. Isommasta DC-moottorista voi tehdä värinämoottorin esimerkiksi ruuvaamalla sen akseliin sähköjohtojen liittämiseen tarkoitetun sokeripalan eli pätkän kytkentälistaa.
  • Askelmoottori
    Myös askelmoottorin sisällä on DC-moottori. Askelmoottorin etuna on, että sen voi ohjelmoida liikkumaan hyvin tarkasti. Askelmoottori täytyy kytkeä Arduinoon ohjainpiirin avulla, ja sen ohjelmointiin on olemassa oma kirjasto.
Moottoreita ylhäältä vasemmalta alkaen - DC-moottori, värinämoottori, solenoidi, askelmoottori ja servo.

Moottoreita ylhäältä vasemmalta alkaen - DC-moottori, värinämoottori, solenoidi, askelmoottori ja servo.

Vinkkejä syventävää materiaalia kaipaaville

Voit tutustua Mehackitin kurssimateriaalin Arduino-projekteja Maker kitillä haastavampiin tehtäviin. Mm. seuraavat tehtävät  laajentavat viikkotehtävän aihepiiriä:

Luku 3: Päälle ja pois

  • Servo-moottorin liikuttelu

Luku 5: Liikettä!

  • Luvun tehtävissä käytetään vaihteistettua DC-moottoria, mutta kytkennät sopivat myös tavalliselle DC-moottorille. Jos sinulla on käytössäsi jatkuvaliikkeisiä servoja eikä DC-moottoreita, voit soveltaa tehtävien ideaa - pääset helpommalla sekä kytkennän että ohjelmoinnin suhteen.

  • 360 astetta pyörivän servon toimintaperiaate:

    • pyörii yhteen suuntaan, kun munServo.write-komennon arvo on yli 90 (esim. munServo.write(120);
    • pyörii toiseen suuntaan kun munServo.write-komennon arvo on alle 90 (esim. munServo.write(40);
    • on paikallaan kun munServo.write-komennon arvo on 90 
    • pyörii sitä hitaammin, mitä lähempänä annettu arvo on lukua 90.

Ongelmia

Kaiken pitäisi olla oikein mutta servo sekoilee?

Muistitko lisätä omia komentoja koodiin? Keksi itse kaksi viimeistä koodiriviä!

#include <Servo.h>  //Lisätään ohjelmaan Servo-kirjasto.
Servo munServo;      //Luodaan Servo-tyypin muuttuja nimeltä "munServo"

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

void loop(){
  munServo.write(0); //Asetetaan servo kulmaan 0.
  delay(1000);   // Odotetaan 1 sekunti
  // Täydennä itse puuttuva komento: Aseta servo toiseen ääriasentoon.
  // Täydennä itse puuttuva komento: Odota yksi sekunti.
}

Servot ja virta

Servot toimivat joskus hassusti, älä huolestu jos moottori vähän nykii ja sekoilee! Joskus auttaa, että painaa kytkentäjohtoja paremmin alustaan kiinni - pienet kontaktihäiriöt voivat sotkea servon toimintaa.

Servot tarvitsevat aika paljon virtaa, ja joskus Arduinolla on pulmia tuottaa virtaa tarpeeksi. Tähän on olemassa konsteja, joihin kannattaa tutustua, jos jatkat moottoriprojektien parissa - esim. tehokkaammat akut ja ulkoiset virtalähteet varmistavat riittävän virransaannin, ja virtavaihteluita voi tasata kondensaattorien avulla.

Lisätietoa ja ratkaisuvinkkejä Sparkfunin hyvässä servotutoriaalissa

Ongelmanratkaisu

Eikö Arduino toimi niin kuin halusit? Ei hätää - tämä on ihan tavallista myös kokeneille Arduino-värkkääjille. Käy läpi seuraava tarkistuslista, yleensä vika on jokin näistä!

  • Onko Tools- eli Työkalut-valikossa, kohdassa Port (Portti) valittuna se Arduinoon viittaava portti?
  • Onko Tools- eli Työkalut-valikossa, kohdassa Board valittuna Arduino/Genuino UNO?
  • Onko koodissa ja kytkennöissä varmasti käytetty samaa Arduino-porttia?
  • Ovatko puolipisteet oikeilla paikoillaan?
  • Onko jokaisella kaarisulkeella ja tavallisella sulkeella pari?
  • Oletko kirjoittanut isot ja pienet kirjaimet kuten esimerkissä?
  • Oletko käynyt läpi kytkemäsi johdot - että johdot on kytketty samalle kytkentäalustan riville kuin komponentit?
  • Oletko kokeillut irrottaa USB-johdon ja kiinnittää sen uudelleen? Oletko kokeillut kytkeä Arduinon eri USB-porttiin? Huom: tämän jälkeen tarkista portti Tools-valikosta.
  • Oletko resetoinut Arduinon pienestä napista laitteen päällä? Tämä käynnistää laitteelle ladatun ohjelman alusta.
  • Eihän sinulla ole komponentteja kytkettynä portteihin 0 tai 1? Nämä portit tarvitaan joskus Arduinon ja tietokoneen väliseen tietoliikenteeseen, mikä voi välillä sotkea asioita.
  • Kokeilitko etsiä Arduino IDE:n tuottamalla virheilmoituksella ohjeita netistä?