Objavljeno:

BlueSensor - izzivi pri razvoju strojne opreme

Razvoj strojne opreme v praksi prinaša kar nekaj izzivov in tega smo se lahko naučili tudi pri razvoju naprave BlueSensor.

Ko smo se namreč lotili jedkanja tiskanine se je izkazalo, da načrt vezja ni ravno najboljši. Načrt je namreč vseboval napako, poleg tega pa je bil narejen za industrijsko proizvodnjo in za “domače” sestavljanje ni bil ravno najbolj primeren. Zato smo pred jedkanjem na hitro pripravili nov načrt. A hitenje je prineslo nove težave in nov načrt je imel še hujšo napako, kar smo na srečo odkrili pred sestavljanjem končnega produkta. Poleg tega se je izkazalo, da bi bilo na vezje morda smiselno dodati še kakšno malenkost, konkretno LED diodo, zato so bile ponovno potrebne spremembe. Vezje je bilo torej potrebno razviti ponovno, staro serijo ploščic pa žal zavreči.

No, tretji oziroma drugi poskus je uspel in nastala je nova serija ploščic (izdelane so bile po tim. kemo transfer metodi, ki jo bomo opisali v enem prihodnjih prispevkov). Nanje smo prispajkali elemente in naložili strojno programsko opremo in tokrat je vse delovalo kot je treba…

…dokler se ni izkazalo, da pri komunikaciji preko Bluetootha prihaja do težav. Lahko da je težava v slabih Bluetooth modulih, lahko pa je težava v pregovorno slabi implementaciji Bluetooth podpore v Linuxu. Kakorkoli, treba je bilo najti drugo rešitev.

A najprej na hitro o zgradbi celotnega sistema. Prvi del sistema predstavljajo senzorji, ki podatke lahko pošiljajo preko Bluetooth povezave ali preko USB kabla. Mogoče bi bilo tudi pošiljanje preko Wi-Fi ali kakšne druge radijske povezave, a ta del (še) ni implementiran, saj zahteva ustrezno strojno opremo. Podatke nato na računalniku bere ustrezen bralnik (aplikacija), ki jih skupaj s časom in v ustrezni JSON strukturi pošlje strežniški aplikaciji, ta pa nato naprej na tim. spletni vtičnik (angl. web socket). Bralniki berejo ustrezne podatke iz različnih senzorjev z različnimi tipali, strežniška aplikacija podatke zbira ne enem mestu, spletni strežnik pa jih prikazuje na spletu.

Ker se je izkazalo, da bo v časovni stiski razhroščevanje Bluetooth povezave oziroma iskanje ustreznih rešitev (npr. ena izmed Arduino naprav bi lahko delovala v načinu master in podatke zbirala od ostalih ter jih preko USB kabla posredovala računalniku) preveč dolgotrajno, smo se odločili, da bomo raje do konca napisali modul za branje podatkov preko USB povezave (torej razvili dodaten bralnik).

Senzorji so tako na računalnik – v našem primeru je to kar RaspberryPi – povezani preko USB kablov, kar je sicer rahlo nepraktično, a sprejemljivo.

Samodejna povezava preko USB kabla

Da pa bi bila uporaba posameznih senzorjev čim bolj enostavna, smo najprej s pomočjo upravitelja naprav v Linuxu UDEV napisali pravila, s katerimi računalnik samodejno zazna, da je bil v USB vrata priključen Arduino. To ugotovi s pomočjo identifikacije USB naprave in njenega proizvajalca. Rešitev sicer ni optimalna, ker sistem zazna zgolj Arduino, ni pa (še) zmožen ugotoviti ali gre za BlueSensor napravo ali ne, a to bomo rešili kasneje.

Najprej smo si ogledali identifikacijske podatke Arduino sistemov in sicer s pomočjo ukaza lsusb:

Bus 001 Device 009: ID 1a86:7523 QinHeng Electronics HL-340 USB-Serial adapter

Nastavitev UDEV pravil je nato razmeroma enostavna. V /etc/udev/rules.d/ ustvarimo datoteko 90-bluesensor.rules:

sudo nano /etc/udev/rules.d/90-bluesensor.rules

Vanjo zapišemo pravila:

KERNEL=="ttyUSB0", ATTRS{idVendor}=="1a86", ATTRS{idProduct}=="7523", SYMLINK+="BlueSensor0"
KERNEL=="ttyUSB1", ATTRS{idVendor}=="1a86", ATTRS{idProduct}=="7523", SYMLINK+="BlueSensor1"
KERNEL=="ttyUSB2", ATTRS{idVendor}=="1a86", ATTRS{idProduct}=="7523", SYMLINK+="BlueSensor2"
KERNEL=="ttyUSB3", ATTRS{idVendor}=="1a86", ATTRS{idProduct}=="7523", SYMLINK+="BlueSensor3"

Pravila pomenijo naslednje. Če je v USB vrata vključena naprava z ID proizvajalca 1a86 ter ID naprave 7523, UDEV ustvari ustrezno simbolno povezavo do USB naprave z imenom /dev/BlueSensorX (X je številka od 0 do 3).

Sledi ponovno nalaganje UDEV pravil:

sudo udevadm control --reload-rules

Ko zdaj v USB vrata vključimo Arduino, se poleg naprave npr. /dev/ttyUSBo pojavi še naprava /dev/BlueSensor0.

Hkrati pa smo bralnik podatkov iz USB povezave prilagodili tako, da bere samo podatke iz naprav /dev/BlueSensorX. Ostale ttyUSB naprave pusti pri miru.

Zdaj je potrebno zgolj pognati bralnik in ko se BlueSensor naprava pojavi v sistemu, bralnik prične brati podatke iz nje in jih pošiljati strežniški aplikaciji. Da bi zadevo poenostavili, smo pognali štiri bralnike, vsak “pazi” na svoja USB vrata in ko je nanje priključena BlueSensor naprava, prične podatke pošiljati naprej.

Ta del smo rešili s pomočjo Supervisorja – gre za sistem, ki je namenjen nadzoru procesov v Linux sistemu. Najprej ga namestimo:

sudo apt-get install supervisor

Nato za vsaka USB vrata (na RaspberryPi sistemu so štiri) ustvarimo ustrezno nadzorno aplikacijo:

sudo nano /etc/supervisor/conf.d/bluesensor.conf

Ta datoteka vsebuje:

[program:bluesensor]
command = python /home/pi/bluesensor/bluesensor-server.py read-serial 
autostart=true
autorestart=true

Žal je za vsaka USB vrata potrebno narediti svojo lastno datoteko, saj je podpora za tim. okoljske spremenljivke (angl. env variables), ki jih lahko uporabimo kot parametre (angl. command line parameters) na voljo šele od Supervisorja 3.2 dalje, tega pa operacijski sistem Raspbian v trenutni različici še nima.

Kaj stori zgornja nadzorna aplikacija?

Zažene bluesensor-server.py s parametrom “read-serial 0“. Torej, zažene strežniško aplikacijo, ki pokliče USB bralnik (read-serial.py) in sicer s parametrom 0, kar pomeni, da bralnik skuša poiskati napravo /dev/BlueSensor0. Ta aplikacija se zažene samodejno ob zagonu sistema, v primeru, da preneha delovati, pa jo Supervisor ponovno samodejno zažene.

Sledi posodobitev Supervisor pravil, ki tudi zažene nadzorno aplikacijo (le-ta pa ustrezen bralnik):

sudo supervisorctl update

Da vse deluje preverimo s:

sudo supervisorctl status

Ko sedaj BlueSensor napravo vključimo v USB vrata, se na spletu prične samodejno risati graf (spletni strežnik teče na RaspberryPi sistemu). Če napravo izključimo in kasneje ponovno vključimo, se črta s podatki prekine in nato nadaljuje naprej. Podatki se nareč prikazujejo v realnem času (oz. z zamikom ene sekunde).

Vklop in izklop BlueSensorja se odrazi na vizualizaciji podatkov.

Vklop in izklop BlueSensorja se odrazi na vizualizaciji podatkov.

Ker posamezne BlueSensor naprave v ustrezni strukturi pošiljajo svojo identifikacijo (oz. meta podatke), lahko za vsako meritev vemo iz katerega senzorja prihaja (v oklepaju je navedena lokacija BlueSensorja), ne glede na to na katera USB vrata je le-ta priključena.

Vizualizacija senzorskih podatkov preko spletne aplikacije.

Vizualizacija senzorskih podatkov preko spletne aplikacije.

Mimogrede, plinski senzorji (še) niso umerjeni in prikazani podatki so v tim. surovi obliki in ne ppm. Vlaga je prikazana v odstotkih, temperatura pa v stopinjah Celzija. Prikaz posameznih črt lahko izključimo, podatki se osvežujejo na eno sekundo. Vizualizacija je sicer še nedokončana in bo vanjo potrebno vložiti še kar nekaj razvoja.

Na RaspberryPi napravi je sicer postavljena Wi-Fi dostopna točka in lasten DNS strežnik. Ko se povežemo na to dostopno točko v spletni brskalnik vpišemo “http://bluesensor.ijs” in prikaže se nam spletna aplikacija za vizualizacijo senzorskih podatkov. Tako lahko povsem neodvisno od spleta vzpostavimo povsem lastno infrastrukturo za vizualizacijo podatkov.

Kategorije: Odprta strojna oprema
Ključne besede: BlueSensor, senzorski sistemi, otroci