Paso 3: Código conductual Resumen
Si la entrada de sensor de luz supera un determinado valor, entonces el MP3 empieza a jugar
Si la entrada de sensor de luz cae por debajo de cierto valor, entonces se detiene el MP3
Mientras se reproduce el MP3, la entrada de sensor de luz se convierte en un nivel de decibelios para el MP3, donde más luz es igual a sonido más alto
Además, el sensor de luz de entrada valores de controles el LED dentro del bucle principal y el bucle de MP3
Como el aumento de entrada de sensor de luz, los aumentos de LED rojo y el LED azul disminuye
Aquí está el código:
código de < >
#include < SPI.h >
#include < SdFat.h >
#include < SdFatUtil.h >
#define cierto 1
#define falso 0
Tarjeta de Sd2Card;
Volumen de SdVolume;
SdFile raíz;
Pista de SdFile;
Asignación de pin de escudo de reproductor de MP3. Ver el esquema
#define MP3_XCS 6 //Control Chip seleccione Pin (para acceder a registros de Control de SPI, estado)
#define MP3_XDCS 7 //Data Chip Select / Pin BSYNC
#define MP3_DREQ 2 //Data solicitar Pin: jugador pide más datos
#define MP3_RESET 8 //Reset es el mínimo de activo
Recuerda que tienes que editar los Sd2PinMap.h de la biblioteca sdfatlib para corregir el control de la tarjeta SD.
VS10xx SCI registros
#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 0x07
#define SCI_HDAT0 0x08
#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
Este es el nombre del archivo en la tarjeta microSD que gustaría jugar
Stick con ceñiros 8,3 normal. Todo minúsculas funciona bien.
Nota: usted debe nombrar a las pistas en la tarjeta SD con 001, 002, 003, etc..
Por ejemplo, el código está esperando para jugar 'track002.mp3', no track2.mp3.
Char [] trackName = "sound.mp3";
número de pista int = 1;
int previousTrigger = 1; Esto indica que ya nos hemos accionado en 1
errorMsg Char [100]; Se trata de una matriz genérica utilizada para sprintf de mensajes de error
int inputPin = A0;
int inputValue = 0;
int blueOutputValue = 0;
int blueOutputLED = 5;
int redOutputValue = 0;
int redOutputLED = 10;
outputVolume int = 0;
lastCheck largo; Esto almacena el último milisegundo desde que tuvimos un gatillo
int is_playing;
int time_since_play;
int checkTriggers(void) {}
#define DEBOUNCE 100
int foundTrigger = 255;
Una vez que se activa un desencadenador, no queremos provocar en él perpetuamente
Pero después de 3 segundos, restablecer el número anterior de gatillo
Si ((previousTrigger! = 255) & & (millis() - lastCheck) > 3000) {}
lastCheck = millis();
previousTrigger = 255;
Serial.println ("anterior disparo reset");
}
Si (foundTrigger! = previousTrigger) {//We've tiene un nuevo desencadenador!
previousTrigger = foundTrigger;
Serial.Print("T");
Serial.println (foundTrigger, DEC);
Return(foundTrigger);
}
otra cosa
Return(255); No desencadenantes tiraron bajo (activado)
}
playMP3 - incluye función de ejemplo de SparkFun
void playMP3 (char * nombre) {}
Si (! track.open (y raíz, nombre de archivo, O_READ)) {//Open el archivo en modo lectura.
sprintf (errorMsg, "Error al abrir %s", nombre);
Serial.println(errorMsg);
retorno;
}
sprintf (errorMsg, "Pista de juego %s", nombre);
Serial.println(errorMsg);
mp3DataBuffer de uint8_t [32]; Búfer de 32 bytes. VS1053 puede tomar 32 bytes en un ir.
int need_data = TRUE;
{while(1)}
{while(!digitalRead(MP3_DREQ))}
DREQ es baja mientras que el búfer de recepción está lleno
Usted puede hacer algo más aquí, el buffer del MP3 es plena y feliz.
Puede ajustar el volumen o prueba a ver cuánto nos podemos retrasar antes de que se escuchan interferencias audibles
Si el IC de MP3 es feliz, pero necesitamos leer nuevos datos de la SD, ahora es un buen momento para hacerlo
if(need_data == true) {}
Si (! track.read (mp3DataBuffer, sizeof(mp3DataBuffer))) {//Try lectura de 32 bytes nuevo de la canción
¡ Oh no! No queda ningún datos para leer!
Tiempo para salir
rotura;
}
need_data = FALSE;
}
Compruebe para ver si necesitamos libertad bajo fianza en esta pista
if(checkTriggers()! = 255) {}
Serial.println ("salir MP3!");
Track.Close(); Cerrar esta pista!
previousTrigger = 255; Truco la próxima comprobación en pensamiento no hemos visto un desencadenador anterior
retorno;
}
}
if(need_data == true) {//This está aquí en caso de que no hemos tenido ningún tiempo libre para cargar nuevos datos
Si (! track.read (mp3DataBuffer, sizeof(mp3DataBuffer))) {//Go hacia fuera a la tarjeta SD y tratar de lectura de 32 bytes nuevo de la canción
¡ Oh no! No queda ningún datos para leer!
Tiempo para salir
rotura;
}
need_data = FALSE;
}
Una vez liberada (alto) DREQ ahora alimentamos a 32 bytes de datos a la VS1053 de nuestra SD leer buffer
digitalWrite (MP3_XDCS, bajo); Seleccionar datos
para (int y = 0; y < sizeof(mp3DataBuffer); y ++)
SPI.transfer(mp3DataBuffer[y]); Enviar byte SPI
digitalWrite (MP3_XDCS, alto); Anule la selección de datos
need_data = TRUE; Sólo hemos vertido 32 bytes en VS1053 nuestro SD leer el buffer está vacío. Establecido así que vamos a obtener datos más
inputValue = analogRead(inputPin);
outputVolume = mapa (inputValue, 0, 1023, 60, -20); <---es donde hace más fuerte/más suave dependiendo de cuánto luz entrada tu títere obtiene
redOutputValue = mapa (inputValue, 0, 1023, 0, 255);
blueOutputValue = mapa (inputValue, 0, 1023, 0, 255);
Mp3SetVolume (outputVolume, outputVolume);
analogWrite (redOutputLED, redOutputValue);
analogWrite (blueOutputLED, blueOutputValue);
}
while(!digitalRead(MP3_DREQ)); Espere DREQ ir indicando altos de la transferencia es completa
digitalWrite (MP3_XDCS, alto); Anule la selección de datos
Track.Close(); Cerrar esta pista
sprintf (errorMsg, "Pista %s hecho!", fileName);
Serial.println(errorMsg);
}
void setup()
{
pinMode (MP3_DREQ, entrada);
pinMode (MP3_XCS, salida);
pinMode (MP3_XDCS, salida);
pinMode (MP3_RESET, salida);
digitalWrite (MP3_XCS, alto); Anule la selección de Control
digitalWrite (MP3_XDCS, alto); Anule la selección de datos
digitalWrite (MP3_RESET, bajo); Poner VS1053 en reinicio de hardware
pinMode (inputPin, entrada); declarar el LDR como INSUMO
pinMode (redOutputLED, salida); declara el ledPin como salida
pinMode (blueOutputLED, salida);
Serial.Begin(57600); Use el serial para la depuración
Serial.println ("MP3 Player ejemplo usando Control");
Interfaz de la tarjeta SD de instalación
pinMode (10, salida); PIN 10 se debe establecer como una salida para la comunicación de SD trabajar.
Si (! card.init(SPI_FULL_SPEED)) Serial.println ("Error: init de tarjeta"); Inicializar la tarjeta SD y configurar los pines de I/O.
Si (! volume.init (y tarjeta)) Serial.println ("Error: volumen ini"); Inicializar un volumen en la tarjeta SD.
Si (! root.openRoot (y volumen)) Serial.println ("Error: raíz de la apertura"); Abra el directorio raíz del volumen.
No necesitamos configurar SPI para VS1053 porque esto ya ha sido realizado por el SDfatlib
Página 12 de la hoja de datos, max Lee SCI es CLKI/7. Entrada reloj es 12.288 MHz.
Multiplicador de reloj interno es 1,0 x después de la energía para arriba.
Por lo tanto, velocidad máxima de SPI es de 1,75 MHz. Usaremos 1MHz seguro.
SPI.setClockDivider(SPI_CLOCK_DIV16); Ajustar la velocidad del bus SPI a 1MHz (16MHz / 16 = 1 MHz)
SPI.transfer(0xFF); Lanzar un maniquí bytes en el bus
Inicializar el chip VS1053
Delay(10);
digitalWrite (MP3_RESET, alto); Subir VS1053
Mp3SetVolume (20, 20); Volumen inicial (20 = - 10dB) LOUD
Mp3SetVolume (40, 40); Volumen inicial (20 = - 10dB) manejable
Mp3SetVolume (80, 80); Volumen inicial (20 = - 10dB) más tranquilo
Ahora que tenemos el VS1053 para arriba y correr, aumentar el multiplicador de reloj interno y hasta nuestra tasa de SPI
Mp3WriteRegister (SCI_CLOCKF, 0x60, 0 x 00); Sistema multiplicador a x 3.0
Página 12 de la hoja de datos, max Lee SCI es CLKI/7. Entrada reloj es 12.288 MHz.
Multiplicador de reloj interno es ahora x 3.
Por lo tanto, velocidad máxima de SPI es de que 5 MHz. 4MHz estarán a salvo.
SPI.setClockDivider(SPI_CLOCK_DIV4); Ajustar la velocidad del bus SPI a 4MHz (16MHz / 4 = 4 MHz)
Configuración del IC mp3 completo
Serial.println ("hecho con la instalación");
}
void loop()
{
inputValue = analogRead(inputPin);
LED ojos pedacitos (afinando necesidades de valores cuando se coloca en marioneta final)
redOutputValue = mapa (inputValue, 0, 1023, 0, 255);
blueOutputValue = mapa (inputValue, 0, 1023, 0, 255);
/ * Si (inputValue > 50)
{
blueOutputValue = 0;
}
Si (inputValue < 20)
{
redOutputValue = 0;
} */
Si es lo suficientemente abierto (inputValue > 600) //if boca
{
Si (is_playing == 0)
{
playMP3(trackName);
is_playing = 1;
}
}
Si (inputValue < 500) / / si boca se cierra bastante
{
Track.Close();
is_playing = 0;
}
Serial.Print(inputValue); a ver si funciona correctamente el sensor de luz
Serial.Print("\n");
analogWrite (redOutputLED, redOutputValue);
analogWrite (blueOutputLED, blueOutputValue);
}
Escribir a VS10xx registro - ejemplo de SparkFun
Lic: Las transferencias de datos son siempre de 16 bits. Cuando entra una nueva operación de SCI
DREQ baja. Entonces tenemos que esperar para que DREQ ir alto otra vez.
XCS debe ser baja para la duración completa de la operación.
void Mp3WriteRegister (unsigned char addressbyte, highbyte unsigned char, unsigned char lowbyte) {}
while(!digitalRead(MP3_DREQ)); Espere DREQ ir alta indicando IC disponible
digitalWrite (MP3_XCS, bajo); Seleccione control
SCI consta de byte de la instrucción, dirección byte y palabra de datos de 16 bits.
SPI.transfer(0x02); Escribir instrucciones
SPI.transfer(addressbyte);
SPI.transfer(highbyte);
SPI.transfer(lowbyte);
while(!digitalRead(MP3_DREQ)); Espere DREQ ir comando indicando alta es completa
digitalWrite (MP3_XCS, alto); Anule la selección de Control
}
Establecer registro de volumen de VS10xx - volumen establece la función del ejemplo de SparkFun
void Mp3SetVolume (unsigned char leftchannel, unsigned char rightchannel) {}
Mp3WriteRegister (SCI_VOL, leftchannel, rightchannel);
}
< / código >