czech english

Hexapod 2.díl

jak na řadič 16ti modelářských servopohonů

V tomto článku popíšeme návod na vyhotovení servodriveru, který je schopný pracovat až s 16ti modelářskými servopohony najednou. Je možné jej ovládat pomocí běžné sériové linky, s dodatečnými úpravami v řídícím programu i přes sběrnici I2C (resp. TWI). Deska byla vyvinuta s důrazem na jednoduchost a možnost postavit si ji v domácích podmínkách. S tímto servodriverem budete schopni za pomoci různých stavebnic postavit šestinohého chodícího robota, robotickou ruku, či jinou hračku.

řadič servopohonů
řadič servopohonů
Modelářské servo je levný a nenáročný pohon, schopný natočení rotoru pod úhlem specifikovaným pomocí modulovaného signálu. Je vhodný pro použití všude tam kde je zapotřebí pozicovat. Běžné servo je složeno z malého stejnosměrného motorku, převodovky, zpětnovazebního odporového snímače natočení a řídící logiky. Servo bývá připojeno třemi vodiči – napájecími vodiči a jedním řídícím signálem.
Ovládací signál je modulovaný s nepříliš kritickou periodou 20ms, průběhem připomínající pulzně-šířkovou modulaci - PWM. Každých 20ms musí obsluha serva vygenerovat impulz o délce 1 – 2 ms. První milisekunda slouží pro inicializaci a délka impulsu v druhé milisekundě odpovídá informaci o natočení rotoru. Jak napovídá Tabulka 1, existuje přímá úměra mezi natočením a délkou řídícího impulsu.
Trvání impulsu [ms] Natočení rotoru [°]
1,00 ms -180°
1,25 ms -90°
1,50 ms
1,75 ms 90°
2,00 ms 180°
Tabulka 1 – Přímá úměra mezi řídícím impulsem a natočením rotoru.
Tabulka je teoretická, maximální úhel natočení je dán typem serva a často je maximálně ±90° stupňů. V takovém případě jsou využitelné impulsy o rozsahu od 1,25 do 1,75ms pro natočení od –90° do +90°.

Řízení servomotorů

Mikrokontrolér vysílá signál pro natočení všech serv sériově v čase po jednom vodiči a zároveň generuje na výstupech čtyrbitovou adresu serva, kterému patří aktuálně vysílaný signál. Demultiplexer ze 4 na 16 (CMOS 4067) poté přidělí dle adresy vlastní signál ke každému servu. Takto je možné ovládat až 16 servomotorů najednou a bez žádné speciální, či složité elektroniky.

Komunikace a ovládání servodriveru

Servodriver využívá komunikační standard EIA RS-232c, který pochází z 70. let minulého století a představuje fyzickou komunikační vrstvu obecně známou jako sériová linka. Definuje, jak by sběrnice měla fyzicky vypadat a jakým způsobem po ní přenášet data. Neřeší dále vyšší vrstvy – režii komunikace a vlastní protokol, tj. co přenášená data pro připojená zařízení znamenají. Tento obvod komunikuje asynchronně s parametry 4800Bd, 8 bitů, bez parity, 2 stopbity.
Použitý protokol pro komunikaci se softwarově nadřazeným zařízením byl maximálně zjednodušen. Jde o čistě jednosměrnou komunikaci ze strany nadřazeného zařízení. Nadřazené zařízení je cokoliv se sériovým portem – od mobilního telefonu až po počítač. Každý datový paket začíná hodnotou 0xFF (255), kterou nastavíme ukazatel v datové paměti na první servo. Každý další přijatý bajt je považován za žádanou hodnotu natočení toho motoru, na který ukazuje vnitřní adresní ukazatel. Tento ukazatel je zároveň po uložení žádané hodnoty inkrementován.
Žádaná hodnota natočení servomotoru je očekávána jako číslo v rozsahu 0-200, které vyjadřuje násobek 10μs. Například hodnota 125 znamená 125*10μs =1,25ms, tedy natočení -90°.
Typickým příkladem jak nastavit úhly natočení všech motorů, je odesláním balíku dat o velikosti 17 bajtů, kde první bajt je nutně roven hodnotě 0xFF a další bajty určují natočení rotoru jednotlivých servomotorů.
Másledující tabulka ukázuje typické nastavení všech 16ti servomotorů. M1 až M16 jsou jednobajtové hodnoty natočení pro servomotory 1 až 16.
0xFF M1 M2 M3 M4 M5 M6 M7 M8 M9 M10 M11 M12 M13 M14 M15 M16

Algoritmus generování impulsů pro serva

Algoritmus pracuje s časovou základnou 10μs – tj. každých 10μs nastane uvnitř mikrokontroléru přerušení. Mikrokontrolér má v paměti SRAM uložené hodnoty natočení pro všechny servomotory vyjádřené jako násobek 10μs. Například hodnota 105 pro daný motor znamená vygenerování intervalu dlouhého 1,05ms pro rotor přibližně v poloze -170°. Tento způsob není příliš efektivní, přesto je program velice jednoduchý a nároky na mikrokontrolér nepřekračují jeho možnosti.
Vždy, když nastane přerušení časové základny, je přičtena jednička k hodnotě osmibitového registru, který počítá čas generovaného impulzu. Poté je hodnota čítače porovnána s hodnotou žádanou a v závislosti na výsledku tohoto porovnání je nastaven stav na výstupu.
Dále algoritmus zkontroluje přetečení čítače. Maximum pro běžné modelářské servo jsou 2ms – odpovídá hodnotě 200 v čítači. Pokud je hodnota menší než 200, čítač nepřetekl a obsluha přerušení ukončí.
Pokud čítač přetekl, program přejde na další servomotor. Přičte se jednička k hodnotě v registru, který obsahuje adresu servomotoru a vynulují se vyšší čtyři bity v tomto registru. Tím se zajistí že hodnota v adresním registru bude rotovat v rozsahu 0 až 15. Poté se vynuluje časový čítač a pro nové servo se z datové paměti načte nová žádaná hodnota natočení. Vše je přehledně rozkresleno na diagramu.
Popsaný algoritmus má jedno omezení, jak bylo uvedeno výše, servomotoru se musí posílat signál o délce 1 až 2 ms s periodou 20ms. Jelikož lze v jednom okamžiku ovládat jen jeden ze 16ti servomotorů, dosahuje řídící signál každého motoru periody 32ms! Každé servo je adresováno přesně 2ms, pro 16 servomotorů je tedy 16  2ms = 32ms.
Tento nedostatek lze vyřešit úpravou řídícího programu - omezením max. počtu ovládaných servomotorů na 10. Předepsaná perioda 20ms u modelářských servomotorů není kritická a proto není pravděpodobné že Vaše servo nebude fungovat s tímto řadičem. Jiným důsledkem prodloužení periody je snížení obnovovací frekvence serva z 50Hz na přibližně 28Hz. V praxi se to může projevit větším „cukáním” rotoru při zatížení. Tento jev způsobuje logika serva, která se snaží vyrovnat hodnotu ze zpětné vazby v delších intervalech – vyrovnává větší odchylku. V běžném provozu se tento efekt prakticky neprojeví. Výhody zapojení jsou zřejmé – nízká výrobní cena a jednoduchost jak plošného spoje, tak řídícího programu. Vše na úkor snížení délky periody.

Elektronika

Obvod je možné rozdělit na část, která upravuje napěťové hladiny přijatých dat po sériové lince, část která moduluje signál pro serva a část která jednotlivé signály přiřazuje těm správným servomotorům.
Část upravující napěťové hladiny logických hodnot mezi TTL/CMOS a standardem EIA RS-232c je řešena jednoduchým nelineárním obvodem. Tento obvod nemůže plně nahradit standardní řešení s integrovaným obvodem MAX232, ale je to jednoduché a v tomto případě i prostorově výhodné. Na plošném spoji jde prakticky o celou pravou stranu. Sériový kanál se připojuje přes konektor K2.
Část modulující signál pro servo sestává z mikrokontroléru ATmega8, napájení, odrušení a krystalu. Na desce je vyveden konektor K3 pro sběrnici TWI, která je kompatibilní s I2C a také konektor K4 s napájením 5V a třemi I/O linkami. Obvod není chráněn proti přepólování ani přepětí - zda je obvod správně napájen signalizuje LED dioda vedle napájecího konektoru.
Část, která přiřazuje modulovaný signál jednotlivým servomotorům je tvořena demultiplexerem ze 4 na 16 (obvod 4067) a 16ti třípinových konektorů. Mikrokontrolér se rozhodne, který signál kam poslat a demultiplexer podle toho rozdělí modulaci na dané výstupy do servomotorů. Na desce plošných spojů je vhodné pocínovat cesty pro napájení servomotorů a tím zvýšit jejich proudovou obsažnost. Všech 16 servomotorů dohromady může vytvořit odběr v řádu jednotek ampér.
Plošný spoj byl navržen s důrazem na jednoduchost provedení i výroby – je možné ho vyrobit v domácích podmínkách, bez potřeby speciální výbavy. Deska je jednostraná, bez propojek.

Rozpis součástek

Zn. Název Hodnota/typ Poznámka
C1, C2Keramický kondenzátor27pFRozteč 5mm
C3, C6Keramický kondenzátor100nFRozteč 5mm
C4Elektrolytický kondenzátor2,2uF/10VRadiální
C5, C7Elektrolytický kondenzátor4,7uF/10VRadiální
D1, D2Usměrňovací dioda1N4148DO35
R1-R4Rezistor4k70204/0,6W
R5Rezistor5k60204/0,6W
R6Rezistor330j0204/0,6W
LED1LED dioda20mA5mm červená
T1NPN bipolární tranzistorBC547TO-92
T2PNP bipolární tranzistorBC557TO-92
Q1Krystalový oscilátor16MhzHC-49
IC1Jednočipový mikrokontrolérATmega8DIL28 úzký
IC2DemultiplexerCMOS 4067 DIL24
K1Konektorová svorkaAK 500/22 piny / rozteč 5mm
K2Konektor sériového portuCANNON-99 pinů / samice
K3Konektorové kolíky (5 pinů)JednořadéRozteč 2,54mm
K4Konektorové kolíky (4 piny)JednořadéRozteč 2,54mm
K5-K20Konektorové kolíky (3 piny)JednořadéRozteč 2,54mm
Pozn: IC1 a IC2 je vhodné opatřit paticemi

Možná vylepšení

Obvod má vyvedeny 3 I/O linky z jednočipu na konektor K4. Lze je použít například pro ovládání posuvného registru 4094 a generovat sním různé efekty – například běžícího hada z LED diod.
Pro bezdrátovou komunikaci s modulem není nic jednoduššího, než použít RS232 sériový BluetoothTM adaptér. S bezdrátovým připojením servořadiče lze postavit nezávislé roboty s vlastním napájením a bez kabeláže, která by je vázala.

Závěr

Popsané zařízení je určeno pro nenáročné a levné aplikace. Plošný spoj byl navržen tak, aby ho mohl v domácích podmínkách vyrobit každý, bez speciální výbavy. Komunikace po sériové lince byla maximálně zjednodušena, aby i vývojář – začátečník dokázal ovládat tento modul.
Schéma, návrh desky plošných spojů, řídící program jednočipu a další užitečné rady pro výrobu naleznete na adrese http://servodriver.matejk.cz. Zde je také umístěn ukázkový program pro ovládání servodriveru pomocí běžného počítače.

Pokud vám některá část přišla méně srozumitelná nebo jste našli chybu či nesrovnalost, ale i v případě, že se vám vše líbilo a chcete nás pouze povzbudit, využijte našeho kontaktního formuláře.