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.