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ů |
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 | 0° |
1,75 ms | 90° |
2,00 ms | 180° |
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, C2 | Keramický kondenzátor | 27pF | Rozteč 5mm |
C3, C6 | Keramický kondenzátor | 100nF | Rozteč 5mm |
C4 | Elektrolytický kondenzátor | 2,2uF/10V | Radiální |
C5, C7 | Elektrolytický kondenzátor | 4,7uF/10V | Radiální |
D1, D2 | Usměrňovací dioda | 1N4148 | DO35 |
R1-R4 | Rezistor | 4k7 | 0204/0,6W |
R5 | Rezistor | 5k6 | 0204/0,6W |
R6 | Rezistor | 330j | 0204/0,6W |
LED1 | LED dioda | 20mA | 5mm červená |
T1 | NPN bipolární tranzistor | BC547 | TO-92 |
T2 | PNP bipolární tranzistor | BC557 | TO-92 |
Q1 | Krystalový oscilátor | 16Mhz | HC-49 |
IC1 | Jednočipový mikrokontrolér | ATmega8 | DIL28 úzký |
IC2 | Demultiplexer | CMOS 4067 DIL24 | |
K1 | Konektorová svorka | AK 500/2 | 2 piny / rozteč 5mm |
K2 | Konektor sériového portu | CANNON-9 | 9 pinů / samice |
K3 | Konektorové kolíky (5 pinů) | Jednořadé | Rozteč 2,54mm |
K4 | Konektorové kolíky (4 piny) | Jednořadé | Rozteč 2,54mm |
K5-K20 | Konektorové kolíky (3 piny) | Jednořadé | Rozteč 2,54mm |
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.