|
Úvod
Nedávno jsem v tomto seriálu stránek
popsal
expandér programovatelných pinů.
Přestože je samostatně použitelný např. k ovládání velkého množství
(desítky až stovky) relé z notebooku přes USB rozhraní, plně využít ho
dokážeme, pokud budeme posílat povely přímo z konkrétní aplikace (Windows,
Linux, webové aplikace). Potom se nám hodí směrovač povelů, který poběží
např. na jednodeskovém SBC počítači (Asus Tinker Board, Raspberry). A o
tom je tento článek.
Cíle projektu
Cílem bylo napsat jednoduchou aplikaci,
která poběží pod Linuxem a bude mít tyto funkcionality:
1. Aplikace poběží na jednodeskovém (SBC) počítači velikosti kreditky, a
to pod Linuxem.
2. Aplikace bude typu TCPServer, který bude po spuštění naslouchat na
konkrétním portu.
3. Aplikace využije knihoven TCPSocket.
4. Aplikace umožní klientům (Windows, Linux) možnost připojit se z LAN
sítě (nebo odkudkoliv z Internetu).
5. Aplikace bude od přijímat od klientů povely.
6. Aplikace bude povely dekódovat. Platné povely bude odesílat do
některého ze 4 USB (ttyUSB0 až ttyUSB3) nebo sériového (ttyS0 až ttyS3)
portu SBC. Na tomto portu je zapojen expandér pinů, který zařídí sepnutí
nebo rozpojení příslušného výstupu.
Lidově řečeno, z notebooku tabletu nebo
telefonu pošlu povel. Ten budu posílat do vždy naslouchajícího serveru,
který bude povel směrovat do odpovídajícího sériového portu, kde ho
mikropočítač PICAXE zařídí sepnutí nebo rozpojení konkrétního relé (nebo
jiného spínače).
Vlastnosti směrovače povelů
1. Dekóduje dva povely Zap1 a Vyp1. Tyto
povely slouží pro laickou vizuální kontrolu komunikace směrovače po síti
IP. Neudělají nic jiného, než obarvení čtverečku červeně (Vyp1) nebo
zeleně (Zap1).
2. Dekóduje desetiznakové povely tvaru Serial Preambule Byte1 a Byte2,
příklad: 0118255255, kde:
0 ... číslo USB portu,
v mé aplikaci rozsah 0 až 3, tedy 4 porty
118 ... tzv. adresa v preambuli, určuje adresu čipu PICAXE v expandéru
pinů, uvažoval jsem použít maximálně 5 čipů na jedné desce expandéru, tj.
pět různých adres.
255... hodnota (rozsah 0-255) bajtu, který nastaví současně všechny
špičky na portu B u PICAXE20M2
255... hodnota (rozsah 0-255) bajtu, který nastaví současně špičky
na portu C u PICAXE20M2 (na portu C se jedná pouze o 7 špiček)
Teoreticky tedy uvažuji, že budu povelovat přes 4 sériové porty maximálně
5 čipů na každém portu a s využitím PICAXE 20M2 spínat maximálně 300 ks
relé.
Deset znaků povelu tedy směrovač povelů dekóduje, vyrobí z nich bajty pro
sériové porty, vybere požadovaný sériový port a do něho odešle preambuli s
adresou konkrétního čipu - viz popis expandéru a dva datové bajty na
spínání relé.
3. Směrovač spouštíme jako obyčejnou
aplikaci nebo ho necháme spouštět při startu SBC.
4. Základní chod směrovače můžeme sledovat a důležité věci nastavovat na
jednoduchém grafickém rozhraní. Protože jsem to psal ve vlaku mezi Táborem
a Prahou a zkoušel
mezi Roudnicí a Prahou na stařičkém notebooku Asus, vypadalo to takto.
Vlevo nahoře je zelený obdélníček, obarvil se po příjmu povelu Zap1. Dole
je žlutý obdélníček. Tam vidíte, že ze Socket 1 přišel povel 0 (port USB0)
118 (preamb - čip 118) 255 (bajt0) 255 (bajt1):

Protože jsem to potřeboval vyzkoušet ve
vlaku, vzal jsem si s sebou jen starou známou desku s PICAXE 08M2, kterou
jsem naprogramoval jako "expandér portů". Označení expandér je fakt
velkohubé, k dispozici jsou jen 4 špičky z portu C. Nicméně, algoritmus je
stejný, jako u desek s několika čipy PICAXE 20M2. Vypadalo to takto:

Zkušební vysílač povelů
Vysílač povelů je součástí aplikace, ze
které potřebujeme ovládat relé. Pro zkoušky ve vlaku jsem použil upravené
známé ovládátko, které jsem si naprogramovali v předchozích lekcích. Dole
jsou 4 tlačítka. Horní nám laicky ověřují TCP komunikaci mezi serverem po
LAN síti a rozvěcují obdélníček zeleně nebo rudě. Spodní odesílají povel
0118255255 (rozsvícení LED) nebo povel 0118000000 (zhasnutí LED) na tom
bastlfuši napájeném z USB portu (fotka nahoře).

Vývojové prostředí
Vše jsem napsal v Gambasu. Použil jsem
dříve popsaný TCP Server Socket, který jsem rozšířil o nový dekódér povelů
a algoritmus sériové komunikace přes USB nebo sériové porty:


Poznámky
1. Zdrojový kód ke stažení aplikace
RouterServerSerial je zde; zkušební
ovládač na posílání
kódu je zde.
2. Pedagogické hledisko. V každé aplikaci používám nějakou novou
dovednost. Zde jsem ukázal, jak se dělá s instrukcemi, které umožňují
dělat s tzv. řetězci (string), byly použity příkazy Left$,
Right$, Mid$. Instrukce byly použity v proceduře Dekoduj_povel a
příklady jsou označeny červeně. Význam parametrů je zjevný.
Left$(povel)
nemá žádný parametr, vždyť taky chceme, aby proměnné USB byl přiřazen
první znak. preamb = Mid$(povel,
2, 3) má dva parametry. Chceme, aby řetězec
preamb začínal druhým znakem řetězce povel a obsahoval tři znaky. Podobně
b1 = Right$(povel, 3)
bude obsahovat tři znaky zprava. Vše je jednoduché, s
jednoduchou logikou. Proto je jazyk Basic vhodný pro techniky a
neprogramátory.
Public Sub Dekoduj_povel()
'Procedura dekóduje povel
usb = Left$(povel)
preamb = Mid$(povel, 2, 3)
b0 = Mid$(povel, 5, 3)
b1 = Right$(povel, 3)
If povel = "Zap1" Then Label1.Background = &H00FF00
If povel = "Vyp1" Then Label1.Background = &HFF0000
If usb = "0" Then Serial0
If usb = "1" Then Serial1
If usb = "2" Then Serial2
If usb = "3" Then Serial3
End
Další důležité procedury, které jsem napsal, jsou:
Public Sub Serial0()
SP0.Begin()
SP0_Write_byte
Try SP0.Send()
If Error Then
Message("Zkontroluj zarizeni na portu!")
Endif
End
Popsaná procedura dělá jen málo věcí. SP0.Begin() otevře stream
portu, procedura SP0_Wite_byte() je popsaná níže a příkaz Try SP0.Send() a
If Error Then ... Endif se pokusí odeslat do sériového portu bajty. Pokud
zapomeneme zastrčit USB to Serial převodník, pošle nám u portu č. 0 na
obrazovku stupidní hlášku, abychom si zkontrolovali zasunutí HW na portu.
Proceduar SP0_Write_byte() pouze zapisuje odpovídající části z řetězce
povelu a znaky celé preambule do tzv. streamu portu, a to bajt po bajtu,
nejdřív preambuli, potom datové bajty b0 a b1. Bajt má dekadicky hodnotu
000 až 255 (hexadekadicky 00 až FF). Vidíte tedy, že procedura
SP0_Write_byte() píše jen do streamu portu 0, a to 4 byjty celé preambule
a dva bajty dat. Opakuji, že třetí bajt preambule adresuje konkrétní čip
PICAXE. Preambule u PICAXE Basicku funguje tak, že pokud nesedí s tou,
která je naprogramována v čipu PICAXE, tak čip ani nehne, hlavně tedy
nečte datové bajty. Pokud čip expanderu obdrží ze sériového vstupu stejnou
preambuli, pak přečte i oba datové bajty a podle nich nastaví všechny
výstupní špičky portů B a C na logickou úroveň H nebo L. To však bylo
popsáno u expandéru.
Public Sub SP0_Write_byte()
' zapise prvni 4 byty, tedy celou preambuli protokolu po bytech
254,254,preamb,224:
Write #SP0, 254 As Byte
Write #SP0, 254 As Byte
Write #SP0, preamb As Byte ' tento bajt preamb adresuje čip PICAXE desky
Write #SP0, 224 As Byte
Write #SP0, b0 As Byte ' zapise prvni bajt dat
Write #SP0, b1 As Byte ' zapise druhy bajt dat
End
Celý výpis programu jako
text lze stáhnout tady. Část TCP
protokolu a Socketu byla popsána v jednom z předchozích článků. Princip
sériové komunikace s čipy PICAXE rovněž. Proto jsem s programem neměl až
tak moc práce. Zajímá-li vás doba, kterou jsem to psal na malém noťasu ve
vlaku, tak asi hodinu, mezi Táborem a Praha hl.n.
Závěr
1.
Chtěl jsem ukázat, jak složité (nebo jednoduché) může být napsání
užitečného programu pro levné zařízení, které vám dokáže spínat stovky
relátek. Opakuji, že povely odesíláte z noťasu (tabletu, telefonu) a přes
domácí WiFi (nebo Internet) si bez sdělovacích kabelů spínáte desítky až
stovky relátek u měřícího zařízení nebo v přizpůsobovacích obvodech
antény.
Podle mého názoru je to velmi jednoduché. Vidláckým praktikám, od
struktury procedurálního programování, přes objekty typu TCPSocket a
Serial_port a přes pár základních instrukcí jazyka jsme se dostali k
užitečnému zařízení, které jsme si sami naprogramovali a které nikde za
drobné nekoupíte.
2. Na testování jsem použil
jednoúčelový zkušební ovládač. Protože jsem měl na cestách jen maličký
notebook, kde mohl běžet jen jeden operační systém ve stejnou dobu. Nemám
v Linuxu nainstalován VirtualBox. Otestoval jsem to pak doma, kdy jsem
posílal do zařízení různé validní i nesmyslné povely. Z Herkulesu.
Vypadalo to takto a označil jsem na obrázku důležité parametry a
nastavení:

3. Trtkal jsem do směrovače
spoustu validních i nesmyslných povelů z různých ovládačů (TCP klientů).
Zdá se, že to funguje stabilně a docela dobře.
4. Snad, aby bylo jasno, cílová platforma, na které server běží, je
jednodeskový počítač (SBC) velikosti kreditky. Já používám Asus Tinker
Board. Spuštěný směrovač povelů vypadá takto:

Není co dodat, snad, že jsem
nainstaloval operační systém Tinker OS na SD kartu, spustil jsem ho,
doinstaloval Double Commander, nastavil FTP k úložišti, stáhnul jsem si
soubor s programem, který jsem namastil v Gambasu a na této stránce
popsal. Potom jsem stáhnul z repozitáře Gambas, spustil jeho instalaci a
na plochu jsem vyrobil spustitelný soubor (má asi 20 kB).
|