Servo je řízené přes Arduino Pro mini, do kterého vstupuje běžný PWM servosignál a servo se v neutrálu nehýbe, při výchylce se rozjede na příslušnou stranu a to tím rychleji, čím je výchylka od neutrálu větší.
Může se hýbat opravdu velmi pomalu až pak poměrně fofrem.
Buďte shovívaví, kód psal strojař
.
Kód: Vybrat vše
// rizeni serva jako hydraulika
#define input 2 // vstup PWM
#define output 4 // vystup PWM
#define led 13 // pin LED
const int hystereze = 30;
const int neutral_uS = 1500;
const int min_uS_in = 850;
const int max_uS_in = 2150;
const int min_uS_out = 450;
const int max_uS_out = 2350;
const int start_uS = 1800;
float out_uS;
float cislo;
long int new_uS;
void setup() {
pinMode(led, OUTPUT); // LED
pinMode(input, INPUT_PULLUP); // input PWM
pinMode(output, OUTPUT); // output servo
out_uS = start_uS;
puls();
delay(20);
attachInterrupt(0, puls_start, RISING);
}
void loop() {
delay(10);
}
void puls_start() {
new_uS = micros();
attachInterrupt(0, puls_end, FALLING);
}
void puls_end() {
new_uS = micros() - new_uS;
vypocet();
puls();
attachInterrupt(0, puls_start, RISING);
}
void vypocet() {
new_uS = min(new_uS, max_uS_in);
new_uS = max(new_uS, min_uS_in);
cislo = new_uS - neutral_uS;
if (abs(cislo) > hystereze) {
digitalWrite(led, HIGH);
cislo = cislo / 60;
cislo = cislo * cislo;
if (new_uS < neutral_uS) cislo = - cislo;
out_uS = out_uS + cislo;
out_uS = min(out_uS, max_uS_out) ;
out_uS = max(out_uS, min_uS_out) ;
}
else {
digitalWrite(led, LOW);
}
}
void puls() {
digitalWrite(output, HIGH);
delayMicroseconds(out_uS);
digitalWrite(output, LOW);
}