Skip to content

Analog ServoPoint

Svata Dedic edited this page Apr 3, 2018 · 3 revisions

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
Protože např. přepínač (typicky) pákou signalizuje polohu a jinak jen ovládané zařízení zapíná a vypíná, nebo přepíná mezi 2 stavy, je zavadený speciální režim provádění "reverz", který při rozepnutí tlačítka provede akce s "opačným" efektem:
  • 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í
Poslední možnost, co provést při reakci na tlačítko ja ukončení sekvence akcí; nikoliv "reverz", ale okamžité ukončení všech činností. To značí, ze výstupy zůstanou tak jak byly v okamžiku reakce (sepnuté, rozepnuté, blikající), serva zůstanou ve své poloze atd.

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ší.
Akce v sekvenci se zpracovávají jedna po druhé - pokud nějaká akce běží delší dobu (přestavování serva, určitý počet bliknutí světel), další akce v pořadí se spuští až po dokončení předchozí. Pokud chcete, aby se akce zpracovaly ihned (je-li to možné), připište na konec definice ":N".

Příklad začátku definice:

DEF:1:+:N
Reakce na tlačítko 1, jeho stisk (+), nečekáme na dokončení.

Table of Contents

Přidávání akcí

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

FIN
který 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.

Více sekvencí

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

Příklady - jednotlivé akce vysvětlím blíže dále.

DEF:1:B
MOV:1:L
FIN
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:N
OUT:1:F:1
WAT:100
MOV:1:L
MOV:2:L
FIN
Po stisku tlačítka 1
  1. začne výstup 1 blikat podle stylu 1.
  2. Počká se 100*50ms.
  3. 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é.
Příklad použití - přejezdové výstražníky se závorami.
DEF:2:+
OUT:2:1
BCK
OUT:3:1
FIN
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 - OUT:3:1

Omezení

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
Při výmazu nastavení se vymažou všechny tabulky a při opětovné konfiguraci se znovu použijí předtím nevyužitelné oblasti paměti.

Práce se servy

Nastavení rozsahu

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
Servo lze přestavit i na konkrétní polohu zadanou jako úhel 0-180, ale pro mnoho aplikací postačí dvě polohy, které je tak možné vyzkoušet a zaznamenat samostatně a pak používat. Při opravě, výměně serva může dojít ke změně krajních poloh - pak není nutné měnit jednotlivé akce a definice, ale postačí změnit nastavení serva.

Nastavení serva se prování příkazem

RNG:s:l:p
RNG:s:l:p:r
kde
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žší.
Z důvodu úspory paměti jsou levá a pravá poloha reprezentované jako menší číslo, zaokrouhluje se na 3 stupně. Program po zadání číslo upraví na nejbližší násobek. Rychlost je nepovinný parametr, nemusí se uvádět - standardní je rychlost 1.

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:5
pomaleji (rychlost 5) se hýbající servo, levá poloha 80, pravá 120 stupňů
RNG:2:90:110
servo se pohybuje standardní rychlostí, levá poloha 90, pravá 110 stupňů

Kalibrace

Nastavení je možné ještě "interaktivně", pomocí příkazu

CAL:s
kde "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
Po spuštění 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

Nastavení ohlasu serva

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:o
kde "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:5
Nastaví ohlas pro servo 1 na výstupu 5.
SFB:2:0
Zruší ohlas serva 2.

Pohyb serva

Pohyb serva nařídí příkaz

MOV:x:p
MOV:x:p:r
kde "x" je číslo serva (1-8) a "p" je poloha. Poloha může být
  • 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.
V zapojení desky ServoPoint jsou vyvedené 2 řídící PWM signály pro serva, znamená to, že některé dvojice serv se mohou pohybovat zároveň. Jde o dvojice 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ňů.

Práce se spínanými výstupy

Zapnutí a vypnutí

K zapnutí a vypnutí slouží příkaz

OUT:x:skv
OUT:x:T
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říkazu INF, kde každému sepnutému výstupu odpovídá "1" v řádku "Out state".

Příklady:

OUT&#58&#59;1&#58&#59;1
OUT&#58&#59;2&#58&#59;&#45&#59;
&lt&#59;/blockquote&gt&#59;
Zapne výstup č. 1 (rozsvítí se zabudovaná LED v Arduinu), vypne výstup č. 2.

Impulz

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

OUT&#58&#59;x&#58&#59;P
OUT&#58&#59;x&#58&#59;P&#58&#59;d
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í.

Příklad: OUT:1:P:1000 OUT:2:P Sepne výstup č. 1 (LEDku Arduina) na dobu 1000ms = 1s. Výstup 2 sepne na

Konfigurace blikání

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&#59;a&#58&#59;b&#58&#59;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.
V případě určeného počtu opakování se příkaz považuje za dokončený (následující akce čekají, nespouští se) až po provedení stanoveného počtu cyklů. Poté se výstup vypne a pokračuje se další akcí sekvence. V případě trvalého opakování (hodnota 0) akce končí ihned, avšak výstup zustává blikat i nadá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.

Zapnutí blikání

Blikání se zapne příkazem

OUT&#58&#59;x&#58&#59;F&#58&#59;y
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).

Blikání lze zrušit nastavením výstupu na on nebo off (OUT&#58&#59;x&#58&#59;0, OUT&#58&#59;x&#58&#59;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

OUT&#58&#59;x&#58&#59;F&#58&#59;y&#58&#59;i
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í.

Čekání

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

WAT&#58&#59;x
kde "x" je doba prodlevy v milisekundách. Akce následující v sekvenci po WAT se začnou provádět až po vypršení uvedeného času.

Zálohování konfigurace

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í.

Složitější akce, podmínky

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é".

Spuštění několika akcí

Nejjednodušší technika je spuštění několika sekvencí na jedno tlačítko:

DEF&#58&#59;2&#58&#59;1&#58&#59;+
...
FIN
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.

Podmínky

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
Za aktivní výstup se považuje takový, který je sepnutý, nebo bliká. Pohybující se servo je podmínka, která platí od chvíle, kdy se servo dá do pohybu a přestane platit ve chvíli kdy servo dokončí pohyb. Podmínka vykonávané sekvence platí, pokud se vykonávají akce příslušné k určité definici. Podmínku lze negovat, tzn. je splněna, když je výstup vypnutý, servo nečinné, tlačítko rozpojené.

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

t&#58&#59;n
&#33&#59;t&#58&#59;n
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.
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.

Čekání s podmínkou

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

WAC&#58&#59;podmínka
WAC&#58&#59;podmínka&#42&#59;
uvede-li se za podmínku hvězdička, jedná se o následnou podmínku (viz výše)

Cekání na dokončení

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

WAT&#58&#59;+
WAT&#58&#59;&#45&#59;
WAT&#58&#59;&#33&#59;
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.

Zrušení prováděné sekvence

Zrušení sekvence se provede příkazem

CAN&#58&#59;x
CAN&#58&#59;x&#58&#59;podmínka
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.

Skok

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

JMP&#58&#59;x
JMP&#58&#59;x&#58&#59;podmínka
kde "x" je
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
Není možné "skočit" před první akci v sekvenci (skok pak způsobí vykonání první akce) ani za konec (sekvence se ukončí).