Categories
Arduino Interactieve Media Product review

PIR bestuurde MP3 speler, o.a. voor geocaches.

imagesVoor echte speurders is Geocaching een populaire buitensport. In Nederland alleen al zijn vele duizenden geocaches verstopt. Fanatieke geochachers maken en onderhouden deze geocaches vaak zelf. Geocaches zijn er in vele verschijningsvormen; sommigen hebben een uiterst creatieve vormgeving, andere geocaches vragen het nodige puzzeldenken om ze te kunnen vinden. En soms zijn ze technisch best wel geavanceerd uitgevoerd. Een met enige regelmaat gevraagde feature is het kunnen genereren van geluiden zodra de geocache gevonden wordt. Arduino is een uitstekend platform om een geocache met zo’n feature te realiseren.

Audio shields

Een Arduino heeft behoudens een piezo-beeper functie geen standaard faciliteiten om geluiden te kunnen genereren. Maar voor het Arduino platform zijn wel allerlei leuke audio shields beschikbaar zoals MIDI-synthesizers en MP3 spelers. Hieronder een kort lijstje met wat voorbeelden:

Elechouce_Arduino_MP3_Shield
Elechouse MP3 shield

Hoewel alle shields op zich prima werken en een goede geluidskwaliteit leveren heeft de versie van Elechouse een leuk voordeeltje. Bij de andere shields moet een Arduino hard moet werken om de audio bestanden eerst in brokjes uit het flash geheugen op te halen om ze vervolgens weer aan te leveren aan de mp3 decoder. De Arduino heeft het hier erg druk mee en komt daardoor veel minder makkelijk toe aan andere taken die je hem ook zou willen geven. Bovendien is het schrijven van een robuuste sketch en het voorkomen van audio hick-ups vanwege dit ‘buffergedrag’ best wel lastig. De Elechouse shield daarentegen speelt de audio rechtstreeks af vanuit het flash geheugen, dus zonder buffering via de Arduino. Daarbij kun je nog kiezen uit on-board flash (64Mbit), een SD card of een USB stick.

Voorbeeldtoepassing

PIRcontrolledMP3player
PIR sensor bestuurde MP3 speler

Voor deze voorbeeldtoepassing gebruiken we een standaard PIR om bewegingen van een voorbijganger te detecteren. Afhankelijk van het type PIR sensor zijn de gevoeligheid en de tijdsduur instelbaar met potentiometers op de achterzijde. De PIR sensor werkt op 5-12V en heeft een open collector uitgang zodat eventueel meerdere PIR sensoren parallel te schakelen zijn. Let op dat je bij het initialiseren van de digitale ingang ook de interne pull-up activeert ( “pinMode(2, INPUT_PULLUP);” ). Zodra de PIR sensor een beweging detecteert wordt de uitgang dus laag en kan het afspelen van een audiobestand gestart worden.

De software aansturing van deze mp3 shield loopt via een soft-serial interface en de standaard Arduino library voorziet in ‘start/stop/prev/next/vol+/vol-‘ commando’s, vergelijkbaar met de push buttons op de shield zelf. De bijbehorende datasheet vermeldt daarnaast ook een aantal functies om status informatie uit de mp3 speler op te vragen. Zo is het kunnen opvragen van het aantal beschikbare audiobestanden waardevol indien je ‘random’ playback wilt realiseren. En het kunnen opvragen van de workstate (‘stop’, ‘play’, ‘pauze’) is handig wanneer je wilt voorkomen dat al een nieuw start-commando gegeven wordt terwijl de shield nog audio aan het afspelen is.  Jammer genoeg zijn deze ‘lees’-functies niet geïmplementeerd in de standaard meegeleverde library. Vandaar dat ik een versie 0.3 heb uitgebracht waar de onderstaande functies zijn toegevoegd.

/** get volume */
u8 check_volume(void);
/** get work state */
u8 check_work_state(void);
/** get nr of files on SPI FLASH */
u16 check_nrof_spi_files(void);
/** get nr of files on SD card */
u16 check_nrof_sd_files(void);
/** get nr of files on USB disc */
u16 check_nrof_usb_files(void);
/** get current playing file */
u16 check_current_playing_file(void);
/** get the user defined data string */
u32 check_user_defined_data(void);

De uiteindelijke voorbeeldtoepassing is eenvoudig van opzet, zie hieronder. De sketch is inclusief de uitgebreide mp3-library, als ZIP bestand te downloaden.

setup():

  • initialiseer de I/O (soft-serial op pin 7 en 8, sensor op pin2, en de status-LED op pin3)
  • initialiseer de mp3-player class en gebruiksmode (= single play, standaard volume)
  • stop eventuele playback
  • vraag het aantal opgeslagen audio bestanden op

loop():

  • monitor PIR ingang en geef de status weer via LED
  • wacht tot PIR sensor wordt geactiveerd
  • speel een random gekozen audio bestand af
  • wacht tot afspelen klaar is

P.s. omdat een geocache een ‘vrije opstelling’ is zal er waarschijnlijk geen stopcontact voorhanden zijn. Daarom is het gebruik van een Li-Ion batterij met solar lader aan te bevelen. Have fun!

Andere toepassingsmogelijkheden

Deze oplossing is uiteraard ook geschikt voor andere toepassingen dan alleen voor geocaches. Denk aan musea, winkels, beurzen, pretparken, recreatieruimtes, etc. Kortom overal waar automatisch muziek of een andersoortig geluid afgespeeld moet worden zodra er iemand voorbij komt.

En door de PIR sensor te vervangen door een andere sensortype kun je het trigger-gedrag eventueel aanpassen aan andere interactiebehoeftes. Bijvoorbeeld afspelen zodra iemand op een vaste positie staat.

Categories
Interactieve Media Kinect MakeyMakey Processing

Interactieve graffiti met Processing, Kinect en Makey Makey.

Op 15/16 augustus wordt in Gemert alweer de 26e editie van het Zebra-festival gehouden. Het festivalterrein is het parkeerterrein van Theater de Eendracht. Aan mij de leuke uitdaging om op een van de vrije muren een graffiti te projecteren die reageert op bewegingen van het aanwezige publiek.

Het platform om dit te kunnen realiseren bestaat in mijn geval uit een Kinect voor “motion-tracking”, een laptop met “Processing” voor de beeldbewerking en voor de graffiti-generatie, een HD-beamer voor de projectie en een MakeyMakey voor de user-interface.

Over Kinect

De gebruikte Kinect is een sensor voor de Microsoft XBOX 360 game console waarmee spellen gespeeld worden met behulp van gesture (=lichaamsbeweging) herkenning. Een van de sensoren die de kinect hiervoor inzet is de 3D diepte sensor, een combinatie van een scanning IR-laser projector en een IR-camera. Hiermee kan de Kinect onder allerlei lichtomstandigheden een diepte-informatie-plaatje generen (640×480 pixels, 30fps, 11 bit resolutie), zie voorbeeldplaatje. Hoe witter de pixel, hoe korter de afstand tot de Kinect. De algoritmes voor het herkennen van gestures zijn niet geintegreerd in de Kinect, daarvoor dient eigen software ontwikkeld te worden, bijvoorbeeld mbv OpenNI.

 

Over OpenNI

OpenNI (opgericht in Nov 2010) had als doel om Natural user-Interfaces te certificeren en om de inter-operabiliteit te bevorderen. Daarvoor werd o.a. een open source library ontwikkeld en onderhouden waarmee relatief eenvoudig nieuwe toepassing ontwikkeld konden worden.

Een van de trekkers van deze industrie-organisatie was PrimeSense, de ontwikkelaar van de Microsoft Kinect 3D technologie. Na de acquisitie van PrimeSense door Apple werd de OpenNI website in April 2014 opgeheven. De overige industrie en enthousiaste OpenNI gebruikers hebben de source code en documentatie echter kort daarna gepubliceerd op een nieuwe website: structureIO. De OpenNI library wordt nog steeds onderhouden en is momenteel beschikbaar voor OSx, Windows, Linux en voor Android. Aan een iOS versie wordt momenteel hard gewerkt.

Voor het gebruik van OpenNI binnen Processing is een wrapper beschikbaar onder de naam Simple-OpenNI. Daarin worden helaas niet alle OpenNI functies ondersteund. Een deel van het motion-detection algoritme zal dus zelf nog in Processing moeten worden geïmplementeerd.

Over Processing

Processing is een open source programmeertaal en -omgeving voor het ontwikkelen van “audiovisuele en/of beeldende kunst”. Oorspronkelijk opgezet om beeldende kunstenaars bekend te maken met de mogelijkheden van IT en om IT-ers in aanraking te brengen met de schoonheid van beeldende kunst. Om die reden is de complexiteit bewust laag gehouden en is de programmeertaal rijkelijk voorzien van functies voor het genereren en manipuleren van dynamische 2D en 3D objecten. Processing draait op platformen zoals Windows, OSx en Linux.

In dit project is Processing gebruik om de videobeelden vanaf de Kinect in te lezen, om beweging te analyseren en detecteren (motion detection) en om beelden te genereren die dynamisch reageren op de motion detection informatie. De user-interface wordt gerealiseerd middels een MakeyMakey die keyboard commando’s verstuurd naar de processing software.

Motion detection

In mijn project heeft Motion Detection tot doel een handsfree alternatief te bieden voor de mouse(pad) functionaliteit van een computer. De Motion Detection functie levert dus X/Y-coördinaten op waarmee je het genereren van graffiti kunt gaan beïnvloeden. Vertrekpunt voor het Motion Detection algoritme is het diepte-informatie beeld zoals dat met de Kinect wordt ingelezen. Het ‘voorwerp’ dat zich het dichtst bij de Kinect sensor bevindt bepaalt de gezochte X/Y coördinaten. Dat punt wordt gevonden door in het beeld op zoek te gaan naar de pixel met de hoogste witwaarde, zie foto.

Deze benadering is een prima eerste stap, maar in de praktijk blijkt de diepte informatie teveel ruis te bevatten waardoor de X/Y coördinaat zich nogal springerig gedraagt. Filtering is dus gewenst.

Daarom passen we “Centre-of-Mass” filtering toe. Daarmee houden we behalve met de hoogste witwaarde-pixel ook rekening met pixels uit de directe omgeving en berekenen daarmee een soort van gewogen gemiddelde; per pixel vermenigvuldig je de grijswaarde met de pixelpositie, telt dat voor alle pixels bij elkaar op en deelt vervolgens dat totaal weer door de som van alle pixelwaardes, zie formule hiernaast. Hoe groter het gebied is dat je gebruikt, hoe stabieler de resulterende X/Y positie zal zijn (ten koste van extra rekentijd, maar da’s op een PC nauwelijks nog een issue).

De volgende stap is het vloeiend volgen van een beweging. Hoewel hier meerdere oplossingen denkbaar zijn blijkt een simpel ‘Moving Average Filter” al een prima resultaat op te leveren, eventueel met exponentiële coëfficiënten voor een snellere response.

Voor wie zelf wil experimenteren is de gebruikte Processing-code te downloaden. Naast het CM-filter en het MA-filter zijn nog wat andere spatial filters inbegrepen; een edge-detectie, noise, blur en een sharpening filter. Dit zijn nog wat (ongebruikte maar wel werkende) restanten uit eerdere experimenten, aangeboden “ter leering ende vermaeck”.

Graffiti generatie

Processing is een uitstekende ontwikkelomgeving om van scratch dynamische graphics te generen, de voorbeelden hieronder laten dat zien. Live zijn het uiteraard bewegende beelden waarbij de positie van de graphics de X/Y coordinaten van de muis of de Kinect met motion detection volgt.





Over Makey Makey

De MakeyMakey van Sparkfun is een Arduino Leonardo derivaat met een voorgeprogrammeerde functie. Het maakt gebruik van een ATMega32u4 microprocessor en ondersteunt daarmee het USB-HID protocol. Hierdoor het kan fungeren als een gewoon computer toetsenbord.

Maar in plaats van reguliere druktoetsen heeft de MakeyMakey hoog-ohmige ingangen waarmee touch-keys gemaakt kunnen worden. En daarmee kun je allerlei leuke Human Interfaces maken. Door iedere ingang bijvoorbeeld in een stuk fruit te prikken kun je je project laten besturen door een banaan aan te raken, of een sinaasappel, etc.

 

 

Over de beamer

De omstandigheden zijn niet ideaal voor gebruik van een beamer; het oppervlak waarop geprojecteerd moet worden is een stenen muur, het gewenste projectie-oppervlak is ca 3*6 meter (h*b), de afstand tussen de beamer en de muur is ca 10 meter en projectie gebeurt in de open lucht. Dat betekent dat er pas geprojecteerd kan worden na zonsondergang en dat de lichtopbrengst vanwege de grootte en de aard van het oppervlak mager zal zijn. Een beamer met een sterke lichtbron is dus gewenst, een hoge contrast ratio is in dit geval wat minder relevant. Voor dit project koos ik voor een beamer met een lichtopbrengst van 4500 lumen en een contrast ratio van 1:4000. Gelukkig zijn dergelijke projectoren op de Chinese markt nog redelijk betaalbaar. Eerste experimenten op locatie toonden aan dat de resulterende beeldkwaliteit zeer acceptabel is. We zien het eindresultaat dan ook met vertrouwen tegemoet :-).

Het eindresultaat