In de Maakbare Wereld van 7 mei 2016 kun je lezen over mijn Harry Potter lijst.
Ik wil hier nog wat uitleg geven waarvoor niet genoeg ruimte was en natuurlijk de code die ik geschreven heb.
Allereerst wil ik Antratek bedanken die mij gesponsord hebben bij dit project, omdat ze dit een erg leuk idee vonden. Het is een goeie plek om Arduino-, Raspberry Pi- en wat al niet voor spullen te bestellen.
Demo
Gelijk maar even een demo van hoe het werkt in het echt:
Hardware
Ik heb de volgende hardware gebruikt: een Raspberry Pi 2, een 7" touch screen van Raspberry Pi, en een HC-SR501 bewegingssensor. Er moeten nog wat draadjes bij kijken, maar dit keer geen solderen.
Verder moet je niet vergeten dat je een draadloos toetsenbord en muis nodig hebt en ook een wifi dongle om updates te kunnen downloaden.
Bij de pins op de Raspberry Pi staan geen nummers of namen, dus je moet wel een beetje opletten waar je wat inprikt.
Het scherm heeft een platte dunne stekker waar niet veel fout mee kunt doen. Daarnaast moet je ook nog vier draadjes verbinden tussen de Raspberry en het scherm. 5V, Ground, GPIO 2 (pin 02) en GPIO 3 (pin 05).
de bewegingssensor heeft ook 5V en Ground nodig en nog een laatste die naar een GPIO pin moet. Ik heb daarvoor pin 07 gebruikt.
Op de foto is het niet echt goed te zien, maar toch bij deze:
Ik heb een grote houten lijst er rond gebouwd, zodat ik het geheel rechtop kan zetten op een kast, maar je kunt ook zelf iets moois verzinnen.
Software
Het belangrijkste is natuurlijk nog de code die verschillende gaat laten afspelen. Ik heb een minuut lang mezelf gefilmd en dit in Movie Maker in kleine stukjes gehakt. Die stukjes worden achter elkaar afgespeeld. Tenzij er natuurlijk iemand voorbij loopt, dan wordt het filmpje afgespeeld waarbij ik zwaai.
De code is denk ik goed te begrijpen. Het begint met een heleboel libraries die geïmporteerd worden. de pin voor de bewegingssensor wordt geactiveerd. De namen van de verschillende mappen worden vernoemd. Daarna komt er een while loop waar de filmpje in een subprocress worden afgespeeld.
De filmpjes heten 1.h264, 2.h264, etc. De variable 'scene' begint bij 1 en wordt steeds eentje opgehoopt tot de laatste (11) is bereikt.
Het program is niet ideaal, maar ik wilde het ook niet te ingewikkeld maken. Hopelijk vind ik nog eens tijd om bugs op te lossen, om een functie in te bouwen waarmee je kunt stoppen en nog wat meer interacties in te bouwen (ik heb nog wat meer filmfragmenten klaarliggen).
#!usr/bin/python
import RPi.GPIO as GPIO
import time
import os
import subprocess
import glob
GPIO.setmode(GPIO.BOARD)
pir=7
GPIO.setup(pir, GPIO.IN)
print("Waiting for sensor to initialize")
time.sleep(2)
pathPlayer = '/home/pi/Public/programs/pi_hello_video-master/hello_video/'
pathVideo = '/home/pi/Videos/harrypotter/'
scene = 1
while True:
infile = pathVideo +str(scene) + ".h264"
subprocess.call( [pathPlayer+"hello_video.bin", infile])
if scene==11:
scene = 1
else:
scene=scene+1
if GPIO.input(pir):
infile = pathVideo + "zwaaien.h264"
subprocess.call( [pathPlayer+"hello_video.bin", infile])
print("Finished")
Video's omzetten
De filmpjes moeten omgezet worden in het .h264 formaat te werken. Op de Adafruit website staat hoe je dit moet doen en ook waar je de hello_video speler kunt downloaden. Je moet dingen in je terminal doen van je computer. Die open je in Windows door 'cmd' te zoeken.
Al met al zijn er heleboel stappen die je moet doorlopen, maar allemaal wel te doen op zich. Ze zijn ook niet zo afhankelijk van elkaar. Je kunt bijvoorbeeld best later nog nieuwe filmpjes maken. Of de code aanpassen zodat de filmpjes in een andere volgorde worden gespeeld.
Zoals als altijd, heb je vragen stel ze gerust. Ik ben vast dingen vergeten uit te leggen en sommige dingen waren voor mij misschien logisch die voor iemand anders heel onduidelijk zijn. Het was voor mij de eerste keer dat ik met een Raspberry Pi heb gewerkt en het viel me heel erg mee, maar het blijft complex.
Ik hoop wat stappen duidelijker te maken die ik gemaakt om mijn papa noodknop te laten werken. Om even samen te vatten wat de noodknop doet. Als er op de grote rode knop gedrukt is, wordt er een e-mail gestuurd naar mijn vrouw met de boodschap "Kom thuis! Z.s.m.!!"
De noodknop
Huzzah!
Het hart van deze operatie is een Huzzah! zoals in elkaar gezet door Adafruit. Dit is een aangepaste versie van de ESP8266 chip, waardoor het aansluiten nog gemakkelijker is. Deze chip kan contact maken met draadloos internet en heeft ook wat input aansluitingen, zoals voor sensoren of onze knop.
Voor het definitieve aansluiten van de knop heb ik eerst de tests gevolgd zoals beschreven op de Adafruit website. Na er zeker van te zijn dat de Huzzah! met het internet kan praten kunnen we de knop vast solderen.
Knop en stroom
De knop is een Big Dome Pushbutton van Sparkfun. Lekker groot en goed om op te slaan. De knop heeft aan de onderkant kant 5 aansluitingen, maar daarvan zijn er twee voor de interne LED lamp (die we helaas niet gebruiken nu) Van de andere drie is er eentje aarde (COM) en de andere twee zijn voor knop wel of niet ingedrukt. Met de multimeter weet je snel wanneer de stroom kan lopen als de knop ingedrukt is. De knop kun je daarna vast solderen aan de Huzzah GND pin en bijvoorbeeld pin 2.
Als stroombron heb ik een batterijhouder met 3 AA batterijen vastgemaakt, de 4,5 V is prima voor de Huzzah!. Nu alle hardware klaar is, is het tijd om het net op de te gaan.
io.adafruit
Er zijn vast heel veel methodes om een e-mail te sturen, maar ik heb de volgende weg gekozen. Adafruit biedt een gratis dienst aan om gegevens weer te geven van met internet verbonden sensoren.
Je kunt een account aanmaken op deze internet of things website: https://io.adafruit.com
Als je aangemeld bent kom je op een voorbeeld dashboard, zo'n website waar je grafieken en meters kunt weergeven. De waardes die je hier ziet komen van Feeds. Zo'n Feed sturen we de data van onze Huzzah!. Het adres van de Feed moeten we in onze code stoppen die op de Huzzah! staat.
De code is kort gezegd eerst het verbinden met het internet. En vervolgens wacht het op het indrukken van de knop. Als er iets verandert, de knop wordt ingedrukt of weer losgelaten wordt er resp een 1 of een 0 het internet opgestuurd. En zowaar op het dashboard kun je de waardes zien verschijnen. De hele code (zonder wachtwoorden etc) staat onder Code Examples
0 staat voor: knop niet ingedrukt
IFTTT
Vanaf de Adafruit site kun je geen berichten sturen, maar de webdienst IFTTT (If This Then That) kan dat wel. Door je Adafruit feed door te geven kunnen er acties ondernomen. De mogelijkheden van IFTTT zijn heel uitgebreid en zeker de moeite om eens door te nemen. In dit geval zeggen we: als de waarde in onze Feed 1 is, stuur een e-mail. De boodschap van het bericht kun je helemaal zelf aanpassen. Het is echt niet moeilijker als een account aanmaken en een paar knoppen drukken.
Ok, dat is in het kort de stappen die ik genomen heb. Sommige zijn wat kort door de bocht. O.a. omdat de uitleg van de Adafruit zoals altijd heel uitgebreid is en het weinig zin heeft om het proberen hier te reproduceren. Volg de aanwijzingen stap voor stap en je zult weinig problemen tegenkomen.
Mocht je vragen hebben, stel ze hieronder en ik zal ze zo goed mogelijk proberen te beantwoorden.
In de Maakbare Wereld van 16 januari staat mijn stukje over de infrarood camera die ik heb gemaakt.
De camera bestaat grofweg uit drie onderdelen: Een Arduino Uno, een Pan Tilt, en een infrarood sensor. Om een beeld te krijgen hoe het werkt een kort kort filmpje van de sensor die heen en weer beweegt.
Later heb ik een klein kartonnen buisje om de sensor geplaatst, zodat er geen licht van opzij valt.
Draadjes
De motoren van de pan tilt zijn redelijk eenvoudig aan te sluiten. Ze gebruiken allebei 5 Volt. Het is nodig om een flinke condensator tussen de plus en min aansluitingen te plaatsen die spanningspieken op kan vangen bij het aanzetten van de motoren. Als je dit niet doet daalt de spanning zoveel dat de Arduino steeds opnieuw opstart. De infrarood sensor heeft vier aansluitingen; er is een uitstekend stukje als oriëntatie punt. Aangezien er een duidelijk beschrijving hier staat ga ik dit niet herhalen. Er worden twee 10 kOhm weerstanden gebruikt die op de plus kant aangesloten worden. Ik vond dat niet heel duidelijk uit de foto. Let op dat deze sensoren in verschillende types bestaat. Ik heb de 3V versie gebruikt en daarom moest ik de 3.3 Volt aansluiting van de Arduino gebruiken, dus niet dezelfde als voor de motoren.
Het complete schema ziet er ongeveer zo uit. (hopelijk zonder fouten :) )
Voor de geïnteresseerde; deze afbeelding is gemaakt met Fritzing, een gratis programma om schakeling e.d. te tekenen.
Resultaten zijn natuurlijk ook leuk om te zien. Ik heb foto gemaakt van een glas bierglas gevuld met warm water.
Glas warm water scannen
Foto van het warme glas water
De kleuren zijn wat willekeurig gekozen, blauw is warm en rood is koud. Maar het idee is duidelijk lijkt me. Ik plaatste het glas toen de sensor al heen en weer bewoog, waardoor er strepen kwamen. Verder was ik erg tevreden of dit resultaat. De sensor heeft normaal een blikveld van ongeveer 90 graden, maar met het kokertje is het een aardig scherp beeld geworden. Het glas stond natuurlijk dichtbij. Misschien zou een lens kunnen helpen, maar de vraag is of een gewone lens wel goed werkt met infrarood licht.
Code
Motoren en sensoren gaan niet uit zichzelf werken en je computer maakt ook niet vanzelf afbeeldingen, dus kort daar wat over. De motoren kun je vertellen om naar een bepaalde stand te gaan van 0 tot 180 graden heen en weer en 0 tot 150 graden op en neer. Ik heb niet dat volledige gebied afgescand, maar van 0 tot 90 graden in beide richtingen. We gaan steeds één plekje opzij tot we de rand bereikt hebben, dan één plaatsje naar beneden en de andere kant weer op.
Na elke beweging vragen we aan de infrarood sensor wat de gemeten temperatuur is. Deze sensor geeft omgevingstemperatuur en de voorwerpstemperatuur, Daarbinnen gebeurd dus ook al genoeg blijkbaar.
De Arduino Uno is het hart van de operatie. Deze doet het aansturen van de motoren en het opvragen van de temperatuur. Als dat gebeurd is stuurt het een bericht naar de laptop via de USB kabel, een serial message. Op de laptop draait een Processing programma dat wacht op berichten, graden Celsius in dit geval. De graden worden omgezet in gehele waarden tussen de 0 en 255, waarbij 0 overkomt met bijv. 24 graden en 255 met 30 graden. Met deze waarde wordt een vierkantje ingekleurd, zo wordt 0 helemaal rood en 255 volledig blauw en alles er tussen in mooie mengkleuren.
Er zat wat verschil tussen de heen rijen en de terug rijen waardoor ze wat verschoven waren ten opzichte van elkaar en dus heb ik ze wat opgeschoven.
Beide programma's zijn hier te vinden. Je kunt ze ook openen in elk tekstverwekingsprogramma, zoals notepad.
Als iemand nog vragen heeft (zoals over code die niet werkt :) ) plaats ze hieronder.
In de Maakbare Wereld van 5 december 2015 staat mijn Stofzuiger Snoepstrooier. Het leek me leuk om in een kort filmpje te laten zien hoe hij er uitziet en hoe hij werkt.
Er kan van alles veranderd worden aan dit ontwerp: langere buis, smallere buis, sterkere stofzuiger, etc.
Maar waar het om gaat is dat het super eenvoudig is en heel leuk om dingen mee weg te schieten.
Als je eigen snoepschieter maakt pas dan alsjeblieft op met mensen of andere dingen die stuk kunnen gaan die in de weg staan.
Vragen zijn altijd welkom.
In mijn 'Maakbare Wereld' stuk van 10 oktober 2015 in de Volkskrant beschrijf ik in het kort hoe ik een schitterende, blinkende disco jurk in elkaar gestoken heb. Allereerst een filmpje om te laten zien dat het echt werkt (of tenminste werkte totdat hij een paar uur gedragen was. Ik moet echt op naaicursus).
Omdat in de krant niet genoeg plek is om diep in te gaan op de software kant van het project wilde ik er hier wat over schrijven.
De FLORA die de LED lampjes aanstuurt wordt geprogrammeerd met de Arduino IDE. Al wordt het steeds makkelijker om hier mee te werken, het kost nog steeds wel wat tijd alles aan de praat te krijgen. Het is vooral nuttig om de handleiding van Adafruit te volgen over hoe je de FLORA voor het eerst moet gebruiken. Lees goed wat je precies moet doen dan zou het altijd goed moeten komen.
De Arduino taal is naar mijn mening een supermooie manier om met programmeren te beginnen. Het is goed leesbaar en je hebt gelijk een fysisch resultaat, zoals knipperende lichtjes.
Ik zal me verder beperken tot de onderdelen die ik gebruikt heb namelijk de FLORA, de 9DOF sensor en de NeoPixels (kleuren LED's). Ik vind het zelf erg fijn om te leren van simpele voorbeelden. Ik geef daarom een paar voorbeelden van wat je kunt doen met deze componenten. Ik zal proberen in de code Nederlands commentaar toe te voegen, zodat het duidelijk is wat de verschillende onderdelen doen.
Hieronder wat korte opmerkingen
Knipperen bij bewegen
Het voorbeeld dat Adafruit zelf in elkaar heeft gestoken is erg informatief. Het kijkt naar de totale versnelling op twee momenten vlak na elkaar en kijkt of er een (groot) verschil is. Zo ja, dan wordt er een functie aangeroepen die willekeurig de lampjes laten knipperen. Ik heb het commentaar vertaald en de sketch is hier te vinden. Je moet het bestand downloaden om het te kunnen inzien. Het beste natuurlijk bewerken in de Arduino IDE, maar in een tekstverwerker kan ook (notepad, wordpad, etc).
Het programma heeft waarschijnlijk maar weinig aanpassingen nodig om voor uw eigen ontwerp te werken. Het belangrijkste zijn de PIN waar het lint van NeoPixels op aangesloten is en het aantal NeoPixels in hetzelfde lint in deze regel: Adafruit_NeoPixel strip = Adafruit_NeoPixel(7, 6, NEO_GRB + NEO_KHZ800);
Het gaat om de twee getallen die na het 'haakje open' staan: 7 en 6. In mijn geval heb ik namelijk 7 NeoPixels aangesloten op PIN 6.
Je kunt de gevoeligheid aanpassen bij: #define MOVE_THRESHOLD 120
Oriëntatie
De 9DOF sensor kan ook de magneetsterkte in drie richtingen meten. Daardoor is het een soort 3D kompas. Je zou dus de kleuren van de NeoPixels kunnen laten veranderen van de windrichting dat je opkijkt.
Het is goed om te beseffen dat het magnetische noorden vanaf uw positie gezien ergens onder de horizon ligt en dat de richting van magnetische vector dus richting de grond wijst. Dat betekend niet dat je niet kunt gebruiken als kompas. Om het precies te doen zouden we wat rekenwerk moeten verrichten, maar voor dit geval proberen we het zo simpel mogelijk te houden. Aangezien de sensor vast zit aan de jurk zal deze in normale situatie steeds met dezelfde as omhoog wijzen. Twee andere assen zullen we steeds andere waarden aangeven. Ik heb gewoon even getest door de jurk rond te draaien en in de Serial Monitor gekeken wat de waardes waren van de verschillende kanalen x, y en z. In mijn geval bleek y niet veel te veranderen en x en z wel. Om de richting te berekenen neem ik de arctan van x en z: atan(magX/MagZ). Ik houd voor simpliciteit hier geen rekening met een vector die precies de andere kant opstaat. Dat kunt u eenvoudig zelf toevoegen (lees: ik was te lui om het te doen) Het bestand vindt u hier.
Ik hoop dat er binnenkort wat mooie kostuums gemaakt worden. Halloween?