Controlul independent al mai multor servoare

Seria de articole: Programarea Arduino de la zero # 5

Serie de articole: Arduino, utilizarea servo-drive-urilor # 2

Am învățat să schimbăm poziția servo-ului, însă acest control are câteva dezavantaje. Să încercăm să conectăm două servere în paralel și să realizăm mișcarea lor sincronă.







Controlul independent al mai multor servoare

Rezultatul programului este puțin diferit de ceea ce avem nevoie. Transmisiile servo nu se mișcă sincron, a doua pornește numai după prima. Faptul este că comanda delay () oprește executarea tuturor acțiunilor pentru un anumit timp. Iar al doilea ciclu nu va începe până când primul nu este finalizat. Cel mai simplu, la prima vedere, soluția simplă este de a da o comandă ambilor servo-uri în același ciclu:

Dar, în acest caz, serverele se pot mișca doar cu aceeași viteză, ceea ce nu este întotdeauna cazul. Avem nevoie de o opțiune mai universală, cu un management complet independent. Prin urmare, în loc să folosiți întârzierea, este util să folosiți temporizatoarele.







Puteți vedea că folosim variabila nesemnată lungă pentru numărarea timpului. Acest lucru se datorează faptului că tipul int poate stoca numere de la -32 768-32 767. După cum ne desfășurăm activitatea în milisecunde, apoi, după 32.67 secunde de la începutul programului nu se mai poate folosi pentru a stoca int numărătoarea inversă. În caz contrar, comportamentul programului va deveni imprevizibil. Dar, de tip lung poate stoca deja un număr -2147483648-2147483647, și excluzând marca unsigned long - de la 0 la 295. 4294967 adică valoarea maximă timer - 4,294,967 secunde, sau aproape 49 zile . Nu cred că programul nostru va funcționa atît de mult fără o pauză

Cea mai ușoară cale este să utilizați funcția millis (). Această funcție returnează timpul scurs de la pornirea programului, cu o precizie de o mie de secundă. Adăugați la bucla funcției () o interogare a timpului curent. Vom efectua acțiunea dorită - rotiți servo - numai dacă a trecut un anumit timp de la sondajul precedent

La prima vedere, nimic nu sa schimbat, servo-ul își schimbă poziția în 1.8 secunde. Acum conectăm două servoare

Singurul lucru care trebuie luat în considerare este că, la intervale mici, și un număr mare de operații efectuate în funcția buclă () a frecvenței apelului poate fi mai mare decât un interval predeterminat. Corespunzător, acțiunea nu va avea loc după ora specificată, dar numai pentru bucla de apel următor () se poate produce astfel de situație, de exemplu, în timp ce se retrage în mod continuu textul prin Serial.print (). Nu este recomandat să puneți această funcție în buclă (). Și dacă avem nevoie să transmitem în mod continuu unele informații, putem limita frecvența în același mod ca și pentru mișcarea servo-urilor:

Acum ne-am asigurat ca servii sa indeplineasca toate actiunile in mod independent. În paralel cu mișcarea, puteți continua să executați programul și să efectuați orice alte acțiuni







Articole similare

Trimiteți-le prietenilor: