Raspberry Pi ruudulla

Minä kun harrastan noita Raspberry Pi-tietokoneita niin tulee aina välillä varusteltua. Kirjoitin aiemmin kakkosmallin tehokkuudesta – se on jo varsin tehokas pikku taskupalvelin, vetäen vertoja low-end pilvipalvelimille. Yleensä olen nähnyt nämä IoT-laitteet tiedonkerääjinä, sensoreina, ja kontrollereina – ne tarjoavat palveluita ja niiden käyttöliittymät ovat esim. mobiilisoftia.

Nyt tuli kuitenkin hommattua jotain erilaista: 2.7″ tft näyttö jolla voi näyttää esim. xwindows näkymää, JavaFX käyttöliittymää, linux konsolia, tai mitä mieleen juolahtaa.

Raspi ja näyttö

Tuliko mainittua että se on kosketusnäyttö? Luo vähän puhtia ajatuksiin esim. olohuoneen mediapömpelistä. Ja varsin kätevä myös kun mystisestä syystä linukka kuolee tai menee outoon tilaan – ellei nyt logien kauhomisesta niin innostu. Ja se JavaFX… Nam.

Näitä näyttöpatentteja on ollut ennekin, mutta tämä Adafruitin näyttö on kyllä harvinaisen kätevä ja nopea asentaa.. Ainoa huono juttu, että se syö signaalipinnejä, käytännössä peittäen ne kaikki. Mutta sen alla on myös liitäntä cobblerille jota kautta voi ainakin osan ottaa uudestaan käyttöön.

Vielä ei paljon hajuakaan siitä mitä aion tehdä tällä, mutta kiinnostava se on joka tapauksessa. Tykkään pi-laitteista. Ne ovat halpoja, helppoja, ja inspiroivia.

Ja tuolla se siis on: https://www.adafruit.com/products/1601

Internet of Messed-Up Things

Kirjailin taannoin kokeiluista mitä tein GoPiGo botilla. Viikonloppuna tuli firman bileissä filosofoitua taas kerran kaikenlaisista älyhärveleistä, niistä jotka lentävät, ja niistä jotka huristavat maata myöden. Vaikka dronet ovat juuri nyt pop, perinteiset maata pitkin mönkivät botit ovat helpompia (ja halvempia) kokeiluun ja opiskeluun.

2015-07-05 17.27.22

Minä tekäisin aikanaan nodejs:llä karun komentoliittymän gopigo-softan ja raspberry pi-ympäristön päälle. Siinä on websocket serverikomponentti, joka ottaa yksinkertaisia käskyjä vastaan ja välittää ne servoille ja moottoreille – ja vastavuoroisesti antaa takaisin mittatietoa. Sitten siinä on ugly as hell-tyyppinen poc-käyttöliittymä, joka on koodattu html-sivun sisään. Nodejs serveri käynnistää molemmat, ja kun tähän ottaa yhteyttä esim. kännykällä, hupi voi alkaa. Tosiaan toistaiseksi botin suurin saavutus on kiusata perheen koiraa ja vierailevia kissoja.

2015-07-01 22.21.13

Ajattelin kuitenkin avata tämän vähäisen näperryksen jos joku on myös kiinnostunut vastaavista. Valitsin noden pohjaksi juuri nopean ja joustavan kokeilun vuoksi. index.js tiedosto käynnistää yhteyden gopigo kerrokseen, ja potkaisee käyntiin pienen websocket sekä web serverin porttiin 3000, ja lataa index.html sivun. Se on verkkainen mutta riittävän nopea, jos haluaa turboahtaa lisää voi käytellä pi v2 myllyjä. Itselläni sattui juuri olemaan ylimääräinen 1st gen Pi tähän kokeiluun, kakkosgeneraatiolla on ylväämpiä tehtäviä 😉

Screenshot 2015-09-11 19.27.32

Jeah, ux suunnittelua mahdollisesti voisi vielä viedä pidemmälle. Kokeile kännykässä niin huomaat sen 😉

No niin, pidemmittä puheitta: https://github.com/crystoll/gopigo

IoT: Go home PI, you’re drunk!

Internet of Things on kiehtonut omaa mieltä jo pitkään ennen kuin termi edes keksittiin: Se on pääosin se asia joka nykypäivän communicator/mobile device kategorian laitteissa ja älypuettavissakin kiehtoo. Älykkäiden verkottuneiden laitteiden mahdollisuudet ja uhat. Nyt tuli sitten aika pistää äly pyörille.

2015-07-05 17.27.22

Nykypäivänä on helpompaa kuin koskaan näperrellä ja prototypoida näiden parissa: Raspberry Pi tietokoneet ovat halpoja ja niihin saa kiinnitettyä oikeastaan mitä vain mielikuvitus loihtii. Olen itse rakennellut niihin aiemmin kokeilumielessä full stack raskasta Java EE ratkaisua, milloin MySQL kannan, milloin MongoDB:n kera ohjaamaan kodin automaatiota. Tuli kokeiltua sekin miten Glassfish sovelluspalvelin pyörähtää käyntiin: Ihan hienosti, jopa ihan ykkösgeneraation Raspissa.

Tällä kertaa halusin kokeilla jotain uutta. Muutama vuosi takaperin JavaOne seminaarissa osallistuin autokilpailuun jossa koodailtiin autoihin algoritmia jolla ne ajaisivat lujaa mutta pysyisivät radalla. Siitä jäi ajatus itämään. Hiljattain tutkin Lego Mindstorm EVO paketteja, mutta ne tuntuivat rajoittuneilta, ja kalliilta kokeiluun nähden. Niihinkin löytyy toki nykyään BrickPi-laajennus jolla voi laittaa Raspberryn käskemään EVO kontrollereita ja sensoreita. Mutta itselleni haaviin jäi GoPiGo-alusta. Moottorit, pieni kontrolleri joka kytkeytyy suoraan Pin kylkeen, virtapaketti joka toimii pattereilla ja irrottaa laitteen virtapiuhan tyranniasta. Go, Pi, Go, feel the wind in your electronic hairs! 😉

2015-07-05 17.27.05

Eli tilaukseen napsahti, ja ei kun testailemaan. GoPiGo web sitelta sai latailla valmiin imagen joka pohjautui jo tuttuun Raspbianiin, ja toimi ihan ok, kunhan viritin sen langattomaan kotiverkkoon ja kävin läpi alustusrutiinit. Sieltä löyty esimerkkejä mm. Pythonilla, Javalla, ja testailin niiden avulla että olin koonnut kaiken oikein ja piuhat olivat paikallaan. Mutta kuten sanottua, tällä kertaa oli tarkoitus tehdä jotain uutta.

Joten päädyin viritykseen, jossa ytimen muodostaa node.js palvelin. Viritin sen automaattikäynnistymään Raspin myötä. Automaattikäynnistys tapahtuu ihan init.d scripteillä, ja apuna käyttelin forever + nodemon yhdistelmää, jotta prosessi päivittää itsensä kun koodeja päivitetään, ja myös jos se sattuisi kaatumaan.

Palvelin initialisoi GoPiGo osan, ja kiinnittää pari tapahtumankuuntelijaa, mm. varoittamaan jos virta käy vähiin pattereissa. Ja lataa html-sivun jonka kautta raspia voi ohjailla. Tuossa vähän maistiaista miltä sen pään koodi näyttää:

socket.on('status', function(msg){
  $('#messages').append($('<li>').text(msg));
});
$('#forward').click(function() {
  socket.emit('command','move forward');
});
$('#backward').click(function() {
  socket.emit('command','move backward');
});

Halusin rivakkuutta ohjaukseen joten websocketeilla mennään. Tarkemmin, socket.io nykyisellä inkarnaatiolla. Käyttöliittymä on tässä kohtaa karu – pelkkää html:ää ja jquerya. Vähän kutkuttaisi päästää Aurelia irti tässä kohtaa. Käytännössä siis websocket kanavalla liikkuu kahteen suuntaan tavaraa: status viestit menevät ’status’ kanavalle, ja näytetään ’client’ päässä. Komennot lähetetään ’commands’ kanavalle, ja voivat olla esim. mene eteenpäin, pysähdy, käänny, laita ledejä päälle, jne.

Ja sehän toimii. Hienosti. Jopa ihan Android kännykästä käsin. Sillä oli kiva kiusata kissoja ja koiraa 😉

2015-07-05 17.33.55

2015-07-01 22.21.13

Mitähän hittoa tällä sitten tekee? No ei yhtikäs mitään. Mutta mielenkiintoinen harjoite taas keveiden pikku älylaitteiden maailmassa, nodejs tuntuisi olevan mukavan keveä ratkaisu tämäntapaiseen hommaan, ja Raspberry Pi tuntuu Noden kanssa tarjoavan kaikki tarpeelliset palaset että prosessin saa pyörimään luotettavasti ja itsenäisesti.

Seuraavia askelia:

– pistä UI päähän jotain fiksumpaa ja helpompaa kehitysframeworkia, esim. Aurelia.

– Kiinnitä pakkaan sensoreita, esim. mikroaaltotutka, kamera, servoja.

– Opeta robotille Asimovin kolme periaatetta ettei käy kuin Volkswagenin tehtailla

– Laita laite tuomaan kylmä olut kun se aistii sille tarpeen.

– Ja ampumaan raketteja devaajan päähän joka taas /&%/&% rikkoi sen buildin! Tässä voidaan vähän joustaa Asimov-periaatteiden kanssa.

http://www.dexterindustries.com/GoPiGo/projects/python-examples-for-the-raspberry-pi/raspberry-pi-controlled-office-cannon/

Raspberry Pi 2 kotiutui

Posti toi mukanaan paketin, jossa oli uudentuoksuinen Raspberry Pi 2 kapistus. Sille löytyykin heti käyttöä, mutta maltoin napsia pari kuvaa ja jaan vähän ensivaikutalmia tässä. Pahoittelen kuvien Nexus 6-laatua, liikkeellä on paljon laadukkaampaakin kuvitusta 😉

Raspberry Pi 2

Kuten on toitotettua, laite on aiempaa moninkerroin tehokkaampi, 900MHz quad core prosessorilla varustettu, ja kuitenkin alkuperäisen hintainen. Muitakin muutoksia löytyy rautapuolelta.

USB portteja on nyt kahden sijasta hubitettu neljä, ja muistikorttikin on pienentynyt MicroSD-kokoon.

USB Portit

Muistikortit

Komposiittivideo löytyy nykyään audioportista. Muuten tutun kaltainen kapistus. Jaahas, ei sitten muuta kuin käyttistä kortille.

Nyt on valinnanvaraa taas hiukan enemmän. Itse olen tykästynyt ennestään Raspbianiin jossa tulee Oraclen Javaa heti mukana hard floatilla. Mutta tarjolla myös mm. Snappy Ubuntu Corea, Pidoraa, Noobsia, Risc OS:ia, ja tietenkin se Windows 10.

Mutta mennään Raspbianilla vielä toistaiseksi, pari projektia mielessä sen päälle. Ja sinne plutkahti perus-käyttöönoton päälle vanha tuttu Java 8 (kuuluu nykyään distroon, ei vaadi sen enempää), ja uutena tulokkaana node.js, npm, sekä mongodb. Hassua kyllä nämä viimeisimmät vaativat erityisvimpautuksia raspbianiin – mutta eivät toki kovin ihmeellisiä. Tahkosin toimivat komennot scripteinä talteen – postailen ne ehkä vastaisuudessa tännekin. Tässä on vähän varaa valita haluaako kääntää itse vai käyttää muiden tekemiä 3rd party paketteja. Mongon kääntäminen ja asennus vei viimeksi tunteja (siinä muuten hyvä benchmarkki uudelle) joten tuikkasin 3rd party paketeista kaiken kehiin.

Tästä kuuluu ehkä vähän lisää joku toinen kerta 😉

Java 8 SE Final Raspberry PI:hin

No niin, ehdin taas puuhastella kotiprojektin kimpussa. Asensin jo aikanaan Java 8 prereleasen Raspberry Pi:hini, pyörittelin sillä MongoDB:tä ja Glassfish 4:sta, ja rakentelin EJB:llä ja JAX-RS palveluilla releitä ohjaavaa koti-aivoa.

Nyt oli hetki aikaa päivittää finaaliversio, ja RasPille tosiaan Hard Float. Ei sillä että prerelerasenkaan kanssa olisi ollut ongelmia. Prosessi meni siis näin:

sudo apt-get update && sudo apt-get install oracle-java8-jdk

 

Easy 😉 Toki vanhat moskat voi poistaa ensin jos on käsin asennellut jotain. Itselläni lähti /opt/java menemään, tuo paketti asentelee näemmä oletuksena /usr/lib/jvm alle.

Hyvä tarkistaa ajamalla vielä:

javac -version
java -version

No melkein. Jostain syystä java ei linkittynyt tuolla paketilla /usr/bin/java alle. Ihan kaikki muut tärkeät JDK vimpaimet kyllä mukaanlukien jconsole ja jar ja javac. Joten tein käsin uuden linkin:

sudo update-alternatives --install /usr/bin/java java /usr/lib/jvm/jdk-8-oracle-arm-vfp-hflt/jre/bin/java 1
sudo update-alternatives --config java

Ja valitaan haluttu versio – varmaankin hyvä idea ottaa sama kuin ensimmäisellä komennolla. Testataan taas.

pi@romanov ~ $ java -version
java version "1.8.0"
Java(TM) SE Runtime Environment (build 1.8.0-b132)
Java HotSpot(TM) Client VM (build 25.0-b70, mixed mode)

 

Ja hienosti pelittää! Ei muuta kuin Glassfish uudelleen käyntiin.

 

 

MongoDB Raspberry PI:ssa

MongoDB käännetty, asennettu ja testattu RaspBerry PI:ssa (Kotiserveri Glassfish + EE 7 + Java 8 + MongoDB projekti).

Seurasin ohjeita seuraavista blogeista yhdistellen:

http://c-mobberley.com/wordpress/2013/10/14/raspberry-pi-mongodb-installation-the-working-guide/

http://ni-c.github.io/heimcontrol.js/get-started.html

Toisesta myös Node.js apuja. Joka tapauksessa, hyödyksi on että koneessa oli 512 megaa muistia, hyvä sammutella muistisyöpöt prosessit käännösten ajaksi ja varata tosiaan tunteja aikaa.

Kuva

Sitten katsotaan miten EJB paukuttelee ajastuksia ja logituksia Mongoon. Oisko tämä Big Datan vastakohta? 😉

Java 8 ja Glassfish 4 Raspberry Pihin

No niin, olen taas ollut Cyberhome-projektin parissa, eli tietotekniikkaa omaan kotiin. Projekti etenee laiskasti kun vapaa-ajalla ei jaksa/pysty/huvita ihan kaikkia iltoja koodailla ja säätää. Mutta eilen tuli vähän läpimurtoa taas Raspberry Pi (raspi) minitietokoneen osalta – siitä ja sen serkuksista on tarkoitus tulla autonomisen mutta tarvittaessa mobiilisti ohjattavan kodinohjausjärjestelmän aivot.

Raspberry Pi ohjaa kotia

Raspille on paljon artikkeleita pythonille, mutta päätin tapella siihen sensijaan Java-puolen kuntoon. Jotta saadaan vaikeustaso kohdalleen, uusimman release candidate version Java 8 versiosta. Siinä ei ollut sinällään mitään ihmettä, pudottelin Hard Float version JDK 1.8:sta arm prosesorille, purin sen /opt alle, fiksasin linkit ja ympäristömuuttujat, ja nyt pyörii Java 8 – ja lambdat ja streamit – täysimuotoisena.

Seuraava etappi oli Glassfish 4. Siihen oli yllättävän paljon ohjeistusta, mutta pääosin vain tiputin sen paikalleen /opt alle, ja säädin vähän muistia ja timeout arvoja, tähän tapaan:

<jvm-options>-XX:MaxPermSize=96m</jvm-options> 
 <jvm-options>-XX:PermSize=32m</jvm-options> 
 <jvm-options>-Xmx128m</jvm-options>
<thread-pool name="admin-thread-pool" max-thread-pool-size="50" max-queue-size="256" idle-thread-timeout-seconds="3600"></thread-pool> 
 <thread-pool name="http-thread-pool" idle-thread-timeout-seconds="3600"></thread-pool> 
 <thread-pool name="thread-pool-1" max-thread-pool-size="200" idle-thread-timeout-seconds="3600"></thread-pool>

Jep, se ei ole nopea, mutta se toimii. Full Java EE 7 Stack, plus uudet Java 8 piirteet.

Tämän päälle rojautin sinne MySql ajurit ja kannan. Ja asensin sen automaattikäynnistyväksi ajamalla Glassfish työkalun asadmin create-service. Tässä tulikin pikku pulma. Glassfish käynnistyi kyllä ajamalla sudo /etc/init.d/GlassFish_domain1 – kuten pitääkin. Mutta ei toiminut buutatessa automaattisesti.

Pikkasen yömyöhän kokeilemisen avulla löytyi ongelma yllättävästä päästä – tuossa Glassfish scriptissä tulisi olla oikeanlaiset headerit, ilman niitä se ei asennu palveluksi. Lisäsin sinne seuraavaa ja se alkoi toimimaan:

### BEGIN INIT INFO
# Provides: Glassfish
# Required-Start: $local_fs $network
# Required-Stop: $local_fs
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
### END INIT INFO

Sitten tuunasin vielä Netbeansin lähettämään työn alla olevat softat suoraan sftp:llä Glassfishin autodeploy-kansioon. Tästä oli hyvät ohjeet ant:lle, mutta halusin tehdä saman Mavenillä – ja pikku säätelyn jälkeen sekin onnistui. Se osuus taas näyttää tältä:

<build>
 <plugins>
<plugin>
 <artifactId>maven-antrun-plugin</artifactId>
 <executions>
 <execution>
 <phase>install</phase>
 <configuration>
 <tasks>
<echo level="info" message="Copying dist directory to remote Pi"/>
<exec executable="d:/utils/pscp.exe" dir="${basedir}">
<arg value="target/${project.build.finalName}.${project.packaging}"/>
<arg value="pi@raspissh:/opt/glassfish4/glassfish/domains/domain1/autodeploy"/>
</exec>
</tasks>
</configuration>
<goals>
<goal>run</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>

Ja nyt on homma aika saumatonta. Tuo ylläoleva toki vaatii lisäksi oikeat työkalut, omassa tapauksessani putty-kirjaston ohjelmistoja, ja tuo raspissh avain pitää luoda ja asentaa paikalleen raspiin jotta salasanoja ei tarvitse kirjoitella vaan autentikointi hoituu lennossa avaimilla.

Päräytin varhaiskokeiluna Java EE 7 mukaisen REST palvelun joka käyttää Pi4J kirjastoa ja kääntää releitä ja kytkimiä ja ledejä päälle ja pois. Siihen päälle HTML5+JQuery käyttöliittymä joka niitä JSON komentoja heittelee sisään ja ulos. Alkaa näyttämään hyvältä. Kiitos Mavenin voin pajautella muutoksia vaikka tekstieditorilla ja asentaa uuden softan komentoriviltä.

Jahka saan vielä paketin vahvavirta-releitä ja vähän konsultointiapua, kodin automaatio etenee taas pykälällä. Tarkoitus on mm. ajastaa lämmitystoimintoja älykkäämmin säilyttäen silti override-mahdollisuudet mm. kännykällä ja ihan vanhanaikaisella Big Red Button(tm):lla.

Tässä pari vinkkiä mistä oli itselle säätäessä apua (mikään ei tietysti toiminut heti heittämällä kuin Strömsössä):

http://www.thehecklers.org/2013/10/27/glassfish4-raspberrypi/

http://blog.c2b2.co.uk/2013/06/getting-started-with-glassfish-4.html

https://blogs.oracle.com/speakjava/entry/integrating_netbeans_for_raspberry_pi