Table of Contents Introduction
0
Dankwoord
1
Hoofdstuk 1 Voorbereiding
2
Concept
2.1
Benodigdheden-Materiaallijst
2.2
Raspberry pi
2.3
Operating System
2.4
Configuration
2.5
Hoofdstuk 2 Software
3
server
3.1
Webage features
3.2
Weer
3.2.1
News
3.2.2
Datum en tijd
3.2.3
Wifi
3.2.4
Lunch
3.2.5
Quotes
3.2.6
Audio
3.2.7
screensaver
3.2.8
Hoofdstuk 3 Hardware
4
Sensoren
4.1
Leds
4.2
Speakers
4.3
Microfoon
4.4
Connecting Hardware
4.5
Hoofdstuk 4 Audio issue
5
Hoofdstuk 5 Autoboot
6
Hoofdstuk 6 Montage
7
Hoofdstuk 7 Resultaat
8
Hoofdstuk 8 Besluit
9
Introductie November five een IT bedrijf gevestigd in het hartje van Antwerpen aan de voet van de Kathedraal , Tot voor kort ging November Five nog door het leven als Appstrakt. Deze naam dekte echter al lang niet meer het volledige pakket waar het bedrijf mee bezig was. November five heeft namelijk de dag van vandaag buiten ondersteunende diensten maar liefst 7 afdelingen: strategy and service design, Experience design, Native Application development, web development, Hardware engineering, product operations, client operations. Zoals je kan merken zijn het niet enkel apps meer, waar de meer als 50 werknemers zich dagelijks mee bezig houden. Om het nieuwe gezicht en imago, dat met de naamsverandering gepaard ging te etaleren, ontstond het idee voor deze bachelor proef. Zoals de titel van deze scriptie wel doet vermoeden, is het onderwerp van dit project en scriptie een spiegel. Dit is vanzelfsprekend niet een soortgelijke spiegel zoals degene die menig medemens in zijn badkamer heeft hangen. Deze spiegel toon naast een weerspiegeling van de ruimte waar hij hangt ook nuttige informatie. Zo kan je ook het uur de datum, weersvoorspellingen, nieuwsberichten, enz. aflezen. Verder kan de spiegel ook muziek fragmenten afspelen, spreken en bepaalde commando’s begrijpen. Dit soort spiegels noemen we smart-mirrors. Smart-mirrors zijn goed op weg om binnen IOT “the next big thing” te worden. Er wordt steeds meer aandacht aan besteed en je ziet meer en meer verscheidene projecten en eigen versies verschijnen. Het doel van dit project was dan ook om met deze spiegel te tonen dat November Five mee is met de laatste technologische nieuwtjes. Verder toont dit project aan dat technologie zo ver kan gaan als je zelf wilt. Het project beschreven in deze scriptie is ontwikkeld op de hardware afdeling. Hier wordt aan zowel projecten voor klanten als voor intern gebruik gewerkt. Een voorbeeld hiervan is de automatisatie van de garage poort en raam blindering. Of de coin-dispenser waar je, je badge kan scannen, van de coin-dispenser een 1euro muntstuk krijgt voor in de drank automaat. En deze één euro op je rekening zet. Om deze bachelor proef te verwezenlijken zijn technologieën zoals Raspberry pi, linux, python, node.js, express, javascript, html, css , bootstrap en elektronica componenten gebruikt. Het resultaat is een vernuftige, moderne en gebruiksvriendelijke interactieve spiegel. Er kan geconcludeerd worden dat dit een zeer innovatief en interessant project was. Die met zijn ideale combinatie tussen hardware en software de volledige breedte van de richting elektronica ICT dekte.
Dankwoord Tijdens de voorbije maanden bij November Five heb ik niet enkel veel bijgeleerd van het werken aan mijn bachelorproef maar ook van mij collega’s van het hardware team. Ik zou willen beginnen met hun te bedanken. Iedere ochtend stond een stand up gepland. We namen samen de stand van zaken door, bespraken wat sinds de vorige meeting afgehandeld was en waar ik momenteel mee bezig was. Zo konden problemen worden opgelost worden of nieuwe inzichten verworven worden. Ook tussen stand ups door kon ik steeds bij hun terecht voor een opinie of hulp. Elke donderdag sloten we de week af met een demo, hier moesten Oliver en ik onze resultaten van de voorbije weken tonen. Deze werden getest en bijgestuurd of goed bevonden. Ook deze feedback was steeds weer opbouwend. Hen zou ik graag bedanken voor de bijstand, inzichten en raad. In het bijzonder wil ik Nick Verbaendert, CTO Hardware bedanken. Hij was hoofd van de hardware afdeling en mijn stage mentor bij november five. Hij volgde de tijdsplanning van het project nauwlettend op, zorgde dat ik steeds voorzien was van benodigd materiaal, Liep men code door, gaf opmerking waar verbetering nodig was en maakte steeds tijd vrij wanneer nodig. dankzij hem kreeg ik de kans te proeven van de gang van zaken in het bedrijfsleven. Hiervoor en voor de algemene coaching, bedankt. Verder zou ik nog Oliver Hofkens, Mede-stagiair van AP elektronica –ICT in dit hardware team willen bedanken. Oliver is toegewijd fan van Linux en Opensource software. Wanneer ik als onervaren Linux gebruiker ergens danig mee vast zat. Kon ik steeds beroep doen op zijn raad. Hij kwam vaak met handige tips and tricks of goed advies op de proppen. Daarnaast zou ik ook Mede stagiair Thaïs Lenglez uit het design team willen bedanken. Zij heeft onder toezicht van haar stage mentoren, Fervent de user interface van de spiegel ontworpen. Ook de nog niet genoemde collega’s bij November Five verdienen een woord van dank. Zij ontvingen Oliver en mij met open armen, altijd vriendelijk, waren steeds te vinden voor een goede babbel, stonden steeds paraat om te hulp te schieten als we iets niet konden vinden of dergelijk. De vriendschappelijke en gemoedelijke sfeer binnen November Five is zeker niet vanzelfsprekend en bij weinig bedrijven in zo een hoge mate aanwezig. Laatst, maar niet allerminst is een woord van dank voor dhr. Tim Dams nog op zijn plaats. Als mijn interne promotor voor dit eindwerk / deze bachelorproef. Kreeg ik ook van hem steeds feedback op mijn verslagen. Verder volgde hij de voortgang van het project op de voet aan de hand van men logbestanden. Samen met dhr. Luyts is hij zelfs halverwege de stageperiode ter plekken een demo van zowel Oliver als mij komen bijwonen. Ik kon steeds rekenen op opbouwende commentaar en een duwtje in de rug als het tijd was in gang te schieten voor een naderende deadline. Voor al de wijze raad, een woord van dank. Antwerpen, 6 juni 2015 Stijn Schrauwen
Concept Het concept is dus een intelligente spiegel. Maar hoe wordt technisch verwezenlijkt, dat er effectief tekst of afbeeldingen te zien zullen zijn op de spiegel? Dit is de eerste vraag die bovenkomt bij dit project. Dit lijkt geen eenvoudige vraag, het antwoord is echter eerder simpel . Door gebruik te maken van een half-doorlaat-spiegel. Een half-doorlaat-spiegel is een spiegel waar je langs de ene zijde je spiegelbeeld ziet en langs de andere zijde zoals een raam kan door kijken. Een alom gekend voorbeeld zijn de spiegels in de Politie verhoorkamers. Het spiegel effect werkt slechts wanneer het donker is aan de niet spiegelende zijde. De tekst die u ziet, staat op een achterliggend scherm, dit is feitelijk een website die in Fullscreen gedisplayed wordt. Als een scherm van zijn behuizing ontdaan wordt kan deze mooi aansluitend tegen deze de niet spiegelende kant van de spiegel wordt geplaatst. De achtergrond van de webpagina moet zwart zijn. Waar het scherm zwart is, is er geen licht achter de spiegel. Op deze plaatsen zal de spiegel dus spiegelen. De plaatsen waar preferabel witte maar eventueel lichte kleuren worden getoond, is er licht achter de spiegel. Het spiegelend effect valt hierdoor weg. De webpagina draait op de localhost van een Raspberry pi. Een Raspberry pi is een minicomputer die makkelijk achter het scherm kan verborgen worden. Door middel van sensor zullen we detecteren of personen voor de spiegel staan en hierop reageren.
Benodigdheden/materiaallijst Hieronder staat de lijst met benodigdheden om het project uit te voeren Raspberry Scherm met HDMI aansluiting HDMI kabel Half-doorlatende spiegel http://www.glasopmaat.be/confrontatie-spiegel-6mm-dik/ Dotstar Ledstrip https://www.adafruit.com/products/2238 Quad Level-Shifter (3V to 5V) https://www.adafruit.com/product/1787 Infrarood sensor Pir sensor ADC bv. MCP3008 Speakers Indien geen 3m ingang op het scherm aanwezig is, kies dan voor boxen die via USB afspelen. De 3m jack van de pi kan namelijk niet tegelijk gebruikt worden voor geluid en PWM sturingen. Breadboard / Protoboard Wires to connect components USB Microfoon USB wifi dongle Behuizing voor de spiegel in te hangen Voeding voor ledstrips Voeding Raspberry pi Toetsenbord Muis
Raspberry Pi Zoals eerder aangehaald zal een Raspberry Pi gebruikt worden in dit project. Een Raspberry Pi is een goedkope computer ter grote van een creditcard. De Raspberry Pi is het hart en brein van dit project. Hij bevat alle intelligentie. Alle andere onderdelen zullen op zijn commando werken. De Pi zal de sensor data inlezen deze behandelen en hierop de webpage en leds laten reageren. Raspberry Pi heeft ondertussen verschillende versies. Bij aanvang van dit project werd gebruik gemaakt van de meest recente versie: de Raspberry 2B. Halverwege dit project kwam een nieuwere versie uit de Raspberry pi 3. Deze beschikt over een beter CPU een 64bit in plaats van de 32bit van de Pi 2. Verder is het CPU van de nieuwe Pi gebouwd op nieuwere architectuur, die meer taken kan uitvoeren per processor omwenteling. De clock snelheid ligt nu rond 1.2GHz dit is 300MHz meer dan de Pi 2. Verder is de grafische kaart dezelfde gebleven maar werkt deze op 400MHz in plaats van 250MHz bij de oudere Pi. Tot slot, een wat vaak vergeten upgrade aan deze nieuwe versie is de verdubbeling in Snelheid van het RAM geheugen. De grote van het RAM geheugen blijft hetzelfde, maar de snelheid stijgt van 450MHz naar 900 MHz. Tijdens dit project kwam een Audio Probleem boven. De liedjes van de Spotify API speelde niet volledig, of helemaal niet af. Bijhorend crashte het geluid van chromium. Wat resulteerde in helemaal geen geluid meer. Er zijn verschillende oplossingen voor dit probleem gezocht na verscheidene pogingen zonder resultaat. Kwam het idee dat een hardware upgrade het probleem misschien zou kunnen oplossen. Over schakelen van Raspberry pi is een koud kunstje. Alles van data tot operating system staat op de Micro-SD kaart. Na de SD-kaart in de nieuwe Pi gestoken te hebben, de GPIO kabel en USB connecties van muis, toetsenbord, microfoon, voeding boxen en wifi-dongle naar de nieuwe pi te hebben overgebracht kan deze opgestart worden en is geen overige of nieuwe configuratie nodig. Jammer genoeg loste ook dit de audio problemen niet op hierover later meer.
Operating system Zoals net Geëxpliceerd in de paragraaf over Raspberry Pi staat alles van data tot Operating system op de micro-SD kaart aangebracht in de Raspberry Pi. Er staat dus geen standaard operating system op. De eerste stap die een Raspberry gebruiker maakt is dus het kiezen en installeren van een OS.
Raspbian Initieel is bij dit project gekozen voor de laatste versie van Raspbian, op dat moment Jessie. Vernoemd naar de laatste gelijknamig versie van Debian, versie 8.0. Raspbian is een OS gebaseerd op Debian, geoptimaliseerd voor de Raspberry Pi Hardware. Debian zelf is een open operating system. Net zoals alle Debian versies is ook deze versie naar een toy story personage, in dit geval Jessie vernoemd.
Na het formateren van een micro SD kaart met voldoende geheugen. Kan de image gedownload en geïnstalleerd worden. Hier is gekozen voor NOOBS, een makkelijke operating system installer. Deze bevat verscheidene OS'en waaronder Raspbian. Noobs is te downloaden op onderstaande link. https://www.raspberrypi.org/downloads/noobs/. Na het uitpakken van de gedownloade zip op de SD-kaart, Het veilig verwijderen en het in pluggen er van in de pi. Zal bij het booten een venster getoond worden waar uit een lijst een operating sytem gekozen moet worden om de installatie ervan te starten. Na een succesvolle installatie zal een melding getoond om dit te bevestigen worden getoond. Tot slot zal de Raspberry pi rebooten waarna de installatie voltooid is.
ARCH Linux Na ettelijke pogingen de eerder genoemde audio problemen op te lossen. Tot zelfs het upgraden van de hardware toe. Zoals uitgelegd in de paragraaf over Raspberry. Geen resultaat opleverde. Werd overwogen eens de kans met een ander operating system te wagen. Dit plan werd extra gesterkt door het niet voorkomen van de audio problemen bij het runnen van de server en webpage op een Windows of Apple laptop. Oliver Hofkens medestagair van AP bij November Five. Maakte initieel bij zijn “viewroom control” project gebruik van een Raspberry Pi waar Arch
op draaide. Later schakelde hij over op een photon, deze zijn nog vele malen kleiner dan Raspberry ’s. De keuze was dus voor de hand liggend om naar dit al correct geïnstalleerd operating system Arch over te schakelen. Als groot fan van opensource gebruikt Oliver Arch Linux als operating system voor zijn eigen laptop. De ervaring die Oliver met Arch had maakte de keuze voor Arch voor hem evident.
Arch Linux is een Lichtgewicht en flexibele distributie. Dit wil zeggen dat Arch met zo min mogelijk pre geïnstalleerde software komt. Slechts de minimum vereisten om als OS te bestaan is aanwezig. Alles dat je extra wilt moet je achteraf zelf nog installeren. Standaard werkt Arch via terminal en niet via user interface. Deze kan uiteraard geïnstalleerd worden en vanuit de terminal gestart worden. Uit persoonlijke ondervind kan ik als nieuweling in linux stellen dat de instap drempel voor Raspbian aanzienlijk lager ligt als de instap drempel naar Arch. Niet te min loste de overstap naar Arch de audio problemen op. Wat minder positief was het feit dat alle instelling en configuratie opnieuw moesten gemaakt worden. Voorbeelden hiervan zijn juiste scherm resolutie instellen het automatisch booten van de server etc. Verder was er buiten het operating system zo goed als niets geïnstalleerd Supervisord, Dotstar library, etc. moesten allemaal opnieuw worden geïnstalleerd.
Configuratie In dit hoofdstuk vindt u de configuraties voor Arch linux. Instellingen die hetzelfde resultaat voor Raspbian hadden zal ik niet mee geven. Omdat de eenvoudige reden dat de relevantie ervan wegvalt na de audio issues die we er ondervonden.
Display in fullscreen De default video instelling van Arch gebruiken een resolutie van 1824x984. Het scherm daarentegen is een full HD scherm. Er verschijnen zwarte randen rond het scherm. Door onderstaande lijn toe te voegen aan de config.txt file zal het beeld naar correcte grote geschaald worden. disable_overscan=1
Set Timezone Om te zorgen dat de klok van de Pi juist staat moeten de juiste tijdszone ingesteld worden. timedatectl set-timezone Europe/Brussels
Er zal een pop up venster verschijnen dat vraagt naar het wachtwoord van “alarm”. Dit passwo ord was nog steeds het default: “alarm”. De tijd zal niet onmiddellijk aanpassen.
Auto Login on boot Het automatisch inloggen van de juiste gebruiker hoort misschien eerder thuis in het hoofdstuk Autoboot. Het is immers niet gewenst dat gevraagd wordt om een gebruiker en wachtwoord op te geven bij het herstarten. Het is de bedoeling dat de spiegel zonder menselijke hulp zelfstandig kan opstarten. Als dit automatisch inloggen later toch zal ingesteld worden, kan dit beter al bij aanvang van het project worden gedaan. Dat vergemakkelijkt het werk. cp /usr/lib/systemd/system/
[email protected] /etc/systemd/system/
[email protected] ln -s /etc/systemd/system/
[email protected] sudo nano /etc/systemd/system/getty.target.wants/
[email protected]`
Pas de ExecStart lijn aan als volgt ExecStart=-/sbin/agetty -a USERNAME %I 38400
Nu moete enkel de deamon bestanden herladen worden, services opnieuw gestart en gereboot. systemctl daemon-reload systemctl start
[email protected] sudo reboot
Autoboot in Gui Een grafische interface werk stukken aangenamer als een terminal. Om niet steeds via de terminal naar de Grafische user interface te moeten switchen zal ook dit worden geautomatiseerd. Arch beschik niet standaard over een Gui. Bij dit project is gekozen voor “xinitrc” en bijhorende frontend “startx”. Xinitrc wordt vooral gebruikt om “desktop enviroments” en “Window managers” te draaien. Later in dit project in het hoofdstuk “Autoboot” zal nog
een aantal keren verwezen worden naar het .Xinitrc bestand. Om de muiscursor te verbergen of om te voorkomen dat het scherm in slaapstand gaat. Met ander woorden en ook wel logischerwijs desktop gerelateerde zaken. Om te beginnen moet een Window manager geïnstalleerd worden. De keuze hiervoor lag bij openbox. Daarna moet xinitrc geïnstalleerd en juist geconfigureerd worden. npm install openbox pacman -S xorg-Xinit cp /etc/X11/xinit/xinitrc ~/.xinitrc sudo nano ~/.xinitrc
Na bovenstaande commando’s te hebben uitgevoerd. Zou de .Xinitrc file moeten openstaan. De onderstaande lijnen moeten in commentaar gezet worden door er een # voor te plaatsen. Gevolgd door onder deze lijnen “exec” en de Gui die automatisch gestart moet worden toe te voegen. In dit geval openbox LXDE. Wat dus in “exec startlxde” dat moet toegevoegd worden resulteert. twm & xclock -geometry 50x50-1+1 & term -geometry 80x50+494+51 & term -geometry 80x20+494-0 & exec xterm -geometry 80x66+0+0 -name login
Installeren van programma’s Volgende programma’s zijn nodig voor dit project. De namen spreken voor zich waarvoor ze gebruikt zullen worden. sudo pacman -S git Install Express, request npm install Express npm install request nmp install Python-shell npm install socket.io npm install rpi-gpio pip install RPi.GPIO pacman -S python-imaging git clone https://github.com/adafruit/Adafruit_DotStar_Pi.git
Verder is het interessant om Bittorrent-Sync te installeren. Dit Synchroniseert bestanden tussen 2 devices. Zo kan je aanpassingen maken op je windows laptop in webstorm, visual studio of variant en hoef je niet telkens te commiten, pushen en pullen om deze aanpassingen op de pi te krijgen. http://www.wikihow.com/Set-Up-Bittorrent-Sync-on-Your-Raspberry-Pi
Enable SPI Om analoge waarden in te lezen via de GPIO pinnen is het nodig om SPI te gebruiken. Hierover kan u meer lezen in het hoofdstuk over hardware. SPI is echter standaard uitgeschakeld op een Raspberry Pi. SPI kan als volgt worden ingeschakeld: sudo nano /etc/modules-load.d/raspberrypi.conf
Voeg deze lijnen achteraan in. spi-bcm2708 spidev
Kijk of het bestand /etc/modprobe.d/raspi-blacklist.conf bestaat. Als dit bestaat, open het. sudo nano /etc/modprobe.d/raspi-blacklist.conf
Plaats een # voor de SPI lijn. #blacklist spi-bcm2708 blacklist i2c-bcm2708
Ook zal je “dtparam=spi=on” aan je config.txt. bestand moeten toevoegen. sudo nano /boot/config.txt
Voeg het volgende toe. dtparam=spi=on
Start opnieuw op.
Wifi De Raspberry heeft zich op twee netwerken bevonden bij November Five Het “IOT” netwerk, dit is een test netwerk waar elk apparaat met het juiste wifi passwoord toegang tot heeft. Hierop is de webpage van de spiegel ontwikkeld. Mijn laptop kon op hetzelfde netwerk wat bitsync mogelijk maakte. Dit netwerk genoot wel niet van alle rechten. Bijgevolg kon door veiligheidsmaatregels geen toegang gemaakt worden tot de “guest wifi” of de “menu van de week”. Dit kon wel op het “CommonTest” netwerk. Zelfs met correct passwoord krijgen hier enkel toestellen waarvan het mac adres geregistreerd staat toegang tot het netwerk.
Algemene netwerk instellingen. sudo nano /etc/network/interfaces
Dit bestand moet er als volgt uitzien. auto lo iface lo inet loopback auto eth0 iface eth0 inet dhcp auto wlan0 iface wlan0 inet manual wpa-roam /etc/wpa_supplicant/wpa_supplicant.config
Netwerk afhankelijke instellingen IOT sudo nano /etc/wpa_supplicant/wpa_supplicant-wlan0
ctrl_interface=/run/wpa_supplicant network={ ssid="IOT" key_mgmt=WPA-PSK psk="*******" }
sudo nano /etc/dhcpd.conf
# IOT interface wlan0 static ip_address=192.168.100.31/24 static routers=192.168.100.1 static domain_name_servers=8.8.8.8 8.8.4.4
Common-Test Op de Common-Test is het belangrijk een statisch IP adres in te stellen. Zo blijft het IP adres hetzelfde in tegenstelling tot het IP adres op te vragen bij de DHCP-server. Als het IP adres telkens veranderd is het quasi onmogelijk om te SSH-en. Hiervoor wordt immers het IP adres gebruik. sudo nano /etc/wpa_supplicant/wpa_supplicant-wlan0
network={ ssid="Common-Test" key_mgmt=WPA-PSK pairwise=CCMP TKIP psk="*******" }
sudo nano /etc/dhcpd.conf
# Common-Test interface eth0 static ip_address= 192.168.96.1/22 static routers=192.168.96.1 static domain_name_servers= 192.168.96.1
Webpage De webpagina die draait op de localhost is geschreven in html, javascript, jquery en css. De mappen structuur is als volgt opgebouwd: een publieke map met twee html bestanden en een assets map. De index.html pagina is de pagina die getoond zal worden. Op de input.html pagina kan je makkelijk de quotes getoond op het scherm toevoegen en verwijderen. In de Assets map bevinden zich de mappen: audio, css, fonts, img, javascript, json, weathericons. In de audio map staan lokaal opgeslagen spraak bestanden. In de Javascriptmap bevinden zich twee bestanden voor elke Html één javascript. De javascript van de index.html pagina is volledig object georiënteerd geschreven. Bovenaan de Javascript van de “spiegel pagina” staan 4 variabelen. Naargelang deze gelijkgesteld zijn aan “true” of “false”, zal de webpage zich anders gaan gedragen. Wanneer de variabele _DEBUG_MODE op true staat zal op de voorgrond steeds een venster te zien zijn waar logs verschijnen. Deze logs kunnen functies zijn die worden uitgevoerd of inhoud van data die wordt binnen gehaald. Deze zal uiteraard enkel tijdens het ontwikkelingsproces getoond worden. De _BYPASS_MIC variabele zorgt ervoor dat we kunnen debuggen zonder telkens de commando’s te moeten uitspreken. Ook dit zal enkel in de ontwikkelingsfase gebruikt worden. _BYPASS_SOCKET Zorgt ervoor dat de sensoren geen effect meer hebben en we de screensaver kunnen af en op zetten zonder de sensoren te gebruiken. Wederom ook weer enkel in de ontwikkelingsfase gebruikt. _SPEECH is de enige variabele die na de ontwikkelingsfase zal gebruikt worden. Deze bepaald of een tekst to speech library of lokale audio files gebruikt zullen worden om spraak commando’s te laten weerklinken. In de fonts maps staan de drie costume Fonts gebruikt voor deze webpage. De image mat bevat het logo gebruikt voor de screensaver en de afbeelding van de microfoon. Beide zijn transparant zodat bij kleur verandering de afbeeldingen niet hoeven aangepast te worden. In de json map bevind zich momenteel enkel nog een Lijst met quotes die op het scherm getoond worden in json formaat. Tot slot in de weather icons map bevinden zich 6 video’s met de .webm extensie. Een van deze zal telkens achter de temperatuur van nu getoond worden om de weersomstandigheid aan te geven. Voor alle Audio en video elementen is Html5 gebruikt. Voor de styling is css en bootstrap gebruikt zodat dit project makkelijk op andere schermgroten kan worden gebruikt. Het Desing is zoals eerder vermeld in het dankwoord, ontworpen door Thaïs Lenglez. Zij deelde haar ontwerpen met mij via zeplin. Een samenwerkings tool tussen desingers en developers. De afmetingen en tekstgrote konden eenvoudig nagekeken worden, Dit vermakkelijkte het implementeren van het desing.
Hier ziet u Object Georiënteerde javascript met de quotes code blok uit geklapt om werkwijze te kunnen zien.
Node Server De webpagina van de spiegel is gehost op een node server draaiend op de Raspberry pi. Deze server is geschreven in “express” een webframework voor “node.js”. De pagina zal beschikbaar zijn op poort 3000 en niet via een http maar via een HTTPS. verbinding bereikbaar. Dit omdat google het niet toelaat om websites via http verbinding blijvend toegang tot u microfoon toe te vertrouwen. Hoe dit komt en waarom dit nodig is kan u lezen in het hoofdstuk “hardware” in de paragraaf “microfoon”. Een HTTPS verbinding is een SSL-verbinding(Secure Sockets Layer) met daarin een normale HTTP-verbinding.
Pythonshell Bij het opstarten van de node server start de server met pythonshell het script dat de sensoren en ledstrips aanstuurt. Bij Arch is de standaard python, python3 het script om de sensoren te controleren is in python2 geschreven. Daarom moet dit expliciet meegegeven worden bij het starten van het script om fouten en het mogelijk crashen van het script te vermijden. Pythonshell zal luisteren naar de logs die het python script maakt. Deze zal de afstand van de IR of PIR sensor loggen. Zo weet de server wanneer er een persoon voor de spiegel aanwezig is. Dit zal de node-server dan via io.sockets naar de client sturen. Meer uitleg over de sockets vindt u in dit hoofdstuk bij paragraaf "screensaver".
Spotify playlist Bij het opstarten van de server word een Spotify playlist opgevraagd. Dit wordt elke 24u opnieuw gedaan zodat de afspeellijst up to date blijft. Elke Spotify afspeellijst heeft een id. De “Top 100 tracks currently on Spotify” is de bij dit gebruikte afspeellijst en heeft volgend ID: “4hOKQuZbraPDIfaGbM3lKI”. Spotify afspeellijsten kunnen niet zomaar opgevraagd worden. In de header moet een geldige access token aanwezig zijn. Deze kan je verkrijgen met een client ID en een bijhorende secret key. Door te een applicatie te registreren wordt een client ID en Secret key gekoppeld aan de applicatie. Er zijn 3 verschillende autorisatie manieren om een access token te krijgen. De “Authorization Code”, “The Client Credentials flow” en de “The Implicit Grant flow”. De “Authorization Code” kan best serverside gehouden worden om de integriteit van de secret key te behouden.“The Client Credentials flow” is altijd server-to-server. terwijl de “The Implicit Grant flow” Client side is. Bij dit project is er voor de “Client Credentials flow” gekozen.
Meer informatie over de flows en acces token op: https://developer.spotify.com/web-api/authorizationguide/#client_credentials_flow. Code die de authorisatie en opvraging van spotify playlist afhandeld. var playlist_id = "4hOKQuZbraPDIfaGbM3lKI"; var client_id = '4dfc86767e744f25bd900dbc69af7450'; // Your client id var client_secret = '********************************'; // Your client secret var redirect_uri = 'https://localhost:3000/index.html'; // Your redirect uri var authOptions = { url: 'https://accounts.spotify.com/api/token', headers: {'Authorization': 'Basic ' + (new Buffer(client_id + ':' + client_secret).toString('base64'))}, form: { grant_type: 'client_credentials' }, json: true }; var playlist = null function getPlaylist(){ request.post(authOptions, function(error, response, body) { if (!error && response.statusCode === 200) { // use the access token to access the Spotify Web API var token = body.access_token; console.log("time" + body.expires_in) var options = { url: "https://api.spotify.com/v1/users/spotify/playlists/" + playlist_id + "/tracks", headers: { 'Authorization': 'Bearer ' + token }, json: true }; request.get(options, function(error, response, body) { console.log(body); playlist = body; }); } });
Posts
De node server heeft één post functie. Die wordt aangeroepen als aanpassingen zijn gemaakt aan de quotes list op de input.html pagina. Deze post zal de oude json file door de nieuwe vervangen.
Get Als een get request gemaakt wordt naar /playlist.json dan wordt de lokaal opgeslage versie van de Spotify playlist door gestuurd naar de client.
Weervoorspelling Op de spiegel zijn 3 temperaturen met opschriften now, later en tomorrow erboven te zien. De temperatuur van “now” komt vanzelfsprekend met de momentele temperatuur overeen de temperatuur bij later is de voorspelde temperatuur over drie uur. De temperatuur bij morgen is de gemiddelde voorspelde temperatuur overdag. Voor de weersgegevens is gebruik gemaakt van de API van http://openweathermap.org. Deze heeft verschillende Api’s voor verschillende plaatsen ter beschikking. Degene die wij gebruiken zij de volgende: NOW Current weather data http://api.openweathermap.org/data/2.5/weather? id=2803138,uk&units=metric&appid=439c7e095ae17682acab6e0ed64014f7", LATER 5 day / 3 hour forecast http://api.openweathermap.org/data/2.5/forecast? id=2803138,uk&units=metric&cnt=2&appid=439c7e095ae17682acab6e0ed64014f7", TOMORROW 16 day / daily forecast http://api.openweathermap.org/data/2.5/forecast/daily? id=2803138&mode=json&units=metric&cnt=7&appid=439c7e095ae17682acab6e0ed64014f7 Tussen deze drie links merken telkens 2 gelijkheden de id=2803138 en appid=439c7e095ae17682acab6e0ed64014f7 de 2803138 is de id van Antwerpen deze bepaald dus de locatie van de opgevraagde gegevens. Aan de hand van de Appid’s kan open weathermap bijhouden, hoe vaak en wat voor gegevens de appicatie opvraagt, wie de eigenaar is en voor wat voor doeleind deze app gebruikt wordt. Voor een appid moet eerst een account aangemaakt worden bij openweathermap. Met deze account kunnen applicaties geregistreerd worden voor een appid. Voor testing kan de appid uit de code voorbeelden van openweathermap gebruikt worden. Deze blijven echter maar een week geldig.
Achter “Now” en de daarbij horende Temperatuur is een animatie overeenstemmend met de weersconditie zichtbaar zo zal bij storm een donderwolk getoond worden, bij regen regendruppels, bij sneeuw sneeuwvlokjes, etc. Deze animaties zijn filmpjes die met het html5 video element worden afgespeeld. In de data verkregen van Openweathermap is steeds een weer id meegegeven deze komt overeen met een weertoestand. Ondanks dat er ettelijke weersituaties zijn, worden deze als gegroepeerd in vijf hoofdsituaties met bijhorende animaties. De verschillende weer codes en hun bijhorende weersconditie is te vinden op volgende pagina. http://openweathermap.org/weather-conditions. Als het weer id onder de 300 ligt, dit komt overeen met de onweersgroep zal de onweeranimatie getoond worden. Tussen 300 en 400 de miezer groep of tussen de 500 en 600 de regen groep. Zal neerslag getoond worden. Een ID tussen 600 en 700 duid valt onder de sneeuwgroep. Er worden sneeuwvlokjes getoond. Weer ID 800 staat voor open lucht 801 voor zeer licht bewolkt. Dit is een speciaal geval. Oorspronkelijk werd een zon getoond bij in deze situatie maar dit was natuurlijk niet geheel correct. Bij een heldere open lucht ‘s nachts zou een zon getoond worden. Daarom is dit voor de correctheid aangepast zodat bij open hemel eerst wordt vergeleken of de huidige tijd tussen zonsopgang en zonsondergang ligt. Is dit het geval word een zonnetje getoond anders word een maantje getoond. Deze weersituatie heeft dus in tegenstelling tot de andere weersituaties 2 animaties in plaats van één. Id’s tussen de 802 en 805 duiden op bewolking daarom zal hierbij een voorbij glijdende wolk getoond worden. Rekening houdend met de gemiddelde weer condities hier in België en het klimaat is gekozen om Id’s die niet aan voorgaande voorwaarden voldoen, ook als bewolk worden beschouwd.
twee zon en maan achter temperatuur
Newsfeed Een van de features van de spiegel is een news-widget. Hier worden vijf actua headlines getoond. Oorspronkelijk werd hier de RSS feed van “de redactie” voor gebruikt. Later werd dit veranderd naar de RSS feed van het VTM nieuws http://feeds.feedburner.com/vtm/NMdG. We gebruiken RSS feeds bij gebrek aan nieuws API’s. RSS kan niet zoals JSON of XML zomaar worden opgevraagd. We maken gebruik van de Google AJAX Feed API. Hiermee kan je eender welke public Atom, RSS, of Media RSS feed mee downloaden. We willen natuurlijk dat dit nieuws zo actueel mogelijk is daarom zal het nieuws elk kwartier opnieuw worden opgevraagd. Niet al het nieuws in de RSS feed is even relevant. Zo zitten er ook artikels met link naar video fragmenten bij. Deze artikels beginnen steeds met de karakters “[VIDEO] – “. De spiegel zal enkel de headlines tonen en heeft geen functionaliteit om deze fragmenten af te spelen. Het melden van de aanwezigheid van video fragmenten heeft dus weinig toegevoegde waarde. Na overleg met Nick heeft deze beslist, deze artikels niet te negeren en in hun plek andere artikels te tonen. Maar om de bovenstaande karakters uit de titel te filteren en enkel het relevante deel ervan te laten zien. Tot slot is het nieuws in tegenstelling tot de rest van de spiegel in het Nederlands in plaats van in het Engels. Dit komt door gebrek aan Engels talige Belgische nieuws feed. Engels talige nieuws feeds zijn dan weer weinig relevant hier in België omdat deze vooral nieuws over het Verenigd koninkrijk en USA bevatten. Zonder en met spiegelglas voor het scherm
Uur en datum Om het uur en de datum op het scherm te tonen is gebruik gemaakt van Moment.js . Een javascript library voor het parsen, valideren, manipuleren en formatteren van datums en tijden. Bij het laden van de pagina wordt de dag en de maand juist gezet. Deze word elke nacht eenmaal om 12u ge-update. De tijd wordt gestart bij het laden en zal vanaf het laden van de pagina elke seconde worden ge-update. November five heeft ook een kantoor in New York. De plaatselijke tijd van daar wordt ook getoond. Deze wordt verkregen door de "utcoffset" functie van moment.js te gebruiken, New York ligt in tijdzone “UTC-5”. Zonder en met spiegel glas
Guest-wifi Password Het November Five guest wifi password veranderd wekelijks en zal ook op de spiegel getoond worden. Hier waren wat problemen met access right door veiligheidsmaat regels. Na de pi toe te voegen aan een vertrouwd netwerk, dat toegang aan apparaten verleed aan de hand van hun mac adders. Had de pi toegang tot de api.
Lunch In de voormiddag meer bepaald tussen half negen en twaalf verschijnt na het begroeten van de gebruiker de resterende tijd tot het middagmaal en wat op het menu staat. Tussen deze tekst staan emoticons, het design van de spiegel is in tegenstelling zwart – wit en eerder strak dan speels. De emoticons passen dus niet binnen het design en worden weg gefilterd. Tussen twaalf en een wordt “lunch is now” met menu getoond. De menu komt van spencer. Spencer is de bedrijfs-app van November Five Hier kan je zaken zien zoals de menu van de week etc. Voor de spiegel een API request kon maken moest eerst een uitbreiding aan spencer geprogrammeerd worden door een van de backend collega’s, voor de spiegel toegang tot deze data kreeg.
Quotes Is het niet tussen half 9 ‘s morgens en 1u ’s middags dan wordt er elke minuut een andere random quote en de quoter ervan getoond. Deze random quotes zijn door Nick gekozen. Ze worden lokaal op de Pi bewaard in een JSON bestand. Om deze makkelijk te kunnen aanpassen zonder de spiegel telkens te moeten demonteren. Is een 2de webpagina ontwikkeld. Op deze pagina is een lijst met quotes en hun quoters te zien. Een quote kan geselecteerd worden en daarna verwijderd of nieuwe quotes met bijhorende quoter kunnen worden toegevoegd. met en zonder spiegelglas
Audio Het audio object bevat twee HTML5 audio elementen. Eén voor het afspelen van muziek en één voor het afspelen van spraak commando’s.
Spraaktechnologie De interactie met de spiegel zal auditief gebeuren. Bij gebruik van Touchscreen zou het scherm binnen de kortste keren vol vingerafdrukken en vegen staan. Zoals eerder aangehaald zijn er twee manieren om de spiegel te laten spreken. Enerzijds het afspelen van vooraf opgenomen audio bestanden die de boodschap bevatten. Anderzijds het gebruik van een tekst naar spraak library die strings zal om zetten naar spraak berichten. De aanwezigheid van deze twee mogelijkheden is als volgt ontstaan. Initieel was het idee om op een site zoals “fiverr” mensen met een mooie stem de boodschappen te laten opnemen. Deze bestanden waren nog niet te beschikking maar ondertussen moesten de speakers en stukken code met audio wel getest worden. Daarvoor is gebruik gemaakt van ResponsiveVoice.JS http://responsivevoice.org/. Dit is een instant HTML5 gebaseerde tekst naar spraak bibliotheek. Hiermee kan je strings in een oogwenk naar een spraakbericht omzetten. Deze library ondersteund tot wel 51 talen in 168 verschillende stemmen. In dit project is gebruik gemaakt van de “UK English Female”. Deze library overtrof alle verwachtingen. Ze werkte betrouwbaar, snel en eenvoudig. De stem is dezelfde als de standaard google translate stem voor Engelse teksten. Ze wordt dus door gebruikers al geassocieerd als computerstem en komt al redelijk natuurlijk over. Het resultaat was zo bevredigend dat later werd besloten om deze library te blijven gebruiken. Een klein nadeel is dat bij zware belasting van het host apparaat soms het begin van kortere boodschappen wordt afgekapt. Dit valt echter weinig voor, valt enkel op als erop wordt gelet en stoort dus amper. Een groot voordeel van de tekst naar spraak library is dat bij eventuele latere aanpassingen. Een string kan weggelaten, bijgevoegd of aangepast worden zonder enige extra kosten. Bij het gebruik van audio files moet je dezelfde spreker terug te pakken krijgen of alle boodschappen opnieuw laten opnemen. Om alle opties open te houden is naast de tekst naar spraak library toch de mogelijkheid ingebouwd voor het gebruik van audio files. Deze worden lokaal opgeslagen in de assets/audio map. De files die hier momenteel voor gebruikt worden zijn gemaakt op een website waar tekst naar audio files kan omzet worden. Deze hebben .ogg als extensie. Deze extensie is geoptimaliseerd voor goede compressie en streaming. De spraak commando’s voorlopig houdt de spiegel het op volgende commando’s: Welkom bericht als de screensaver verdwijnt Bij gebruik van audio files is dit eenvoudig: “welcome”. Bij de tekst to speech library zijn er momenteel drie mogelijke berichten waarvan er een random gekozen zal worden "Hello gorgeous, I'm Cindy, I'll be your assistant for today.", "Hi goodlooking, I'm Samantha, I'll be your assistant for today.", "How you doing?" Visuele ondersteuning van de boodschap
De vraag of hij een liedje wilt horen "Do you want me to play a song?" Visuele ondersteuning van de boodschap
Als hij dit niet heeft verstaan vraagt hij eenmalig om dit te herhalen. "I did not understand, can you please repeat?"
Spraak herkenning Na het stellen van de vraag: “Do you want me to play a song?”. Wacht de spiegel op interactie van de gebruiker. Hij luistert naar het gesproken antwoord van de gebruiker. De spraak herkenning toepassen op dit antwoord is verwezenlijkt met behulp van de javascript web Speech API. Deze kan jammer maar ook wel logisch slechts naar een taal tegelijk luisteren en daar de spraak van naar tekst Omzetten. Voor deze spiegel is dat Amerikaans Engels geworden. Alles over de microfoon en hoe het geluid wordt opgenomen staat beschreven in het hoofdstuk over hardware.
Visueel wordt duidelijk aangegeven dat een gebruiker op de vraag kan antwoorden met "Yes" of "No". zijn vier mogelijke scenario's die kunnen voorvallen. De eerste optie is het antwoorden van "No". In dit geval verdwijnt de vraag en functioneert de spiegel verder in stilte tot de screensaver opnieuw is getoond en verborgen. Spraak technologie is niet eenvoudig omdat elke persoon een ander toonhoogte, intonatie en uitspraak heeft. Daarom is het mogelijk dat in combinatie met achtergrond geluid de spiegel een gesproken commando met een homofone uitspraak verward. Dit is eenvoudig opgelost door niet enkel tegen het woord "No" te filteren maar tegen alle woorden die soortgelijk klinken. Tijdens het debuggen ondervonden we dat dit enkel "nope" was. In de array met ontkenningen zitten dus de 2 woorden: "no" en "nope". Voor de bevestigende woorden is dit:"Yes","us" en "this". Een tweede mogelijkheid is dat de spiegel de gebruiker hoort antwoorden, maar deze niet verstaat of een ander woord verstaat dan de 5 bovenstaande uit de array van ontkenning of bevestiging. De spiegel zal vragen om je commando
te herhalen. Na overleg is beslist dat als de spiegel dit bij het herhalen nogmaals niet verstaat er vanuit mag gegaan worden dat er een gesprek tussen twee personen aan de gang is of hij achtergrond geluid oppikt. Zodat hij deze vraag niet oneindig blijft herhalen. De derde mogelijkheid is dat de spiegel helemaal geen geluid oppikt. In dit geval zal hij de vraag laten verdwijnen en niet meer opnieuw stellen. De laatste mogelijkheid is het antwoorden van Yes. Het woord “yes” op het scherm krijgt een rode kleur. De boodschap blijft nog enkele seconden staan.
Muziek Het tweed audio element zal een random gekozen nummer uit een Spotify afspeellijst afspelen. Spotify afspeellijsten kunnen niet zomaar met een get request opgevraagd worden. In de header moet een geldige access token aanwezig zijn. Het opvragen hiervan kan op verschillende manieren gebeuren. Hier is gebruik gemaakt van de "Client Credentials Flow". Dit dient voor server-to-server authenticatie en zal dus logischerwijs door de server worden uitgevoerd. Dit wordt verder uitgelegd in het hoofdstuk over de server. De frontend stuurt een request naar de node server. De server heeft bij het opstarten de playlist bij Spotify opgevraagd en daarvan een versie lokaal opgeslagen. De lokale versie stuurt de server door naar de client. Hij zal de playlist elke 24u opnieuw bij Spotify opvragen. Dit is vooral nuttig bij Hitlijsten die wekelijks anders zijn samengesteld. De front-end zal steeds bij het opstarten en om middernacht de afspeellijst opnieuw bij de node server opvragen en op zijn beurt lokaal opslaan. Het opvragen bij het opstarten gebeurt met enkele seconden vertraging. Gebeurt dit niet dan zal bij het opstarten van de pi de node server opstarten onmiddellijk gevolgd door chromium dat naar de spiegel webpage surft. Als bij het laden van de client onmiddellijk de afspeellijst worden opgevraagd zullen de server en Spotify nog niet klaar zijn met authentiseren. De node server zal een lege afspeellijst naar de client terug zenden. Om dit te voorkomen en de server voldoende tijd te geven de access token op te vragen wachten we enkele seconden voor we de playlist bij de server gaan opvragen. Uit de verkregen afspeellijst zal een random liedje gekozen worden. Eerst wordt gecheckt of dit nummer een link naar een fragment van het nummer bevat. Is dit niet het geval, wordt een nieuw nummer gekozen. Tot een nummer met URL gevonden wordt. Het fragment van de link zal door het tweede audio element van het audio object het
element voor muziek afgespeeld worden. Er verschijnt een muziek widget met de titel van het nummer en de album hoes.
Screensaver Als een persoon vlak voor de spiegel staat moet de webpagina met functionaliteit getoond worden. Staat er niemand vlak voor de spiegel. Moet een zwart achtergrond met het November Five logo getoond worden.
Io Sockets Zoals eerder aangehaald monitort de node server met pythonshell het python script van de ledstrips en sensoren. Door de logs van dit script te bestuderen weet de server wanneer een persoon voor de spiegel staat. Om via de backend de frontend in te lichten wordt “socket.io” gebruikt. Met “Socket.io” kan realtime event-based bi-directionele communicatie worden opgezet. In dit project zal de communicatie eenzijdig van server naar client plaats vinden. “socket.io” werkt op elk platform browser of device met de focus op betrouwbaarheid en snelheid.
Screensaver Aan de hand van wat de webpage via de sockets binnen krijgt zal bepaald worden. Of de screensaver op of af staat. IR sensoren zijn gevoelig aan omgevingslicht hierin bevind zich immers ook Infrarood licht. Proefondervindelijk is gebleken dat met kleine marge we kunnen stellen dat bij waardes hoger dan 15 er een persoon zich voor de spiegel bevind. Als de socket waarden hoger dan 15 ontvangt zal de screensaver verdwijnen. Bij waarden lager dan 15 zal deze opnieuw worden getoond, dit zal er eveneens voor zorgen dat alle audio stopt met spelen.
Hardware Om te kunnen communiceren met de spiegel beschikt deze over enkele hardware componenten. voorlopig twee sensoren en twee ledstrips. Deze zullen in dit hoofdstuk over hardware besproken worden. Het aansturen van de Sensoren en LED-strips gebeurd via een pythonscript. De code is geschreven in python2 dit kan van belang zijn bij het runnen van de code. Op raspbian wordt python code zonder verdere specificatie als python2 code beschouwd op Arch is de standaard python, python3. Een van de vereisten van de spiegel was dat deze een screensaver moest tonen als er geen persoon vlak voor de spiegel stond, Als een persoon voor de spiegel plaatsnam moest de leds opgloeien en de screensaver verdwijnen. Om te weten of een persoon voor de spiegel staat moeten sensoren worden gebruikt worden.
Infrarood sensor Initieel werd de Sharp GP2Y0A21YK gebruikt om aanwezigheid van personen te detecteren. Deze werkt op 5V en trekt 33mA. Deze sensor heeft drie aansluitingen: VCC, GND en een data-pin. Door zijn beperkte bereik (tot 80cm) is al snel overgeschakeld naar de grote broer: "de Sharp GP2Y0A02YK0F". Met een bereik van 20 tot 150cm . Zijn werking is dezelfde, er moeten enkel 2 draadjes omgewisseld worden bij de aansluiting. Een Raspberry pi beschikt over GPIO pinnen om data in te lezen of uit te sturen, zoals de data van de data-pin van de sensor. Dit bleek echter minder evident dan gedacht, toen duidelijk werd dat de GPIO pinnen van een Raspberry pi enkel digitaal zijn en geen een Raspberry pi over geen enkele analoge pin beschikt. Voor Output valt dit probleem nog redelijk eenvoudig op te lossen met PWM sturingen. voor input was dat een ander verhaal. Na enig research werk werd de oplossing aangeboden in volgende fantastische guide https://learn.adafruit.com/downloads/pdf/reading-aanalog-in-and-controlling-audio-volume-with-the-raspberry-pi.pdf Hierin wordt beschreven hoe je met behulp van een externe ADC zoals de MCP3008 met bit banged SPI code in Python analoge waarden kan inlezen. Omdat in de stock van November Five de nagenoeg gelijke MCP3004 aanwezig was, is deze gebruikt i.p.v. de MCP3008. Hoe de sensors aangesloten en aangestuurd moeten worden bespreken we later in de paragraaf: "inlezen van sensoren".
PIR sensor Aangeraden is om in combinatie met de Infrarood sensor ook gebruik te maken van een PIR sensor, zoals de PIR Mini Sensor ID 28033 van parallax. Ondanks dat Pir sensors ook infrarood sensors zijn, zijn er enkele belangererijke verschillen. Hierdoor kan in geval van goede aansturing het combineren van deze twee sensoren een enorme meerwaarde bieden. Om te beginnen heeft de PIR sensor een breder detectie gebied 100° en groter bereik tot ongeveer 3.5m. De Pir sensor zal echter geen spanning in verhouding tot de afstand met het bewegend object op zijn uitgang genereren, Maar een hoog signaal in geval van detectie en een laag signaal wanneer geen beweging word gedetecteerd. Een nadeel aan de Pir sensor is dat wanneer een gebruiker voor de sensor onbeweeglijk stilstaat de sensor geen verandering meer meet en dus een Laag signaal aan zijn uitgang zal krijgen. Daarom zal het aansturingsscript logica bevaten die zorgt dat wanneer de PIR sensor geen aanwezigheid detecteert, maar de IR sensor nog wel. De waarde van de IR zal doorgestuurd worde naar de Node server. Verder zullen er timers aanweezig zijn, deze moeten voorkomen dat er in de frontend te snel getoggeld wordt tussen screensaver aan en uit, of tussen het in en uitfaden van de ledstrips. Als de Pir sensor nog beweging detecteert en de IR sensor een bepaalde periode geen aanwezigheid detecteert, betekend dit dat er personen in de buurt van de spiegel bevinden maar er niet recht voor staan. De Leds rond de spiegel zullen oplichten maar de screensaver blijft getoond.
Inlezen van de sensoren Zoals eerder aangehaald staat in deze guide https://learn.adafruit.com/downloads/pdf/reading-a-analog-in-andcontrolling-audio-volume-with-the-raspberry-pi.pdf hoe we analoge waarden kunnen inlezen via de GPIO pinnen van de Raspbeery pi. Aansluit schema en Voorbeeld code kan u terug vinden in de guide. Volgende lijnen code en het het stuk achter de Titel "Run it. mogen alvast weg gelaten worden, ze dienen louter om het volume van de Raspberry pi aan te passen door aan de potentiometer te draaien. Voor onze toepassing is dit dus overbodig. Het enkel inlezen van de waarden volstaat. weg te laten code print 'Volume = {volume}%' .format(volume = set_volume) set_vol_cmd = 'sudo amixer cset numid=1 -- {volume}% > /dev/null' .format(volume = set_volume) os.system(set_vol_cmd) # set volume
Als dit script werkt, is het weinig moete om de potentiometer te vervangen door de infraroodsensor. De sensor zal naarmate een object zich dichter bij bevind een hogere uitgangsspanning genereren. Om ook de PIR in te lezen en niet enkel de IR sensor lezen we een 2de maal een waarde van de DAC in dit maal op pin 1 waar de PIR sensor is aangesloten ipv op pin 0 van de IR sensor. Het finale script om de sensoren uit te lezen zal er als volgt uitzien. Zoals eerder aangehaald zal de IR sensor zijn uitgangs waarde in verbandstaan met de afstand die hij meet. De PIR sensor daarintegen zal enkel beweging of geen beweging detecteren, dus een logische 1 of 0 op zijn uitgang generenen. Zoals ook eerder aangehaald is de IR sensor gevoelig aan infraroodlicht in omgevingslicht. Met een kleine marge op dit opgepikt omgevings licht kan gesteld worden dat waarden hoger dan 15 duiden op een object of persoon binnen in het bereik van onze sensor.
De Pir sensor zal bij detectie van beweging een waarde schommelend rond de 60 uitsturen. Als hij geen beweging detecteerd zal deze waarde nul of net boven nul liggen. Om de uniformheid en een zekere marge in te bouwen kiezen zal ook de waarde van de pir sensor met waarde 15 vergeleken worden. Meten beide sensoren niets (lees als waarde lager als 15), dan word waarde nul gelogd. detecteerd een van de 2 een object of persoon (lees: een waarde hoger dan 15), dan word de waarde van een sensor gelogd. De waarde van de IR sensor heeft voorhang op degen van de PIR sensor. Omdat de waarde van de IR sensor meer informatie bevat dan de waarde van de PIR. Deze maakt enkel duidelijk dat er aanwezigheid is. Terwijl de IR data niet enkel op aanwezigheid duid maar ook de afstand tot de spiegel. Detecteren beide sensoren een object of persoon dan zal enkel de data van de IR sensor worden doorgestuurd. Enkel als de PIR een hoge uitgang heeft en de IR sensor een waarde lager als 15 zal de waarde van de PIR doorgestuurd worden. Om te voorkomen dat op de frontend de screensaver frequent op en af springt, zijn timers ingebouwd. Pas als vijf seconden lang aanwezigheid wordt gedetecteerd zal de waarde geprint worden, gevolgd door 5seconde pauze voor de volgende waarde geprint wordt. Dit voorkomt dat de spiegel opspringt bij het voorbij wandelen ervan. De spiegel zal pas uitschakelen na drie seconden geen aanwezigheid meer gedetecteerd te hebben. Dit zorgt ervoor dat als een gebruiker bijvoorbeeld zeep neemt, niet onmiddelijk waarde nul wordt geprint en de screensaver in de frontend opspringt, omdat het script geen aanwezigheid meer detecteerd. #!/usr/bin/env python import time import sys import os import RPi.GPIO as GPIO GPIO.setmode(GPIO.BCM) DEBUG = 1 #ADC + sensor # read SPI data from MCP3008 chip, 4 possible adc's (0 thru 3) def readadc(adcnum, clockpin, mosipin, misopin, cspin): if (adcnum > 3) or (adcnum < 0): return -1 GPIO.output(cspin, True) GPIO.output(clockpin, False)
# start clock low
GPIO.output(cspin, False)
# bring CS low
commandout = adcnum commandout |= 0x18 commandout <<= 3
# start bit + single-ended bit # we only need to send 5 bits here
for i in range(5): if (commandout & 0x80): GPIO.output(mosipin, True) else: GPIO.output(mosipin, False) commandout <<= 1 GPIO.output(clockpin, True) GPIO.output(clockpin, False) adcout = 0 # read in one empty bit, one null bit and 13 ADC bits for i in range(16): GPIO.output(clockpin, True) GPIO.output(clockpin, False) adcout <<= 1 if (GPIO.input(misopin)): adcout |= 0x1 GPIO.output(cspin, True) adcout >>= 1 # first bit is 'null' so drop it return adcout # change these as desired - they're the pins connected from the # SPI port on the ADC to the pi
SPICLK = 23 SPIMISO = 21 SPIMOSI = 19 SPICS = 24 # set up the SPI interface pins GPIO.setwarnings(False) GPIO.setup(SPIMOSI, GPIO.OUT) GPIO.setup(SPIMISO, GPIO.IN) GPIO.setup(SPICLK, GPIO.OUT) GPIO.setup(SPICS, GPIO.OUT) # read analog inputs IR_SensorMid = 0; PIR_Sensor = 1; Last_Read_IR = 0 Last_Read_PIR = 0 Tolerance = 100 Output_IR = 0 Output_PIR = 0 detection_counter = 0 no_detection_counter = 0 while True: # read the analog pins Value_IR = readadc(IR_SensorMid, SPICLK, SPIMOSI, SPIMISO, SPICS) Value_PIR = readadc(PIR_Sensor, SPICLK, SPIMOSI, SPIMISO, SPICS) # how much has it changed since the last read? Adjust_IR = abs(Value_IR - Last_Read_IR) Last_Read_IR = Value_IR Adjust_PIR = abs(Value_PIR - Last_Read_PIR) Last_Read_PIR = Value_PIR if (Adjust_IR > Tolerance ): Output_IR = Value_IR / 81.92 # convert 13bit adc0 (0-8192) trim pot read into 0-100 volume level Output_IR = round(Output_IR ) # round out decimal value Output_IR
= int(Output_IR ) # cast volume as integer
if (Adjust_PIR > Tolerance ): Output_PIR = Value_PIR / 81.92 # convert 13bit adc0 (0-8192) trim pot read into 0-100 volume level Output_PIR = round(Output_PIR ) # round out decimal value Output_PIR
= int(Output_PIR ) # cast volume as integer
if(Output_IR > 15 or Output_PIR > 15): no_detection_counter = 0 detection_counter = detection_counter + 1 if(detection_counter > 5): detection_counter = 0 if(output_IR > 15): print(output_IR) else: print(output_PIR) else: detection_counter = 0 no_detection_counter = no_detection_counter + 1 if(no_detection_counter > 3): no_detection_counter = 0 print(output_IR) time.sleep(1)
### Ledstrips Boven en onder de spiegel komen Ledstrips. Een Ledstrip is een strook van aaneengeschakelde Leds. De meeste Ledstrips hebben 2 aansluiting waarmee de hele strip mee kan worden opgelicht. Ledstrips zijn verkrijgbaar in verschillend aantal leds per meter. Dit project werd verwezenlijkt met strips 30 leds per meter bevatten en een lengte van 1 meter. Initieel werd gebruik gemaakt van RGB Neopixel led strips van Adafruit. Deze beschikken niet over twee maar drie aansluitingen naast een 5V en een GND ook over een datapin. Dankzij deze datapin kunnen we de leds individueel aansturen en zo bepalen of ze aan of uit staan hun kleur en intensiteit. Wanneer de Raspberry pi enkele taken tegelijk moet uitvoeren en daar zwaar mee belast word. Werd de benodigde kloksnelheid niet meer behaald, dit resulteerde in ongewenst gedrag, zoals flikkeren kleur veranderingen van van bepaalde pixels etc. Daarom werd overgeschakeld naar de Dotstar ledstrips van Adafruit deze bevat maar liefst 4 pinnen een 5V, GND, Data pin en een clockpin. Elke pixel kan op volledige sterkte tot 60mA trekken. Dit voor 60 leds komt overeen met 3.6 ampère. De 5V van de Raspberry kan dus niet als voeding gebruikt worden. Deze kan maximaal 2A leveren. Er zal dus van een externe voeding gebruik gemaakt worden. Naast externe voeding laten we de Ledstrips aan een lagere intensiteit branden. De Dotstar datapin werkt op 5V. De GPIO pinnen van de Raspberry leveren echter slechts 3.3V. Met een spanningsomvormer zoals de 74AHCT125 de spanning van 3.3V naar 5V converteren.
Aansturen van de Ledstrips
Om de Dotstar ledstrip te kunnen aansturen moet je gebruik maken van de Dotstar library. Deze is te vinden op https://learn.adafruit.com/adafruit-dotstar-leds/overview. Hier kan zowel een library voor Arduino als een python module voor Raspberry pi gedownload worden. Na het downloaden van de python module voor Raspberry pi is het voldoende te zorgen dat de Dotstar.so file in de zelfde map als het python script dat de leds aanstuurt staat. Aangeraden is om eerst te testen of de ledstrips correct aangesloten zijn. Door het voorbeeld programma uit de pyton module strandtest.py te runnen kan gecheckt worden of de leds correct aangesloten zijn. Dit programma combineert looplichtjes met faden naar andere kleuren etc. Het zal overduidelijk zijn als een ledstrip zich niet correct gedraagt. De spiegel moest de leds enkel geleidelijk kunnen in en uit faden, In dezelfde kleur. Het eerste ledstrip controle script deed dit door een voor een de pixels kleur te veranderen. Dotstar pixels zijn RGB pixels. Dit betekend dat een pixel uit drie kleuren pixels bestaat een rode, groene en blauwe. Door deze leds op verschillende intensiteiten te laten branden kan je zowat elke andere kleur bekomen. De waarde 0 komt overeen met niet branden, de waarde 255 betekend volle sterkte. Zo is de RGB waarde 255,255,0 bijvoorbeeld geel. Branden de drie leds even fel zal de kleur wit te zien zijn. Dit maakt van wit een speciale kleur. Dit is de enige kleur waarvan je de intensiteit kan bepalen door de ander leds van kleur te laten veranderen. Branden de drie leds elk op 255 dan is de kleur wit te zien. Branden de leds elks op 128 dan is nog steeds de kleur wit te zien maar op halve sterkte. Het python script voor de leds zou dus de leds een voor een aflopen, in dit geval alle dertig en een voor een de kleur met een waarde verhogen of verlagen. Na het aanpassen van de laatste led werd de strip geüpdatet en werden de resultaten zichtbaar. Dit werd herhaald tot een van de twee absolute bereikt was. Afhankelijk of de leds in of uitfaden. Dit wit licht voelde echter koud aan in het meer warme geler omgevingslicht. Daarom werd ook de kleur van de leds aangepast naar 255,255,60
Met een andere kleur als wit is het onmogelijk de strip op voorgaande manier te laten in faden of uitfaden. In plaats van aan het begin van het script de intensiteit van de strip in te stellen en achteraf de kleuren aan te passen. Zal nu de kleur bij het opstarten van het script gezet worden en zal achteraf de intensiteit verhoogd of verlaagd worden. Een voordeel is dat dit voor de hele strip geld en dus veel sneller gebeurd dan een voor een de kleuren van de pixels aan te passen. Hier ziet u een test script met 2 functies dit zal de leds laten in en uitfaden tot het script stopt. De maximale brightness (intensiteit) is nooit 255 dit is veel te fel een zal een gebruiker van de spiegel verblinden. In het oude script waar de kleur wit nog gebruikt werd. Is de brightness op ¼ van het maximum ingesteld, wit licht is immers feller dan geler licht. In het nieuwere script met gele licht is de brightness naar 2/5 gezet. Script met wit licht.
#!/usr/bin/python import time from dotstar import Adafruit_DotStar numpixels = 30 # Number of LEDs in strip strip
= Adafruit_DotStar(numpixels)
strip.begin()
# Use SPI (pins 10=MOSI, 11=SCLK)
# Initialize pins for output
strip.setBrightness(64) # Limit brightness to ~1/4 duty cycle head
= 0
# Index of first 'on' pixel
tail
= -10
# Index of last 'off' pixel
color = 0xFF0000
# 'On' color (starts red)
def fadein(strip, wait_ms=5): for j in range(256): for i in range(strip.numPixels()): strip.setPixelColor(i, j,j,j) strip.show() time.sleep(wait_ms/1000.0) def fadeOut(strip, wait_ms=5): for j in range(256): for i in range(strip.numPixels()): strip.setPixelColor(i,255-j,255-j,255-j) strip.show() time.sleep(wait_ms/1000.0) while True:
# Loop forever
fadein(strip) fadeOut(strip)
Script met geel licht #!/usr/bin/python import time from dotstar import Adafruit_DotStar numpixels = 30 strip
# Number of LEDs in
= Adafruit_DotStar(numpixels)
# Use SPI (pins 10=MOSI, 11=SCLK)
strip.begin()
# Initialize pins for output
for i in range(strip.numPixels()):
# set color for each pixel, pixel by
strip.setPixelColor(i,255,255,60)
pixel
# DEPENDING ON THE COLOR YOU CAN SET THE
strip.setBrightness(0)
# BRIGHTNESS, IF THE COLOR CHANGES CHANGE THE BRIGHTNESS!
strip.show() def fadeIn(strip): for j in range(100): strip.setBrightness(j) time.sleep(0.01) def fadeOut(strip): for j in range(100): strip.setBrightness(99 – j) strip.show() time.sleep(0.01) while True: fadein(strip) fadeOut(strip)
# Loop forever
strip.show()
Speakers De spiegel moet met een persoon kunnen communiceren en als deze dat vraagt een sample van een spotify nummer afspelen. Het scherm dat gebruik is heeft geen interne boxen. Daarom zullen externe boxen gebruikt moeten worden. De Raspberry pi beschikt over een 3mm analoge audio uitgang. Deze is echter nutteloos bij dit project. Een Raspberry pi is een low cost computer, om kosten te bespraken beschikt deze dus niet over een volwaardige geluidskaart en gebruikt Pulse width modulation om zijn audio af te spelen. Dit heeft als aanzienlijk nadeel dat er geen audio via de 3mm pin kan worden afgespeeld tegelijk met het gebruiken van PWM sturingen. Geluid Via HDMI afspelen kan wel perfect, omdat dit geluid digitaal is. De dotstarLeds maken gebruik van PWM, daarom is het niet mogelijk de 3mm output pin van de Raspberry pi te gebruiken. Er zijn verscheidene oplossingen. Enkele oplossingen zijn: Gebruik boxen die via USB aangesloten zijn. USB is uiteraard digitaal, zoals eerder vermeld is het voor digitale audio geen probleem om tegelijk PWM sturingen te doen. USB Audio devices hebben vaak een interne geluidskaart om de audio via de USB connectie van digitaal naar analoog om te zetten en daarna naar de boxen te sturen. Een andere optie is het kopen van een scherm met interne boxen. Zo kan het geluid via HDMI naar het scherm worden gestuurd en kan daar de audio Afgespeeld worden. De boxen gekocht voor dit project zijn USB powerd dit spaart heel wat plek van een extra adapter uit. Iets minder is dat de audio nog steeds via een 3mm pin moet worden aangebracht. Het scherm had dan wel geen interne boxen maar gelukkig wel een 3mm audio output aansluiting. We konden dus via HDMI audio naar het scherm sturen die deze audio dan via de 3mm audio output dit naar de boxen stuurde. ...
Speak up module Voor de USB-microphone is research gedaan naar de speak up. Met deze module kan je commando’s opnemen. Als de module een van deze opgenomen commando’s hoort zal hij erop reageren. De module kan stand alone gebruikt worden. Dan communiceert hij via zijn GPIO pinnen. Andersheid kan hij ook in click-mode gebruikt worden. Hier communiceert hij via USB of UART. Hij kan tot 200 commando’s onthouden. Jammerlijk bleek de speakup module niet geschikt voor dit project. Deze module had volgend probleem, Hij was stem afhankelijk. Enkel commando’s gesproken door dezelfde persoon als bij de opnamen zullen herkend worden. Dit komt doordat elke persoon een unieke stem heeft, verschillende toon hoogte, intonatie en uitspraak. Sterker nog zelfs commando’s gesproken door dezelfde stem als de opname werden niet steeds herkend. Dit probleem kon eventueel nog opgelost worden door hetzelfde commando meerderen malen op te nemen.
USB microfoon De spiegel moet instaat zijn antwoorden te registeren en begrijpen die worden gegeven op de vragen die hij stelt. Een Raspberry pi beschikt niet over een 3mm microfoon ingang. Daarom is een USB microfoon de meest voor de hand liggende keuze. Deze hebben meestal geen extra configuratie nodig. Chromium zal echter telkens een http webpagina de microfoon wil gebruiken een pop up venster tonen waar je de website Toestemming kan geven de microfoon te gebruiken. Om veiligheidsreden is het niet mogelijk een http pagina als vertrouwd in te stellen. Localhost is standaard een Http verbinding. Om dit om te vormen naar een https verbinding moet een ssl-certificaat worden uitgeschreven. Een certificaat kan gekocht worden bij bedrijven zoals Globalsign. Deze schrijven certificaten uit die zonder problemen door de browser vertrouwd worden omdat een Root-certificaat aanwezig is. Het is ook mogelijk zelf een ssl-certificaat uit te schrijven. Je moet dit dan achteraf wel zelf manueel toevoegen aan de lijst met vertrouwde certificaten in chromium. Anders zal een de pagina alsnog geblokkeerd worden. Van zodra de localhost succesvol als https webpagina beschikbaar is kunnen we deze als vertrouwd instellen en kan onze webpage zonder meldingen de microfoon activeren.
Connecting hardware Zoals de meeste test opstellingen werd de schakeling eerst op een breadboard gemaakt. Er bestaan handige koppelstukken om van de gpio pinnen naar een breadboard door te verbinden. Achteraf is een protoboard gebruikt om de componenten op te solderen zijn. Na aan weerszijde de 2buitenste pinnen los te solderen kan je dezelfde connector tussen Gpio van de pi en het protoboard gebruiken als voor het breadboard. Als deze pinnen niet los gesoldeerd zijn zal de connector niet passen in het protoboard. Deze pinnen hebben verder ook geen speciale functies ze exact hetzelfde als de GND,3.3V en 5V pinnen op het middelste gedeelte van de connector. De Hardware componenten (Ledstrips en sensoren) zijn via connectoren op het protoboard aangesloten, zo zijn ze eenvoudig te vervangen bij een defect. De connecties aan de ledstrips zijn met krimpkousen afgewerkt.
Connecties FROM
pin
pi
TO
19
MCP
11
21
MCP
12
23
MCP
13
24
MCP
10
SCLK
MCP
12
MOSI
Levelshifter
9
GND
Levelshifter
13,10,7
GND
MCP
14,9
GND
PIR
GND
GND
IR
GND
GND
Ext 5V Source
GND
GND
LEDS
GND
5V
MCP
15,16
5V
Levelshifter
1
5V
PIR
5V
5V
IR
5V
FROM Ext 5V Source
pin
pin
TO
pin
5V
LEDS
5V
GND
pi
GND
FROM
pin
LEDS
Ext 5V Source
5V
GND
pi
GND
DI
Levelshifter
11
CL
Levelshifter
8
pin
pin
pi
5V
GND
pi
GND
OUT
MCP
2
pin
TO
pin
VDD
pi
5V
GND
pi
GND
OUT
MCP
1
FROM
pin
Levelshifter
FROM MCP
TO
VDD
FROM PI
pin
5V
FROM PIR
TO
TO
pin
7
pi
GND
8
LEDS
DI
9
pi
MOSI
10
pi
GND
11
LEDS
CI
12
pi
GND
13
pi
SCLK
14
pi
5V
pin
TO
pin
1
IR
OUT
2
PIR
OUT
9
pi
GND
10
pi
24
11
pi
19
12
pi
21
13
pi
23
14
pi
GND
15
pi
5V
16
pi
5V
Breadboard De breadboard testopstelling
Schematic of protoboard drawn in fritzing Blue are the onboard wires Red are 5V wires Black are GND wires Yellow and White are Data and clock data wires
.
Protoboard Door gebrek aan rode draad in het labo is gebruik gemaakt van witte kabel voor de +5V draden. De zwarte draden zijn GND draden. Grijs en geel zijn draden voor data of kloksignalen. In de Afbeelding zijn de ledstrips er nog niet aan gesoldeerd.
Connectors Om onze externe componenten te verbinden met ons protoboard gebruiken we connectors. Zo zijn ze eenvoudig aansluit en vervangbaar.
Connector From External source for leds to Protoboard
.
Connectors From Protoboard to leds and sensors
Connector From Raspberry pi to Protoboard
# Audio issue Omdat de geprobeerde oplossingen zeer breed waren. Past deze paragraaf niet in een van de andere hoofdstukken. Verder is van het tijdsbestek van dit project een aanzienlijk stuk aan het oplossen aan deze audio problemen besteed. Vandaar dit weleens waar klein maar volledig toegewijd hoofdstuk aan de audio problemen.
Het probleem Het enkel afspelen van Spotify tracks in een loop achter elkaar verliep in 90% van de gevallen perfect. Het enkel afspelen van commando’s (welkom bericht gevolgd door de vraag achter of een liedje moest af gespeeld worden) werkte ook. Wanneer de twee werden samen gebracht liep er telkens iets mis. of de helft van gesproken boodschappen werd afgekapt, of liedjes begonnen niet te spelen, of liedjes speelde 10 seconden en liepen dan vast. Soms speelde de eerste keer na opnieuw opstarten alles perfect. Maar na de screensaver te tonen en opnieuw te verberg werden enkel de commando's afgespeeld. Het vreemde was dat de audio als ware crashte google gaf namelijk nog steeds aan dat er muziek werd gespeeld door in het tabje de speaker te tonen dat er geluid van die web pagina kwam. Maar er klonk geen geluid meer.
De oplossingen Er zijn ettelijke oplossingen geprobeerd hieronder zijn de voornaamste opgelijst.
Voice recognition Eerst werd gedachten dat de Voice recognition in combinatie met het afspelen van de audio misschien te belastend was. Dit te overbruggen had geen effect op de audio problemen.
Callback Er is gekeken of er een probleem was met de callback functie door gebruik te maken van set time-outs in plaats van de callback fucntie. Ook dit loste de problemen niet op. Er is geprobeerd time outs in de callbacks te gebruiken zodat het audio element meer tijd kreeg of te laden. Er is zelfs geprobeerd deze wachttijd onacceptabel lang te maken. Maar zelfs met lang laad tijd bleven de audio issues verschijnen
Geforceerd stoppen er is geprobeerd de audio geforceerd te stoppen door de audio stop functie meermaals na elkaar aan te roepen. Voor het afspelen van een nieuwe audio file
multi platform zowel HTML5 audio, javascript audio, jquerry audio is geprobeerd.
Scheiding van audio elementen Oorspronkelijk werd een element gebruikt voor het afspelen van audio dit is gesplitst naar 2 elementen. Één voor muziek en één voor commando’s dit is nog tot op heden zo maar loste de problemen niet op.
local opgeslagen commando’s of tekst to speech api
Er is getest of het verschil maakte of de Text to speech library werd gebruikte of lokaal opgeslagen .ogg files. Ook is het verschil tussen .mp3 files en .ogg files is geprobeerd.
Nieuwe track? Nieuw Audio ellement Het verschil is getest tussen één audio element aan te maken bij het laden van de pagina en hier telkens als een track eindigde onmiddellijk nieuwe tracks in te laden, maar er is ook geprobeerd elke keer audio moest worden gespeeld, het vorige audio element te verwijderen en telkens een nieuw aan te maken. Ook dit zonder resultaat.
back to basics verder is een 2de versie test versie van de webpage aangemaakt die zo basic mogelijk was waar alles dat niet voor de audio nodig was, was weg "gestript". Maar ook hier kwamen de audio issues voor.
Preloaden Er is geprobeerd tracks te pre-loaden. Het eerste liedje werd ingeladen bij het laden van de pagina. De commando’s werden via een ander audio element afgespeeld dat dit liedje veel laadtijd kreeg. Het 2de liedje werd onmiddellijk geladen na het eindigen van het eerste liedje. Maar ook dit alles hielp niet.
Andere Browsers Ik heb verschillende browsers geprobeerd Chromium 45 de huidige nieuwste versie van Raspbian. Raspbian wilt steeds stabiel zijn en loopt daarom express een aantal versies achter zodat de versies die ze aanbieden zeker bug vrij zijn. Daarom heb ik deze guide gevolgt om te updaten naar de laatst uitgekomen versie van chromium
https://www.raspberrypi.org/forums/viewtopic.php?t=121195. Zonder resultaat verder heb ik nog ICE-weasel geprobeerd een fork van firefox ook zonder resultaat.
Hardware Er dachten dat misschien de hardware van de pi te zwaar belast werd. We schakelden over van de Raspberry pi 2B naar een gloed nieuwe net gereleaste Raspberry pi 3. Maar ook dit deed de problemen niet verdwijnen.
Veranderen van Operating System Het leek on onwaarschijnlijk dat deze nieuwe Raspberry Pi dit niet zou aankunnen, dus ik probeerde vanaf mij laptop via het ip adres van de pi naar de webpagina te surfen en dit werkte zonder audio issues. Dit heb ik dan nogmaals geprobeerd vanaf de Raspberry Pi van Oliver die als os Linux ARCH gebruikte in plaats van Raspbian. Ook hier werkte de pagina feilloos. Zoals u in hoofstuk1 al heeft kunnen lezen was dit de uit eindelijke oplossing, de audio problemen bleken dus aan Raspbian te liggen.
De pi autobootable maken Het is gewenst dat als de spiegel zonder stroom valt deze niet volledig uit elkaar moet gehaald worden om een toetsenbord te kunnen aansluiten en alles terug manueel op te starten. Dit moet geautomatiseerd worden zodat de spiegel zichzelf opstart, zonder menselijke handeling. Net zoals in het hoofdstuk over configuratie zal enkel de Arch configuratie besproken worden, ondanks dezelfde instelling ook op raspbian gemaakt zijn. De relevantie van de Raspbian configuratie valt jammerlijk weg door de audio issues die we daarmee ondervonden.
Auto boot node server Om de node server op te starten bij boot gebruiken we supervisor. Dit is een Client/server system dat gebruikers toelaat processen te monitoren en te controleren op UNIX-like operating systems. Oliver had supervisor reeds gebruikt voor zijn project. Ik moest dit dus niet opnieuw installeren. Oliver had in de “supervisor.conf “ file volgende 2 lijnen toegevoegd: [include] files=/etc/supervisor.d/*.ini
Dit zorgt ervoor dat supervisor alle .ini files in de supervisor.d map zal uitvoeren. Indien deze programma’s crashen ze opnieuw opstarten. Het volstond dus om een nieuwe file met volgende inhoud aan te maken sudo nano /etc/supervisor.d/server.ini [program:nodeServer] directory = /home/dev/repos/apps-0002-interactive-mirror-hardware/myapp/ command=sudo node app.js user=dev startsec=0 startretries=0 autorestart=true
Autoboot pythonscript Het pythonscript zal nog steeds door Pythonshell in de node server gestart en gemonitord worden. Bij Arch is de standaard python het echter python3 terwijl bij Raspbian dit Python 2 is. Onze code is in Python 2 geschreven. De lijnen die bij Raspbian ons script startte zullen nu dezelfde error veroorzaken als een python2 script met Python 3 runnen. Door het server script aan te passen en als optie het pad naar python 2 mee te geven, zal python 2 gebruik worden om het script te runnen. PythonShell = require('python-shell'), pyshell = new PythonShell('Pythonscript.py'),
PythonShell = require('python-shell'), options = {pythonPath: 'usr/bin/python2'} pyshell = new PythonShell('Pythonscript.py',options),
Autoboot chromium Om Chromium te auto booten is gebruik gemaakt van LXsession. In te stellen via de LXsession configuratie user interface . Deze is te vinden onder home > preferences > Default applications for LXSession. Voeg volgende lijn toe:
chromium-browser --incognito --allow-running-insecure-content --kiosk https://localhost:3000
De “incognito” parameter zal zorgen dat bij het uitvallen en opnieuw opstarten van de spiegel geen melding voor het herstellen van pagina’s te zien zal zijn. De “allow-running-insecure-content” zorgt ervoor dat de data van de weer API geladen wordt deze wordt standaard geblokt omdat de gegevens van een HTTP verbinding komen terwijl de verbinding van de spiegel webpage HTTPS is. De weer api is niet beschikbaar in HTTPS. De “kiosk” parameter zorgt dat dat zoekbalken, scrolbalken, etc verborgen worden.
Verbergen van de muis cursor Als de pi boot en automatisch chromium in kiosk mode opstart blijft de muispointer zichtbaar. Zelfs als geen muis aangesloten is. Door in de /.xinitrc onderstaande lijn toe voegen, zal de muiscursor na korte periode van inactiviteit verborgen worden. Is er wel een muis aangesloten is het genoeg deze te bewegen om de cursor opnieuw te laten verschijnen. unclutter -grab &
vermijd scherm slaapstand Na tien minuten geen gebruikers activiteit te registreren, gaat het scherm voor ecologische redenen in slaapstand het scherm wordt zwart tot een toets wordt aangeslagen of de muis beweegt. Dit moet bij deze toepassing uiteraard worden vermeden. Volgende lijnen code in de /.xinitrc file zullen vermijden het scherm in slaapstand te laten gaan. xset -dpms & xset s noblank & xset s off &
Deze configuratie kan ten allen tijden gecheckt worde met commando “xset –q”. Achter de lijn “prefer blanking” moet het woord “no” staan.
Monteren van de spiegel De spiegel zal met een ijzer gelast frame worden opgehangen. Achteraan in het frame is een cirkelvormig gat open gelaten hier zal een gat door de muur geboord worden zodat de stroom uit achterliggende kamer kan worden afgetapt. Zo kunnen de kabels door dat gat weg gewerkt worden
Je ziet dat het frame opgedeeld is in 5 vlakken. In het middelste vlak komt de spiegel in elke hoeke van dit vlak merk je een klein kubusjes met uitsparing op. Deze zijn 3D geprint en zullen zorgen dat het scherm in het midden van het frame staat en geen ijzer hoeft aan te raken. Onderaan kan u de van hun behuizing ontdane speakers zien.
Initieel was het plan om de Raspberry achter het scherm aan te brengen maar met alle aansluitingen was ook hiervoor het frame te ondiep. Omdat de spiegel over de hele breedte van de muur komt. Kan de pi zonder probleem naast het frame plaatsen. Voor de draden is rechts onderaan een sleuf gemaakt.
Op deze foto ziet u ook dat het protoboard in een 3D geprint doosje is vastgevezen. Zodat dit deftig kon worden opgehangen.
Op deze foto ziet u ook dat het protoboard in een 3D geprint doosje is vastgevezen. Zodat dit deftig kon worden opgehangen. Hier ziet u het scherm in het frame geplaatst.
Plaatsen van de spiegel
Een L-profiel boven en onderaan houden de spiegel op zijn plaats
Op volgende Foto’s merkt u boven de spiegel een bakje op. Hierin zitten de sensoren. Rechts was plaats voor de microfoon voorzien. Deze bleek echter geluid goed genoeg achter de spiegel te kunnen registreren. Zonder de microfoon kan het bakje vele malen kleiner. Ondertussen is een nieuw kleiner bakje 3D geprint. Dit moet enkel nog worden vervangen. Op termijn komen de sensoren misschien onder de wasbak zodat deze ook mooi weg gewerkt zijn.
Resultaat Aan het einde van dit project kunnen we tevreden terugblikken en trots zijn op het resultaat. Enkel het inbouwen van bluetooth beacons is niet verwezenlijkt. Dit Kwam echter door externe oorzaken, zoals het ontbreken van regels over rechten van zo een beacon binnen het bedrijf omm security issues te vermijden. Deze moesten eerst opgesteld worden voor deze konden worden geïntegreerd. Alle overig gestelde doel einden zijn bereikt. Een minder puntje aan de spiegel is dat het spiegelbeeld redelijk donker is. Dit valt op photo niet te zien. Maar hier valt natuurlijk weinig aan te veranderen. Er is met verschillende spiegels getest. Maar ze waren alle even donker. Ondanks dit kan zeker gesteld worden dat het project de verwachtingen heeft ingevuld. De spiegel hangt en heeft een moderne professionele uitstraling. De audio klinkt helder zonder haperingen, de spiegel begrijpt commando’s goed. Zelf voor de gebruikers die de spiegel niet interactief gebruiken bied hij een meerwaarde. Het herinneren van de datum, enkele nieuws flashes, het uur. Allemaal in een oog opslag terwijl je toch je handen staat te wassen. De tijd die vroeger enkel naar het wassen van handen ging wordt nu dubbel besteed.
Besluit Over de eerste weken van de stage mag zeker gezegd worden dat het wat zoeken was. Zonder enige noemenswaardig ervaring met Raspberry Pi en zo goed als geen ervaring met Linux. Was de instap in dit project niet evident. Door het dagelijks gebruik vlotte het leerproces uiteraard goed. Tegen de tijd dat halverwege het project de overstap van Raspbian naar Arch gemaakt moest worden. Vormde Bash al lang geen probleem meer. Wat de overstap naar Arch vergemakkelijkte. De instap drempel naar Arch ligt als beginner immers een stuk hoger dan de instap drempel naar Raspbian. Verder heb ik tijdens dit project via zelfstudie een nieuwe programmatie taal aangeleerd. Voor dit Project had ik immers nog nooit een lijn python code gezien. Dit zijn maar enkele voorbeelden van de kennis verrijkt bij dit project. Er kan dus zeker en vast gesteld worden dat dit een leerrijk project was. Stap per stap sprint per sprint ging het project vooruit. Wat eerst nog lang niet op de spiegel leek die het moest worden. Veranderde onmiddellijk toen de eerste test spiegel aankwam. Dit gaf extra motivatie om het project succesvol te eindigen. Elk einde van de week was duidelijk de progressie te zien. Week na week werd de spiegel indrukwekkender, tot het uiteindelijke mooie eindresultaat werd bekomen. Het feit dat er een fysiek resultaat is, dat ook nog eens gezien mag worden geeft enorme voldoening. Net zoals na zo lang aan een project werken, alle gestelde doelen te behalen. En zo een afgewerkt product te kunnen afleveren. Momenteel zijn de aansluitkabels nog niet weg gewerkt. Maar eens ook deze door een gat in de muur worden weg gewerkt. Zal de spiegel een van zeer strakke, moderne uitstraling genieten. Nu de spiegel in gebruik genomen door het brede publiek is, ben ik er zeker van dat nieuwe ideeën van collega’s en cliënteel zullen binnenstromen. Met als gevolg dat er innovaties en uitbreidingen aan de spiegel zullen blijven gemaakt worden. Dit maakt dat de spiegel na updates zal blijven verbazen en geen vergeten project bekomt. Ook dit draagt bij tot het met een voldaan gevoel afsluiten van dit project. Een ding staat vast, terwijl toilet bezoeken en het achteraf wassen van de handen normaal saai en steeds hetzelfde zijn. Zullen ze toilet bezoeken bij November Five aangenaam en verrijkend zijn.