Krmiljenje več servo motorčkov istočasno

Servo motor:

Servo motorji so samostojne električne naprave, ki premikajo in obračajo dele strojev s precizno natančnostjo. Najdemo jih skoraj povsod, od igrač do avtomobilov. Poleg vezic za napajanje je srce servo motorja majhen enosmerni motor, kateri se vrti pri visokih obratih. Ker ima zelo malo navora, ima zraven zobniški prenos, ki visoke obrate z malim navorom pretvori v počasne obrate z velikim navorom. Motor vsebuje še elektronsko vezje na tiskani ploščici, kjer se nahaja senzor. Ta prepozna za koliko se je zavrtela gred motorja. Gred motorja se lahko premika v obsegu 180°, od -90°do +90°. Pozicija gredi motorja je odvisna od dolžine impulza na priključku za signal, frekvenca teh impulzov pa je okoli 50 Hz. Položaj gredi torej določamo s PWM impulzi, ki trajajo od cca. 0,7 ms do 2 ms. Dolžina impulzov PWM signala od 0,7 ms do 1 ms zavrtijo gred servo motorja v smeri urinega kazalca, dolžine od 1,7 ms do 2 ms pa gred zavrtijo proti smeri urinega kazalca. Pri standardnem servo motorju dolžina impulzov PWM signala 1,5 ms zavrtijo gred v položaj sredine.

Slika 1: Zasuk servo motorčka v odvisnosti od PWM impulzov

Mi želimo istočasno krmiliti več (v našem primeru 10) servo motorčkov. Priključili jih bomo od 3 do 12 pina razvojne plošče Arduino Uno. S trimer potenciometroma vrednosti 10 kohm bomo spreminjali kot zasuka (analogni vhodA1) in hitrost vrtenja (analogni vhod A0) vseh servo motorčkov. S stikalom, priključenim na pin 2 vklopimo oziroma izklopimo delovanje. Zaradi tokovne porabe servo motorčkov (vsak porabi cca 45 mA), jih bomo napetostno priključili na zunanji vir napetosti (adapter).

Program za krmiljenje 10-tih servomotorčkov istočasno:

/*

  Istočasno krmiljenje 10-tih servomotorčkov.

  Avtor: Milan Ivič

  Datum: dec. 2015

 */

 #include <Servo.h>        //Knjižnica za servo.

 #define Servo_motorcki 10                      //10 servo motorčkov, od pina 3 do pina 12.

 #define Pini_Servo_motorckov(i) (i+3)        //Od 3-tjega pina naprej.

 Servo Servoti[Servo_motorcki];

 #define Zmanjsaj -1

 #define Povecaj +1

 int Potenciometer_hitrost = A0;     //Potenciometer za spreminjanje hitrosti vrtenja.

 int Hitrost;

 int Potenciometer_zasuk = A1;     //Potenciometer za spreminjanje kota vrtenje.

 int Kot_vrtenja;

 int Vrednost_zasuk_pot;

 int Stikalo = 2;                       //Stikalo za vklop / izklop => Pin 2.

 int Smer_vrtenja = Povecaj;

 void setup()

 {

   for(int nServo = 0; nServo < Servo_motorcki; nServo++)

   {

     Servoti[nServo].attach(Pini_Servo_motorckov(nServo));           //Servo motorčki => Pin 2 do pin 12.

   }

 

   Serial.begin(9600);          //Serijska komunikacija, za kontrolo in prikaz delovanja.

 }

 void loop()

 {

   int Stanje_stikala = digitalRead(Stikalo);

   if(Stanje_stikala == HIGH)                            //S stikalom vklopimo delovanje.

   {

     Hitrost = analogRead(Potenciometer_hitrost);        //Branje vrednosti na A0 (hitrost).

     Hitrost = map(Hitrost, 0, 1024, 1, 40);             //Iz območja 0 do 1023 v območje od 1 do 40.

     delay(10);

 

     Vrednost_zasuk_pot = analogRead(A1);               //Branje vrednosti na A1 (kot vrtenja).

     Vrednost_zasuk_pot = map(Vrednost_zasuk_pot, 0, 1024, 1200, 2200);        //V območje od 1200 do 2200.

     Serial.println(Vrednost_zasuk_pot);

     Kot_vrtenja = Kot_vrtenja + (Smer_vrtenja * Hitrost);                     //Spreminjanje kota vrtenja.

     

     if(Kot_vrtenja >= Vrednost_zasuk_pot)

     {

       Kot_vrtenja = Vrednost_zasuk_pot;           //S potenciometrom (A1) spreminjamo kot vrtenja.

       Smer_vrtenja = Zmanjsaj;                    //Zavrti servo v desno (v smeri urinega kazalca).

     }

 

     if(Kot_vrtenja <= 800)

     {

       Kot_vrtenja = 800;                 //Inicializacija (800 us določimo skrajno desno lego servota).

       Smer_vrtenja = Povecaj;            //Zavrti servo v levo (proti smeri urinega kazalca).

     }

 

     for(int nServo = 0; nServo < Servo_motorcki; nServo++)            //Za vse servo motorčke.

     {

       //Položaj vseh je odvisen od vrednosti spremenljivke Kot_vrtenja:  

       Servoti[nServo].writeMicroseconds(Kot_vrtenja);

     }

   }

 }

Predprocesorska direktiva #define, imenovana tudi makro, zahteva od pravajalnika, da ob vsakem nizu ime_makra izvede zamenjavo z vrednost_makra. Namesto da bi neštetokrat pisali isto, napišemo enkrat in uporabljamo sinonim.

Servo motorčki so priključeni na pine 3 do 12. Na pin 2 je priključeno stikalo (s pull down uporom 10 kohm), s katerim vklopimo delovanje servo motorčkov.

V glavni zanki void loop() beremo vrednosti na analognih vhodih A0 in A1, kamor sta priključena trimer potenciometra vrednosti 10 kohm. 10-bitno vrednost A/D pretvornika (0 V - 5 V => 0 - 1024) pretvorimo v območje 1 - 40 za spreminjanje hitrosti vrtenja in v območje 1200 - 2200 za spreminjanje kota zasuka servo motorčkov. Vrednosti 1200 do 2200 nam v programu predstavljajo µs (mikro sekunde), saj za položaj servo motorčkov vpisujemo čas v µs.