Liiketunnistin ja näytönsäästäjä

OnePlus oli toivonut että peilillä näkyisi heidän mainosvideoita tai esittelyvideoita.
Ajattelimme ryhmän kesken, että OnePlussan video sopii täydellisesti näytönsäästäjä rooliin.

Päätimme hylätä Raspberry Pi:n oman näytönsäästäjä ohjelman ja käyttää tämän sijasta xscreensaver- ohjelmaa. Xscreensaver on hyvin helppo käyttää ja tätä pystyi hallitsemaan todella paljon. Xscreensaverin pystyi käynnistämään ja sulkemaan komennolla, tämä oli hyvin tärkeää meidän kannalta.

Olimme ostaneet peiliä varten liiketunnistimen, jonka tarkoitus olisi herättää peili lepotilasta kun tämä tunnistaa jonkun henkilön astuneen tämän eteen. Yritimme aluksi asentaa sensorit thobach GitHubin ohjeilla. Ohjeet osoittautuivat kuitenkin hyvin hankalaksi ja sekavaksi. Emme tästä johtuen saaneet liiketunnistinta näillä ohjeilla tehtyä.

Koska olin aikaisemmin kokeillut kyseistä liiketunnistinta Arduinolla. Olin varma että pystyn tekemään oman ohjelman joka käyttää liikettunnistimen dataa, ja tämän perusteella kertomaan onko liiketunnistimen edessä joku vai ei.

Päätin kokeilla ohjelmoida oman python koodin, joka hallitsee näytönsäästäjää. Tämä koodi ei siis ole millään tavalla yhteydessä peiliin, ja tämä koodi pitää käynnistää erikseen. Kyseinen koodi on hyvin simppeli, mutta koska kenelläkään ryhmän jäsenellä ei ollut kovinkaan paljon ohjelmointi taustaa takana, meni kyseisen ohjelman tekemiseen ja testaamiseen kokonainen päivä.

Arduino on ohjelmoitu keräämään liikettunnistimelta datan kaksi kertaa sekunnissa. Tämän datan Arduino lähettää suoraan Raspberrylle. Raspberryssä tiedon ottaa vastaan python koodi. Python kerää saadun tiedon kolmen ketjun ryhmiin, eli 1.5 sekunnilta saadun tiedon yhteen ryhmään. Python laskee jokaisen ryhmän keskiarvo arvon ja tämän perusteella se päättää onko peilin edessä ketään. Jos arvo nousee tarpeeksi korkeelle ajaa python-koodi komennon joka sammuttaa näytönsäästäjän (Käynnistykseen on laitettu 3-4 sekunnin viive, jotta videota voi hetken vielä katsoa kun tulee peilin eteen) . Vastaavasti jos arvo tippuu tarpeeksi matalalle, käynnistää python koodi näytönsäästäjän jossa on OnePlussan video.

 

 

 

Mainokset

Kuvastin asennus ilman verkkoa[FAIL]

Info:

Yritämme luoda ympäristöstä riippumaton peiliä ja jotem emme voi luottaa viikoittain ulos puskettuihin ohjelmisto päivityksiin , koska ne eivät välttämättä ole vakaita. Pyrimme tällä estämään peilin ohjelmiston tahattoman rikkoutumisen ja minimoimaan sen riskin.

 

Pakettien hankinta

Ensimmäiseksi meidän pitää hakea meille paketit valmiiksi , jotka sitten asennamme offline-tilassa saadaksemme peilin toimimaan. Paketin hallinnasta voi ladata paketteja ilman niiden asennusta antamalla komennon apt-get download paketin-nimi. Paketit tallentuvat tällä komennolla kansioon /var/cache/apt/archives/.

paketit-default.PNG

(täällä on kaikki asennetut paketit)

Toinen vaihtoehto on antaa sama komento kuin aikaisemmin lisäämällä loppuun yhden muuttujan lisää ja voit itse valita mihin kansioon paketinhallinta ne asentaa.

Komento näyttää tältä:

apt-get download -o=dir::cache=/tähän/haluamasi/polku/ paketin-nimi. Ladatut paketit eivät välttämättä toimi suoraan ellei niiden kanssa ole ladattu riippuvuuksia(DEPENDENCIES), jotka paketti tarvitsee toimiakseen. Laiskana henkilönä kopioin suoraan kaikki asennetut paketit kansiosta ja heitin ne git repositoryyn(git add *, git commit -a ja git push komennoilla). Lataan ne sitte testikoneelle ja poistan internetin käytöstä, jolloin näen saanko peilin asennettua manuaalisesti ilman nettiä.  Komennolla sudo dpkg -i /missä/paketit/on asentaa offline-tilassa paketin manuaalisesti.

offline-testi1

(Kuvastimen git ladattu ja sitten kone offlineen ja yrittämään asennusta.)

Manuaalisesti asennusta yrittäessä tein uuden virtuaalikoneen, johon yritin asentaa git pakettia. Ladatessani Salt-mirror projektin gitistä huomasin, ettei git ollut kopioinut kuin pelkän tyhjän kansion kuvastin projektista. katsoessani git kansiota koneessa jossa kopioin kuvastimen omaan git repositoriooni tiedostot ovat siellä. Hetken pähkäiltyä tämän ei pitäisi olla ongelma, kun kaikki asennuspaketit ovat kuitenkin siellä.

Sain asennettua curlin nodejs wget, mutta magicmirror asennus tarvitsee verkkoyhteyttä hakeakseen jotain tiedostoja. Tiedostojen lista on pitkä(https://github.com/heikkima/kuvastin/blob/master/package-lock.json) ja asennuksen muuttaminen scriptiin on vaikeaa, joten luulen joutuvani luopumaan offline asennuksesta. Tutkin asiaa tarkemmin ja kysyn neuvoja ennekuin palaan asian ääreen uudestaan.

Edit: Voi olla mahdollista, että katselin väärää tiedostoa ja tämä saattaisi olla oikea: https://github.com/heikkima/kuvastin/blob/master/package.json

 

Salt Raspberrylle

Yritämme luoda automaattista peiliä, joka päivittää itsensä automaattisesti. Tähän tarkoitukseen tarvitsimme etähallintaa. Etähallinta on erittäin kätevä keino hallita konetta/palvelinta, mutta nämä hallitut koneet ovat lähes poikkeuksetta aina samassa verkossa. Ongelmana meillä on, että peili tulee vaihtamaan paikkaa ja silloin emme tiedä onko uudessa paikassa minkälainen verkko vastassa. NAT suojaus on osoittautunut erittäin hankalaksi ja siihen haemme nyt ratkaisua SALT ohjelman muodossa.

Oma tietämykseni saltin käytöstä on tasoa ”ruohonjuuri”. En ole koskaan vielä konfiguroinut salt-masteria taikka minionia. Nyt olisi tarkoituksena saada master ja minion vastaamaan toisilleen, sekä jakamaan komentoja.

Virtualbox valmistelu

Asentaessani raspbianin desktop-versiota virtualboxiin tuli mieleeni, että miten saan molemmat koneet samaan verkkoon, virtuaaliseen verkkoon ja jolla pääsee kummatkin internettiin. Virtualboxissa pitää suunnistaa File valikkoon, josta valitsemme preferences ja avautuu uusi ikkuna mistä sunnistamme network kohtaan. Siellä näkyy tyhjä laatikko jonka oikeassa yläreunassa on pieni plus. Plussaa painamalla virtualbox luo uuden verkon, joka kätkee sisäänsä koneet. Sitten menemme virtuaalikoneen asetuksiin vaihtamaan verkkoasetuksiin NAT network adapter 1 -kohdalle.

vb ohjeet uusi

(Tässä luomme uuden NAT verkon)

 

vb netti

(Tässä valitsemme koneeseen mitä verkkoa käytetään)

 

Mistä Salt?

Samalla kurssilla oleva, saltin kanssa tällä hetkellä työnkentelevä, Jori Laine(Jorin Github projekti) sai itselleen hetkeksi tekemistä, kun kävin pyytämään apua saltin kanssa. Istuessamme koneen ääreen Jori antoi ymmärtää, että salt kannattaa käydä hakemassa täältä. Paketinhallinnassa(apt) on kuulemma vanha/viallinen/huono versio ja uusimmat ohjet eivät sen kanssa toimi kunnolla.

Latasin kotikoneelleni minionin ja masterin bootstrapin kautta(HUOM. OVAT ERI KOHDISSA TUOLLA SIVULLA!!!). Menin ensimmäiseksi muokaamaan minionin config tiedostoa(/etc/salt/minion) laittamalla minionin config-tiedostoon masterin nimen tilalle ip-osoitteen. Enempää en minionista säätänyt ja sen jälkeen masterin vuoro. Master sijaitsee samassa polussa kuin minion(/etc/salt/master). Laitoin masterin config-tiedostoon masterin kuutelevan omaa ip-osoitettaan,(Jori neuvoi tämänkin ja hyvin on toiminut) sekä asetin masterille nimen komennolla: master_id: #suolainen#nimi#. Master on muuten täysin minionin kanssa oletus asetuksilla.

master conf

(masterin config tiedostosta kuvaa asetusten jälkeen)

minion conf

(Minionin conffista kuvaa, kun on toiminnassa)

 

Top.sls

Masterilla saadessani yhteyden minioniin oli aika laittaa minionille topfile.sls kuntoon. Ajoin ensimmäiseksi masterilla komennon sudo salt raspberry (salt-minion) pkg.install vlc asentaakseni minionille testinä VLC mediatoistimen. Komento meni läpi ja minion suoritti ohjeiden mukaan toiminnot.

Capture
Masterin komennot minionille.
minion vlc
Minion kuuntelee ja tottelee.

 

Sitten Jorin ohjetta(täällä ohjeet) katsellessa oli aika laittaa topfile.sls toimintaan. Loin top.sls, johon laitoin sisään:

base:
’raspberry’:
– kuvastin

Tämä määrittää, että minion ”raspberry” suorittaa moduulin ”kuvastin”. Loin samaan kansioon kuvastin.sls käyttämällä sudoedit kuvastin.sls komentoa. Kuvastin.sls tiedostoon laitoin sisään seuraavaa: kuvsatin_sls

(moduulin on  tarkoitus asentaa paketit mitkä on edelletty magicmirror asennukseen.)

Seuraavana totetutan moduulin ajamisen minionille komennolla: sudo salt ’*’ state.apply tämä toteuttaa tilan kaikille koneille, mutta olemme top.sls laittaneet raspberryn minioniksi, joten tila toteutetaan ainoastaan yhdellä minionilla tai sitten kaikilla raspberry nimisillä minioneilla.

Ajaessani moduulia minionilla huomasin masterin palauttavan, ettei minion vastaa. Tähän kokeilin käyynnistää uudestaan minionin, mutta se ei auttanut. Jostain syystä salt-minion ei pysy käynnissä ollenkaan. Yrittäessäni käynnistää uudelleen salt-minionia, niin en saa sitä pysymään päällä, vaan se kaatuu. Kirjoittamalla history terminaaliin näen aikaisemmat komennot ja sieltä katsoessani mitä olin tehnyt aikaisemmin. Tuli mieleeni, jos minion on hajonnut poistaessani git koneelta. Poistin gitin koneelta moduulin testausta varten.

minion ei vastaa

(salt-minion ei vastaa.)

salt-minion ei vastaa

(minion ei jostain syystä pysy käynnissä.)

Poistin salt kansion ja ajoin apt-get purge salt-minion poistaakseni saltin tiedostot ja kävin sitten hakemassa saltbootsrapin uudestaan ja aloitin sen asentamisen. Sain asennuksen jälkeen salt-minionin toimimaan ja poistin vanhan avaimen masterilta. Käynnistin minionin uudestaan(sudo service salt-minion restart) ja hyväksyin masterilla avaimen(sudo salt-key -F master ja sudo salt-key -A). Sain masterin totetuttamaan top.sls tiedoston komennoilla sudo salt ’*’ state.apply. Master palautti seuraavaa:

saltmoduuli

 

(vihdoinkin ensimmäinen moduuli toimii.)

 

 

 

Crontab

Crontab on linuxin ohjelma, jolla on  mahdollista määrittää tehtäviä hoidettavaksi taustalla tietyillä aikaväleillä. On mahdollista määrittää esimerkiksi sudo apt-get update toimimaan vaikka viikon välein tai maanantaisin, joka kuukausi. Aloitin laittamalla crontabille(sudo crontab -e niin saat root käyttäjän ajamaan tehtävät. crontab -e on käyttäkohtainen.) tehtäväksi ajaa joka viikko perjantaisin sudo apt-get update ja upgrade. Tämä ei kuitenkaan onnistunut ja en osannut sanoa miksi.

Seuraavaksi aloin työstää kuinka saan salt-masterin luomaan crontabille tiedoston, jolla määritellään taustalla hoidetut työt. Avasin terminaalin ja komennolla Crontab -e saatiin auki cronin työtiedosto. Komennolla sudo crontab -e saadaan root käyttäjän cron tiedosto auki, koska jokaisella käyttäjällä on omansa.

Kokeillessa huomasin, että crontab ei suorita käskyjä kuten haluaisin. Kokeilin mm. @reboot service salt-master start -käskyä ja cron ei sitä suorittanut, kun tarkistin käynnistämisen jälkeen.  Etsin netistä vastausta ongelmaan ja ratkaisu on, että cron ei käytä samaa polkua(PATH) kuin käyttäjä. Komennot jotka toimivat terminaalissa eivät toimi cronissa ellei polkua, jossa se ne toteuttaa ole asetettu ennalta. Oman polun, jota käyttäjäsi käyttää saa esille, kun laittaa teminaaliin echo $PATH.

Kopioin echo $PATH tulostuksen ja laitoin sen crontabin asetustiedostoon. Samalla vaihdoin shellin mitä crontab käyttää bashiin lisäämällä seuraavan rivin SHELL=/bin/bash. Tämäkään ei toiminut. En oikein käsitä miten crontabin saa ajamaan tavallisisa terminaali komentoja ja tietoa etsimälläkään en saanut selvää vastausta ongelmaan. Annan nyt cronin olla ja keskityn saamaan salt-masterin toimimaan.

 

crontab

(crontab conf-tiedosto on auki alemmassa terminaalissa.)

 

crontab 2

(annoin tehtäväksi vaihtaa kansiota kuvastimen projekti kansioon ja suorittaa annetut tehtävät.)

 

crontab PATH

(crontab asetustiedosto johon laitettu käyttäjän polku ja bash shelli.)

Peilin asennus ongelmia

Eli meillä on tässä nyt ollut pari viikkoa ongelmana peilin asennuksessa bugi, jonka seurauksena näyttö pysyy mustana vaikka peili softa on päällä. Tähän etsimme ratkaisua mm. MagicMirror2 rakentajien foorumeilta. Tässä on muutama keino mitä kokeilimme foorumissa löytyneiden ratkaisujen ja omien pohdintojen seurauksena:

  • Peilin kielen vaihtaminen pois englannista
    • Ei auttanut
  • Raspbianin eri versioita
    • Ei auttanut
  • Asennus bashin korjaamista
    • Ei auttanut
  • Ylimääräisten moduulien poistamista config.js tiedostosta ennen asennusta
    • Ei auttanut
  • Asentaminen sudona
    • Ei auttanut

Yllättäen se ratkaisu, mikä sai peilin asentumaan meille tuntemattomasta syystä oli seuraava: ensin kloonasimme projektimme gitistä ja ajoimme asennus bashin roottina (sudo -s). Tämä ei vielä saanut peiliä toimimaan, mutta kun tämän jälkeen poistimme projekti kansion ja kopioimme sen gitistä uudestaan ja teimme manuaalisen asennuksen ilman roottia (npm install && npm start) alkoi peili toimimaan.

Edit. Myöhemmin huomasimme, että asennus bashiä muokkaamalla asentu peili puhtaalle raspbian käyttöjärjestelmälle ongelmitta useampaankin kertaan. Tässä kuitenkin piti aina muistaa että asennus bashia ei saanu ajaa sudo:na eikä roottina.

Tämä muutos on puskettu gittiin ja peili asentuu taas normaalisti Raspbian Stretch 4.9 käyttöjärjestelmälle ongelmitta.

Liiketunnistimien kokeilua

 

https://github.com/thobach/MMM-Gestures tästä osoitteesta löytyy ohje ja laitteet joita tarvitaan liike tunnistimen lisäämiseksi peiliin APDS-9960 sensori, joka havaitsee edestakaisin liikkeen sensorin edessä, sekä GP2Y0A21YK sensori, joka havaitsee etäisyyden. Arvelimme asennuksen onnistuvan, koska olihan reposition omistaja luonut ohjeet asennusta varten. Lähdin siis ohjeiden mukaan moduulia asentelemaan.

Aluksi laitoin piuhat niille osoitettuihin paikkoihin arduinossa.

Kuvista ei ehkä erota joten laitan ohjeen minkä mukaan pinnit laitoin kohdilleen:

  • Input 1: APDS-9960 on digital pin 2 (interrupt) + I2C (SDA on pin A4, SCL on pin A5) + GND & VCC (3.3V)
  • Input 2: GP2Y0A21YK on analog pin 0 (analog) + GND & VCC (5V)
  • Output: serial out on USB

Tämän jälkeen laitoin raspiin virran ja lähdin tekemäään softa puolta. Tässä vaiheessa kohtasin yllättävään ongelmaan: raspini reboottasi itsensä koko ajan. Aluksi luulin, että se oli jäänyt johonkin looppiin, mutta hetken goooglailtuani asiaa totesin, että syynä oli adapterini (5v,1A). Se ei antanut tarpeeksi virtaa.

Tämä ongelma onneksi ratkesi kun vaidoin virran tulemaan koneen usb 3 portista.

Seuraavaksi pääsin asentamaan softaa. ensiksi kloonasin moduulin kansioon kuvastin/modules komennolla ”git clone https://github.com/thobach/MMM-Gestures.git” ja vaihdoin ilmestyneeseen kansioon. Missä annoin komennon ”npm install serialport@4.x.x nodejs-websocket”. Asennuksesta sain pari erroria, mutta ne eivät toistaiseksi vaikuttaneet mihinkään joten jatkoin eteenpäin.

IMG_20171117_113825.jpg

Automaattinen käynnistys

Seuraavaksi laitoin peilin ja gestures.js käynnistymään samalla kun konekkin käynnistyy. Siihen on oma ohje osoitteessa

 https://github.com/MichMich/MagicMirror/wiki/Auto-Starting-MagicMirror

ja olen kirjoittanut siitä aikaisemmin täällä, joten en mene siihen sen syvemmin.

 

Arduino

Nyt lähdin kokeilemaan miten moduulin arduino koodi toimii Arduinossa. Ohjeet olivat sen suhteen hiukan epäselvät. Ainakin henkilölle, joka ei ole aikaisemmin työskennellyt Arduinolla. Aluksi piti lisätä seuraavat kirjastot arduinon kirjastoon:

https://github.com/RobTillaart/Arduino/tree/master/libraries/RunningMedian

https://github.com/jeroendoggen/Arduino-distance-sensor-library/tree/master/DistanceSensor

https://github.com/sparkfun/APDS-9960_RGB_and_Gesture_Sensor

Koska en tiennyt miten se tehdään niin sen selvittelyssä meni hetki. Kirjastot löytyvät kun Arduino on asennettuna, käyttäjän alkuhakemistosta sketchbook folderista. Thobach kirjoitti ohjeessaan, että hän on lisännyt kirjastot moduuli pakettiin, mutta en niitä sieltä löytänyt, joten jouduin hakemaan wgetillä jokaisen tiedoston githubista (view raw ja kopioi url). Tämä menetelmä toimi kahden ensimmäisen kirjaston kohdalla, mutta sparkfunin kirjasto ei jostain syystä toiminut tai sitten en löytänyt oikeita tiedostoja.

Lisäksi kun olen kopioinut sparkfunin koko repositorion, niin arduino valittaa ettei kirjaston nimi saa sisältää muuta kuin numeroita ja kirjaimia. kokeilin nimeä muuttaa, mutta se ei auttanut vaan arduino valittaa seuraavaa ”No such file or folder as SparkFun_APDS9960.h found.” eli se ei löydä tiedostoa, vaikka se on kansiossa. Kokeilin myös sinne kopioida ainoastaa nuo tiedostot, mutta sain silti saman valituksen.

Eli asennus ei toistaiseksi ole onnistunut.

 

 

Uusi näyttö OnePlussalta!

Viikko sitten perjantaina lähdimme vaihtamaan peiliimme uutta näyttöä, jonka OnePlus oli meille sponsoroinut. Ensin meidän oli tietenkin irrotettava vanha näyttö raameista ja, koska olimme päätäneet vielä kerran vaihtaa peiliimme kalvon, otimme myös peili levyn irti. Jotta saimme levyt irti oli ruuveja löysttävä ja lkuumaliimaa revittävä, mutta kaikesta huolimatta onnistuimme kehikon hienovaraisessa purkamisessa.

 

 

Tätä seurasi putsaus operaatio, jotta saisimme kalvosta jääneet liiman rippeet irti lasista. Tähän käytimme kuumaa vettä, saippua vettä, ikkunan puhdistus ainetta, rättejä, pesusieniä, raakaa voimaa ja tanssi askeleita.

Seuraavaksi oli vuorossa uuden kalvon kiinnitys peiliin ja ilmeisesti oman kokemuksemme vuoksi tästä peilin pinnasta tuli paras tähän mennessä.

 

 

Seuraavaksi purimme näytön osiin ja vertasimme kuinka paljon paremmin uusi näyttö näkyi vanhaan verrattuna. Alla olevista kuvista huomaa selkeästi eron. Logo erottuu paremmin ja esimerkiksi uutisista saa jopa luettua jotain uudella näyöllä nainirkkaassa valossa.

 

 

Nyt oli vuorossa näytön kiinnitys peiliimme niin, että se pysyisi varmasti siinä kiinni eikä tipahtaisi matkan varrella pois.

IMG_20171103_150406.jpg

Ongelmia SD-kortille siirtämisessä

Kokeilimme perjantaina koulussa asentaa sensoreita Raspberryyn ja peili ohjelmaamme siinä kuitenkaan onnistumatta. Tarkoituksenamme oli hyödyntää MMM-Gestures moduulia, joka löytyy osoitteesta https://github.com/thobach/MMM-Gestures. Meiltä ilmeisesti puuttui jotain, koska vaikka kuinka yritimme emme saaneet moduulia toimimaan vaan Arduino ilmoitti puuttuvasta kirjastosta.

Joka tapauksessa sovimme, että jatkaisin tästä eteenpäin kotona omalla Rasperrylläni. Olin suunnitellut, että lataisin käyttöjärjestelmän koneelleni ja siirtäisin sen sitten USB-piuhan kautta sd-kortilleni, joka oli puhelimessani. Olimme tehneet samoin myös aikaisemmin ja menetelmä oli toiminut…

 

…mutta ei tällä kertaa. Kytkin puhelimeni kiinni koneeseen täynnä toivoa ja unelmia, mutta siitä alkoikin itku ja hampaiden kiristys. Koneeni ei havainnut puhelintani ja puhelimeni ei havainnut tietokonettani. Kokeilin koneessani käyttää Device manageria ja skannata uusien laitteiden toivossa, mutta se ei tuottanut tulosta. Tämän jälkeen latasin kännykälleni (Huawei Honor 7 lite) tarkoitetun HiSuite-ohjelman ja seurasin sen antamia ohjeita.

Lisäksi varmistin, että File transfer oli käytössä eikä asetus vain lataus.

Tämäkään ei auttanut lopulta lähdin kiertelemään foorumeita ja löysin lupaavan näköisen ohjeen https://forums.androidcentral.com/ask-question/628255-huawei-p8-not-recognized-any-pc.html

Jossa oli Andreid Gallardon kirjoittama viesti

There is a solution…

In your dialer, type in *#*#2846579#*#* then select in background>usb hisuite and there you have it…
works like magic…

hope it helps.

cheers!”

 

Kokeilin tätä vielä useammilla eri USB-tiloilla mutta kun tämäkään ei toiminut päätin luovuttaa ja kokeilla uudestaan labraluokassa, jossa menetelmä oli aikaisemminkin onnistunut.