-
Notifications
You must be signed in to change notification settings - Fork 0
Analog ServoPoint
Tlačítka jsou číslovaná 1..16, podle polohy v tlačítkové matici. Jako pokyn k činnosti se bere změna sepnutého stavu tlačítka, tedy sepnutí i rozepnutí. Každý taková pokyn může spustit jednu nebo více *sekvencí* činností - akcí. Nemusí spustit nic - např. rozepnutí tlačítka, které na 100 sekund rozsvítí lampy nemusí mít přiřazenou žádnou činnost.
Každá definice má své číslo, může jich být max. 63. Zadáním již použitého čísla definice se stará definice přepíše nově zadanými údaji pro spuštění a novou sekvencí akcí.
DEF:x:y
kde "x" je pořadové číslo tlačítka a "y" je způsob reakce na něj. Základní dva režimy jsou:
- d,c,1,+
- (down, closed) reakce na *sepnutí* tlačítka, provedou se stanovené akce
- u,o,0,-
- (up, open) reakce na *rozepnutí*, provedou se stanovené akce
- pro každou akci OUT (on, off, blik) příslušný výstup vypne
- pro posun serva L nebo R provede posun do opačné polohy
- akce WAT a řídící povely (viz dále) se ignorují
Tyto zvláštní režimy nařídíme pomocí:
- T
- "toggle". Změna stavu tlačítka provede akce.
- A
- sepnutí tlačítka provede akce. Rozepnutí provádění přeruší, ale nevrátí zpět.
- B
- sepnutí tlačítka provede akce. Rozepnutí tlačítka provede reverz. Ideální pro přepínače.
- R
- První sepnutí tlačítka provede akce. Druhé sepnutí provede "reverz". Rozepnutí tlačítka se ignoruje. Vhodné pro situace, kdy se jedním stiskem něco provede a druhým stiskem totéž zruší.
Příklad začátku definice:
DEF:1:+:NReakce na tlačítko 1, jeho stisk (+), nečekáme na dokončení.
Po úvodním příkazu DEF se *všechny* příkazy zaznamenají jako akce do příkazové sekvence. Vypíše-li příkaz chybu, nezaznamená se. Počet akcí je omezen na 16. Zadaná příkaz se ihned provede - netýká se příkazů čekání a řízení. Záznam se ukončí příkazem
FINkterý ukončí definici a zapíše ji do EEPROM.
Pokud se spletete, mohou se hodit tyto pomocné příkazy:
- BCK
- back, smaže poslední zaznamenanou akci, můžete ji napsat znova.
- ERR
- zruší celou definici, neuloží ji. Pokud se přepisovala stará definice, použitím ERR zůstane původní obsah.
Definice jsou číslované, je možné více definic (sekvencí) přiřadit stisku (rozepnutí) téhož spínače. V takovém případě se provedou (zahájí provádění) všechny definice, které odpovídají spínači, začnou se vykonávat zároveň; první akce se vykonají v pořadí čísel svých definic. Vykonávání dalších akcí v sekvencích pak závisí na čekání na dokončení těch předchozích.
Příklady - jednotlivé akce vysvětlím blíže dále.
Po stisku tlačítka 1 se servo 1 přestaví do polohy "vlevo". Po rozepnutí tlačítka se přestaví opět vpravo.DEF:1:B MOV:1:L FIN
Po stisku tlačítka 1DEF:1:B:N OUT:1:F:1 WAT:100 MOV:1:L MOV:2:L FIN
- začne výstup 1 blikat podle stylu 1.
- Počká se 100*50ms.
- Pak se servo 1 a 3 otočí do polohy vlevo - tato dvě serva se mohou pohybovat najednou. "N" na konci definice značí, že se nečeká na dokončení pohybu serva 1, servo 3 se začne pohybovat také.
Zde je vidět oprava, kdy při se uživatel při zadání příkazu OUT spletl, a chybu opravil pomocí BCK a opětovného zadání. Sekvence má pak 1 akci -DEF:2:+ OUT:2:1 BCK OUT:3:1 FIN
OUT:3:1
Z důvody úspory délky programu jsem vypustil z programu část algoritmu pro správu paměti akcí - při opakovaném definování, vymazávání atd se může stát, že se paměť pro ukládání sekvencí vyčerpá ačkoliv počet "živých" akcí bude nižší než kapacita. V takovém případě doporučuji tento postup:
- provést DUMP
- uložit výsledek
- provést CLR, smazat všechno nastavení
- z uloženého výsledku vykopírovat nastavení zpět
Každé servo má následující vlastnosti, které se jednou nastaví a pak se při jednotivých akcích používají:
- levá poloha
- pravá poloha
- rychlost
Nastavení serva se prování příkazem
kdeRNG:s:l:p RNG:s:l:p:r
- s
- číslo serva. Pokud má již rozsah definovaný, přepíše se novou definicí.
- l
- levá poloha serva, jako úhel 0-180
- p
- pravá poloha serva, jako úhel 0-180
- r
- rychlost, 1 nejvyšší, 8 nejnižší.
Příkaz RNG je konfigurační, neukládá se do sekvence akcí pro reakce na tlačítka
Příklad nastavení serva:
RNG:1:80:120:5pomaleji (rychlost 5) se hýbající servo, levá poloha 80, pravá 120 stupňů
RNG:2:90:110servo se pohybuje standardní rychlostí, levá poloha 90, pravá 110 stupňů
Nastavení je možné ještě "interaktivně", pomocí příkazu
CAL:skde "s" je číslo serva. CAL znamená "CALibrate". Po zadání CAL se zpracování vstupu přepne na *jednotlivé znaky*. Náklon serva se ovládá stiskem nebo přidržením tlačítek klávesnice PC:
- q, +
- "nahoru", většá úhly. Každý stisk vychýlí servo o 3 stupně.
- a, -
- "dolů", menší úhly.
- ENTER
- potvrdí polohu
- ESC nebo "." (tečka)
- zruší celou kalibraci
CAL
se servo nastaví do (prozatím definované) levé polohy. Není-li ještě servo nastavené, je levá a pravá poloha 90. Nejprve nastaví levá poloha, potvrdí ENTER
. Pak pravá poloha, opět potvdí ENTER
. Pak se nastavuje rychlost. Během nastavení rychlosti servo přejíždí mezi nastavenými polohami. Posledním stiskem ENTER
(po seřízení rychlosti) se nastavení uloží ve formě příkazu RNG
, jako by jej zadal uživatel přímo.
Příkaz CAL je konfigurační, neukládá se do sekvence akcí pro reakce na tlačítka
Příklad kalibrace serva:
CAL:5
Každé servo může být (volitelně) spojené s jedním výstupem, na kterém se signalizuje "ohlas" polohy. Při pohybu serva do pravé polohy se takový výstup sepne, při pohybu serva do levé polohy se rozepne. Pokud se servo pohybuje do polohy zadané jako stupně, má ohlas jiný význam - je sepnutý během pohybu serva, rozepnutý, je-li servo v klidu.
Ohlas serva se nastaví jako
SFB:s:okde "s" je číslo serva, "o" je číslo výstupu. Pokud je číslo výstupu 0, ohlas u serva se zruší (příkaz
SFB
zmizí z konfigurace). Dvě serva mohou mít přiřazený stejný výstup; pak platí, že poslední pohyb vyhrává. Po zapnutí napájení Arduino vyhodnotí polohy serva a je-li některé v (zapamatované) poloze R (pravé), zapne jeho ohlas.
Sepnutí výstupů odpovídající ohlasům je možné kontrolovat ve výpisu příkazu INF
, kde každému sepnutému výstupu odpovídá "1" v řádku "Out state
".
Ohlasy je možné použít pro spínání přídavných zařízení, signalizaci, ... například pro provázání s řízením znaků návěstidel podle polohy výhybek.
Příkaz SFB je konfigurační, neukládá se do sekvence akcí pro reakce na tlačítka
Příklad nastavení ohlasu
SFB:1:5Nastaví ohlas pro servo 1 na výstupu 5.
SFB:2:0Zruší ohlas serva 2.
Pohyb serva nařídí příkaz
kde "x" je číslo serva (1-8) a "p" je poloha. Poloha může býtMOV:x:p MOV:x:p:r
- L - úhel levé polohy nastavený příkazem RNG
- R - úhel pravé polohy nastavený příkazem RNG
- konkrétní úhel, kam se má páka serva nastavit.
1,2 - 3,4 - 5,6 a 7,8
. Pokud se spustí pohyb jednoho serva z dvojice bez čekání na dokončení, a spustí se druhé servo z dvojice, začne se pohybovat okamžitě. Pokud se vykonají akce ke spuštění serv mimo určené dvojice, čeká se vždy na uvolnění signálu (dokončení pohybu serva). Potřebujete-li pohybovat servy zároveň, musíte jejich zapojení podřídit uspořádání do dvojic.
Pokud není možné servem hýbat (servo mimo pár je nyní v pohybu), akce zablokuje svou sekvenci až do doby uvolnění servo výstupu - a to i v případě, že se na dokončování akcí nečeká.
Po dokončení pohybu serva se opraví výstup ohlasu, je-li pro servo nastavený. Pokud je servo již v poloze nařízené příkazem, povel se považuje za vykonaný ihned.
Příklady:
MOV:1:R MOV:2:L MOV:3:150 </blockquote>Nastaví nejprve servo 1 do pravé polohy (zkonfiurované předtím příkazem
RNG
), pak servo 2 do levé polohy a nakonec nastaví servo 3 na úhel 150 stupňů.
K zapnutí a vypnutí slouží příkaz
kde "x" je číslo výstupu (1-63) a "s" představuje stav. Základní stavy jsou 1, + zapnutí výstupu 0, - vypnutí výstupu T změna stavu - zapnutý výstup vypne, vypnutý zapne. Ke změně dojde okamžitě, je-li zapotřebí před nebo po vypnutí čekat, musí se použít příkaz WAT (viz dále). Sepnutí výstupů je možné kontrolovat ve výpisu příkazuOUT:x:skv OUT:x:T
INF
, kde každému sepnutému výstupu odpovídá "1" v řádku "Out state
".
Příklady:
OUT&#58;1&#58;1 OUT&#58;2&#58;&#45; &lt;/blockquote&gt;Zapne výstup č. 1 (rozsvítí se zabudovaná LED v Arduinu), vypne výstup č. 2.
Některá zařízení se spínají krátkým elektrickým pulzem, po kterém musí zůstat výstup opět vypnutý. Pulz se dá na výstup poslat příkazy
kde "d" je nepovinné, a představuje délku pulzu v jednotkách 1ms. Standardní pulz trvá 100ms. Po skončení pulzu zůstane výstup vypnutý. "Reverzní" operace k pulzu je vypnutí výstupu. Pozor: kvůli úspoře místa se uchovávají časy v jednotkách 50ms. Zadaný čas se zaokrouhlí.OUT&#58;x&#58;P OUT&#58;x&#58;P&#58;d
Příklad: OUT:1:P:1000 OUT:2:P Sepne výstup č. 1 (LEDku Arduina) na dobu 1000ms = 1s. Výstup 2 sepne na
Popis "blikací sekvence" se musí provést zvlášť (důvod viz kód programu a datové struktury). Nejprve se nadefinují styly blikání (celkem 4 možné), následně lze výstup namísto prostého zapnutí nechat blikat (střídavě zapínat a vypínat) určitým stylem.
Blikání se konfiguruje jako
FLS&#58;a&#58;b&#58;c
- a
- délka zapnutí, v jednotkách 50ms
- b
- délka vypnutí, v jednotkách 50ms
- c
- počet cyklů, nebo 0 - opakovat neustále.
Blikací styly je možné definovat 4. Celkem může blikat 8 výstupů v jeden okamžik.
Příkaz FLS
je konfigurační, nezazaznamenává se do akcí reagujících na tlačítka.
Blikání se zapne příkazem
kde "y" je číslo stylu blikání. Akce se ukončí buďto po stanoveném počtu bliknutí, nebo - pokud se bliká stále - ihned (přičemž výstup bliká i nadále).OUT&#58;x&#58;F&#58;y
Blikání lze zrušit nastavením výstupu na on nebo off (OUT&#58;x&#58;0, OUT&#58;x&#58;1
). Další příkaz k blikání na daném výstupu zruší předchozí blikání. Zapnuté blikání se pro účely vyhodnocení stavu výstupu a podmínek (viz dále) považuje za "aktivní výstup" i v době kdy je výstup ve "vypnuté" fázi blikacího cyklu.
Jako speciální připad může ihned následující výstup blikat v protifázi, tzn. je zapnutý tehdy, když je hlavní výstup vypnutý a naopak. Blikání s protifází se provede příkazem
Do protifáze je možné přivést pouze výstup bezprostředně následující, nelze určit konkrétní výstup číslem jako u jiných akcí.OUT&#58;x&#58;F&#58;y&#58;i
Mezi výkonné akce lze vložit čekání - to zdrží následující akce v sekvenci. Může se jím např. zařídit předzvánění u přejezdu apod. Čekání se provede příkazem
kde "x" je doba prodlevy v milisekundách. Akce následující v sekvenci poWAT&#58;x
WAT
se začnou provádět až po vypršení uvedeného času.
Veškeré provedené nastavení se vypíše příkazem DMP nastavení se vypíše jako posloupnost příkazů, které, jsou-li provedené na "čistém" ServoPointu po resetu, nastavení obnoví. Doporučuji, poté, co vytvoříte část nastavení, nakalibrujete serva atd atd. si nastavení vypsat a uložit na PC do textového souboru, případně vytisknout. Zdatnější jedinci mohou textový soubor i verzovat např. pomocí Gitu.
Po výmazu (příkaz CLR), nebo jiném poškození či výměně Arduina můžete původní nastavení obnovit tím, že do okna terminálu ovládajícího ServoPoint vepíšete (vykopírujete) uloženou posloupnost příkazů.
POZOR - ServoPoint má poměrně malý vstupní buffer (úspora RAM). Doporučuji nastavení kopírovat do terminálu po 3-5 řádcích, aby nedošlo k oříznutí textu.
VELKÝ POZOR: Upgrade software mohou zahrnovat změny formátu dat v EEPROM. V takovém případě se EEPROM při startu Arduina vyčistí - při upgrade SW určitě udělejte nejprve zálohu nastavení.
V ServoPointu je několik "programátorských" akcí, které umožňují vytvářet složitější kombinace. Jejich použití je volitelné, pro pokročilejší uživatele - a mnohem méně "vyzkoušené".
Nejjednodušší technika je spuštění několika sekvencí na jedno tlačítko:
jsou 2 definice, obě reagující na stisk tlačítka 1. Při jeho stisku se začnou provádět obě sekvence. Pro každou z nich platí obyklá pravidla čekání na dokončení akce - sekvence se ale neblokují navzájem.DEF&#58;2&#58;1&#58;+ ... FIN
Některé akce mohou být podmíněné. Podmínkou rozumím vyhodnocení okamžitého stavu ServoPointu, vstupů, výstupů a probíhajících dějů. Pokud stav odpovídá zadané podmínce, příkaz se provede, jinak se ignoruje.
Podmínky jsou pouze jednoduché, nedají se skládat. Podmínka může být
- aktivní výstup
- pohybující se servo
- vykonávaná sekvence
- stisknuté vstupní tlačítko
S použitím podmínek lze sekvenci předčasně ukončit, opakovat, pozdržet než doběhne jiný proces atd.
Podmínka se zapisuje jako
kde "t" je typ podmínky a "n" je číslo výstupu apod. Pokud podmínka začíná vykřičníkem, jedná se o negovanou podmínku, která je splněná při neaktivitě prvku.t&#58;n &#33;t&#58;n
- k
- Stisk vstupního tlačítka. "n" je číslo vstupního tlačítka 1..16, podmínka je splněna, je-li tlačítko stisknuté
- o
- Výstup je aktivní. "n" je číslo výstupu 1..63, podmínka je splněna, pokud je výstup aktivní (zapnutý, bliká, ohlas serva)
- s
- Servo je v činnosti. "n" je číslo serva.
- c
- Příkazová sekvence se vykonává. "n" je číslo definice odpovídající příkazu
DEF
.
Podmíněné čekání zablokuje sekvenci do doby, než bude splěná stanovená podmínka, nebo než se vykonávání sekvence zruší (příkaz CAN
). V případě čekání s podmínkou lze podmínku ještě doplnit požadavkem, že se stav (výstup, servo, tlačítko) do aktivního stavu dostane až následně.
Například podmínka, že "servo přejde do stavu neaktivní" znamená, že pokud se servo již pohybuje, jeho zastavení splní podmínku. Ale je-li servo právě zastavené, podmínka splněná není, a splní se až když se servo dá do pohybu a následně zastaví. Stejný princip se uplatní pro jiné typy podmínek.
Vázat zároveň více následných podmínek na konkretní jeden výstup, servo atp nedoporučuji, řídící program s tím moc nepočítá.
Čekání s podmínkou způsobí příkaz
uvede-li se za podmínku hvězdička, jedná se o následnou podmínku (viz výše)WAC&#58;podmínka WAC&#58;podmínka&#42;
Jde jednorázově, nebo do trvale, nařídit čekání na dokončení příkazu. Nastavení platné pro celou sekvenci se uvádí v příkazu DEF. V rámci sekvence lze nastavení dále upravit
Způsobí, že se na dokončení akce čeká (+), nečeká (-), nebo se počká jen na bezprostředně následující akci (!), pak se čekat přestane.WAT&#58;+ WAT&#58;&#45; WAT&#58;&#33;
Zrušení sekvence se provede příkazem
kde "x" je číslo definice, jejíž sekvenci chcete zrušit. Sekvence se ukončí, pokud se pohybuje servo, zastaví se kde právě je. Blikání s určeným počtem cyklů se ukončí, neomezené blikání pokračuje.CAN&#58;x CAN&#58;x&#58;podmínka
V rámci sekvence můžeme "skočit" na jinou akci - to znamená že po akci "skok" se provede jiná akce než ta, která v definici následuje. Skok se zapisuje jako
kde "x" jeJMP&#58;x JMP&#58;x&#58;podmínka
- záporné číslo
- řízení se posune x akcí dozadu. Například -1 znamená vykonání akce bezprostředně předcházející akci
JMP
- kladné číslo
- přeskočí se x následujících akcí
- 0
- celá sekvence se ukončí, přeskočí se všechny následující akce