Interpretr signálu pro modelářské servo

Toto zařízení jsem vytvořil jako rozcvičku pro lodní modeláře. Oni nám vláčkařům záviděli světla a zvuky, které provozujeme v rámci kolejiště. Lodníci přišli s konceptem, kdy se jim zdálo zvládnutelné využití třetího kanálu na vysílačce k ovládání světel. A to takovým způsobem, že budou pohybem nahoru/dolů (vlevo/vpravo) přehazovat zvolený aspekt.
To se mi zdá jako celkem použitelné řešení a doma při testování se to celkem dalo zvládnout.

Vytvořil jsem proto velice jednoduché zařízení, založené na jednoduchém procesoru PIC16F628A (nebo na obstarožním PIC16F84). A to je vlastně všechno co je potřeba. Pro jistotu jsem ve své konstrukci zařadil ještě LDO pro omezení napětí, ale asi to nebyl úplně dobrej nápad, spíš jsem měl použít omezovač z odporu a Zenerovo diody. Na konci jako spínací prvek ULN2803.

Model servo signal interpreter

I was created this device as a mental exercise for boat modellers. They are envy train modellers light and sound effects we are using on model layouts. Boat modellers come with concept of usage third channel on RC radio to control lights on model. Principle is very simple. Moving controlling stick up/down (left/right) will switch between used aspect.
It seems like feasible for me. It works fine during my testing at home.

Then I was created simple device, based on basic processor PIC16F628A (or old fashion PIC16F84). And this is all you need. For sure I was added also LDO as voltage limiter, but I'm not sure, it is good idea, maybe resistor with Zener diode will be better. At the end is used switch based on ULN2803.

Použití

Použití je velice jednoduché. Pro začátek je dobré si vyzkoušet ovládání. Jednoduše připojíme LED diody (s příslušnými předřadnými odpory) ke všem výstupům, připojíme k přijímači a zapneme. Pákou na vysílači si vyzkoušíme přepínání pozic.
Na zařízení jsou místa pro dvě propojky. Ty slouží k úpravě krajních pozic. Jednoduše dáme páku nahoru, do místa kde očekáváme přepnutí a krátce propojíme propojku "set max". Pak dáme páku dolů, do místa kde očekáváme přepnutí a krátce propojíme propojku "set min". Tím je celá konfigurace hotová.
Zařízení nyní reaguje na přepínání pákou tak jak očekáváte

Dalším krokem je připojení a definice světelných efektů. Efekty předpokládám jako samostatně existující jednotlivé komponenty. Popis již existujících efektů naleznete ZDE. V reálné praxi pravděpodobně nebudete chtít používat jedno světlo za druhým, ale různé kombinace a skupiny světel. To je jednoduše řešitelné pomocí běžných diod (například 1N4007).
Vezmeme efekt, nebo světlo a připojíme jeho kladný pól do konektoru (kladný pól je společný, takže lze použít kterýkoli řádek). Na všechny záporné póly při kterých má efekt svítit připojíme katody diod. Následně propojíme anody diod a připojíme k nim záporný pól světelného efektu.
Následující obrázek ukazuje příklad tří žárovek. Žlutá žárovka svítí při pozici 1, zelená svítí při pozicích 4, 5 a 6, červená svítí při pozici 5.

Usage

Usage is pretty simple. At the begin is good to test controlling. Simple connect to all outputs LED diodes (with proper current limiting resistors), connect to receiver and switch on. use controlling stick on transmitter to check switching of positions.
On the device is two positions for shorting jumpers. They are used for adjusting switching positions. Simple put controlling stick to upper position, where you expect switching and short (and release) jumper marked as "set max". Then move controlling stick to down position and short (and release again) jumper marked "set min". Then device is configured.
Device should react to switching with controlling stick as you are expecting.

Next step is connect and define light effects. I suppose effects as separate small components. Description of already existing effects can be found HERE. In real life you will not like to use lights one by one, but in some combinations and groups. It is easy to solve it using standard diodes (for example 1N4007)
Take effect or light and connect his positive pole to positive pin of header (positive pole is common, then can be in any position). To all negative poles the effect should light you must connect cathode of diode. Connect all anodes together and connect minus pole of light effect to them.
Following picture presenting example of three light bulbs. Yellow bulb lighting in position 1, green lighting in positions 4, 5 and 6, and red lighting in position 5.

Video ukázka

Video example

Popis modelářského serva

Nejprve si zopakujeme, jak je servo připojené a jak je "kódovaný" signál.
Servo se připojuje pomocí tří vodičů. Dva jsou napájecí: společná nula (zpravidla černé barvy, označovaný jako "-"), kladné napájení (zpravidla červené barvy, označovaný jako "+") a vlastní signál (zpravidla bílé nebo oranžové barvy). Napájení je celkem zrádné, za minimální napájení se považují tři články (4,5V), zatímco maximum bývá u elektrických modelů zpravidla přímé napětí baterie pro pohon motoru (tedy 7,2V i více). Signál se odvozuje jako CMOS úrovně napájecího napětí.
Kódování signálu není složité. Základní opakovací kmitočet byl stanoven jako 50Hz. Výchylka serva se definuje jako kladný pulz o délce 1000 mikro sekund (µs) pro výchylku 0° (páka otočená doleva) až 2000 µs pro výchylku 180° (páka otočená doprava). Střední poloha 90° odpovídá 1500 µs. Někteří výrobci umožňují výchylky až 270° a někteří výrobci mají definované pulzy jako kratší (pravděpodobně se pokoušejí o přepočet na amerických 60Hz), takže se setkáváme zhruba s rozsahem 500-2500µs. Viz následující obrázek.
Velice detailní popis chování serva je možné najít na TOMTO videu (gEnglish - německá angličtina).

Model servo description

At the begin we will recapitulate how is servo connected and how is signal "encoded".
Servo is connected using three wires. Two of them powering servo: common ground (usually black colour, marked as "-"), positive power (usually red colour, marked as "+") and signal wire (usually white or orange colour). Powering voltage can be little tricky. As a minimum voltage is understand three battery cells (4,5V). But maximum is for electric models usually full voltage of motor powering battery (then it can be 7,2V and more). Signal is understand as CMOS levels of powering voltage.
Encoding of signal is not complicated. Basic repeating frequency is defined as 50Hz. Servo position is defined as positive pulse with length 1000 micro second (µs) for position 0° (stick in left position) up to 2000 µs for position 180° (stick in right position). Middle position 90° is at 1500 µs. Some manufacturers allowing angles up to 270° and some producers using shorter pulses (probably they are trying to convert to American 60Hz), then we can found pulses between 500-2500 µs. See following figure.
Very good description of model servo can be found on THIS video (nice gEnglish - German English).

Popis programu

Z programátorského hlediska se jedná o velice jednoduchou aplikaci, ve které je největší část věnovaná softwarovému čítači.
Pro vyhodnocení délky pulzu je použit základní časovač Timer0, který používá jako vstup hodinový signál procesoru (Fosc/4, takže 1MHz) v režimu čítač. Je také zapnut prescaller 1:16, takže jedna změna znamená 16µs. Běžné servo pracuje s délkou pulzu zhruba v rozmezí 1000-2000µs, serva s velkou výchylkou zvládají 500-2500µs. To znamená hodnoty TMR0 v rozmezí 500/16=31 až 2500/16=157 (62 kroků na 180° výchylky). To je celkem přijatelná hodnota pro potřeby jednoduchého vyhodnocování.
Pro spouštění a zastavování čítače využívám vstup přerušení (INT), přerušovací rutina při náběžné hraně spustí čítač a při sestupné přečte jeho hodnotu a uloží jí do pracovní proměnné.

Program description

From programming point of view it is very simple application, where maximum portion is software counter.
For enumeration of pulse length I was used base counter Timer0. This counter using as a base input is used processor clock (Fosc/4, then 1MHz) in counter mode. Prescaller is enabled and configured to value 1:16, then one increment of Timer0 mean 16µs. Usual servo working with pulse length 1000-2000µs, servos with large way allow 500-2500µs. It means, that values of TMR0 can be in range of 500/16=31 up to 2500/16=157 (62 steps to 180° of way). This value is very acceptable for usage with simple calculations.
For starting and stopping of counter is used interrupt input (INT). Interrupt routine during rising edge start counter and during falling edge will read its value and store it to working variable.
Hlavní program tak pouze sleduje, jestli byla změřená nová hodnota pulzu a pokud ano, tak na ní reaguje příslušným způsobem.
Tato metoda umožňuje vytvářet docela efektivní konstrukce na velice malých a levných procesorech. Například různé regulátory rychlosti, nebo ekvivalenty lineárního serva přímo vestavěné do řízení a podobně.
K popisu přikládám i zdrojové kódy a budu věřit, že pokud je někdo použije ve své další konstrukci, bude mne o tom informovat a nebude konstrukci používat k prodeji.
Main program then only looking, if new pulse was measured and if yes, then it reacts proper way to it.
This method allow to create effective constructions based on very small and cheap processors. For example various speed controllers, or equivalents of linear servo directly build in to controlling machines etc.
As a part of this description is also source codes, then I would like to trust, if anybody will use it in its own construction, then will inform me and will not use it for making money.

Download: code.zip