Servomootor

## Tingmärk

Servo skeem

**Servomootor on tagasisidega mootor -** see tähendab, et servomootorit juhtides antakse signaaliga ette positsioon, kuhu tahetakse mootor keerata ja mootor püüab seda positsiooni siis hoida. Kui mootor oma signaaliga etteantud positsioonist välja viia, siis ta hakkab koheselt ennast tagasi õigesse - “tasakaalu” asendisse viima, käitudes sarnaselt vedrule. **Servomootor ei võimalda pidevat pöörlemis, vaid liikumist teatud nurgas.**

Robootikas  on  servomootori  rakendusteks  peamiselt  robotite jäsemed jms. erandiks on **modifitseeritud servomootor**, mis võimaldab ka pidevat pöörlemist, st. selliseid saab kasutada ka rataste veomootoritena. Servomootorite eelisteks on suur erivõimsus (ehk võimsus oma suuruse kohta), neid on lihtne juhtida, ei ole tarvis ehitada jõuelektroonikat,
piisab servomootori ühendamisest otse mikrokontrolleri jalale.

## Servomootori ehitus

Servomootor koosneb:

* Tavaline alalisvoolu (DC) mootor
* Käigukast (ülekanne), mis vähendab kiirust, kuid suurendab jõudu
* Tagasiside andur, milleks on harilikult potentsiomeeter
* Juhtimiselektroonika

Kui tagasiside potentsoimeetrilt tulev pinge ja signaalist saadav pingel on erinevad, siis seda erinevust võimendatakse vastupidises suunas, nii et mootor hakkaks keerama. Mootor keerab ennast nii kaua kuni jõuab punkti, kus pinged saavad võrdseks, siis saab pinge mootoril nulliks ja mootor jääb seisma, kui nüüd signaali muuta või mootor jõuga oma tasakaalu asendist välja keerata, siis rakendub koheselt tasakaalustav pinge, mis püüab mootorit õigesse asendisse pöörata. Mida suurem on hälve õigest positsioonist seda suurem on ka pinge mootoril, ehk seda suurema jõuga ja kiiremini keeratakse, seega on see väga sarnane vedrule.

## Servo ühendamine

Tavalisel servomootoril on 3 ühendusjuhet:

1. Must/Pruun - Maandus ehk Ground
2. Punane - +5V toide ehk toitepinge positiivne klemm
3. Valge/Oraanž - Signaali juhe, juhtimiseks kasutatakse mikrokontrolleri PWM väljundit

## Servomootori juhtimine

Praktikas ei juhita servomootorit mitte analoog pingega, vaid digitaalse **PWM** (*pulse width modulation* ehk impulsi pikkuse/täiteteguri modulatsioon) signaaliga. See tähendab et mootori signaali otsale antakse kindla aja järel impulsse, mille pikkus määrab ära, millise nurga servomootor võtab.

### Impulsid

Üldlevinud on servod, millele tuleb impulsse anda iga **20ms** järel ja impulsi pikkus on **1-2ms**, mis siis määrab positsiooni ligi **180 kraadises nurgas** (nurk varieerub veidikene sõltuvalt tootjast, nii et seda tuleb konkreetsel juhul uurida)

### Arduino servo juhtimine

Arduino-ga servo juhtimine on imelihtne, kasutades Servo.h teeki on kasutajal vaja määrata ainult, mis kraadi peale peab servomootor minema, ülejäänud teeb ära juba teek ise.

## Servomootori testimine ja analüüs

Sellel näidisel saame testida digitaalset servomootori juhtimist ning ma manuaalset (potensiomeetri abil)

    Arduino servomootori näidis koodi leiab Arduino IDE näidete hulgast ning toon need välja ka all.

Koodi näidis

```
//Nädis Knob, potensiomeetriga

#include <Servo.h>

Servo myservo;  // loob servo objekti

int potpin = 0;  // analoog potensiomeetri pin
int val;    // muutuja mis loeb potensiomeetri andmeid

void setup() {
  myservo.attach(9);  // servo ühendamine pin 9
}

void loop() {
  val = analogRead(potpin);            // loeb pot väärtust 0-1023
  val = map(val, 0, 1023, 0, 180);     // muudab eelnev väärtuse 0-180
  myservo.write(val);                  // viib servo vastavasse asendisse
  delay(15);                           //
}

```

Koodi näidis 2

```
//Nädis Sweep, keerleb

#include <Servo.h>

Servo myservo;  // loob servo objekti

int pos = 0;    // nurga positsiooni muutuja

void setup() {
  myservo.attach(9);  // Ühendab servo pin 9
}

void loop() {
  for (pos = 0; pos <= 180; pos += 1) { // nurk muutub 0 kraadi võtta kuni 180
    myservo.write(pos);              // servo liigu vastava kraadi peale
    delay(15);                       // ooteaeg
  }
   for (pos = 180; pos >= 0; pos -= 1) { //nurk muutub 180 kraadi võtta kuni 0
    myservo.write(pos);              // servo liigu vastava kraadi peale
    delay(15);                       // ooteaeg position
  }
 }

```

### Analüüs

Analüüsi antud koodi

* Mis juhtub kui ületada 180 kraadi servol
* Kuidas muuta servo liikumise kiirust
* Kuidas keerata servomootor kindlasse asendisse
* Kas servomootorid suudab ringelda