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.

Sunday, April 5, 2015

Reducing the Number of Colors (Part II)

A while ago I made an algorithm in Matlab to reduce the number of grayscales in a black&white image (link). And after that I tried to do the same with a color image (link) which didn't work out that well.

Image of flowers with only 12 colors


I was kinda busy with a lot of things, but the wish to try again was always somewhere in the back of my head. A couple of weeks ago I reviewed an online course I followed on Coursera on Machine Learning. This is probably the one of the best courses I have followed, but like with all things, if you don't use the skills learned frequently you loose the skills. But still I remembered some of the topics and what I in particular wanted to learn again was clustering.

In the topic of clustering you let the algorithm you make search for groups of points lying close together. I don't want to explain the whole subject here, and since the course explains it so perfectly I would suggest to watch the movies there.
I believe they have opened the course in such a way now that you can follow it at any moment now and don't have to wait for a new session to start. If you ever want to learn about fitting data, computer learning, Matlab/Octave programming this is a great place to start.

Back to my small project.

Finding Clusters in RGB space

The colors in an image have three values red,green and blue for every pixel. I view these as point in a cube which has sides going from 0 to 255. If there is i.e. a lot of sky in an image there will be lot of points with a light blue color close to each other in this cube. I want to find that cluster of points.
Time for an example.

original picture
picture with only 12 colors

In the pictures you can see the result of my algorithm. I have looked for clusters in the RGB cube, 12 in this case. In the end every pixel belongs to one of the clusters and the original color is replaced with the mean color of the cluster.
The result looks pretty good in my opinion. I could make a nice paint by numbers picture with this :)
But how does it preform on other images? And does it always give the same result?
That second question is not a trivial one. I choose my start point (the average point of the clusters) at random by taking points from the image (the RGB value of pixels in the original image).

Example 2: Room for improvement


The top image is the original image and the three images after that are from three different runs. When you inspect them closely you notice that they are quite different. Why is this happening?
First of all, I only let the algorithm run for a short time, and I'm not even checking if it has in any way finished. With finished I mean that a new step in the calculation doesn't change the answer.
Second of all the starting point determine the outcome. I would have do do this calculation a lot of times and then take a sort of average of the end results and maybe throw away bad results.

Hope to come back soon with a Part III to this topic. 







Friday, April 3, 2015

Handschoen Richtingaanwijzer

In Maakbare Wereld van de Volkskrant van zaterdag 4 april heb ik geschreven over mijn handschoenen die ik heb uitgerust met een richtingaanwijzer voor als je aan het fietsen bent.

Hiervoor heb ik een Adafruit GEMMA gebruikt en een Neopixel. Informatie hierover kun je bijvoorbeeld hier vinden. Het mooie van dit product is dat je het op een stof kunt naaien met geleidend draad en daardoor hoef je vaak niks te solderen. Het programmeren is redelijk eenvoudig, hiervoor heb je de Arduino programmeeromgeving nodig. Ik heb hiervoor de aangepaste versie gebruikt die je kunt vinden op de Adafruit website, klik hier. Download de versie die bij je computer past en volg de instructies goed.
Ik had hier verder geen problemen mee, maar dat kwam denk ik ook omdat ik al eerder een Trinket (zie hier) van dezelfde fabrikant had gebruikt en daardoor er geen driver problemen meer waren.

Mijn code is te vinden onder Code Examples. De code kun je ook gewoon lezen in een tekstverwerker. (Word, notepad, wordpad, notepad++)

Ik wil nog maar eens benadrukken dat de GEMMA of de grotere FLORA hele eenvoudige en betaalbare apparaten zijn en waar een heel arsenaal aan sensoren bij beschikbaar zijn, zoals GPS, licht, geluid, versnelling en nog wat.

Als iemand vragen heeft, aarzel niet om ze te stellen. En ik vind het leuk om te horen als iemand zelf iets gemaakt heeft.


Succes met bouwen!
korte video demo


EDIT (21 april): Hier is de illustratie die Bier & Brood hebben gemaakt bij het artikel. Beter dan ik het kan uit tekenen. De weerstand van 10 kOhm tussen D2 en GND is erg belangrijk. 

Illustratie van Bier&Brood

Friday, March 6, 2015

Afstand 'Voelen' tips en trucs

-SOME ENGLISH BELOW-
Deze post moet wat achtergrondinformatie geven bij mijn Maakbare Wereld stuk in de Volkskrant op zaterdag 7 maart 2015. Ik heb hier een soort handschoen gemaakt die meet hoe ver weg objecten zijn en dit doorgeeft door harder en zachter te gaan trillen. De afstand sensor is een HC-SR04 en microcontroller die alles regelt is een Trinket van Adafruit.


Het uiteindelijke resultaat

video
Het filmpje laat zien hoe alles in elkaar gesoldeerd is, maar nog niet hoe het er uiteindelijk uitziet.

In de krant zijn er een aantal details waar ik niet op in ben gegaan, omdat ze redelijk technisch zijn of omdat er gewoon niet genoeg plaats was. Als je de behoefte hebt om iets vergelijkbaars te maken is de kans groot dat je een aantal vragen hebt of problemen tegenkomt. Ik zal er een paar opnoemen en later er verder over uitweiden.

Waarom heb ik een batterijhouder gebruikt met 3AA batterijen, da's toch superzwaar?
Voor de afstand-voel-sensor-handschoen heb ik een Trinket gebruikt van Adafruit. Het installeren van de Trinket gaf mij nogal wat problemen.
De trilmotor kan op verschillende sterktes trillen, maar daar komt nog wat elektronica bij kijken.
De afstandssensor kwam niet met een handleiding en daarvoor heb ik goed moeten zoeken naar voorbeelden en wat moeten testen om het goed te laten werken in dit project.

Als je nog andere vragen hebt dan kan dat altijd helemaal onderaan in het commentaar gedeelte.

Batterijhouder

Sommige ontwerpbeslissingen neem je terwijl je bezig bent en achteraf ga je dan twijfelen. Ik kwam een natterijhouder tegen voor 3AA batterijen met aan/uit schakelaar, USB uitgang en een riemclip. Ik wist dat er genoeg spanning uit zou komen en bovendien door de USB uitgang hoefde ik ook niks te solderen. De Trinket kun je namelijk ook spanning geven door de USB ingang. Er zijn ongetwijfeld kleinere en lichtere batterijen, maar op dit moment kan ik hem aan een broekzak hangen en daardoor hoef je geen enkel gewicht aan je hand te dragen.

Trinket installeren

Volg de handleiding. Serieus, er staat een hele lap tekst op de Adafruit website en dat is niet voor niks. En zelfs dan vond ik het nog knap lastig om het aan de praat te krijgen. Het grote probleem was dat mijn Windows 8.1 het niet leuk vindt om een apparaat te installeren dat hij niet kent. Als je bootmenu van je computer eng vindt dan zou ik adviseren om iets anders te gebruiken,bijv een Arduino micro. Het kost iets meer, maar het is vast sneller te installeren.

Ik moest uiteindelijk in mijn 'Advanced Boot Options' aanvinken 'Disable Driver Signature Enforcement' waardoor mijn computer in een Test Mode kwam en daarna ging het installeren gelukkig goed. De computer uit Test Mode krijgen was weer wat zoeken, maar ik moet bekennen dat ik vergeten ben welke tip dat was.

Trilmotor bedienen

Ik heb dit voorbeeld gevolgd. Ik had niet exact dezelfde componenten, maar dat maakt niet zoveel uit. Het is wel belangrijk dat je iets hebt. De transistor is er voor om de spanning te kunnen variƫren, de weerstand om te zorgen dat er niet teveel stroom loopt en de diode zorgt ervoor dat de niet een spanningspiek de verkeerde kant opgaat.

Afstandsensor

De afstandsensor die ik gekocht had is redelijk veel voorkomend. Ik heb ook nog een infrarode sensor geprobeerd, omdat die nog iets kleiner is, maar heb die niet gekozen omdat deze voor hele korte afstanden (1 a 2 cm ) niet nauwkeurig meet. In mijn testopstelling op een breadboard en met een Arduino Uno werkte het eerste simpele voorbeeld dat ik op internet tegenkwam al goed. Toen alles gesoldeerd was aan de Trinket waren er wat problemen. De sensor zendt geluid uit en kijkt dan hoe lang het duurt voordat het terug komt. Dit leek niet goed te gaan, want de Trinket reageerde maar heel af en toe.
Uiteindelijk kwam ik er achter dat het nodig was om bij het meten van de tijd het volgende te gebruiken:

duration = pulseIn(echoPin, HIGH,3000);

Het laatste getal is de tijd voordat er een timeout is, in milliseconden (ms). Aangezien dit bij veel voorbeelden op internet niet vermeld wordt leek het me wel zo fijn om het hier te vermelden.

Conclusies

Dit was een erg leuk knutselproject. Zoals altijd had ik me vergist in waar de problemen zouden, maar uiteindelijk vielen de meeste wel mee als je er eenmaal mee begint. Ik hoop dat er mensen zijn die er wat inspiratie uithalen.


SHORT ENGLISH SUMMARY

For the Volkskrant newspaper I made a sensor to wear on your hand that tells you how far away objects are. I used a HC-SR04 distance sensor connected to a Trinket microcontroller from Adafruit. A buzzer/vibrating motor also from Adafruit was giving the feedback by vibrating harder of softer.

Installing the Trinket driver was pretty challeging. I needed to 'Disable Driver Signature Enforcement' in the 'Advanced Boot Options'.
Quick remark about the HC-SR04. I had to use the following line to read the time it takes for the sound to come back to the sensor:
duration = pulseIn(echoPin, HIGH,3000);
The last number is a timeout variable, and without it the Trinket didn't respond. Most examples don't have itso it's worth mentioning here.
For the buzzer use this example from Adafruit.
Sorry for the short explanation, but I anyone has any question put them down below in the comments.

Friday, January 30, 2015

Vogels spotten - bij de Maakbare Wereld in de Volkskrant van 7 februari 2015


Om te zien hoeveel vogels er nu zo langskomen op ons balkon heb ik een webcam geplaatst die alleen foto's neemt als er beweging is. Ik heb hiervoor Processing 2.2.1 gebruikt, omdat deze versie goed werkt met de webcam. Mijn code kunt u vinden onder Code Examples.

De foto's van de vogel bezoekjes zijn samengevoegd in een gif bestanden, zodat het filmpjes worden. Hieronder zijn wat voorbeelden.

Het kan misschien wat tijd kosten voordat ze geladen zijn.








Dingen om op te letten. 

Ik heb in mijn code de bestandsnamen laten afhangen van de tijd. En daarnaast was het niet mogelijk een bestand op te slaan als deze naam al bestond. Anders heb je de kans dat er 30 keer per seconde een nieuw bestand wordt opgeslagen wat het programma heel traag maakt.

Ik heb de bestanden direct naar mijn google drive laten opslaan, zodat ik ook op afstand kon zien of er nieuwe foto's waren. Maar met andere cloud oplossingen zoals Dropbox, Onedrive, iCloud werkt dat vast ook. 

De waardes waarbij het programma beslist of een pixel aanzienlijk verandert is en wanneer er genoeg pixels verandert zijn heb ik proefondervindelijk bepaald. Als je dus zelf gaat kijken of het programma bij jou werkt is dat een goeie plek om iets te veranderen.

Ik heb gekozen voor een venster formaat van 640 bij 480 pixels en een bijpassende webcam. Het programma geeft een lijst met alle mogelijke webcam formaten. Kijk dus eerst een keer welk nummer er voor de webcam staat die jij wilt gebruiken en verander dat nummer op de plek in de code.
Als het programma heel traag is, kun je ervoor proberen om een kleiner formaat webcam te kiezen.
Of als je dieper in de code wilt duiken, proberen om gebieden over te slaan als de huidige afbeelding met de vorige wordt vergeleken, door de for loop te veranderen. Een tip daarbij is dat afbeeldingen in Processing geen matrices zijn maar gewoon een vector van getallen. Een enkele for loop is eigenlijk al voldoende.