Problémom však aj naďalej ostáva prepojenie týchto zariadení s PC, najmä ak sa jedná o viacero zariadení a pokiaľ ich chceme prepojiť na väčšie vzdialenosti, rádovo desiatky až stovky metrov.
Knižnica AndamBus rieši práve vyššie uvedené problémy tak, že je možné pomocou jednoduchých príkazov komunikovať so zariadeniami Arduino pripojenými na spoločnú zbernicu.
Základný popis
Ako už bolo vyššie spomenuté, topológia komunikačného rozhrania je zbernica, kde jedno zariadenie je považované za nadradené (po starom master – vraj sa už nemá používať :-) a ostatné zariadenia, ktoré komunikujú po výzve nadradeného zariadenia (po starom slave – toto už vôbec nepouzívať). Topológiu znázorňuje nasledovný obrázok:
Pre fyzickú vrstvu bol zvolený štandard RS485 z dvoch dôvodov:
- Príjemca je pripojený na zbernicu v pasívnej konfigurácii – s režime vysokej impedancie a neovplyvňuje teda stav zbernice v režime príjmu.
- Signalizácia je diferenciálna po krútenej dvojlinke. Takáto signalizácia umožňuje z veľkej časti odfiltrovať naindukované rušenie jednoduchým odčítaním priameho a invertovaného signálu.
Samotný štandard umožňuje komunikovať až do 1200m, v takom prípade sa však musí použiť príslušná rýchlosť. Reálne mám odskúšané 3 zariadenia na zbernici o dĺžke cca 50m.
Nad takto vytvorenou topológiou sa následne nachádza „sieťový stack“ – možno je to príliš honosný názov, verte však, že v prípade jednoduchších kontrolérov sa jedná o pomerne bohatú funkcionalitu (napr. ak porovnám s funkcionalitou rodiny GPRS modemov SIM800×).
Nadradený uzol je tvorený „inteligentným“ zariadením typu PC, prípadne RaspberryPi, ktoré riadi celú komunikáciu spôsobom dopyt-odpoveď. Implementované je ako dynamická knižnica pre linux (.so).
Podriadený uzol môže byť v zásade ľubovoľné zariadenie, momentálne však existuje implementácia najmä pre Arduino Mega (nižšie verzie sú príliš obmedzené) alebo PC pre účely testovania protokolu. Implementácia zahŕňa okrem samotnej komunikačnej časti aj implementáciu často používaných zariadení ako napr. teplomery Dallas 1-wire, termostaty, časovače, ovládanie solárneho ohrevu vody, ovládanie žalúzií, atď.
Hlavné funkcionality knižnice:
- Autodetekcia pripojených jednotiek (zariadení Arduino) podľa adresy zariadenia
- Kompletná konfigurácia pripojených jednotiek (ovládanie a konfigurácia vytvorených termostatov, časovačov)
- CLI klient na základné nastavenie a konfiguráciu
- Pri pravidelnej obnove sa prenášajú len zmenené hodnoty z pripojených jednotiek
- Implementované callbacky napr. zmena hodnoty pinu, chyba komunikácie
Na čo je to celé dobré?
Pri riešení domácej automatizácie je často potrebné dostať dáta z riadiacej jednotky do PC, prípadne niekam na server, aby bola informácia dostupná aj vzdialene. Takisto je dôležitý aj opačný smer komunikácie – chcem doma otvoriť garážovú bránu. Vyberiem si mobil a stlačením tlačidla sa mi zavolá web servis, ktorý prostredníctvom tejto knižnice pošle môjmu Arduinu príkaz, ktorý pin má prepnúť aby sa garážová brána otvorila.
Rovnako dobre však poslúži na ovládanie solárneho ohrevu vody, zavlažovanie trávnika, alebo len obyčajné sledovanie fyzikálnych veličín ako je teplota, relatívna vlhkosť, svetelné podmienky, prípadne rýchlosť vetra.
Princíp je jednoduchý – každá podriadená jednotka obsahuje sadu tzv. portov, ktoré slúžia ako základná jednotka riadenia. Môžu byť rôzneho typu (analógové, digitálne, vstupné, výstupné a rôzne kombinácie týchto charakteristík) a pri najjednoduchšom použití (konfigurácii knižnice) zodpovedajú jednotlivým GPIO pinom. V tomto článku si aj ukážeme, ako môžeme nastaviť pomocou knižnice AndamBus porty tak, aby sme ich mohli čítať, alebo ovládať pomocou príkazov z príkazového riadku PC. V prípade záujmu by som pripravil pokračovanie článku, kde by som ukázal ako je možné nakonfigurovať aj pokročilejšie požiadavky ako napr. čítanie hodnoty teplomera, zobrazenie hodnôt na LCD, jednoduchý termostat apod.
Ako na to?
Pre inštaláciu a použitie knižnice je potrebná aspoň základná znalosť práce s Arduinom. Takisto pre kompiláciu a použitie Linuxovej časti je potrebné poznať základné ovládanie Linuxu, IDE CodeBlocks (možno by sa dalo nahradiť iným buildovacím nástrojom) a C++.
Stačí nám na to zopár súčiastok (samozrejme okrem PC, resp. nejakého mini počítača s linuxom):
- Arduino Mega (je dobrá aj „čínska“ verzia z AliExpresu)
- RS485 modul pre Arduino
- RS485 modul pre USB
- Prepájacie káble
- Prípadne relé moduly, teplomery, LCD displej podľa uváženia, resp. podľa toho čo chcete ovládať, merať
Kód používa niektoré externé knižnice, ktoré je potrebné pred spustením kompilácie stiahnuť a nainštalovať na príslušné miesto:
- DallasTemperature
- OneWire
Najprv je potrebné stiahnuť zdrojové kódy z GitHubu.
Zdrojové kódy sú rozdelené do 2 častí podadresármi Arduino a Linux. V podadresári Arduino sú uložené zdrojové kódy, kde andamBus a andamBusDevs je potrebné nakopírovať do adresára s knižnicami pre Arduino. Ja ich mám uložené c:\Users\<username>\Documents\Arduino\libraries
. Podadresár ino obsahuje 2 súbory, ktorú tvoria základnú kompilačnú jednotku pre Arduino projekty. Je potrebné ich nakopírovať na správne miesto podľa používanej konfigurácie (u mňa d:\work\arduino\andambus
).
Po nakopírovaní si otvoríte .ino súbor v Arduino IDE a spustíte kompiláciu pre Arduino. Po skompilovaní pripojte Arduino a spustite nahrávanie programu. Sériový terminál si nastavte na rýchlosť 115200 bps. Ak sa všetko podarilo, po reštarte by ste mali vidieť nasledovný výpis:
Obsah adresára Linux si nakopírujete na PC s Linuxom (používam aktuálne virtuálku s Ubuntu 18.04). Projekt knižnice bol vytvorený v nástroji CodeBlocks 17.12. Po otvorení projektu si vyberte target libIntel a spustite kompiláciu (Ctrl+F9). Po skončení nájdete vytvorenú knižnicu v podadresári bin/intel/libAndamBus.so
. Môžete si tento súbor skopírovať medzi lokálne knižnice napr. /usr/local/lib
. A následne spustiť sudo ldconfig. V prípade, že sa tak rozhodnete neurobiť, nezabudnite nastaviť premennú LD_LIBRARY_PATH
.
Pre kompiláciu nástroja pre príkazový riadok, ktorý túto knižnicu používa si vyberte kompilačný target cl intel a spustite kompiláciu. Binárny spustiteľný súbor nájdete v podadresári bin/intel/abc
.
Aby bolo možné nástroj použiť, je potrebné zapojiť HW. Samotné zapojenie nie je nijak zložité, možno v prípade prvého pokusu sa bude zdať, že je toho veľa, ak to ale začnete používať, začne to všetko dávať zmysel.
Samotné zapojenie vyzerá nasledovne:
Nakoľko počítam s tým, že pri prvých pokusoch budete používať len krátka prepojovacie káble a len jedno podriadené Arduino, nie je potrebné sa zdržiavať zakončovaním vedenia. Pri použití dlhších zberníc je už potrebné zakončovať na oboch stranách.
Spustenie programu abc
Program spustíte nasledovne:
ferec@ubuntu-18:~/ws$ bin/intel/abc /dev/ttyUSB0
Ak nedošlo k žiadnej chybe, program čaká na príkazy z klávesnice. Kedykoľvek môžete vyvolať nápovedu pomocou príkazu h<enter>.
V prvom kroku je potrebné spustiť detekciu zariadení na zbernici. Knižnica je konfigurovaná na hľadanie adries 1–5. Program vypíše zoznam nájdených jednotiek, v tomto prípade:
Podriadené jednotky (Arduino) sú konfigurované s predvolenou adresou 3, ktorú je možné zmeniť príkazom a (ktorý slúži na nastavovanie rôznych vlastností).
Po úspešnej detekcii vykonáme refresh príkazom „r“. Pokiaľ máme pripojených viacero jednotiek, je možné vykonať refresh len vybranej jednotky príkazom „r 3“.
Po úspešnom refreshi si zobrazíme zoznam portov na danej jednotke príkazom „l p 3“. Zobrazí sa nám prázdny zoznam, keďže sme zatiaľ na jednotke nič nenakonfigurovali.
Poďme si teda vytvoriť jednoduchý výstupný port na GPIO 8 pomocou príkazu „c p 3 8 DO“. V nápovede nájdete popis jednotlivých komponentov príkazu, ale v jednoduchosti: c(vytvor) p(port) 3(adresa jednotky) 8(číslo GPIO) DO(digital output).
Následné zobrazenie zoznamu portov cez „l p 3“ zobrazí detaily o vytvorenom porte.
Na tento port si môžete pripojiť LED diódy, prípadne relé. Ak nemáte poruke, stačí voltmeter. Hodnotu si nastavujete pomocou príkazu „s 3 8 0“ alebo „s 3 8 1“ podľa toho, akú hodnotu chcete na porte nastaviť.
Port je typu DO, tzn. výstupný port, kde logická 1 znamená +5V a 0 znamená 0V. Logická 1 však nemá dostatočný výkon na priame ovládanie LED diód s vyššou spotrebou, nanajvýš postačí na nízkopríkonové. V takom prípade sa môže hodiť typ DOR, ktorý má priradené hodnoty opačne, tzn. logická 0 je +5V a logická 1 je 0V.
Knižnica ďalej ponúka možnosti ďalších typov portov: DI je digitálny vstup 5V a DIP je aj s pullup odpormi priamo v kontroléri.
Čo sa týka analógových vstupov, typ portu je AI a podporujú ich piny A0 až A15, ktorých číselná hodnota je 54 až 69.
Analógový výstup Arduino priamo nepodporuje, je však možné použiť emuláciu pomocou PWM na vybraných pinoch a následne vyhladiť dolnopriepustným filtrom. Použijeme typ portu AOP.
Aby sme o konfiguráciu neprišli, uložíme do EEPROM príkazom „w 3“.
Čo sme ešte nespomenuli?
Knižnica toho vie oveľa viac, vyššie sme si ukázali len základnú funkcionalitu. V pokračovaní si ukážeme ako nastaviť Arduino tak, aby sledoval teplotu pomocou digitálneho teplomera a túto hodnotu zobrazoval na LCD displeji. Prípadne si môžeme ukázať ako vytvoriť funkčné zariadenie (termostat), ktoré dokáže reagovať na zmenu teploty zapnutím portu. A to tak, že knižnicu použijeme len na konfiguráciu Arduina a termostat ostáva funkčný aj po odpojení knižnice.