Go Down

Topic: [SOLUCIONADO] Música con Sparkfun / WTV020SD (Read 1 time) previous topic - next topic

ehipi

Feb 02, 2016, 10:37 am Last Edit: Feb 19, 2016, 09:15 am by ehipi
Buenos días.
Llevo bastante tiempo leyéndoos y adentrándome en el mundo "Arduino". Tengo un proyecto personal en curso que consiste en hacer una caja musical con un módulo y arduino.
Estoy empezando a usar el módulo y por tanto voy "por partes" para, primero, ver que funciona correctamente. Actualmente no oigo nada (ayer conseguí oir - bajito - algo pero al hacer otro montaje y volver a éste, ya no se oía), no sé si me falta algo o tengo algo mal conectado. Os pongo todos los datos:

Material usado:
Arduino Pro Micro
SparkFun Audio-Sound Breakout - WTV020SD + tarjeta SD 2GB
Pila de 9V
Reductor tensión a 3,3V
Cables
Interruptor
Canción grabada en ad4 con nombre 0000.ad4 (convertida con el Audio Converter Utility de la página de Sparkfun)

Montaje realizado:


Código utilizado



Code: [Select]


/*
  WTV020-SD-16P Test
Control a WTV020-SD-16P module to play sounds from an Arduino board.

Created July 2012.
By Diego J. Arevalo.
*/

const int resetPin = 10;  // The pin number of the reset pin.
const int clockPin = 9;  // The pin number of the clock pin.
const int dataPin = 6;  // The pin number of the data pin.
const int busyPin = 5;  // The pin number of the busy pin.

int busyPinState = HIGH;

void setup() {
  pinMode(resetPin, OUTPUT);
  pinMode(clockPin, OUTPUT);
  pinMode(dataPin, OUTPUT);
  pinMode(busyPin, INPUT);
  resetModule();
}

void loop() {
  playSong(0);
  delay(5);
}

void playSong(int trackNumber){
  sendCommand(trackNumber);
  busyPinState=digitalRead(busyPin);
  while(busyPinState==HIGH){
    busyPinState=digitalRead(busyPin);
  }
}

void resetModule(){
  //Reset pulse.
  digitalWrite(resetPin, HIGH); 
  digitalWrite(resetPin, LOW);
  delay(5);
  digitalWrite(resetPin, HIGH);
  //Reset idle to start bit.
  digitalWrite(clockPin,HIGH);
  delay(300);
}

void sendCommand(unsigned int command) {
  //Start bit Low level pulse.
  digitalWrite(clockPin, LOW);
  delay(2);
  for (unsigned int mask = 0x8000; mask > 0; mask >>= 1) {
    //Write data setup.
    if (command & mask) {
      digitalWrite(dataPin, HIGH);
    }
    else {
      digitalWrite(dataPin, LOW);
    }
    //Write data hold.
    delayMicroseconds(50);
    //Clock high level pulse.
    digitalWrite(clockPin, HIGH);
    if (mask > 0x0001){
      delayMicroseconds(100);
      //Clock low level pulse.
      digitalWrite(clockPin, LOW);
      delayMicroseconds(100);
    }
    else{
      //Stop bit high level pulse.
      delay(2);
      digitalWrite(clockPin, LOW);
    }
  }
  //Busy active high from last data bit latch.
  delay(20);
}




¿Alguna idea/ayuda de dónde puede estar el fallo?
¡Gracias!

Edito: después de un tiempo probando cosas, desmontarlo y volver a montarlo, resulta que se oye.
Pero lo desenchufo (quito alimentación), vuelvo a enchufar y ya no se oye nada...
alguna idea??

surbyte

Solo para probar, intenta alimentar todo con una fuente o batería mas potente. Es posible que tu batería de 9V este agotada. 
Por otro lado. No tengo claro cual puede ser la mínima corriente necesaria para que funcione el DC DC que ahora esta de 9V a 3.3V. Revisa si entrega 3.3V a la salida. Pero usa una fuente de 9V y no una batería solo para probar.

ehipi

#2
Feb 03, 2016, 11:18 am Last Edit: Feb 03, 2016, 11:28 am by ehipi
Solo para probar, intenta alimentar todo con una fuente o batería mas potente. Es posible que tu batería de 9V este agotada.
Por otro lado. No tengo claro cual puede ser la mínima corriente necesaria para que funcione el DC DC que ahora esta de 9V a 3.3V. Revisa si entrega 3.3V a la salida. Pero usa una fuente de 9V y no una batería solo para probar.
Muchas gracias surbyte. He probado con una fuente de alimentación externa y me pasa lo mismo, al quitar la alimentación no se oye nada.
Se me ocurrió hacer la prueba sin utilizar el arduino y al quitar la alimentación si funciona bien. De momento para las pruebas voy a usar la fuente de alimentación, después ya pensaré en sustituirla por la pila.

El circuito con el cuál se oye solamente sería éste:




Si quito la alimentación y la vuelvo a poner, sólo tengo que pulsar el pulsador del "Play". Con el primer pulso, se enciende y con el segundo pulso se apaga y así sucesivamente.

Mi proyectillo es hacer una cajita de música muy sencilla, y ya que he conseguido que se oiga bien, voy al segundo apartado que me interesa y tengo alguna duda.

Para no tener que estar todo el rato teniendo que pulsar el pulsador del play para darle los pulsos, había pensado utilizar un interruptor ON (ON) (u otra cosa si se os ocurre) que cuando el "pulsador" esté metido (tapa cerrada) no se alimente el circuito. Cuando la tapa se abra, el "pulsador" se sube y dejaría pasar la corriente.

Estos cambios en la entrada en el PIN Digital 6 (de 3,3V si está abierto y GND si está cerrado) que el Arduino lo procese y por cada cambio, en el PIN digital de SALIDA (10) de un pulso cada vez que haría la función de "PLAY".
No sé si me explico..  Dejo un esquema de "la idea".



El tema es que el "Play" de la placa de SD se activa por cada pulso conectado a GND (primer pulso se enciende, segundo pulso se apaga, y así sucesivamente cada vez que pones la alimentación), por lo que no sé cómo hacer para que, cuando varíe la entrada (pin 6 del arduino), dé inmediatamente un pulso y cambie de estado (la pata play se conecte a gnd). En el siguiente cambio de estado (cuando se cierra la tapa, y no haya alimentación), se vuelva a dar otro "pulso", el play se conecte a gnd otra vez y se pare. Y el resto "del tiempo" está "suelto"¿? (sería a 3,3V??)
Hay algo que "me falla" pero no logro saber por donde cogerlo

El código que he pensado utilizar sería este:

Code: [Select]


// NIVEL PARDILLO PDF

int  val=0; //almacenará la lectura del pulsador: ON u OFF
int  valAnterior=0; //almacenará una lectura justamente anterior
int  estado=0; //¿qué toca ahora, encender o apagar el LED?

void setup ()
{
pinMode(10,OUTPUT);
pinMode(6,INPUT);
}

void loop()
{
  val=digitalRead(6);

  if (val==HIGH && valAnterior==LOW)
  {
    // Detecta el cambio del estado del pulsador de no estar pulsado a estar pulsado
    estado=1-estado;
    delay(20);

  }

    if (val==LOW && valAnterior==HIGH)
  {
    // Detecta el cambio del estado del pulsador de no estar pulsado a estar pulsado
    estado=1-estado;
    delay(20);

  }
 
  valAnterior=val; //el valor del pulsador pasa a ser valor pasado
 
  if (estado==1)
  {
  digitalWrite(10,HIGH); //El pin 10 se pondrá a GND
 
  }
 
  else 
  {digitalWrite(10,LOW);}
}





Esa es una idea, otra es usar un TSL2561 pero tengo el mismo problema: tiene que estar siempre alimentado y consumiría mucha batería.


surbyte

Ahora veo el problema y esta en tu código. 
Resulta que tu haces esto

Code: [Select]
 if (val==HIGH && valAnterior==LOW)   { 
    // Detecta el cambio del estado del pulsador de no estar pulsado a estar pulsado
    estado=1-estado;
    delay(20);
  }


Supongamos que presionaste y estado estaba en 0. Ahora estará en 1.
pero luego tu código ejecuta esto, cuando milisegundos despues sueltas el botón.
Code: [Select]
  if (val==LOW && valAnterior==HIGH)   {
    // Detecta el cambio del estado del pulsador de no estar pulsado a estar pulsado
    estado=1-estado;
    delay(20);
 }

Entonces estado vuelve a quedar en 0.
Y por eso no funciona.
Deja solo 1. No los dos. No lo borres, coméntalo!.
Prueba y nos cuentas.

ehipi

#4
Feb 03, 2016, 07:37 pm Last Edit: Feb 03, 2016, 10:13 pm by ehipi
Prueba y nos cuentas.
¡Genial surbyte! Qué despiste. He estado haciendo tantos cambios que no me había fijado en ese error.
He hecho la prueba parcialmente, es decir, fuente + reductor de tensión + arduino y ver la tensión de salida del PIN 10 (salida que conectaría al PLAY) ¡y funciona perfectamente!
También he medido los mA, consume unos 40mA.

Ahora me surge una duda, creo que es bastante "tonta" pero son de estas cosas que te dan qué pensar.
La salida del PIN10 del arduino da o 0V o 5V
La placa de sparkun del SD funciona a 3,3V
Si conecto directamente el Pin10 al Play de la placa, ¿la dañará? ¿o lo tengo que pasar otra vez por el reductor a 3,3V y alimentar el PLAY de la placa a 3,3V

EDITO:
He probado la conexión del PLAY a la pata 10 del Arduino y no funciona :( no se activa/desactiva la música. ¿Alguna idea de lo que puede ser? Ahora estoy usando una alimentación externa.

Por si a alguien le sirve, dejo el código:


Code: [Select]


int  val=0; //almacenará la lectura del pulsador: ON u OFF
int  valAnterior=0; //almacenará una lectura justamente anterior
int  estado=0; //¿qué toca ahora, encender o apagar el LED?

void setup ()
{
pinMode(10,OUTPUT);
pinMode(6,INPUT);
}

void loop()
{
  val=digitalRead(6);

  if (val==HIGH && valAnterior==LOW)
  {
    /**
    // Detecta el cambio del estado del pulsador de no estar pulsado a estar pulsado
    estado=1-estado;
    delay(20);
    */

   digitalWrite(10, LOW); // asigna el valor LOW al pin
   //delay(5000);     // espera medio segundo
   digitalWrite(10, HIGH); // asigna el valor HIGH al pin
  }

/**
    if (val==LOW && valAnterior==HIGH)
  {
    // Detecta el cambio del estado del pulsador de no estar pulsado a estar pulsado
    //estado=1-estado;
    //delay(20);
   
   digitalWrite(10, LOW); // asigna el valor LOW al pin
   delay(5000);     // espera medio segundo
   digitalWrite(10, HIGH); // asigna el valor HIGH al pin
   delay(5000);     // espera medio segundo
   
  }

*/
 
  valAnterior=val; //el valor del pulsador pasa a ser valor pasado
/** 
  if (estado==1)
  {
   digitalWrite(10, LOW); // asigna el valor LOW al pin
   delay(500);     // espera medio segundo
   digitalWrite(10, HIGH); // asigna el valor HIGH al pin
   delay(500);     // espera medio segundo
   
  }
 
  else 
  {
   
    digitalWrite(10,LOW);
   
    }
    */
}


surbyte

Usa un divisor resistivo formado por dos resistencias de 1k y 2k.
La de 1k unida al pin de arduino. La de 2k unida a masa. Ambas resistencias unidadas entre si y de esa unión a tu entrada de 3.3V 

ehipi

Gracias surbyte!
Efectivamente, era la tensión en la entrada. Con el divisor de tensión, perfecto!
Muchas gracias. Dejo como SOLUCIONADO el tema.

Go Up