Ovládání serva - nastavení krajních poloh - snížení rychlosti
Napsal: 15 pro 2019, 16:00
Vymýšlím, jak ovládat několik serv na sobě nezávisle tak, abych pro každé mohl nastavit krajní polohy a rychlost pohybu. Nejjednodušeji si to představte jako ovládání závory na modelovém kolejišti. Přepínačem se dvěma polohami přepínám polohu závory nahoře / dole. Abych se nemusel moc trápit s mechanickým provedením, chci si krajní polohy nastavit a to nejlépe potenciometrem/potenciometry (ne v programu arduina). A ještě je potřeba pohyb závory zpomalit protože pohyb standardního serva je ve srovnání s pohybem závory sakra rychlý. Kdybych chtěl být hračička, tak pohyb závor nebývá jen z jedné krajní polohy do druhé, ale vlivem setrvačnosti s sebou závora při dojezdu do krajní polohy trochu zacuká (při dojezdu na konec se zarazí, zakýve a postupně se pohyb zastaví).
Ještě je potřeba zachovat polohu závor při opětovném zapnutí celé elektroniky, aneb v nějaké poloze přepínačů celou elektroniku vypnu a když ji znovu zapnu mělo by vše (všechny závory) zůstat v polohách jak jsou, ne že se po zapnutí všechny začnou hýbat.
Program je bez řešení rychlosti pohybu jednoduchý, vlastně jeden z těch úplně základních vzorových:
#include <Servo.h>
Servo myservo; // create servo object to control a servo
int potpin = 0; // analog pin used to connect the potentiometer
int val; // variable to read the value from the analog pin
void setup() {
myservo.attach(9); // attaches the servo on pin 9 to the servo object
}
void loop() {
val = analogRead(potpin); // reads the value of the potentiometer (value between 0 and 1035)
val = map(val, 0, 1035, 0, 180); // scale it to use it with the servo (value between 0 and 180)
myservo.write(val); // sets the servo position according to the scaled value
delay(15); // waits for the servo to get there
}
Nenapadá mě, jak do pohybu včlenit ještě to zpomalení. Jsou sice dostupné knihovny, které pohyb serv řeší komplexněji, ale nyní bych raději vystačil jen s tou knihovnou Servo.h
Nakonec úvaha: Jestliže mám na Arduinu 6 analogových vstupů, tak to znamená, že mohu mít max 6 na sobě nezávislých okruhů pro zmíněné závory, je tak?
Alternativně lze vynechat nastavování jedné krajní polohy s tím, že ji nastavím mechanicky a pohyb (výchylku serva) si doladím jen v druhé krajní poloze.
Ještě je potřeba zachovat polohu závor při opětovném zapnutí celé elektroniky, aneb v nějaké poloze přepínačů celou elektroniku vypnu a když ji znovu zapnu mělo by vše (všechny závory) zůstat v polohách jak jsou, ne že se po zapnutí všechny začnou hýbat.
Program je bez řešení rychlosti pohybu jednoduchý, vlastně jeden z těch úplně základních vzorových:
#include <Servo.h>
Servo myservo; // create servo object to control a servo
int potpin = 0; // analog pin used to connect the potentiometer
int val; // variable to read the value from the analog pin
void setup() {
myservo.attach(9); // attaches the servo on pin 9 to the servo object
}
void loop() {
val = analogRead(potpin); // reads the value of the potentiometer (value between 0 and 1035)
val = map(val, 0, 1035, 0, 180); // scale it to use it with the servo (value between 0 and 180)
myservo.write(val); // sets the servo position according to the scaled value
delay(15); // waits for the servo to get there
}
Nenapadá mě, jak do pohybu včlenit ještě to zpomalení. Jsou sice dostupné knihovny, které pohyb serv řeší komplexněji, ale nyní bych raději vystačil jen s tou knihovnou Servo.h
Nakonec úvaha: Jestliže mám na Arduinu 6 analogových vstupů, tak to znamená, že mohu mít max 6 na sobě nezávislých okruhů pro zmíněné závory, je tak?
Alternativně lze vynechat nastavování jedné krajní polohy s tím, že ji nastavím mechanicky a pohyb (výchylku serva) si doladím jen v druhé krajní poloze.