JavaScript hardverprogramozás [Novucode]

Az utóbbi időkben a JavaScript hihetetlen népszerűségnek örvend. Szinte a legnépszerűbb programozási nyelvnek tekinthető. Ezt jól mutatja az is, hogy mennyire sokat fejlődött, milyen rengeteg dologgal egészítették ki, és itt nem csak a NodeJS-re gondolok: már mobil aplikációkat írhatunk vele. Sőt a FirefoxOS próbálta app rétegként használni mobilon majd pedig TV platformon.

Ebből a trendből a harverfejlesztők sem maradhattak ki, így születtek meg az olyan projektek, mint a Tessel, az Espruino vagy a JonnyFive (illetve a többi). Ráadásul az olyan gyártó – mint a Tessel – még kész modulokat is árul a központi vezérlőhöz, így macerás forrasztások nélkül (plug and play), szinte egyből használható egy-egy szenzor vagy vezérlő.

De miről is szól ez az egész javascript a hardveren őrület? Miért jó?

Működését tekintve a lényeg az, hogy implementálták az alap JavaScript utasításkészletet, kiegészítették pár hardver specifikus utasítással és írtak hozzá egy egyedi firmware-t, amivel a végeredmény egy a támogatott mikrovezérlők által értelmezhető kódot generál, majd ezt futtatja is a kiválasztott eszközön. Ebben az a jó, hogy egy sokak által ismert nyelven lehet programozni, így használhatóak a kedvenc fejlesztői eszközeink, illetve nem kell egy teljesen új dolgot megtanulni, ahhoz alkalmazkodni. Persze így kevésbé optimális kódot tudunk csak írni, illetve kevesebb funkciót érünk el – nem úgy mint a gyártók által adott SDK-ban megírt alkalmazásban. Azonban még így is rengeteg lehetőségünk van.

Az ARM alapú eszközöknél (RaspberryPi, Tessel, egyebek) ez végtelenül egyszerű; csak bedugjuk és szinte egyből írhatjuk a programunkat. Kicsit bonyolultabb a helyzet ha mikrovezérlőt (Arduino, ESP8266, egyebek) szeretnénk használni, hiszen ekkor több plusz beállítást is el kell végezni egy sima Arduino IDE telepítéshez képest, szóval lehet, hogy nem a kezdők kedvence lesz. Persze a kettő architektúra között fontos különbségek vannak: míg az ARM alapú vezérlők egy apró Linuxot futtató számítógépnek tekinthetőek, ahol a számítási kapacitás magasabb; addig a mikrovezérlő alapú megoldások sokkal kissebb erőforrással rendelkező céleszközök korlátozott funkcionalitással, cserébe viszont stabilabb működéssel, alacsonyabb fogyasztással és gyorsabb boot idővel.

Próbáljuk ki!

Én az Espruino-t választottam, mivel a céleszköz egy ESP8266 alapú Sonoff Basic és ez alapból támogatja. Az Espruino futtatja az ES5 JavaScript utasítások nagy részét (kb 95%), sőt több ES6-os újdonság is elérhető: arrow functions, template strings, binary literals, forEach/etc on ArrayBuffers. Ezen felül egy kész IDE-t is ad a kezünkbe, melyben akár vizuálisan is szerkeszthetjük, majd felírhatjuk a vezérlőre a kódunkat. Ideális eszköz azoknak akik most ismerkednek a hardver programozással.

Ahhoz hogy elkezdjünk egy ilyen projektet, a következőkre lesz szükségünk:

  • kompatibilis mikrovezérlő
  • egy editor
  • programozó (USB soros átalakító, ha nincs ráforrasztva)
  • feltelepített driver (Windows, Linux, OSX)
  • a kész firmware
  • fontos, hogy a WebIDE beállítások, kommunikációnál jó „Baud rate” legyen megadva (esetemben 115200)

Ha programozót használunk, a következőképp csatlakoztassuk:

  • Táp – Táp
  • RX – TX
  • TX – RX
  • GND – GND

A driver telepítése (esetemben CH340) után a mikrovezérlő beállítása a következőképpen néz ki:

Ha ezzel megvagyunk, akkor akár fel is csatlakozhatunk a vezérlőre és valós időben adhatunk neki utasításokat JavaScriptben, mint például:

Persze így nem tudunk értelmes alkalmazást írni, ezért nyissuk meg a kedvenc szerkesztőnket és abban folytassuk. Az erdeményt utólag is fel tudjuk küldeni az eszközre.

De lássunk egy példát, hogy mikor jön jól az, hogy javascriptben programozhatunk: Szeretnénk egy wifis relét (Sonoff Basic) távolról vezérelni. Ehhez elég lenne az Arduino IDE-hez elérhető ESP8266 könyvtár által biztosított beépített webszerver, illetve a wifis kliens vagy hozzáférési pont mód. Ez az alábbi kóddal megoldható:

Mindez JavaScriptben a következőképpen néz ki:

Látszik, hogy az Espruino használatával a hasonló feladatok egyszerűen megoldhatóak úgy hogy a kód összességében kevesebb, végülis a JavaScript nyelv a web nyelve.

Már csak ki kell tennünk a gombot, aminek a megnyomására ki/be kell kapcsolnunk a relét:

Persze itt tudnunk kell mindig az eszközünk IP címét (ha van hozzáférésünk a hálózatunk routeréhez, akkor ezt az IP címet fixálhatjuk). De mi van ha több eszközünk van? Akkor már nem túl kényelmes minden esetben megnyitni a böngészőben az adott eszközt, ráadásul minél több ilyen eszközünk van, annál nehezebb lenne fejben tartani az egyes címekhez tartozó funkciókat. Ha pedig biztonságosan akarjuk megoldani, akkor minden eszközön külön meg kellene adnunk a belépéshez szükséges jelszót. Valljuk be, nem éppen kényelmes.

Célszerű ezen a ponton valamilyen módon összekötni a reléket. Legjobb megoldás erre egy üzenet bróker alkalmazása, ami működését tekintve nagyon egyszerű: fogad egy üzenetet egy topic-ban, majd addig tárolja míg valaki ki nem olvassa onnan, vagy  –beállítástól függően – mindig megőrzi az utolsó állapotot. Ehhez beállíthatunk felhasználónév/jelszó párost biztonságunk érdekében. IoT körökben a legelterjedtebb ilyen protokol a gyors MQTT, melynek sokféle implementációja érhető el, mint például az ingyenes Mosquitto. Ilyen bróker használatával már nem kell tudjuk a relék IP címét:

Ha szeretnénk visszajelzést kapni arról, hogy a vezérlő végrehajtotta az utasítást, beállíthatunk egy státusz topic-ot is, ahová a mikrovezérlőnk ír és a kliens olvas ki, ahogy a példában is látható. Már csak annyi a feladatunk, hogy a vezérlőnkben beállított topic-ba üzenetet küldjünk be, ami jelen esetben az 1 vagy a 0 parancs lesz. Ezt tehetjük például mobilról egy alkalmazás használatával (pl: MQTT Dash), vagy számítógépről, esetleg integrálhatjuk meglévő okosotthon rendszerünkbe (pl Home Assistant).

Mint látható, nem is olyan bonyolult az így megszületett kód. Aki szeretné később bővítheti egyedi értesítések kezelésével, eseménykezeléssel, webes felülettel vagy akár kijelzővel is. Viszont ha nagyon összetett logikát szeretnénk megvalósítani, érdemes előbb elolvasni a performanciáról szóló részt a dokumentációban.

Az elékészült kódot a WebIDE segítségével könnyen felküldhetjük az ESP-re, így kipróbálhatjuk a kódunk működését. Viszont ez csak átmeneti, ugyanis egy újraindítás után kikerül a memóriából. Ahhoz hogy véglegesen bekerüljün a kód a vezérlőbe, ki kell adnunk egy save() parancsot, amit megtehetünk a WebIDE bal oldalán.

Összességében egy gyorsan eredményt biztosító és könnyen tanulható jól dokumentált platform ez azoknak, akik most ismerkednek a hardver fejlesztéssel, vagy csak érdeklődnek a különlegességek iránt. Ráadásul az Espruino-hoz elérhető WebIDE segítségével nagyon könnyen próbálhatunk ki kódrészleteket anélkül, hogy az alap firmware-t felülírnánk, így ideális kísérletezéshez.

 


A cikk a novucode.com-ról költözött át

Kövess minket!
, , ,

About Virág Zoltán

Meetup szervező, előadó és okosotthon blogger. Szabadidőben otthonát és kertjét automatizálja, ezen felül kütyümániás alkalmazás fejlesztő.
View all posts by Virág Zoltán →