perjantai 30. kesäkuuta 2017

SERVO I

Odotin itse tässä jo olevan sarjaliikenne kutosen, mutta usein eteen on tullut uusia kynnyksiä, joten siirtyköön se tuonnemmaksi muutaman yksinkertaisemman sovelluksen vuoksi.

Nykyisissä pienoismalliservoissa on jo itsessään varsin kehittynyt ohjaus- ja valvontatoteutus. Ennen (vuosia, vuosia sitten) asennon tieto tuli ohjausyksikölle potentiometrillä muodostettuna tasajännitteenä. Nyt ohjaus toteutetaan ohjauspulssin kestoajalla. Yksi (1) millisekunti vastaa servon asentoa nolla (0) astetta ja 2ms vastaa 180 kulma-astetta. Noiden keskiarvo 1,5ms luonnollisesti 90 asteen kulmaa. Uusi asentotieto lähetetään tyypillisesti 20ms välein. Servon oma elektroniikka huolehtii lopusta.
   Tämä ohjelma on hyvin yksinkertainen. Siinä on kaksi for-looppia. Toinen kasvattaa kulma-arvoa, ja saavutettuaan suurimman arvon, hyppää ohjelma toiseen for-looppiin, missä kulma-arvo pienennetään. Tämän jälkeen pääohjelma aloittaa alusta ja sama toistuu. Suomen lippu heiluu edestakaisin. Paremman käsityksen lipituksesta saa videosta: antinarduvideo44.youtube.com
Nämä kulma-arvot välitetään kirjasto-ohjelmalle <Servo.h>, mikä on koko toiminnan sydän ja oleellisin osuus. Tuo kirjasto-ohjelma osaa pilkkoa tuon millisekunnin (välin 1 – 2ms) tarvittavaan 180 osaan.
   Itse fyysisessä servoyksikössä on ainoastaan kolme johtoa; musta miinus, punainen +5V ja jonkun muun värinen ohjausjohto (olen törmännyt sekä valkoiseen että keltaiseen johtoon). Tässä Suomen lippua heiluttava servo ottaa asentoa muuttaessaan yli 400mA, joten ulkoisen 5V:n virtalähteen käyttö on suositeltavaa.

Itse ohjelma koostuu kirjasto-ohjelman liittämisestä #include <Servo.h>, servomuuttujan määrittelystä Servo kone ja asetusosassa servon liittäminen läntöpinniin 9 kone.attach(9).

OHJELMA 44
/*******************************
* Ohjelma 44
* 30.6.2017
* Suomi-servo
*/
#include <Servo.h> // Servon kirjasto-ohjelma

Servo kone; // Kehittää servo-objektin
int kulma = 90;

void setup() {
    kone.attach(9); // Arduino pinni
    Serial.begin(9600);
}

void loop() {
    for(kulma = 90; kulma < 180; kulma += 1){
       kone.write(kulma);
       delay(20);
    } // for-looppi loppu
    for (kulma = 180; kulma >= 90; kulma -= 1){
       kone.write(kulma);
       delay(20);
    } // for-looppi loppu

}//Pääohjelma Loppu