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:
Osa
Kuva
Selitys
180 asteen servomoottori
Servo 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".
Piikkirima
Taita 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.
Potentiometri
Potentiometri 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)?
voidloop(){
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ä:
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.
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"
voidsetup() {
munServo.attach(9); //Kerrotaan ohjelmalle, että servo on kiinnitetty porttiin 9.
}
voidloop(){
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.
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ä?