Stap 3: De code uploaden naar de Arduino
U moet een bibliotheek genaamd WaveHC voor de Wave Shield die u tegenkomen zult wanneer u volgen naar de opvoeden Ladyada.
Het eerste ding is een seriële verbinding met de elektrische Imp instellen zodat elke ontvangen signalen kunnen worden gebruikt.
De code behandelt dan een signaal ontvangen op één van de pinnen van de Imp, alsof het een knop wordt ingedrukt. Dit veroorzaakt op zijn beurt een geluidsbestand moet worden afgespeeld vanaf de SD-kaart via de Wave Shield-bibliotheek.
Kopieer de onderstaande code en plak deze in de Arduino IDE en deze uploaden naar de Raad van bestuur:
/*
Deze code stelt een seriële verbinding met een elektrische Imp en triggers geluidsbestanden van een SD-kaart worden afgespeeld wanneer een signaal wordt ontvangen van het GMB.
Het is eigenlijk een mashup van de wave shield knoppen voorbeeld en het voorbeeld van de elementaire arduino elektrische imp
Pinnen:
8,9 voor GMB
Pin 13, 12 en 11 worden gebruikt om te praten met de SD-kaart en kunnen niet worden gewijzigd.
De rest van de pinnen, zijn echter meer flexibel.
2 -> LCS
3 -> CLK
4 -> DI
5 -> LAT
10 -> CCS
0 = onwayhome.wav
6 = friday.wav
7 = tea.wav
*/
Moet u de WaveHC bibliotheek
#include < FatReader.h >
#include < SdReader.h >
#include < avr/pgmspace.h >
#include "WaveUtil.h"
#include "WaveHC.h"
#include < SoftwareSerial.h >
een seriële conncetion ingesteld voor het GMB
SoftwareSerial impSerial (8, 9); RX op 8, TX op 9
Kaart van de SdReader; Dit object bevat de gegevens voor de kaart
FatVolume vol; Dit houdt de informatie voor de partitie op de kaart
FatReader wortel; Dit bevat de gegevens voor het bestandssysteem op de kaart
F FatReader; Dit bevat de gegevens voor het bestand we aan het spelen bent
WaveHC Golf; Dit is de enige Golf (audio) object, omdat we zullen slechts één filter tegelijk spelen
#define DEBOUNCE 5 / / button debouncer
Hier is waar we de "knoppen" die we zullen gebruiken - in dit geval zijn ze aangesloten op pinnen op de elektrische Imp definiëren
byte knoppen [] = {6,0,7};
Deze handige macro laat ons bepalen hoe groot de array van boven is, door de grootte controleren
#define NUMBUTTONS sizeof(buttons)
Wij zullen volgen als een knop is gewoon ingedrukt, gewoon vrijgegeven, of 'ingedrukt' (de huidige staat)
vluchtige byte ingedrukt [NUMBUTTONS], justpressed [NUMBUTTONS], justreleased [NUMBUTTONS];
deze handige functie geeft het aantal bytes in het RAM, momenteel gratis groot voor debugging!
int freeRam(void)
{
extern int __bss_end;
extern int * __brkval;
int free_memory;
Als (__brkval (int) == 0) {}
FREE_MEMORY = ((int) & free_memory)-((int) & __bss_end);
}
else {}
FREE_MEMORY = ((int) & free_memory)-((int) __brkval);
}
Return free_memory;
}
VOID sdErrorCheck(void)
{
Als (! card.errorCode()) keren;
putstring ("\n\rSD I/O fout:");
Serial.Print(Card.ErrorCode(), HEX);
putstring (",");
Serial.println(Card.errorData(), HEX);
while(1);
}
VOID Setup {}
byte i;
seriële poort instellen
Serial.begin(19200);
putstring_nl ("WaveHC met");
Serial.Print (NUMBUTTONS, DEC);
putstring_nl("buttons");
putstring ("vrije RAM:"); Dit kan helpen met het opsporen van fouten, uit RAM lopend is slecht
Serial.println(freeRam()); Als dit onder 150 bytes kan het problemen magie!
De pennen voor de DAC-besturingselement instellen Deze pennen zijn gedefinieerd in de bibliotheek
pinMode (2, OUTPUT);
pinMode (3, OUTPUT);
pinMode (4, OUTPUT);
pinMode (5, OUTPUT);
Stel de gegevenssnelheid voor de SoftwareSerial-poort
impSerial.begin(19200);
Maak input & pull-up weerstanden op schakelaar pinnen inschakelen
voor (ik = 0; ik < NUMBUTTONS; i ++) {}
pinMode (knoppen [i], INPUT);
digitalWrite (knoppen [i], hoge);
}
Als (! card.init(true)) {//play met 4 MHz spi als 8MHz niet voor u werkt
Als (! card.init()) {//play met 8 MHz spi (standaard sneller!)
putstring_nl ("Card init. mislukt!"); Er ging iets mis, laat uitprinten waarom
sdErrorCheck();
while(1); vervolgens 'stoppen' - niets doen!
}
inschakelen optimaliseren lees - sommige kaarten kunnen timeout. Uitschakelen als u problemen ondervindt
card.partialBlockRead(true);
Nu gaan we voor een FAT-partitie!
uint8_t deel;
voor (deel = 0; deel < 5; deel ++) {/ / Wij hebben maximaal 5 "slots" om in te kijken
Als (vol.init (kaart, deel))
breken; We vonden een, laat borgtocht
}
Als (deel == 5) {/ / als we uiteindelijk niet het vinden van een :(
putstring_nl ("geen geldige FAT-partitie!");
sdErrorCheck(); Er ging iets mis, laat uitprinten waarom
while(1); vervolgens 'stoppen' - niets doen!
}
Laat de gebruiker te vertellen over wat we gevonden
putstring ("Using partitie");
Serial.Print (deel, DEC);
putstring (", type is vet");
Serial.println(vol.fatType(),DEC); FAT16 of FAT32?
Probeert te openen van de root directory
Als (! root.openRoot(vol)) {}
putstring_nl ("kan niet openen root dir!"); Er ging iets mis,
while(1); vervolgens 'stoppen' - niets doen!
}
Oef! Daar kregen we voorbij de harde delen.
putstring_nl("Ready!");
TCCR2A = 0;
TCCR2B = 1 << CS22 | 1 << CS21 | 1 << CS20;
Timer2 Overflow Interrupt Enable
TIMSK2 | = 1 << TOIE2;
}
Signal(TIMER2_OVF_vect) {}
check_switches();
}
VOID check_switches()
{
statische byte previousstate [NUMBUTTONS];
statische byte currentStatus [NUMBUTTONS];
byte index;
voor (index = 0; index < NUMBUTTONS; index ++) {}
currentStatus [index] = digitalRead(buttons[index]); Lees de knop
/*
Serial.Print (index, DEC);
Serial.Print (": cstate =");
Serial.Print (currentStatus [index], DEC);
Serial.Print (", pstate =");
Serial.Print (previousstate [index], DEC);
Serial.Print (", druk op =");
*/
Als (currentStatus [index] == previousstate[index]) {}
Als ((gedrukt [index] == laag) & & (currentStatus [index] == LOW)) {}
gewoon ingedrukt
justpressed [index] = 1;
}
anders als ((gedrukt [index] == HIGH) & & (currentStatus [index] == HIGH)) {}
net vrijgegeven
justreleased [index] = 1;
}
ingedrukt [index] =! currentStatus [index]; Vergeet niet, digitaal hoge middel niet ingedrukt
}
Serial.println (gedrukt [index], DEC);
previousstate [index] = currentStatus [index]; houden van een lopende telling van de knoppen
}
}
void loop {}
Gegevens verzenden vanuit de software seriële
Als (impSerial.available())
Serial.write(impSerial.Read()); de seriële hardware
Gegevens verzenden vanuit de hardware serial
Als (Serial.available())
impSerial.write(Serial.read()); de seriële software
byte i;
Als (justpressed[0]) {}
justpressed [0] = 0;
Serial.println ("pin 6 geactiveerd");
playcomplete("Home.wav");
}
Als (justpressed[1]) {}
justpressed [1] = 0;
Serial.println ("pin 0 geactiveerd");
playcomplete("Friday.wav");
}
Als (justpressed[2]) {}
justpressed [2] = 0;
Serial.println ("pin 7 geactiveerd");
playcomplete("Tea.wav");
}
/*
Als (justpressed[3]) {}
justpressed [3] = 0;
playcomplete ("uw Song.wav");
}
Als (justpressed[4]) {}
justpressed [4] = 0;
playcomplete ("uw Song.wav");
}
Als (justpressed[5]) {}
justpressed [5] = 0;
playcomplete ("uw Song.wav");
}
*/
}
Speelt een volledige bestand van begin tot eind met geen pauze.
ongeldig playcomplete(char *name) {}
Bel onze helper vinden en spelen deze naam
playfile(name);
terwijl (wave.isplaying) {}
niets te doen tijdens het spelen van haar
}
nu zijn gedaan afspelen
}
ongeldig playfile(char *name) {}
Zie als de Golf-object is momenteel bezig met iets
Als (wave.isplaying) {/ / al het spelen van iets, dus stoppen met het!
Wave.stop(); Stop ermee
}
kijken in de root directory en open het bestand
Als (! f.open (root, naam)) {}
putstring kon niet ("open bestand"); Serial.Print(name); terugkeer;
}
OK lees het bestand en zet hem in een golf-object
Als (! wave.create(f)) {}
putstring_nl ("niet een geldig WAV"); terugkeer;
}
OK tijd om te spelen! Start het afspelen
Wave.Play();
}