Poslední aktualizace  květen 2019 

      
 

   Směrovač povelů

Ú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).

 


 

   TU 73, Mira, ok1ufc