Friday, May 6, 2016

Harry Potter fotolijst

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.

Happy building!

Saturday, April 9, 2016

Vogelhuis nachtlamp

Het vogelhuis-nachtlampje in actie. Lees meerin de Maakbare Wereld van 9-4-2016.

Friday, March 11, 2016

Papa Noodalarm (Maakbare Wereld 2016-03-12)

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. 








Friday, January 15, 2016

Infrarood Camera met een Arduino

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.








Friday, December 4, 2015

Stofzuiger Snoepstrooier

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.

Friday, October 9, 2015

Disco Jurk

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?




Monday, July 20, 2015

Reducing Color part III


Recently I found a few hours to pick my project of reducing colors in a color image. In my previous post I explained how I take a color image and let Matlab search for 12 colors (or any number of my choosing) that best represent the original. I was quite pleased with the result as it was, but there was still plenty of room for improvement. Letting the algorithm run longer was one of them.

One thing another that I thought was missing was naming the colors found. I am colorblind. For me it's sometimes hard to name green or orange. The author of XKCD once held an interesting experiment where he let people name colors. The results are interesting and funny. For me most important is the list with 954 named colors. I thought would be cool to see if I could first find the most dominant colors in an image and then find the name of that color (or something very close).

All the colors in the table were in Hex codes so I converted them with the help of a function I found on the Matlab File Exchange site.

Since my reduced color image only has 12 different RGB colors it's not too much effort to compare each of these values with the list of 954 colors. I took the Cartesian distance between two numbers.

I'm not sure if that is the best way of finding the right color name. We humans are pretty picky when it comes to colors. So a shade of gray shifted a bit darker will still look gray. But shift it in one direction (i.e. blue) and all of a sudden it's a color.


Two Shades of Gray


Gray and some Color

Ok, it's not a very distinct color, but it's not completely gray. Maybe you'd call it shadow blue or air force blue (people think of a lot of names).

Anyway I added the XKCD list to my algorithm and found colors close to the dominant colors and finally to see how well it worked I used those colors to paint the picture. Behold the three images: original photo, reduced colors and XKCD colors.
Original


Reduced to 12 colors

XKCD colors

And the colors are:
    'eggplant'
    'beige'
    'bubblegum pink'
    'piss yellow'
    'deep lilac'
    'brownish orange'
    'rusty red'
    'very light pink'
    'darkish pink'
    'brick red'
    'light burgundy'
    'dried blood'

I don't think the colors are an exact match. And my reducing colors algorithm still has varying results, but it sort of work.

If I ever learn how to make this into a smartphone app I can walk through the supermarket and I will finally be able to pick the yellow banana's (#ffff7e apparently).
Questions are always welcome.