Jeffrey Cross
Jeffrey Cross

Arduino Servo knihovna: Úhly, Microseconds, a “volitelné” příkazové parametry

Minulou středu jsem strávil většinu dopoledne a část odpoledne pronásledováním anomálie signálu, která, jak se ukazuje, neexistovala. Neřekl bych zážitek plýtvání časem, ale zkušenost zabírala více času, než jsem si přála. Pokud jste se zajímali o celý příběh, popsal jsem tento účet v nástroji ToolGuyd (Osciloskop, signál Arduino Servo PWM a Wild-Goose Chase).

Výsledek - lepší základní pochopení Arduinovy ​​servo knihovny, o kterou se vám s tímto příspěvkem pokusím podělit. Mohlo by se to zdát jako začátečník, ale až do komplikací minulého týdne jsem používal Arduino servo knihovnu několikrát s lehkostí a předpokládanou odborností.

Arduino ServoWrite

Arduino servo knihovna usnadňuje ovládání serva s minimálním kódem a komplikacemi. Referenční stránka společnosti Arduino pro doménu ServoWrite příkaz, který čerpá z knihovny servo, nabízí následující příklad kódu:

#zahrnout Servo myservo; void setup () {myservo.attach (9); myservo.write (90); // nastavit servo na střední bod} void loop () {}

Tento ukázkový kód instruuje servo, spojené s pinem 9, aby se přesunulo do své střední polohy (90 °). U servomotoru s nepřetržitým otáčením se zastaví pohyb servopohonu.

V praxi se připojená serva přizpůsobí svým středovým polohám, ale možná ne přesně.

90 ° vs. 1500 mikrosekund

Nejběžnější serva přijímají vstupy od 1000 µs do 2000 µs, přičemž 1500 µs odpovídá střední poloze. Pro servo 0-180 ° by to bylo 90 °.

Dříve jsem používal knihovnu servo writeMicroseconds příkaz, který definuje přesnou šířku impulsu, kterou chcete poslat servo. Minulá středu začaly moje potíže, když jsem místo toho použilnapsat příkaz s parametrem 90 °.

Teoretickynapsat příkaz, který instruuje servo, aby se nastavilo na 90 °, by měl poslat stejné impulsy jako awriteMicroseconds příkaz, který vysílá 1500 µs pulsů. To znamená, psát (90) a writeMicroseconds (1500) oba by měly vysílat 1500 µs pulsů. Ale jak se ukazuje, tento předpoklad může vést k problémům.

Nahrál jsem následující kód do mého Uno a analyzoval signály osciloskopem.

#zahrnout Servo servo1; Servo servo2; Servo servo3; void setup () {servo1.attach (3); servo2.attach (4); servo3.attach (5, 1000, 2000); servo1.write (90); // nastavit servo na střed (90 °) servo2.writeMicroseconds (1500); servo3.write (90); // nastavit servo na střed (90 °)} void loop () {}

Zde je to, co vypadaly výstupy pinů 3, 4 a 5, shora dolů:

  • Kolík 3, zaslán do 90 °: 1,472 ms
  • Pin 4 poslal 1500 µs puls: 1.500 ms
  • Kolík 5, zaslán do 90 °: 1.500 ms

Šířky pulsu byly měřeny pomocí vestavěného softwaru osciloskopu, ale ruční měření bylo v souladu.

Rozdíl mezi 1472 µs a 1500 µs je velmi malý a nemusí být ani dostačující k tomu, aby byl rozdíl v poloze serva. Zde je zachycení obrazovky digitálních pulzů, přičemž měření jsou uvedena vpravo dole.

Ale stále je to měřitelný rozdíl:

Když se podíváte na signálservo3, který také nasměruje servopohon do polohy 90 °, měli byste vidět, že šířka pulsu je 1500 µs, stejně jako uservo2, pro který je puls označen jako 1500 µs.

Příkaz, psát (90), je stejný pro první a třetí servo signál, tak proč jeden poslat 1,472 ms pulsy a další 1,500 ms?

Arduino ServoAttach

Odpověď spočívá naServoAttach příkaz. Referenční stránka Arduina uvádí dvě formy příkazu:

servo.attach (pin) servo.attach (pin, min, max)

První verze je minimální kód, který musí skica určit i / o pin pro servo řízení. Druhý zahrnuje dva velmi důležité, alevolitelný parametry, které určují minimální a maximální rozsahy šířky impulsu pro skicu.

V obou připojit a příkazové řádky servo knihovny, jasně uvádí, že výchozí min a max nastavení je 544 a 2400 µs.

„Volitelné“ Limity šířky impulsu

Pokud jste, stejně jako já, zvyklí používatwriteMicroseconds místo namístonapsat, pak možná nebudete dávat mnoho myšlenky na minimální a maximální parametry šířky pulsu. Ale pokud použijetenapsat příkazy a nastavení poloh serva s úhly a stupni, pak zvažte explicitně definování těchto parametrů ve vašich náčrtcích Arduino.

Když se podívám znovu na můj příkladový kód, pro třetí servo signál překonám výchozí limity šířky impulsu 1000 a 2000 µs. To je důvod, proč první a třetí servo signály vysílaly různé impulsy pomocí stejných příkazů.

servo3.attach (5, 1000, 2000);

Kromě potenciálu pro mírně mimo středové signály, servo nemusí předvídatelně interpretovat šířky pulsů nad nebo pod limity, pro které byl určen. Podpětí a nadlimitní impulsy mají také potenciál poškodit servo.

Pokud je servopohon 0-180 ° navržen tak, aby reagoval na 1000-2000 µs pulsů, interpretuje 1000 µs jako „0 °“ a 2000 µs jako „180 °“. Ale s výchozím rozsahem šířky pulsu 544-2400 µs, Arduino vyšle signál ~ 1000 µs pro úhel 44 °. Zametání od 1000 do 2000 µs by se pak pouze promítlo na ~ 90 ° otočení ramena servopohonu namísto úplného otočení o 180 °. Tomuto problému a dalším potenciálním problémům se lze vyhnout, pokud se místo úhlů ve stupních použijí mikrosekundy, nebo pokud jsou volitelné parametry šířky podlahy a stropu pulzní šířky definovány v nastavení pinů pro každé servo.

I když se cítím poněkud hloupě, když jsem strávil pár hodin snahou rozluštit nečekaný signál 1,472 ms a vyřešil, zda je můj nový osciloskop vadný, mám pocit, že nejsem jediný, kdo bere Arduino knihovny za samozřejmost. Chvíli jsem se na kód zřejmě díval, ale poté, co jsem ho na chvíli použil s předvídatelnými výsledky, jsem prostě zapomněl, že to není kouzelná černá skříňka, která dělá serva jednodušší. Podívejte se buď na knihovnu nebo na stránku Arduinapřipojit velení by mi zachránilo nějaké potíže, ale nemyslel jsem ani na to.

Při příštím spuštění serva nepředvídatelně v novém projektu zkontrolujte, zda jste v nastavení pinů nastavili limity šířky pulsu. Možná to bude tak jednoduché.

Stuart Deutsch píše více o nástrojích a tématech workshopů v ToolGuyd.

Podíl

Zanechat Komentář