viernes, 30 de agosto de 2013

Construcción de una caja musical con arduino III

En este artículo vamos a añadir un potenciómetro a nuestro prototipo para ajustar el volumen del decodificador MP3. Un potenciómetro es un resistor variable que normalmente posee algún tipo de control que nos permite ajustar su resistencia y por lo tanto el voltaje que leeremos por unos de los pins analógicos del microcontrolador. En la foto vemos dos tipos de potenciómetros. En uno el ajuste de la resistencia se hace mediante una rueda que se puede girar fácilmente los dedos. En el otro se hace mediante un pequeño tornillo. Obviamente para nuestra caja usaremos el primero, ya que no queremos que el usuario tenga que ajustar el volumen con un destornillador ;-)



El potenciómetro tiene tres pines, dos de ellos van a corriente y tierra, y el tercero va conectado a uno de los pines analógicos del microcontrolador. El esquema de conexión es el siguiente


Y aquí está montado en la placa de prototipo


El sketch

El código fuente modificado para que al girar la rueda del potenciómetro se ajuste el volumen es el siguiente:

#include <SPI.h>
#include <Adafruit_VS1053.h>
#include <SD.h>

#define MP3_XCS 6   // CS Registros
#define MP3_XDCS 7  // CS Datos (BSYNC)
#define MP3_DREQ 2  // Interrupción chip disponible
#define MP3_RESET 5 // Reset activo bajo
#define VOLUME_PIN A1
#define MIN_VOLUME 70


bool isSdOpened=false;
File root;
File entry;
long fileCount;
unsigned long totalBytes;
int currentVolume=MIN_VOLUME-map(analogRead(VOLUME_PIN),0,1023,0,MIN_VOLUME);
int oldVolume=currentVolume;

Adafruit_VS1053_FilePlayer musicPlayer = Adafruit_VS1053_FilePlayer(MP3_RESET, MP3_XCS, MP3_XDCS, MP3_DREQ, 10);


void setup(){
  pinMode(10,OUTPUT);
  Serial.begin(115200);

  musicPlayer.begin();

  while(!isSdOpened){
    isSdOpened=SD.begin(10);

    Serial.print("SD.begin ");
    Serial.println(isSdOpened);
  }

   musicPlayer.useInterrupt(VS1053_FILEPLAYER_PIN_INT);
   musicPlayer.setVolume(currentVolume,currentVolume);

  root=SD.open("/");
  root.rewindDirectory();
  fileCount=0;
  entry=root.openNextFile();
  while(entry){
    fileCount++;
    Serial.print(entry.name());
    Serial.print("\t");
    if(entry.isDirectory()){
      Serial.println("Directorio");
    }
    else{
      Serial.println(entry.size(), DEC);
    }
    entry.close();
    entry=root.openNextFile();
  }
  root.rewindDirectory();
  Serial.print("Numero de ficheros: ");
  Serial.println(fileCount);
  randomSeed(analogRead(0));

  Serial.print("Volumen: ");
  Serial.println(currentVolume);

}


void loop(){

  if (! musicPlayer.playingMusic) {
    musicPlayer.softReset();
    delay(1000);
    root.rewindDirectory();

    int randNumber = random(1,fileCount+1);

    Serial.print("Numero aleatorio: ");
    Serial.println(randNumber);

    for(int i=0;i<randNumber;i++){
      entry=root.openNextFile();
      entry.close();
 
    }
    Serial.print("Fichero: ");
    Serial.println(entry.name());
    musicPlayer.startPlayingFile(entry.name());
  }
  else{
    currentVolume=MIN_VOLUME-map(analogRead(VOLUME_PIN),0,1023,0,MIN_VOLUME);
    if(currentVolume!=oldVolume){
      musicPlayer.setVolume(currentVolume,currentVolume);
      oldVolume=currentVolume;
      Serial.print("Volumen: ");
      Serial.println(currentVolume);
    }
  }
}

Comentarios al código fuente

En la instrucción currentVolume=MIN_VOLUME-map(analogRead(VOLUME_PIN),0,1023,0,MIN_VOLUME) leemos el valor de la entrada analógica y lo adaptamos al rango de valores que vamos a pasarle a la funcion setVolume(). La función analogRead(VOLUME_PIN) devuelve un valor entre 0 y 1023, pero a setVolume() le vamos a pasar un valor entre 0 y 70. La función map() devuelve un valor extrapolado de un rango a otro. En nuestro caso le pasamos un valor entre 0 y 1023 y devuelve su valor proporcional en el rango 0 a 70. Y por último restamos el valor devuelto por map() a 70 porque cuanto menor es el valor que le pasamos a setVolume() mayor es el volumen de la canción, es decir, el valor cero es el máximo volumen.
En la función loop(), cuando no se está reproduciendo la canción leemos el valor del potenciómetro y si ha cambiado ajustamos el valor con setVolume().

Con esto ya tenemos las funcionalidades básicas de nuestra caja. En la próxima entrada veremos cómo hacer que la música se reproduzca o pare cuando se abre o cierra la caja.

Artículos relacionados

 

No hay comentarios:

Publicar un comentario