Stránka 1 z 1

servo ovládané senzorem s použitím millis

Napsal: 02 led 2025, 17:59
od Mata
Ahoj všem.Už několik dní se snažím ovládat servo po spuštění tlačítkem,při zapnutí doleva,při vypnutí doprava,ale bez použití delay,takže millis,protože chci do budoucna ovládat i jiné věcí.
Jde mi hlavně o to aby se pohybovalo mnou určenou rychlostí,což nemůžu docílit.Funguje mi to pouze když podržím tlačítko a resetartuji Arduino.Prosím tedy o radu,snad jsem to vysvětlil srozumitelně ;)
Zde je kod:

Kód: Vybrat vše

# include <Servo.h>
Servo myservo;
unsigned long MOVING_TIME = 1500;
unsigned long moveStartTime;
const int cidlo1 = 13;
int startAngle = 0;
int stopAngle  = 40;
void setup() {
  myservo.attach(9); 
}
void loop() {  
if (digitalRead(cidlo1) == LOW) { 
unsigned long progress = millis()-  moveStartTime;
  if (progress <= MOVING_TIME) {
    long angle = map(progress, 0, MOVING_TIME, stopAngle, startAngle);
    myservo.write(angle);   
  }
 }
 else {
unsigned long progress = millis()-  moveStartTime; 
  if (progress <= MOVING_TIME) {
    long angle = map(progress, 0, MOVING_TIME, startAngle, stopAngle);
    myservo.write(angle);   
  }
 }  
}

Re: servo ovládané senzorem s použitím millis

Napsal: 02 led 2025, 18:18
od kiRRow
a teď to vysvětlit arduinu ... třeba nikde na začátku toho pohybu serva nezaznamenáváš moveStartTime ... to se děje jen po startu programu, což i vysvětluje proč to funguje jen po resetu, kdy millis() je natolik nízké, že když od něj odečteš nulu, tak progres bude stále menší nebo roven MOVING_TIME

a jak se to má chovat v nedefinovaných situacích ? ... třeba stisknu, ono se to začne hýbat, ale co to má udělat, když stisk uvolním dříve než to doběhne ? ... má se vrátit okamžitě ?, nebo dojít na cílovou pozici a pak se vrátit na počátek ?

Jinak rychlost servomotoru pak řídíš tím jak často a po jak velkých krocích mu měníš jeho polohu ... hodně často a v malých krocích, pojede to servo pomalu, ale hladce ..... málo a velké kroky budou vést k rychlým, ale trhaným pohybům ... k něčemu je lepší to a k něčemu jinému tamto.

A právě jsi dospěl k bodu, kdy budeš muset trošku ten program přeškatulkovat ... krok č1) ... načíst stav tlačítka, porovnat ho s předchozím stavem tlačítka a tím vyhodnotit jesli je stisknuto, drženo, uvolněno, nestisknuto ... to využít v kroku č2) kdy za určitého stavu tlačítka a pomocí toho že si pamatuji kde motor je, tak vypočtu co chci v dalším kroku udělat .... krok č3) spustit akci kterou chci vykonat .... krok č4) upgradovat stav millis a skočit na začátek programu ........ (krok č4, lze i nahradit krokem č0, stím že na začátek programu bude skákat až krok č3)

Re: servo ovládané senzorem s použitím millis

Napsal: 02 led 2025, 19:01
od kiRRow
zkráceně ... načíst (senzory + předchozí výsledek), spočítat, vykonat, uložit výsledek

Re: servo ovládané senzorem s použitím millis

Napsal: 02 led 2025, 21:00
od Caster
Použij knihovnu servo.h
Další inspirace v článku How to Control Servo Motors with Arduino – Complete Guide ;)

Re: servo ovládané senzorem s použitím millis

Napsal: 04 led 2025, 16:13
od jankop
kiRRow píše:
02 led 2025, 18:18
a teď to vysvětlit arduinu ...
:lol: :lol: :lol:

Re: servo ovládané senzorem s použitím millis

Napsal: 07 led 2025, 15:38
od luger
Já používám knihovnu VarSpeedServo, jede na pozadí a má docela slušné funkce.