Konverze KittenBot® Geek Motor na Servo

Název článku je trochu zavádějící a zaslouží si uvedení na pravou míru. Již jsme se seznámili a motorem a servem Geek Servo z produkce KittenBot®. Stejně tak jsme se seznámili s tím, jak fungují RC soupravy. Prostým pohledem zjistíme, že máme malý nesoulad v tom, že RC přijímač nemá silový výstup, zatímco Geek Motor připojuje přímo motor, takže vyžaduje silové ovládání.

Tento požadavek není ve světě modelů nikterak neobvyklý. Modeláři hovoří o ESC (Electronic Speed Controller); česky regulátor otáček, nebo jen regulátor.
Pro takový regulátor platí ve světě RC modelů určité zvyky. Vzhledem k tomu, že napájení motoru je energeticky náročnější činnost, bývají baterie připojené právě na regulátor. Regulátor respektuje potřeby motoru (napájecí napětí, počet fází, napětí, proudy a další). Z toho důvodu k němu často bývají připojené baterie, které mají jiné pracovní napětí než je vhodné pro ostatní elektroniku. Proto na sobě takový regulátor často má vhodný měnič, aby byl schopen napájet přijímač a ostatní elektroniku (nejčastěji napětí 4,5 až 6 V, proud cca 500 mA).

I já jsem v minulosti vytvořil několik takových regulátorů. Nebylo pro mne tedy složité některý z nich modifikovat pro potřeby Geek motoru.
Nejprve jsem použil hardware, který maximálně využívá minimální komponenty. Tedy procesor PIC16F15313 se dvěma vstupy a čtyřmi PWM výstupy a k němu motorový budič DRV3388 (podrobnější popis v časopise Praktická elektronika Amatérské Rádio 3/2018, respektive 1/2020). Tím dostaneme dvoukanálový regulátor. Tato konfigurace je velmi zajímavá. Umožňuje prostou změnou software vytváření „mixů“. Tedy případ, kdy z jednoho kanálu pro rychlost a druhého pro zatáčení složíme dvě rychlosti pro dva motory – například dvoukolových robotů, pásových vozidel a podobně. Případně lze využít pro dva kanály, jeden pro rychlost a jeden (třetí kanál vysílače) pro ovládání světel – jedním stiskem zapnu, druhým vypnu světla (pochopitelně se nemusí jednat pouze o světla).

Tato koncepce je praktická, pokud si chceme hrát s elektronikou regulátoru. Je však poněkud nepraktická z pohledu stavby robota. Krom přijímače máme totiž ještě celkem velkou desku regulátoru a navíc další dráty.

Proto jsem regulátor mírně přepracoval. Zmenšil jsem desku tak, aby se vešla do vnitřku Geek motoru (za cenu oboustranného osazení) a zachoval jsem pouze jeden kanál. Takto zjednodušený regulátor jsem pak dal rovnou do Geek motoru. Motor se potom připojuje přímo pomocí třívodičového konektoru jako běžné servo. To hodně zjednodušuje stavbu jednoduchých hraček, kdy se používá přímo přijímač RC ovládání. Podobně se zjednodušuje život začínajícím uživatelům Arduina nebo PICaxe, kteří ještě přesně nechápou rozdíl mezi výkonovým a datovým signálem. Mohou tedy motor připojit a ovládat stejně jako každé jiné servo pomocí datového signálu.

Trochu si popíšeme, jak takový regulátor pracuje. V tomto konkrétním případě je pro sledování signálu pro servo použita periférie CCP – v režimu Capture. Tato periférie sleduje vstupní signál a při jeho změně uloží stav časovače Timer1. Při náběžné hraně neděláme nic, pouze si uložíme stav časovače. Při sestupné hraně pak odečteme aktuální hodnotu od uložené, tím dostaneme délku pulzu. Při vhodném nastavení rychlosti Timer1 dostaneme přiměřený rozsah hodnot pro běžné servo pulzy.
Hodnotu pak použijeme jako číslo řádku do tabulky, kde máme uložené hodnoty pro PWM. Zvolený řadič má k dispozici dvě CCP periferie a zároveň čtyři PWM, je tedy možné použít pro každý výstup jedno PWM. Pak se program nemusí vůbec starat o řízení směru a rychlosti, prostě jen naplní příslušné PWM a hardware řeší vše ostatní.

Plnění PWM je realizováno v 52 krocích (krok 0 znamená 0%, krok 52 znamená 100% plnění). Pokud se má jednat o otáčky v obráceném směru, je k hodnotě plnění přidán nejvyšší bit (přičteno číslo 128).

Měření šířky pulzu se provádí v krocích po 37 µs s tím, že hodnoty menší než 481 µs (prvních 13 kroků) se považují za šum a nezpracovávají. To stejné pro hodnoty větší než 2516 µs (více než 68 kroků). Středová hodnota 1500 µs je tedy krok číslo 40. Tabulka pro převod je uložená v takzvané Storage Area Flash (SAF) paměti, která je u tohoto mikrořadiče mapována jako část programové paměti od adresy 0x0780. První bajt je tedy pro krok číslo 13, střed (krok 40) je na adrese 0x079B. Jelikož se jedná o mapování do paměti programu, je každý datový bajt rozšířen na šířku slova (14 bitů). Běžně se používá instrukce RETLW s operačním kódem 0x34, ale tento zvyk není nutné dodržet. Takže pokud chceme editovat tabulku a změnit si rychlostní křivku, uvidíme jí jako hodnoty 0x34XX, kde XX je požadovaná hodnota plnění PWM. V editoru také uvidíme čísla v šestnáctkovém formátu, takže maximum 52 (desítkově – dec) uvidíme jako 34 (šestnáctkově – hex).

Podklady (včetně gerber souborů pro výrobu desek) je možné najít na stránce fucik.name včetně ostatních regulátorů. Jen drobná poznámka – desku jsem použil tloušťky 0,8mm.