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