tiistai 29. elokuuta 2017

SERVO III

Useampaakin servoa on mahdollista ohjata samanaikaisesti. Tällöin kirjastomoduuli (#include <Servo.h>) on käyttökelvoton, joten sitä ei tarvitse liittää mukaan ohjelmaan. Myös digitaalipinnin ohjauskäsky (digitalWrite()) on liian hidas tähän ohjaukseen. Nykyisiä servoja ohjataan pulssin pituudella, jolloin pulssin kesto 1 ms vastaa 0-asteen asentoa ja 2 ms vastaavasti 180 asteen asentoa. Muut pituudet siltä väliltä.
    Tässä ohjelmassa pulssin kestoajat on muodostettu viiveellä (delayMicroseconds(kesto us);). Jotta päästäisiin tarvittaviin nopeuksiin, ei voida ohjata lähtöbittiä suoraan, vaan suoraan kovopuolella lähtöbittiä käsittelevää kanavaa. Käskyt ovat (bitSet(PORTD,pinni); ja bitClear(PORTD,pinni);). Nuo käskyt eivät ole funktioita, vaan itse asiassa makroja, jotka ohjaavat toimintaa suoraan kovopuolella. Makro bitSet asettaa lähdön ykköseksi (1, +5V) ja bitClear luonnollisesti palauttaa lähdön nollaan (0). PORTD on se tavu, missä sijaitsee lähtöbittien 0 .. 7 ohjaukset. (Näistä hiukan enemmän seuraavassa osiossa.)
Tämä ei taida enää olla ihan viimeistä huutoa?
     Tässä sovelluksessa hain kokeilemalla kääntymäkulmien ääriarvot (pulssin pituuden arvot välillä 1 .. 2 ms), joiksi sain nolla (0) astetta noin 600 us ja 180 astetta noin 2500 us. Todellisia pulssien pituuksia en mitannut. Ainoastaan tarkastelin kääntymäkulmia. Miksi näyttäisi olevan noin paljon heittoa, en siis tiedä.
    Kokeilu ja ohjaus tapahtui siten, että muutin pulssin pituusarvoa ( Uin_Luku ) ja latasin ohjelman Arduinoon, jolloin latauksen mentyä molemmat servot kääntyivät samanaikaisesti.

OHJELMA 46
/*************************************
* Ohjelma Servo_46
* 29.8.2017
* Kahden servon samanaikainen ohjaus
*
*/

// Määrittelyt
   const int Con_Pinni1 = 3;
   const int Con_Pinni2 = 2;
   unsigned int Uin_Luku = 1500;

void setup() {
   pinMode(Con_Pinni1, OUTPUT);
   pinMode(Con_Pinni2, OUTPUT);
   Serial.begin(9600);
}// Määrittelyt loppu

void loop() {

   bitSet(PORTD,Con_Pinni1);
   delayMicroseconds(Uin_Luku);
   bitClear(PORTD,Con_Pinni1);

   bitSet(PORTD,Con_Pinni2);
   delayMicroseconds(Uin_Luku);
   bitClear(PORTD,Con_Pinni2);

delay(10);
}// Pääohjelma loppu

Ei kommentteja:

Lähetä kommentti