sunnuntai 26. kesäkuuta 2016

Tee-se-itse-palvelin sensoridatalle Node.js:llä

Internetiin yhdistetyt sensorit tuottavat hirmuisen määrän dataa, ja koko hommassa ei ole mitään järkeä jos tietoa ei saa tallennettua tietokantaan ja haettua ja suodatettua tarvittaessa. Tätä varten on pilvipalveluja, mutta olen jo pitkään halunnut viritellä oman serverin kotiin. Lisäksi kiinnostuin vähän aikaa sitten node.js:stä, joten päätin tehdä koko homman itse.

Teinkö todella vuokaavion? Taisinpa tehdä. Verkkoon liitetty valoisuussensorini lähettää kerran minuutissa lukemansa wifin kautta node.js -serverille, joka tallentaa sen MongoDB-tietokantaan. Dataa voi katsella ja muokata webbikäyttöliittymän kautta.


Olen asentanut muutaman kerran perinteisen LAMP -stackin (Linux, Apache, MySQL, PHP), ja sellaisenkin päälle olisin toki voinut dataa keräävän serverini rakentaa. Olen kuitenkin taustaltani huomattavasti enemmän front- kuin backendkoodaaja, joten mahdollisuus käyttää tutumpaa JavaScriptiä serverin puolella sai minut valitsemaan node.js:n. Tyhjensin siis vanhan media-PC:n serveriksi ja asensin siihen Ubuntu 16.04 -käyttiksen. Tietokantana toimii MongoDB ja serverinä node.js:n ja express.js:n voimin ohjelmoitu tee-se-itse -palvelin.

En ole ikinä koodannut serveriä enkä ajatellut sitä nytkään tekeväni, mutta löysin vaativan mutta mainion tutoriaalin aiheesta. En ala tässä käymään sen tarkemmin läpi pitkähköä ja teknistä asennus- ja koodaussessiota, mutta asiasta kiinnostunut löytää paljon lisätietoa edellä olevasta linkistä. Lyhyesti kuvattuna Express.js loi valmiin luurangon, jonka päälle on nopea kehittää monenlaisia node.js -sovelluksia. Serveri oli valmis muutaman illan koodailun tuloksena (voi juhannuksen näinkin viettää :D). Se sisältää kirjautumisen, autentikoinnin, salasanojen hashauksen, käyttäjien hallinnan, datasettien luomisen ja yksilöllisten API-avaimien generoinnin.

Hyödyllisemmän sensorin puuttuessa liitin NodeMCU -mikrokontrolleriin valovastuksen sarjaan 12k vastuksen kanssa 3.3 voltin ja ainokaisen analogisen pinnin väliin, ja kirjoitin ohjelman joka lähettää kerran minuutissa luetun arvon tuliterälle palvelimelleni GET-metodilla. Jotta tietokantaan voi kirjoittaa arvoja, ko. datasetin täytyy olla ensin asetettu julkiseksi ja lähettävän ohjelman täytyy tietää oikea API-avain.

Vasemmalla MacGyveroidun sensorini lukemat muutaman tunnin ajalta, oikealla serverin loki. Datasta voimme päätellä että a) aurinko menee välillä pilveen ja b) valon määrä tuvan puolella taloa kasvaa iltaa kohti. Onpahan nyt faktatietoa asiasta.


sunnuntai 19. kesäkuuta 2016

verkko-ohjattu LED

Ekskursioni Lua-ohjelmointiin NodeMCU:lla edistyy. Kirjoitin lähiverkossa toimivan serverin, jonka kautta voi ohjata RGB-LEDiä puhelimella, tabletilla tai millä vain laitteella jossa on selain. Kytkentä ei voisi olla simppelimpi, sillä NodeMCU toimii 3.3 voltin jännitteellä, joka on tarpeeksi lähellä LEDin käyttöjännitettä. Kytkin yhteisen katodin maahan ja jokaisen värin anodin omaan ulostulopinniinsä. Pitempiaikaiseen installaatioon olisi ehkä silti syytä laittaa virtaa rajoittavat vastukset anodeihin, sillä valo on melko kirkas.


NodeMCU-firmwaren tehokkuus näkyy hyvin koodin pituudessa: koko ohjelma on vain noin sata riviä pitkä ja siitäkin suurimman osan muodostaa asiakaslaitteelle tarjoiltava HTML. Vastaavan serverin ohjelmointi pelkällä C:llä vaatisi jäätävän paljon enemmän koodia. Lua on kuitenkin rakennettu C:n päälle ja tukee tarvittaessa C-kielen funktioita kun halutaan suorituskykyä.

Ohjelma avaa lähiverkkoon yksinkertaisen serverin, joka kuuntelee TCP-yhteyksiä portissa 80 ja lähettää asiakkaalle nettisivun joka sisältää punaisen, sinisen ja vihreän neliön, joita klikkaamalla lähetetään palvelimelle get-metodilla avain/arvopari (esim ?vari=PUNAINEN). Ohjelma tulkkaa avaimen ja arvon URL:n perästä saadessaan get-komennon, ja sytyttää halutun LEDin.

Alla oleva listaus toimii, mutta se on yksinkertaisempi mitä aluksi koodasin. Jostain syystä merkkijonoksi tallennettu bufferi ei voi olla suurempi kuin 1460 tavua, ja jouduin poistamaan HTML-koodista noin puolet. Tutkimukset aiheesta jatkuvat, sillä mitään tämän monimutkaisempaa ei niin minimaaliseen tilaan mahdu. Tuli mieleen ainakin koodin pätkiminen alle 1460 tavun paketteihin ja niiden lähettäminen asiakkaalle yksi kerrallaan, mutta toivoisin jotain vähemmän monimutkaista ratkaisua.

lauantai 11. kesäkuuta 2016

NodeMCU WiFi-moduuli tulla tupsahti postilaatikkoon

Mitä kaikkea saakaan neljällä eurolla? Riippuu mistä ostaa. Sillä saa joko hampurilaisen ilman ranskiksia ja juomaa, tai sitten täysverisen 32-bittisen dev boardin 80 MHz suorittimella, WiFi-yhteydellä ja USB-liitännällä.

Nätti kuin mikrokontrolleri pienenä

Minulla oli jo yksi ESP8266 -moduuli sääasemaprojektia varten, mutta se siirtyi paikkaan X, joka on tunnetusti, varsinkin minun tapauksessani, melko yleinen tavaroiden säilytyspaikka. Se oli lisäksi vielä karvahattumalli, jonka ohjelmoimiseen olisi tarvinnut Arduinon tai USB - Serial konvertterin, joten päätin tilata NodeMCU v3:n (kuvassa) jonka voi kytkeä suoraan tietokoneeseen, ja jossa on paljon GPIO-pinnejä prototyyppausystävällisessä formaatissa.

Käyttöönotto

En ole aiemmin puuhastellut muiden kuin kasibittisten AVR-kontrollereiden kanssa Arduino-ympäristössä, joten ensimmäiseksi piti asentaa koneelle tarvittavat työkalut firmwaren päivitykseen ja koodin lataamiseen:
Ensimmäinen öö-hetki tuli heti vastaan. Esptool eli firmwaren päivitykseen käytettävä softa toimii pelkästään vanhemman Python 2.7.x, mutta ei uuden 3.x version kanssa. Downgreidattuani Pythonin aiempaan versioon sainkin esptoolin toimimaan ja komentokehotteen kautta pingattua laitetta. Se palautti kuuliaisesti chip id:n ja muutaman muun datanpätkän. Success, laite toimii!


sunnuntai 5. kesäkuuta 2016

Ötökkärobotti

Sääasemaprojektin osia odotellessa rakenneltiin Onnin kanssa yksinkertainen kävelevä robotti. Tosin vielä sitä ei voi sellaiseksi kutsua, sillä tällä hetkellä se on ohjelmoitu kävelemään koko ajan eteenpäin, eikä siinä ole yhtään sensoria. Ötökkäbotin vartalo koostuu kahdesta toisiinsa kuumaliimatusta SG90 - servosta, jotka liikuttelevat rautalangasta taivuteltuja jalkoja. Servorungon päälle sopii kuin nakutettuna Arduino Nano -klooni, joka ohjaa servoja ohjelman mukaan. Nanon päällä on vielä 9v paristokotelo, ja koko viritelmä on kiinnitetty runkoon professionaalisesti parilla kuminauhalla.
Kunhan saadaan ötökkä kävelemään suunnilleen suoraan, liitän systeemiin myös ultraäänisensorin, jolloin botti osaa väistää esteitä ja seiniä.