Jindra Fučík

Servo Kontrol mikro

Úvod

Na dovolené jsem se trochu nudil a tak mne napadlo, že bych si mohl udělat minimalistickou aplikaci pro řízení modelářského serva. Občas se hodí používat servo pouze jako mechanický prvek, který se pohybuje potřebnou rychlostí mezi dvěma polohami (otevřeno/zavřeno, ...). Často jen z nějaké primitivní logiky bez vhodného časování pro vytvoření celého signálu potřebného pro servo.
Takže jsem se rozhodl si vytvořit pokud možno jednoduchý "řadič" pro servo. Nemá cenu popisovat jakým signálem se servo ovládá, bylo tak již učiněno mnohokráte.
Pro generování signálu běžně používám PWM a nebo časovače dostupné u běžných MCU. Pro dobrou funkci je vhodné, aby časovač používal rozlišení alespoň 16bit. Na druhou stranu na trhu je celá řada extrémně levných MCU, které takový hardware nemají. Ale pokud má procesor sloužit právě pro jednu činnost, tak přece není nutné ani spoléhat na hardwarový čitač, aby pak procesor nechat věčně čekat na naplnění čítače.
Takže jsem se rozhodl koupit asi nejlevnější procesor na našem trhu (PIC10F200) a napsal jsem si jednoduchý kód, který řeší odpočítávání času tou nejprimitivnější metodou - tedy počítáním vykonaných instrukcí. Kupodivu se ukázalo, že lze dosáhnout celkem přijatelných výsledků.

Funkce zařízení

Tato verze podporuje následující funkce:
  • Ovládání jednoho modelářského serva
  • Volná definice dvou koncových poloh
  • Volná definice rychlosti přesunu mezi polohami
  • Ovládání jedním signálem

Hardware

Z hlediska hardware v podstatě není co řešit. Servo má provozní napájení v podstatě stejné jako procesor, takže zdroj není nutné řešit. Jeden pin je použit jako vstup a jeden jako výstup signálu. V podstatě místo schématu stačí nakreslit zapojovací obrázek. V zapojení lze pochopitelně dělat různé úpravy - například přidávat zenerovy diody pro filtraci napájení, nebo přidat rezistor mezi vstup a kladné napájení pro lepší definici logické úrovně v čase přepínání a podobně. Po pravdě, nic takového jsem zatím nepotřeboval, takže jsem to neřešil a nechávám na zralé úvaze čtenáře jestli potřebuje a nebo nepotřebuje takové věci řešit.

Servo Control micro

Introduction

I have lot of spare time during my vacation, then I decided to build minimal application for controlling model servo. Sometime is useful to have servo only as a mechanical element, that moving themselves by defined speed between two endpoints (open/close, ...). It is useful especially when it can be used with simple logic without any special timing and without creation of complete controlling signal necessary need for controlling of servo.
Then I decided to create maximum simple "controller" for servo. I guess it is no necessary to describe signal to control servo, it was done many times.
I'm usually using PWM or timers available on MCU for servo signal creation. For good reasons it is good when timer have resolution at minimum 16bit. From the other hand, here are few extremely cheap MCUs on market, that are not equipped by this type of hardware. But if MCU will be used only for one task, then it is no necessary to depend on hardware counter, to let main MCU waiting to fill up of counter.
Then I decided to buy probably cheapest processor on our market (PIC10F200). Then I was write simple code, that solving counting of time using one of more primitive methods - by counting of executed instructions. I found surprisingly, that it have not so bad reasons.

Device functions

Current version allow to use following functions
  • Controll of one model servo
  • Free definition of two endpoints
  • Free definition of moving speed between those two endpoints
  • Controlling by one signal

Hardware

From hardware point of view here is nothing special to solve. Servo using more less same voltage as processor, then it is no necessary to solve power source unit. One pin is used as input and one pin as signal output. I guess that instead of schematic will be enough to draw figure with connection diagram. It is possible to done various changes in schematic for sure - for example add zener diodes for power voltage filtration, or add resistor from positive power to input signal for better definition of logical level in time when switch is mowing etc. I did not need any of this functionality, then I does not solved it and I'm keeping it on readers decision if it will be implemented or not.

Software

Software je poměrně jednoduchý v podstatě neustále dokola opakuje 3 kroky:
  1. Vytvoření pulzu pro servo podle předem vypočítané hodnoty
  2. Výpočet hodnoty dalšího pulzu (podle rychlosti a stavu přepínače)
  3. Čekání 19ms
První část je naprosto jednoduchá - nastavení výstupu na logickou 1 a pak čekání X*10 instrukčních kroků. Kde X je šířka pulzu. Násobek 10x se používá proto, že tím pádem se šířka pulzu pohybuje v rozmezí 90-210 (900µs - 2100µs) při době trvání jednoho instrukčního cyklu 1µs (výchozí pro tento procesor s využitím interního oscilátoru). Navíc 10 instrukčních cyklů je celkem komfortní hodnota pro počítání kroků a zároveň například obhospodaření watch dog (wdt).

Ve druhé části se provádí určení následující hodnoty pulzu. Nejprve se přečte stav vstupního signálu a podle něj se nastaví příslušná koncová poloha. Pak se podle zadané rychlosti určí další krok ve směru k zadané poloze. (Pokud se servo již nachází v cílové poloze, tak se nic nemění)

Třetí část je zase jednoduchá prázdná smyčka, která je nastavená na konstantní hodnotu cca 19ms. Správně má být frekvence pulzů 50Hz, tedy čas mezi začátky pulzů 20ms, ale v praxi není nutné tuto hodnotu počítat přesně, stačí aproximace která říká, že doba pulzu je minimálně 0,9ms (900µs), nějaký čas strávený počítáním, takže zhruba 1ms a zbývá tedy počkat 19ms. Zavádí to mírnou nepřesnost, ale nepřesnost v řádech ve kterých není člověk schopen pozorovat žádnou změnu a přiznejme si to - levná azijská serva nejsou schopna s takovou přesností reagovat.

Nastavení

Pro nastavení se používají tři hodnoty - krajní poloha A (vstup v logické 0), krajní poloha B (vstup v logické 1) a rychlost přesunu mezi těmito dvěma polohami. Nastavení se pochopitelně musí provádět při programování procesoru. Nastavení se provádí jednoduše změnou parametrů na adrese F0-F2. Příklad je uveden na obrázku dole, hodnoty jsou označené červenou, modrou a fialovou barvou. Je použito jednoduchého mechanizmu, na této adrese je vždy instrukce RETLW XX. Tedy v HEX výpisu je hodnota instrukce 8XX - stačí tedy měnit zmíněné hodnoty XX a tím dochází ke změně hodnot. Trochu pozor na to, že ve většině programovacích nástrojů se hodnoty editují v šestnáctkové soustavě, takže si nejprve desítkové číslo převeďte na šestnáctkové.

Parametr rychlost (na adrese F2, na obrázku fialový) má následující význam: Hodnota 0 (800), znamená maximální rychlost které je servo schopné. Hodnota 1 (801) je takzvaná základní rychlost, takže změna o 10µs za každý krok (pokud je tedy vzdálenost koncových bodů A a B 100kroků = 1000µs - například A=100, B=200, rozdíl A-B*10µs = 1000µs), pak doba přestavení bude cca 2 sec (100 kroků / 50 Hz = 2sec).
Hodnota 2 (802) znamená poloviční rychlost - každý krok se zopakuje 2x, takže přestavení z minulého příkladu bude trvat cca 4sec. další hodnoty znamenají prostý násobek 3 znamená 6*2sec a tak dále.
Pro hodnoty větší než 128 (80hex -> 880) platí jiné pravidlo, zde hodnota znamená kolik kroků se přeskakuje. Tedy hodnota 128 -> 80hex (880) znamená normální rychlost, přeskakuje se 0 kroků, takže přesun z předchozího příkladu bude trvat zase 2sec. Ovšem pro hodnotu 129 -> 81hex (881) se přeskakuje jeden krok, takže rychlost přesunu je ve skutečnosti dvojnásobná - tedy přesun z předchozího příkladu bude trvat cca 1sec. Pro hodnotu 130 -> 82hex se přeskakují 2 kroky, takže přesun bude trvat cca 2/3sec. Ale pozor - počet kroků 100 není dělitelný 3, takže se v jedné krajní poloze bude servo chovat neklidně, neboť se nikdy netrefí do koncové polohy. Proto je nutné, aby počet kroků pro tuto rychlost byl například pouze 99. Pak bude program fungovat správně a rychlost přesunu bude zhruba 0,66sec.

Jako dobrá pomůcka pro určování nastavovacích parametrů se ukázalo použití větší verze Servo Kontrol, která umožňuje interaktivní nastavení za provozu, následně přečíst hodnoty z EEPROM procesoru a použít je pro nastavení této minimalistické verze.

Software

Software is simple, it in reality repeating those three steps:
  1. Creation of servo pulse based on pre calculated value
  2. Calculation of value for next step (based on requested speed and switch position)
  3. Wait 19ms
First part is crystal clear - set up output to logical 1 and then wait X*10 instruction cycles. Value X is pulse width. Multiply by 10x is used because in this case pulse width is in between 90-210 (900µs - 2100µs) when instruction cycle take 1µs (base value for this processor with internal oscillator). Value of 10 instruction steps is comfortable value for counting steps and controlling watch dog timer (wdt).

In second part is calculated next pulse value. First of all program read input signal and based on it is set relevant endpoint as target value. Then based on configured speed is calculated next step in direction to selected endpoint. If servo is already in target position, nothing is changed.

Third part is again simple empty loop, configured to constant value 19ms. Proper frequency of pulses have to be 50Hz, then time between two pulse starts 20ms, but in reality is no necessary to calculate this value more accurate. Approximate value is more than good. Aproximation is done on expectation, that minimal pulse width is 0.9ms (900µs), some time used for calculation, then circa 1ms and remaining time is 19ms. It invite small inaccuracy , but inaccuracy in values that human is not possible to recognize any change. And for sure - cheap Asian servos are not able to react in this accuracy.

Configuration

Here are three values used for configuration - endpoint A (input in logical 0), endpoint B (input in logical 1) and speed of movement between those two positions. Change of those values must be done during processor programming. Configuration is done by simple change of parameters on address F0-F2. Example is present on figure bellow. Values are marked by red, blue and violet colour. It is used simple technique. On this address is always instruction RETLW XX. Then in hex output the instruction is 8XX. It is enough to change value of XX and it will mean change of values. Little note, that majority of all programming tools using hex editors, then it is necessary first of all to transfer decimal number to hexadecimal.

Pearmeter "speed" (on address F2, violet frame on picture) have following description: Value 0 (800) mean maximum speed of servo. Value 1 (801) is called "basic speed", it mean distance of 10µs per step. Then if distance of endpoints A and B is for example 100 steps = 1000µs - for example A=100 and B=200, distance A=B*10µs = 1000µs; then time for move will be cca 2 sec (100 steps / 50Hz = 2 sec).
Value 2 (802) mean half speed - every step is multiplied 2x, then move from previous example will take about 4sec. Next values mean only another multiply; then 3 mean 3*2 = 6 sec etc.
Values bigger than 128 (80hex -> 880) using different rule. This value means how many steps are "skipped". Then value 128 -> 80hex (880) mean normal speed; here are skipped 0 steps, then move from previous example will take again cca 2sec. But value 129 -> 81hex (881) mean skip one step, then speed will be in reality 2x bigger; it mean that move from previous example will take cca 1sec. Value 130 -> 82hex (882) mean skip of two steps, then move from previous example will take 2/3sec. Note, that number of steps 100 is not possible to divide by 3, then servo will remain in one endpoint unstable, because will never reach requested endpoint. Then it is necessary to have number of speed steps set to 99. It will make program working normally and move will take 0.66sec.

As a good helper for configuration of working parameters is first use bigger version of Servo Control, that allows interactive change of parameters during operation. Then read values from processor EEPROM and use it for configuration this minimal version.

Závěr

Velice jednoduchá aplikace umožňuje využít modelářské servo jako mechanický výstup i ve velmi triviálních aplikacích. Pochopitelně by bylo možné jedním procesorem řídit dvě serva, ale to jsem zatím nepotřeboval. Stejně tak by bylo možné změnit způsob ovládání z jednoho vstupu na systém se dvěma vstupy - jeden pro krajní polohu A, druhý pro krajní polohu B. Ale ani to jsem zatím nepotřeboval a navíc to řeší větší verze.

Vzhledem k velikosti procesoru je možné jej naletovat přímo na konektor serva a vznikne nám tak celkem legračně vypadající kabel pro připojení serva a jeho ovládání pomocí běžného přepínače. Pokusně jsem si takový konektor vyrobil a natočil jsem i zábavné prezentační video.

Conclusion

Very simple application allows to use model servo as mechanical output also in very trivial applications. Of course it will be possible to control two servos by one processor, but I do not need it yet. It will be also possible change method of control from one input to two inputs - one for endpoint A and second for endpoint B. But I do not need it yet, and this situation is solved by bigger version. The size of processor allows to solder it directly to pin header for servo, and we will get interesting cable for servo connection and control by using usual switch. I was created cable like this and prepared interesting video.



Pokud máte problém s osazováním, nebo s výrobou desek plošných spojů, využijte kontaktní formulář na TOMTO web-shopu, kde si můžete objednat komponenty nebo hotový dekodér.
Pravděpodobně budete potřebovat využít kontaktní formulář pro výrobku které nejsou součástí standardního výrobního programu.

Once you have problems with soldering or creating PCB boards, please use contact form on THIS web-shop, where you can order some parts or finished decoder.
Probably you will need to use contact form for modules not included in standard production.

Download: HEX