10. Servomootori juhtimine—pulsilaiusmodulatsioon ja juhtkang (joystick)
<- eelmine peatükk
järgmine peatükk ->
10.0. Seosed eelmiste peatükkidega
Eelmises peatükis saime tööle juhtkangi (joystick), mis vastab kahest potentsiomeetrist koosnevale juhtimissüsteemile. Kummagi süsteemi kuuluva potentsiomeetri pealt saime lugeda väärtusi, mis on käsitletavad kui x-telje ning y-telje väärtused. SW viigu (switch—lüliti ) pealt saime lugeda digitaal signaali väärtusi 0 ja 1. Saime kõiki väärtusi kuvada Serial monitori ekraanile. Potentsiomeetriga muutsime takistust, seega muutsime ka pinget—siit tuleneb võimekus juhtida mingit elektrilist protsessi.
10.1. Eesmärk ja selgitused
Selles peatükis ehitame eelmise tunni vooluahelat meenutades vooluahela, millesse lisaks juhtkangile lisame ka kaks servomootorit (ühe x-telje ning teise y-telje tarvis). Ühte servomootorit saame juhtida ühe tavalise potentsiomeetriga—ent meil on juhtkangi näol kaks potentsiomeetrit (x-telje ja y-telje tarvis).
Erinevalt varasemast on meil programmis vaja kasutada täiendavat tarkvara, mis mõeldud servode juhtimiseks. Seega laeme alla oma esimese teegi (library). Sõnast teek arusaamise hõlbustamiseks võime mõelda raamatukogule: kreeka tüvega väljendatult biblioteek (vrd. βιβλιοθήκη). Uurime ka pulsilaiusmodulatsiooni (inglisekeelne lühend on PWM, tuleb esitähtedest: Pulse Width Modulation). Pulsilaiusmodulatsiooni oleme juba eespool maininud viikude tähistustest rääkides.
Kümnenda peatüki järel õpilane oskab:
10.2. Töövahendid:
10.3. Tegevused:
10.3.1.PWM
Pulse Width Modulation (kasutame edaspidi lühendina PWM) nimetatakse eesti keeles pulsilaiusmodulatsiooniks. Sellest on kirjutatud Robootika gümnaasiumile õpikus lk 221 (vt https://www.robootika.ee/wp/wp-content/uploads/2015/04/robootika_gymn_opik.pdf ) Kirjeldame seda olulist teemat ka siin. Tegu on võimalusega digitaalsignaali abil edasi anda analoogsignaali infot: st signaali kõrgeks lülitamine ja madalaks lülitamine nii, et see mõjutab kontrolleriga ühendatud seadet nii nagu me ette anname teise seadmega, mis tegelikult on analoog-seade.
Eelmises peatükis edastasime potentsiomeetriga (st analoog-seadmega) manipuleerides Serial monitorile erinevaid pinge väärtusi—programmi abil kirjutasime tulemuse lahti ka voltides.
Sedakorda me rakendame potentsiomeetri analoogsignaali digitaalselt juhitavale servole käskluste andmiseks. Kuna servomootor vajab „infost aru saamiseks“ digitaalsignaali (digitaalsignaal varieerub olekutes null ja üks), siis peame midagi ette võtma analoogsignaali (olekute skaala vahemikus 0-1023) „tõlkimiseks“ „kaheolekulisse digitaal-keelde“, mis on arusaadav servole. Siin aitabki meid PWM.
Arduinol kasutame pingeallikana 5V toite-viiku. Oletame, et täiel pingel pöörleb mootor vahemikus x RPM (Revolutions Per Minute), mis vastab 5V pingele. Kui aga vähendame toitepinget poole võrra, siis peaks ka servo reageerima poole võrra väiksema RPM-ga: 5V/2 = 2,5 RPM.
Ent kuna digitaalselt juhitavasse servosse saame anda sisendi vaid kas pingega (st see oleks alati 5V) või ilma (st see aga oleks alati 0V), siis ei jää pinge moduleerimiseks muud üle, kui ajaliselt piirata signaali kõrgeks lülitamist nii, et efekt oleks sarnane 2.5V pingega. St pool impulsile kuluvast ajast on signaal endiselt 5V, teine pool aga 0V. Mootori jõudluse poole võrra vähendamiseks vähendasime lihtsalt impulsi kõrgeks lülitatud osa; ülejäänud osa seega oli madalaks lülitatud. Sellist meetodit nimetame pulsilaiusmodulatsiooniks (PWM).
1 vt https://www.robootika.ee/wp/wp-content/uploads/2015/04/robootika_gymn_opik.pdf
10.3.2.Servomootori tööpõhimõte
Servomootoritest vaata Robootika gümnaasiumile õpikust peatükki Elektrimootorid ning peatükki Elektrimootorid—II tase. Vt lk 29-352.
Servomootor on alalisvoolul töötav mootor, millel on käigukast, mille ülesanne on võimaldada juhtimissüsteemi kaudu ette antud nurga muutmist ning hoidmist: näiteks 0-180 kraadi vahel etteantud nurk.
Servo pöörd-osa positsioonid on täpselt programmeeritavad. Antud näite koostamisel kasutatud Tower Pro mikroservo SG90 pööramise kontrollimiseks kasutame Arduino programmis deklareeritud PWM võimekusega digitaal-viiguga ühendatud juhet (meie alljärgneval skeemil vastav juhe tähistatud oranžiga).
Miinus—GND: tootja poolt tähistatud seekord musta asemel hoopis pruuni juhtmega.
5V toide on, nagu ikka, punane juhe.
Sedakorda kasutasime värvikoodi, mis võetud vastava toote kohta märksõnadega „Tower Pro servo sg90 data sheet“ tehtud internetiotsingust.
2 vt https://www.robootika.ee/wp/wp-content/uploads/2015/04/robootika_gymn_opik.pdf
Harjutus A
Kui asute kasutama servot, tehke otsing internetis otsisõnadega „data sheet“ ning lisage servo margitunnused.
Kommenteerige, mida leidsite.
Servo pöörd-osa positsioonidest rääkides tuleb aga mainida, et see, kas servot saab kasutada tema tootja poolt kirjeldatud pöörde-ulatuses, ei pruugi iga kord vastata tootja poolt kirjelduses lubatule.
Näites kasutatud Hiina odav-servode (vt netist otsisõnadega „sg90 data sheet“) kasutamise korral tuleb valmis olla ka selleks, et tegelikult andmelehel kirjeldatud pöördeulatus ei vasta Teie töölaual aset leidvale tegelikkusele—mingites positsioonides võib servo tugevasti väriseda, võbeleda.
Probleemist võib ka kvaliteetsemate servode puhul saada aimu sõrmeotsaga iseloomulikku surinat tunnetades: saame seda proovida nii, et paneme programmi ja vooluahelat kasutades 180 kraadi pöörama pidava servo näiteks äärmistesse asenditesse 0 kraadi ja seejärel ka 180 kraadi. Mõlemas lõpp-asendis võime servot kergelt sõrmeotstega puudutada. (NB! mitte kinni hoida või väänata!) Kui tunneme iseloomulikku vibreerimist—surinat või kogeme lausa silmaga nähtavat vibreerimist (inglise keeles kirjeldab seda otsisõna „jitter“—uurige internetist!), siis on mõistlik olla tema pöördeulatuse kasutamisel pigem veidi konservatiivsem. Saame kasutada 0-180 kraadist väiksemat vahemikku: näiteks 15-165 kraadi. Piiriks, kuhu on mõistlik uut äärmist positsiooni programmi abil nihutada, on see, kas tunneme veel sümptomaatilist surinat. Proovime tunnetada seda näpuotstega.
10.3.3. Vooluahela skeem potentsiomeetriga juhitavale ühele servole
Alustuseks konstrueerime eelmisest peatükist tuttava vooluahelaga (vt kõrval olev pilt) üsna sarnase vooluahela, millel on lisaks potentsiomeetrile ühendatud ka üks servomootor.
Võrdle selles peatükis konstrueeritavat vooluahelat eelmises peatükis kasutatud vooluahelaga, mis sisaldas vaid potentsiomeetrit. Veendu, et kui potentsiomeetrilt tulevat analoog-vormis infot loeme Analog-in viiguga, siis servot juhime ikkagi digitaal-viikude reas oleva PMW võimekusega viiguga.
10.3.4. Servo.h teek
Ent enne sellele vooluahelale vastava programmi koostamisega alustamist peame uurima veel ühte teooriateemat. Nimelt vajame servo juhtimiseks nn „raamatukogu-programmi“, eesti keeles märgib mõistet sõna ’teek’. Peame programmi lisama viite servo tarkvarale, mis sisaldub teegis. Kasutame teeke seepärast, et ilma nendeta oleks meie programmid keerukamad. Teekide korral aga on keegi meid juba ette aidanud.
Paljude programmeerimisülesannete lihtsustamise huvides kasutatakse kellegi poolt varem valmis kirjutatud ning internetist alla laetavat programmi. Antud juhul on selleks servo.h ja kõige viimane versioon peaks asuma kõige kõrgemal kohal allalaadimiseks võimalike versioonide seas, praegu selle teksti kirjutamise hetkel on viimaseks Servo-1.1.3.zip:
https://www.arduinolibraries.info/libraries/servo
Kui meil veel arvutisse servo.h laetud ei ole, siis laeme selle arvutisse praegu. Vajaduse korral õpetaja aitab.
10.3.5. Programm potentsiomeetriga ühe servo juhtimiseks:
Võtame ladususe huvides lahti näidisprogammi: File-> Examples -> Servo -> Knob.
Kontrollime, kas viikude kohta programmi kirjutatu vastab tegelikkusele ning vajadusel korrigeerime programmi või vooluahelat. Laeme seejärel programmi Arduinole. Pöörame potentsiomeetri telge—mis juhtub servoga?
Igaks juhuks paneme siia ka programmi koos eestikeelsete kommentaaridega. Võite ka kopeerida siin sisalduva programmilõigu Arduino IDE-sse ja salvestada oma 10. peatüki tarvis tehtud faili-kausta.
Soovitus: kui te seda juba varem teinud ei ole, siis korrastage nüüd kümnendast tunnist alates kasvõi vaid oma kodutöödki peatükkide lõikes alamkataloogidesse. Nii leiate oma materjali kiiremini.
Kommentaarid3 andsime sedakorda Arduino IDE-st lugemiseks—uurige otse Arduino IDE-s ja mängige koostatud vooluahelaga. Kuidas see sarnaneb üheksandas peatükis tehtule?
#include <Servo.h> /*nii teavitame Arduino IDE-t vajadusest kasutada Servo.h teeki.*/ Servo servo1; /*Peame looma objekti: deklareerima servo mingi nimega, näiteks "servo1".*/ int potentsiomeeter1 = A0; /* deklareerime potentsiomeetri signaaljuhtme viigu analoog-ühenduse, millest saame PWM läbiviimiseks vajaliku analoog-signaali. Kontrollime, kas potentsiomeetri keskmine viik on ühendatud A0 peale: võib olla ühendatud ka mistahes muu A-ga algava tähistusega viigu peale*/ int muutuja1; /*analoog-viigult A0 info lugemiseks on vaja ka muutujat, kuhu loetud info selle potentsiomeetrilt lugemise järel salvestatakse*/ void setup() { servo1.attach(11); /*ütleme Arduinole, et infosuhtlus servo-objektiga servo1 käib läbi viigu number 11. Tegu on digitaal-viiguga--PWM digitaalne osa! Kontrollime, kas skeemil kasutame sama viigu--võime aga valida ka mõne muu viigu, mis toetab PWM*/ } void loop() { muutuja1 = analogRead(potentsiomeeter1); /* muutuja1-le salvestatakse potentsiomeeter1 pealt loetav analoog-info: analoog-info "vahemik" on 0-1023.*/ muutuja1 = map(muutuja1, 0, 1023, 0, 180); /* Muudame map() funktsiooni abil muutujat. Seejuures tuleb kõik nõutud muutujad sulgudesse kirja panna. map funktsiooni argumentideks on: potentsiomeetri pööramise järel eelmisel real analogRead abil muutujasse salvestatud info, selle info vahemik (0-1023); seejärel aga pöördenurga info 0-180. Kui servo väga vibreerima juhtub, saame esma-abi korras seda pöördeulatust ka vähendada--näiteks anda 20-160. Vajadusel katsetage*/ servo1.write(muutuja1); /* "kirjutab" muutuja1 väärtuse servole: servo täidab write() käsu, mille andsime potentsiomeetriga*/ delay(15); /* hoidmaks servot, lisame natuke aega--et servol oleks aega reageerida*/ }
Toimib ühe servo juhtimine ühe potentsiomeetri abil. Kus saaksime sellist juhtimist kasutada? Kas võiksime konstrueerida käepärasest materjalist lihtsa—ühe servoga—ühe liigendiga robotkäe ja seda potentsiomeetriga juhtida?
3 Kommentaariteksti arvutiprogrammile loetamatuks tegemiseks kasutasime seekord sümboleid /* ning */ sümboli // asemel: kui varasemalt kasutatud // selekteerib välja ühe rea algusest kuni lõpuni, siis /* ning */ abil on võimalik välja selekteerida ka mitmerealist lõiku.
10.3.6. Juhtkang—kaks potentsiomeetrit ühes—järelikult võime juhtida kahte servot
Alustuseks konstrueerime nii meie üheksandast tunnist tuttava juhtkangi vooluahelaga kui ka käesoleva tunni eelmises osas ühte servot ja potentsiomeetrit sisaldava vooluahelaga üsna sarnase vooluahela: ent meil on nüüd konstrueeritavas vooluahelas kaks servot, mida juhime kahe potentsiomeetriga—st juhtkangi (joystick) abil.
Vihje: ärge kohe vaadake järgmisel leheküljel näidisena toodud vooluahelat. Võrrelge pigem üheksandas peatükis õpitut käesoleva peatüki alguses kasutusel olnuga, seejärel pange kokku kahe servomootori juhtkangi abil juhtimiseks vajalik vooluahel.
- Mõelge Analog-in-viikude ja PWM võimekusega digitaal-viikude peale.
- Jälgige kuidas panete klappima toite.
- Veenduge, et maa-ühenduse (GND) külge ühendate õiged viigud.
Koostage oma skeem ning alles seejärel uurige järgmisel lehel asuvat näidisskeemi.
10.3.7. Ja üritage iseisesvalt luua ka programmi:uurige selles tunnis kommenteeritud ühe servo ühe potentsiomeetriga juhtimise programmi
Mida peate muutma, et juhtida kahe potentsiomeetriga kahte servot?
Kui asute proovima, siis võite kasutada lõikude kopeerimist (Ctrl + C ning Ctrl + V klahvikombinatsioonid)
Vihjeks: eristage ühte servot ja tema juhtimise potentsiomeetrit teisest servost ja selle juhtimise potentsiomeetrist. Sama kehtib ka muutuja kohta. Veenduge, et olete andnud ette õiged viigud.
Kompileerige Arduino IDE-s. Kui kompileerimisel ilmnevad vead, püüdke neid lahendada. Ärge vaadake järgmisel lehel antud näidisprogrammi enne, kui olete ka üritanud internetist abi leida.
10.4. Kodutöö
Kui koolitund on juhtumisi ajaliselt läbi saanud enne, kui olete jõudnud lahenduseni, siis on sobilik jätta juhtkangi (joystick) abil kahe servo juhtimine koduseks ülesandeks.
Kui aga jõudsite õppetunnis töötava lahenduseni, siis mõelge vahepeal ka robootika ja eesti keele peale. Seda teksti kirjutades tundub mulle kuidagi kohmakas öelda ’juhtkang’. (Surfake internetis otsisõnaga kang—leidke füüsikalise kangi kohta eesti keeles kirjutatu.) Piinlik oleks ka igakordselt kasutada ingliskeelset sõna joystick.
Eesti keelel on rikkalik sõnamoodustustraditsioon: üritage leida elegantselt kõlav eestikeelne vaste! Võite mõelda nii asja ehitusele kui ka kasutusele.
Mina ütleks, et selle tarviku nimi võiks olla topelt-potentsiomeeter.
Kas see tundub mõistlik?
Aga mis sõna Teie välja pakute?
Kas jääme juhtkang (joystick) juurde?
10.5. Lisa
Kuna lubatud oli ka topelt-potentsiomeetri (joystick) ühendamise ja servo juhtimise osa, siis neile, kes tahavad minu versiooni näha—toon selle alles nüüd kui olete oma versioonid tõenäoliselt juba valmis saanud
10.5.1. Näidis-vooluahel
Väiksemal skeemil on üheksandas tunnis kasutusel olnud topelt-potentsiomeetri (joystick) vooluahela näide.
Ja täiustatult kahe servo juhtimiseks:
10.5.2. Näidisprogramm kahe servo juhtimiseks topelt-potentsiomeetriga (joystick)
Usutavasti kirjutasite ise oma programmi ja saite selle ka oma loodud skeemi peal kenasti tööle.
Ent kui läksite kõigile ise ehitamise ahvatlustele vaatamata kergema vastupanu teed ja selle siit kopeerisite oma Arduino IDE-sse topelt-potentsiomeetri koos kahe-servoga tööle panekuks, siis kasutage nüüd viimast võimalust õppida—kirjutage kopeeritud programmile ise kommentaarid.
Kirjutage täpsemad ja paremad kui need, mis selles tunnis ühe-potentsiomeetri-ühe-servo-skeemi juures.
Seejärel aga uurige, mida ja kuidas markeeritakse värviga. Võite lisada värvi-infot ka alltoodud programmilõigu teksti—vastavalt värvile, mis on juhtmetel, mida kasutate.
#include <Servo.h> Servo servo1; int potentsiomeeter1 = A0; int positsioon1; Servo servo2; int potentsiomeeter2 = A1; int positsioon2; void setup() { servo1.attach(11); servo2.attach(10); } void loop() { positsioon1 = analogRead(potentsiomeeter1); positsioon1 = map(positsioon1, 0, 1023, 0, 180); servo1.write(positsioon1); delay(15); positsioon2 = analogRead(potentsiomeeter2); positsioon2 = map(positsioon2, 0, 1023, 0, 180); servo2.write(positsioon2); delay(15); }
10.6 Lisa—servo testimiseks
Enne kui asute servot sisaldavale vooluahelale programmi kirjutamist lõpetama, pange sellesama programmi abil korraks oma servod proovile—vaadake, kas nad ka on võimelised ilma värina ja surinata toimetama—pöördeulatus võib osutuda testi järel üsna ahtakeseks.
//peale järgneva programmi edukalt Arduinole laadimist pange käima ka Serial monitor #include <Servo.h> int servoPositsioon = 0; /* sellesse muutujasse salvestame positsiooni, mille anname Serial monitori kaudu... */ int servoDigitaalViik= 11; //vt kuhu ühendasid servo signaaljuhtme, minul nr 11 viik Servo testitavServo; //objekti testitavServo loomine void setup() { Serial.begin(9600); testitavServo.attach(servoDigitaalViik); } void loop() { Serial.println("A) sisesta servo liigutamiseks lõpp-positsiooni tähistav number"); Serial.println("B) seejärel vajuta Enter"); while (Serial.available()==0) { //ootab kuni sisestate pööret tähistava numbri } servoPositsioon = Serial.parseInt(); //salvestame muutujasse positsiooni { testitavServo.write(servoPositsioon); //saame näha, mis Servo teeb... kas antud servopositsioon nurgast hakkab surisema ja tõmblema Serial.println("Kui praegu suriseb, siis anna kiirelt uus number keskemalt--ära lase servol alatalitleda"); delay(50); //igaks juhuks pigem andke servole veel täiendavalt aega } }
Kui nüüd selle programmiga servo testimise tagajärg on sarnane sellega, mis juhtus antud tunni kirjeldamisel minuga, siis olete ka kogemuse võrra rikkamad: keegi ei ole veel saanud robootikat selgeks nii, et detailidega üldse probleeme poleks olnud.