Étape 3: Code comportemental Overview
Si l’entrée de capteur de luminosité dépasse une certaine valeur, le MP3 commence alors à jouer
Si l’entrée de capteur de lumière passe au-dessous d’une certaine valeur, alors le MP3 est arrêté
Alors que le MP3 est jouée, l’entrée du capteur de lumière est transformée en un niveau de décibels pour le MP3, où plus de lumière est égal à son plus fort
En outre, le capteur de luminosité d’entrée des valeurs de contrôles la LED à l’intérieur de la boucle principale et la boucle de MP3
Comme les hausses d’entrée du capteur de lumière, les augmentations de LED rouges et la LED bleue diminue
Voici le code utilisé :
< code >
#include < SPI.h >
#include < SdFat.h >
#include < SdFatUtil.h >
#define vrai 1
#define faux 0
Carte de Sd2Card ;
SdVolume volume ;
SdFile racine ;
Piste de SdFile ;
Cartographie de MP3 Player bouclier de broche. Voir le schéma
#define MP3_XCS 6 //Control accès sélectionnez puce (pour l’accès aux registres de SPI/statut)
#define MP3_XDCS 7 //Data Chip Select / BSYNC Pin
#define MP3_DREQ 2 //Data demander Pin : joueur réclame davantage de données
#define MP3_RESET 8 //Reset est basse active
N’oubliez pas que vous devez modifier le Sd2PinMap.h de la bibliothèque de sdfatlib pour corriger le contrôle de la carte SD.
VS10xx SCI registres
#define SCI_MODE 0 x 00
#define SCI_STATUS 0 x 01
#define SCI_BASS 0 x 02
#define SCI_CLOCKF 0 x 03
#define SCI_DECODE_TIME 0 x 04
#define SCI_AUDATA 0 x 05
#define SCI_WRAM 0 x 06
#define SCI_WRAMADDR 0 x 07
#define SCI_HDAT0 0 x 08
#define SCI_HDAT1 0 x 09
#define SCI_AIADDR 0x0A
#define SCI_VOL 0x0B
#define SCI_AICTRL0 0x0C
#define SCI_AICTRL1 0x0D
#define SCI_AICTRL2 0x0E
#define SCI_AICTRL3 0x0F
C’est le nom du fichier sur la carte microSD que vous souhaitez jouer
Stick avec nomenclature 8.3 normal. Tout en minuscule fonctionne bien.
Remarque : vous devez nommer les pistes sur la carte SD avec 001, 002, 003, etc..
Par exemple, le code s’attend à jouer « track002.mp3 », pas de track2.mp3.
char trackName [] = ".mp3" ;
le numéro de piste int = 1 ;
int previousTrigger = 1 ; Cela signifie que nous avons déjà déclenchée sur 1
errorMsg Char [100] ; Il s’agit d’un tableau générique utilisé pour sprintf des messages d’erreur
inputPin int = A0 ;
inputValue int = 0 ;
int blueOutputValue = 0 ;
int blueOutputLED = 5 ;
int redOutputValue = 0 ;
int redOutputLED = 10 ;
int outputVolume = 0 ;
long lastCheck ; Cette option stocke la dernière milliseconde puisque nous avons eu un déclencheur
int is_playing ;
int time_since_play ;
int checkTriggers(void) {}
#define DEBOUNCE 100
int foundTrigger = 255 ;
Une fois qu’un déclencheur est activé, nous ne voulons pas déclencher à ce sujet perpétuellement
Mais après 3 secondes, réinitialiser le numéro précédent de la gâchette
Si ((previousTrigger! = 255) & & (millis() - lastCheck) > 3000) {}
lastCheck = millis() ;
previousTrigger = 255 ;
Serial.println ("reset de déclenchement de précédente") ;
}
Si (foundTrigger! = previousTrigger) {//We've a obtenu un nouveau déclencheur !
previousTrigger = foundTrigger ;
Serial.Print("T") ;
Serial.println (foundTrigger, DEC) ;
Return(foundTrigger) ;
}
d’autre
Return(255) ; Aucun déclencheur ne tiré faible (activé)
}
playMP3 - incluse fonction de SparkFun exemple
void playMP3 (char * fileName) {}
Si (! track.open (& racine, fileName, O_READ)) {//Open le fichier en mode lecture.
sprintf (errorMsg, « Impossible d’ouvrir %s », fileName) ;
Serial.println(errormsg) ;
retour ;
}
sprintf (errorMsg, « Piste de jeu %s », fileName) ;
Serial.println(errormsg) ;
uint8_t mp3DataBuffer [32] ; Tampon de 32 octets. VS1053 peuvent prendre 32 octets à un aller.
int need_data = TRUE ;
{while(1)}
{while(!digitalRead(MP3_DREQ))}
DREQ est faible alors que le tampon de réception est plein
Vous pouvez faire quelque chose ici, la mémoire tampon du MP3 est pleine et heureuse.
Peut-être régler le volume ou la tester pour voir combien nous pouvons retarder avant que nous entendons glitches audibles
Si l’EI MP3 est heureux, mais il faut lire les nouvelles données de la carte SD, est maintenant le moment idéal pour faire
if(need_data == true) {}
Si (! track.read (mp3DataBuffer, sizeof(mp3DataBuffer))) {//Try lecture 32 octets de nouveau de la chanson
Oh non ! Il n’y a aucune gauche de données à lire !
Temps de sortie
rupture ;
}
need_data = FALSE ;
}
Vérifiez pour voir si nous avons besoin de caution sur cette piste
if(checkTriggers()! = 255) {}
Serial.println ("sortie MP3!") ;
Track.Close() ; Fermer cette piste !
previousTrigger = 255 ; Tour de la prochaine vérification en pensant, nous n’avons pas vu un déclencheur précédent
retour ;
}
}
if(need_data == true) {//This est ici dans le cas où nous n’avons pas eu le temps libre pour charger les nouvelles données
Si (! track.read (mp3DataBuffer, sizeof(mp3DataBuffer))) {//Go sur carte SD et essayez de lire 32 octets de nouveau de la chanson
Oh non ! Il n’y a aucune gauche de données à lire !
Temps de sortie
rupture ;
}
need_data = FALSE ;
}
Une fois DREQ relâchée (élevé) on nourrit maintenant 32 octets de données à le VS1053 de notre SD lire tampon
digitalWrite (MP3_XDCS, basse) ; Sélectionnez les données
pour (int y = 0; y < sizeof(mp3DataBuffer); y ++)
SPI.transfer(mp3DataBuffer[y]) ; Envoyer les octets SPI
digitalWrite (MP3_XDCS, élevé) ; Décochez la case données
need_data = TRUE ; Nous avons simplement déversés 32 octets dans VS1053, donc notre SD lire la mémoire tampon est vide. Définissez l’indicateur alors que nous allons obtenir plus de données
inputValue = analogRead(inputPin) ;
outputVolume = carte (inputValue, 0, 1023, 60, -20) ; <---c’est où vous rendre plus fort/plus doux selon combien lumière d’entrée votre marionnette obtient
redOutputValue = carte (inputValue, 0, 1023, 0, 255) ;
blueOutputValue = carte (inputValue, 0, 1023, 255, 0) ;
Mp3SetVolume (outputVolume, outputVolume) ;
analogWrite (redOutputLED, redOutputValue) ;
analogWrite (blueOutputLED, blueOutputValue) ;
}
while(!digitalRead(MP3_DREQ)) ; Attendez DREQ aller haut transfert indiquant est terminée
digitalWrite (MP3_XDCS, élevé) ; Décochez la case données
Track.Close() ; Clore cette piste
sprintf (errorMsg, « Track %s fait! », fileName) ;
Serial.println(errormsg) ;
}
void setup()
{
pinMode (entrée, MP3_DREQ) ;
pinMode (MP3_XCS, sortie) ;
pinMode (MP3_XDCS, sortie) ;
pinMode (MP3_RESET, sortie) ;
digitalWrite (MP3_XCS, élevé) ; Désactivez l’option contrôle
digitalWrite (MP3_XDCS, élevé) ; Décochez la case données
digitalWrite (MP3_RESET, basse) ; Mettez VS1053 dans réinitialisation du matériel
pinMode (inputPin, entrée) ; déclarer le LDR comme intrant
pinMode (redOutputLED, sortie) ; déclarer la ledPin comme une sortie
pinMode (blueOutputLED, sortie) ;
Serial.Begin(57600) ; Utiliser la série pour le débogage
Serial.println ("MP3 Player exemple à l’aide de la commande") ;
Interface de configuration SD carte
pinMode (sortie 10,) ; Broche 10 doit être défini comme une sortie pour la communication de la SD au travail.
Si (! card.init(SPI_FULL_SPEED)) Serial.println ("erreur : carte init") ; Initialiser la carte SD et configurer les broches e/s.
Si (! volume.init (& carte)) Serial.println ("erreur : Volume ini ») ; Initialiser un volume sur la carte SD.
Si (! root.openRoot (et volume)) Serial.println ("erreur : racine d’ouverture") ; Ouvrez le répertoire racine du volume.
Nous n’avons pas besoin de configurer SPI pour VS1053, parce que cela a déjà été fait par le SDfatlib
De page 12 du datasheet, max SCI lectures sont CLKI/7. D’entrée de l’horloge est 12.288 MHz.
Multiplicateur d’horloge interne est 1,0 x après le pouvoir en place.
Par conséquent, vitesse max de SPI est 1,75 MHz. Nous allons utiliser 1MHz pour être sûr.
SPI.setClockDivider(SPI_CLOCK_DIV16) ; Réglez la vitesse du bus SPI sur 1MHz (16MHz / 16 = 1 MHz)
SPI.transfer(0xFF) ; Lancer un octet factice sur le bus
Initialiser la puce VS1053
Delay(10) ;
digitalWrite (MP3_RESET, élevé) ; Mettre en place VS1053
Mp3SetVolume (20, 20) ; Définir le volume initial (20 = - 10 dB) LOUD
Mp3SetVolume (40, 40) ; Définir le volume initial (20 = - 10 dB) Manageable
Mp3SetVolume (80, 80) ; Définir le volume initial (20 = - 10 dB) plus calme
Maintenant que nous avons le VS1053 vers le haut et le déroulement, augmenter le multiplicateur d’horloge interne et jusqu'à notre taux de SPI
Mp3WriteRegister (SCI_CLOCKF, 0 x 60, 0 x 00) ; Ensemble multiplicateur à x 3,0
De page 12 du datasheet, max SCI lectures sont CLKI/7. D’entrée de l’horloge est 12.288 MHz.
Multiplicateur d’horloge interne est maintenant 3 x.
Vitesse max de SPI est donc de que 5 MHz. 4MHz sera en sécurité.
SPI.setClockDivider(SPI_CLOCK_DIV4) ; Réglez la vitesse du bus SPI sur 4MHz (16MHz / 4 = 4 MHz)
Programme d’installation de IC mp3 complet
Serial.println ("Done with setup") ;
}
void loop()
{
inputValue = analogRead(inputPin) ;
LED les yeux bits (besoins peaufinage des valeurs lorsqu’il est placé en marionnettes final)
redOutputValue = carte (inputValue, 0, 1023, 0, 255) ;
blueOutputValue = carte (inputValue, 0, 1023, 255, 0) ;
/ * Si (inputValue > 50)
{
blueOutputValue = 0 ;
}
Si (inputValue < 20)
{
redOutputValue = 0 ;
} */
Si (inputValue > 600) //if bouche est assez ouverte
{
Si (is_playing == 0)
{
playMP3(trackName) ;
is_playing = 1 ;
}
}
Si (inputValue < 500) / / si la bouche est assez fermé
{
Track.Close() ;
is_playing = 0 ;
}
Serial.Print(inputValue) ; pour voir si votre capteur de luminosité fonctionne correctement
Serial.Print("\n") ;
analogWrite (redOutputLED, redOutputValue) ;
analogWrite (blueOutputLED, blueOutputValue) ;
}
Écrire dans le registre des VS10xx - de SparkFun exemple
SCI : Transferts de données sont toujours 16 bits. Quand arrive une nouvelle opération de SCI
DREQ va faible. Il faut ensuite attendre DREQ à repartir élevé.
XCS doit être faible pendant toute la durée de fonctionnement.
void Mp3WriteRegister (unsigned char addressbyte, hightbyte unsigned char, unsigned char octet) {}
while(!digitalRead(MP3_DREQ)) ; Attendez DREQ à aller haut indiquant QU'IC est disponible
digitalWrite (MP3_XCS, basse) ; Sélectionnez contrôle
SCI se compose d’instruction byte, octet de l’adresse et mot de 16 bits de données.
SPI.transfer(0x02) ; Écrire des instructions
SPI.transfer(addressbyte) ;
SPI.transfer(highbyte) ;
SPI.transfer(lowbyte) ;
while(!digitalRead(MP3_DREQ)) ; Attendez DREQ aller haut commande indiquant est terminée
digitalWrite (MP3_XCS, élevé) ; Désactivez l’option contrôle
}
Définissez VS10xx Registre de Volume - volume régler la fonction d’exemple de SparkFun
void Mp3SetVolume (leftchannel unsigned char, unsigned char rightchannel) {}
Mp3WriteRegister (SCI_VOL, leftchannel, rightchannel) ;
}
< /code >