Stap 3: Gedrags Code Overview
Als de lichtsensor input boven een bepaalde waarde gaat, dan is de MP3 begint te spelen
Als de lichtsensor input beneden een bepaalde waarde gaat, is wordt het MP3 gestopt
Terwijl de MP3 wordt afgespeeld, wordt de lichtsensor input omgezet in een decibel niveau voor de MP3, waar meer gelijken luider geluid licht
Bovendien, de lichtsensor invoerwaarden besturingselementen de LED worden binnen de hoofdlus en de MP3-lus
Als de input verhogingen van de lichtsensor, de rode LED-verhogingen en de blauwe LED vermindert
Hier is de code die wordt gebruikt:
< code >
#include < SPI.h >
#include < SdFat.h >
#include < SdFatUtil.h >
#define TRUE 1
#define valse 0
Kaart van de Sd2Card;
SdVolume volume;
SdFile wortel;
SdFile spoor;
De toewijzing van de pin van de MP3 speler Shield. Zie het schema
#define MP3_XCS 6 //Control Chip Selecteer Pin (voor toegang tot de registers van de SPI controle/Status)
#define MP3_XDCS 7 //Data Chip Select / BSYNC Pin
#define MP3_DREQ 2 //Data verzoek Pin: speler vraagt om meer gegevens
#define MP3_RESET 8 //Reset is actief laag
Vergeet niet u voor het bewerken van de Sd2PinMap.h van de sdfatlib bibliotheek om te corrigeren van de controle de SD-kaart.
VS10xx SCI Registers
#define SCI_MODE 0x00
#define SCI_STATUS 0x01
#define SCI_BASS 0x02
#define SCI_CLOCKF 0x03
#define SCI_DECODE_TIME 0x04
#define SCI_AUDATA 0x05
#define SCI_WRAM 0x06
#define SCI_WRAMADDR 0x07
#define SCI_HDAT0 0x08
#define SCI_HDAT1 0x09
#define SCI_AIADDR 0x0A
#define SCI_VOL 0x0B
#define SCI_AICTRL0 0x0C
#define SCI_AICTRL1 0x0D
#define SCI_AICTRL2 0x0E
#define SCI_AICTRL3 0x0F
Dit is de naam van het bestand op de microSD-kaart die u graag wilt spelen
Stick met normale 8.3 nomeclature. Alle kleine letters werkt goed.
Opmerking: moet u de naam van de tracks op de SD-kaart met 001, 002, 003, enz.
Bijvoorbeeld verwacht de code om te spelen 'track002.mp3', niet track2.mp3.
char Tracknaam [] = "sound.mp3";
int titelnummer = 1;
int previousTrigger = 1; Dit geeft aan dat we al hebt geactiveerd op 1
char errorMsg [100]; Dit is een algemene array gebruikt voor sprintf van foutberichten
int inputPin = A0;
int inputValue = 0;
int blueOutputValue = 0;
int blueOutputLED = 5;
int redOutputValue = 0;
int redOutputLED = 10;
int outputVolume = 0;
lange lastCheck; Deze slaat de laatste milliseconde sinds wij een trekker
int is_playing;
int time_since_play;
int checkTriggers(void) {}
#define ONTDENDERING 100
int foundTrigger = 255;
Nadat u een trigger hebt geactiveerd, willen we niet te activeren op het voortdurend
Maar na 3 seconden, reset het nummer van de vorige trigger
Als ((previousTrigger! = 255) & & (millis() - lastCheck) > 3000) {}
lastCheck = millis();
previousTrigger = 255;
Serial.println ("vorige trigger reset");
}
Als (foundTrigger! = previousTrigger) {//We've kreeg een nieuwe trigger!
previousTrigger = foundTrigger;
Serial.Print("T");
Serial.println (foundTrigger, DEC);
Return(foundTrigger);
}
anders
Return(255); Geen triggers trok lage (geactiveerd)
}
playMP3 - opgenomen functie van SparkFun voorbeeld
VOID playMP3 (char * fileName) {}
Als (! track.open (& root, fileName, O_READ)) {//Open het bestand in Leesmodus.
sprintf (errorMsg, "Failed to open %s", fileName);
Serial.println(errorMsg);
terugkeer;
}
sprintf (errorMsg, "Playing track %s", fileName);
Serial.println(errorMsg);
uint8_t mp3DataBuffer [32]; Buffer 32 bytes. VS1053 kun je 32 bytes in een keer.
int need_data = TRUE;
while(1) {}
while(!digitalRead(MP3_DREQ)) {}
DREQ is laag, terwijl de ontvangstbuffer vol is
Kunt u hier iets anders doen, de buffer van de MP3 is volledige en gelukkig.
Misschien het volume instellen of testen om te zien hoeveel tijd we voordat we hoorbaar glitches horen kunt uitstellen
Als het MP3-IC blij is, maar we moeten nieuwe om gegevens te lezen van de SD, nu is een geweldige tijd om dit te doen
if(need_data == True) {}
Als (! track.read (mp3DataBuffer, sizeof(mp3DataBuffer))) {//Try lezen van 32 nieuwe bytes van het lied
Oh neen! Er is geen gegevens links om te lezen!
Tijd om af te sluiten
breken;
}
need_data = FALSE;
}
Controleren om te zien als we borgtocht op dit circuit moeten
if(checkTriggers()! = 255) {}
Serial.println ("afsluiten MP3!");
track.Close(); Sluit deze track!
previousTrigger = 255; De volgende controle truc in denken hebben we niet gezien een eerdere trigger
terugkeer;
}
}
if(need_data == True) {//This is hier in het geval dat hadden we nog niet alle vrije tijd om nieuwe gegevens te laden
Als (! track.read (mp3DataBuffer, sizeof(mp3DataBuffer))) {//Go uit naar SD-kaart en probeer het lezen van 32 nieuwe bytes van het lied
Oh neen! Er is geen gegevens links om te lezen!
Tijd om af te sluiten
breken;
}
need_data = FALSE;
}
Zodra DREQ wordt vrijgegeven (hoog) feed wij nu 32 bytes aan gegevens naar de VS1053 van onze SD Lees buffer
digitalWrite (MP3_XDCS, laag); Gegevens selecteren
voor (int y = 0; y < sizeof(mp3DataBuffer); y ++)
SPI.transfer(mp3DataBuffer[y]); Stuur byte van de SPI
digitalWrite (MP3_XDCS, hoge); Hef de selectie van gegevens
need_data = TRUE; We hebben net 32 bytes gedumpt in VS1053, zodat onze SD Lees buffer leeg is. Vlag instellen, dus we gaan krijgen meer gegevens
inputValue = analogRead(inputPin);
outputVolume = kaart (inputValue, 0, 1023, 60, -20); <---dit is waar je er harder/zachter afhankelijk van hoeveel licht uw marionet input krijgt
redOutputValue = kaart (inputValue, 0, 1023, 0, 255);
blueOutputValue = kaart (inputValue, 0, 1023, 255, 0);
Mp3SetVolume (outputVolume, outputVolume);
analogWrite (redOutputLED, redOutputValue);
analogWrite (blueOutputLED, blueOutputValue);
}
while(!digitalRead(MP3_DREQ)); Wachten op DREQ naartoe hoge aangeeft overdracht is voltooid
digitalWrite (MP3_XDCS, hoge); Hef de selectie van gegevens
track.Close(); Sluiten deze track
sprintf (errorMsg, "Track %s done!", fileName);
Serial.println(errorMsg);
}
VOID Setup
{
pinMode (MP3_DREQ, INPUT);
pinMode (MP3_XCS, uitvoer);
pinMode (MP3_XDCS, uitvoer);
pinMode (MP3_RESET, uitvoer);
digitalWrite (MP3_XCS, hoge); Hef de selectie van controle
digitalWrite (MP3_XDCS, hoge); Hef de selectie van gegevens
digitalWrite (MP3_RESET, laag); VS1053 gestoken hardware reset
pinMode (inputPin, INPUT); de LDR declareren als een INPUT
pinMode (redOutputLED, OUTPUT); de ledPin verklaren als uitgang
pinMode (blueOutputLED, OUTPUT);
Serial.begin(57600); Seriële gebruiken voor foutopsporing
Serial.println ("MP3 Player voorbeeld met behulp van de controle");
Setup SD-kaartinterface
pinMode (10, OUTPUT); Pin 10 moet worden ingesteld als een uitgang voor de mededeling van de SD aan werken.
Als (! card.init(SPI_FULL_SPEED)) Serial.println ("fout: kaart init"); De SD-kaart initialiseren en configureren van de I/O pinnen.
Als (! volume.init (& kaart)) Serial.println ("fout: Volume ini"); Een volume op de SD-kaart initialiseren.
Als (! root.openRoot (& volume)) Serial.println ("fout: Opening root"); Open de hoofdmap van het volume.
Wij hebben geen behoefte aan opstelling van SPI voor VS1053, omdat dit al gebeurd door de SDfatlib
Pagina 12 van gegevensblad zijn max SCI leest CLKI/7. Input klok is 12.288 MHz.
Interne klok multiplier is 1.0 x na macht.
Daarom is de max snelheid van de SPI 1,75 MHz. Wij gebruiken 1MHz veilig te zijn.
SPI.setClockDivider(SPI_CLOCK_DIV16); De snelheid van de bus van de SPI ingesteld op 1MHz (16MHz / 16 = 1 MHz)
SPI.transfer(0xFF); Een dummy byte gooien in de bus
Initialiseren VS1053 chip
delay(10);
digitalWrite (MP3_RESET, hoge); Opvoeden van VS1053
Mp3SetVolume (20, 20); Stel het volume van de eerste (20 = - 10dB) LOUD
Mp3SetVolume (40, 40); Stel het volume van de eerste (20 = - 10dB) beheersbaar
Mp3SetVolume (80, 80); Stel het volume van de eerste (20 = - 10dB) rustiger
Nu dat we de VS1053 up and running hebben, verhogen van de interne klok multiplier en onze SPI-tarief omhoog
Mp3WriteRegister (SCI_CLOCKF, 0x60, 0x00); Set vermenigvuldiger naar 3.0 x
Pagina 12 van gegevensblad zijn max SCI leest CLKI/7. Input klok is 12.288 MHz.
Interne klok multiplier is nu 3 x.
Max snelheid van de SPI daarom dat 5 MHz. 4MHz zullen veilig zijn.
SPI.setClockDivider(SPI_CLOCK_DIV4); De snelheid van de bus van de SPI ingesteld op 4MHz (16MHz / 4 = 4 MHz)
MP3 IC setup voltooid
Serial.println ("gedaan met setup");
}
void loop
{
inputValue = analogRead(inputPin);
LED ogen bits (behoeften tweaking van waarden wanneer geplaatst in definitieve marionet)
redOutputValue = kaart (inputValue, 0, 1023, 0, 255);
blueOutputValue = kaart (inputValue, 0, 1023, 255, 0);
/ * Als (inputValue > 50)
{
blueOutputValue = 0;
}
Als (inputValue < 20)
{
redOutputValue = 0;
} */
Als (inputValue > 600) //if mond open genoeg is
{
Als (is_playing == 0)
{
playMP3(trackName);
is_playing = 1;
}
}
Als (inputValue < 500) / / als genoeg is worden gesloten door de mond
{
track.Close();
is_playing = 0;
}
Serial.Print(inputValue); om te zien als je licht sensor goed werkt
Serial.Print("\n");
analogWrite (redOutputLED, redOutputValue);
analogWrite (blueOutputLED, blueOutputValue);
}
Schrijven naar VS10xx registreren - van SparkFun voorbeeld
SCI: Overdracht van gegevens zijn altijd 16 bit. Wanneer een nieuwe SCI-transactie komt in
DREQ gaat laag. Dan moeten we wachten voor DREQ hoge om weer te gaan.
XCS moet laag zijn voor de volledige duur van de operatie.
VOID Mp3WriteRegister (unsigned char addressbyte, unsigned char highbyte, unsigned char lowbyte) {}
while(!digitalRead(MP3_DREQ)); Wachten op DREQ te gaan hoog die aangeeft dat IC is beschikbaar
digitalWrite (MP3_XCS, laag); Besturingselement SELECT
SCI bestaat uit de instructie byte byte van het adres en 16-bits gegevenswoord.
SPI.transfer(0x02); Instructie schrijven
SPI.transfer(addressbyte);
SPI.transfer(highbyte);
SPI.transfer(lowbyte);
while(!digitalRead(MP3_DREQ)); Wachten op DREQ naartoe hoge geeft opdracht is voltooid
digitalWrite (MP3_XCS, hoge); Hef de selectie van controle
}
VS10xx Volume Register - volume instellen functie instellen van SparkFun voorbeeld
VOID Mp3SetVolume (unsigned char leftchannel, unsigned char rightchannel) {}
Mp3WriteRegister (SCI_VOL, leftchannel, rightchannel);
}
< / code >