Problema vu meter hecho con arduino.

#1 por Ejoejo el 13/03/2013
hola, he hecho un vu meter con arduino con el siguiente codigo sacado de una pagina web y modificado algo por mi;

int sound[4];
int soundav;
int sensorPin = 9;
int sensorValue = 0;
const int inputPIN = 8; //audio input pin, you have to amplify your output to max 5V
const int firstLED= 34; //first output pin for the leds
const int lastLED = 53; //last output pin for the leds
int leds;
int x;
int y;

void setup ()
{
pinMode (inputPIN, INPUT); // put input pin in input state
for (int a=firstLED; a <=lastLED; a++){ // loop through all the outputpins and put them in output state
pinMode(a, OUTPUT);
}
leds = (lastLED - firstLED) +2; //count how many leds you have connected + add 1 for all leds off
}

void loop ()
{
sensorValue = analogRead(sensorPin);
for (int num=0; num < 4; num++) {
sound[num]= analogRead (inputPIN);
if(num==3) {
soundav=(sound[0]+sound[1]+sound[2]+sound[3])/4; // average sound levels
x = map(soundav, 1, sensorValue, 0,leds);// map the sound values from 0 to 20 because we have 21 levels. OFF & 20 leds.

y = firstLED + x; //get the correct led pin number where the led state changes
for (int b= firstLED; b < y; b++) { //loops through all the leds from firstLED to the level of the sound
digitalWrite(b,HIGH);
}
for (int c = y; c <= lastLED ; c++) { //loops through all the leds from lastLED to the level of the sound
digitalWrite(c,LOW);

}
}
}
}


Esta programado de tal forma que se pueda modificar la sensibilidad de los leds con un potenciometro el unico problema es que cuando llega al maximo de leds encendidos ya sea por el volumen de entrada o modificando el valor de sensibilidad los leds se quedan todos encendidos y ya no hace nada. Al principio todo funciona bien lods leds van al ritmo pero como ya he dicho cuando llegan al maximo es como si el arduino dejara de leer y aunque modifique la sensibilidad con el potenciometro y la baje o baje el volumen no responde la unica solucion es darle a reset. Si alguien puediera ayudarme o tubiera otro codigo mejor estaria muy agradecido. Gracias un saludo
Subir
#2 por mustang64 el 13/03/2013
Hola Ejoejo,
No tengo muy claro dónde está el problema, pero sospecho de tres sitios:

1) No entiendo muy bien por qué una entrada analógica está en el pin 8, que es digital, pero mi conocimiento de elctrónica es muy limitado. ¿No debería estar en una entrada A0..Ax? Aunque si dices que te funciona, pues funciona.

2) leds = (lastLED - firstLED) +2; No entiendo bien por qué suma 2, cuando debería sumar 1.

3) el map(soundav... Ahí puede haber un problema con los valores que mapea, ya que en lugar de mapear con 1 y 1023 u otro valor, puede mapear con 1 y 0, siendo 0 el valor que devuelva el sensorValue = analogRead(sensorPin). En este caso no sé cómo se comportará el arduino, ya que tratará de mapera 1..0 a 0..21.

Puedes intentar poner trazas para ver los siguientes valores:
1) después de leds=(lastLed-firstLed)+2; pon un Serial.print("leds="); Serial.println(leds);
2) después de sensorValue = analogRead... pon un Serial.print("sensorValue="); Serial.println(sensorValue);
3) después de soundav = (sound[0]+...)/4; pon otro Serial.print("soundav="); Serial.println(soundav);
4) después de x=map(...; pon Serial.print("x="); Serial.println(x);

Luego prueba el esquema con el pote al mínimo, y después al máximo:

leds debería decirte 21.
sensorValue no sé qué te va a devolver como valor máximo de una entrada digital con lectura analógica. El valor mínimo será un 0.
soundav te dará un valor máximo y otro mínimo (y otros intermedios)
x te debería dar valores entre 0 y 20.

Si x te da valores fuera de ese rango, el problema está en el map y en el manejo de sensorValue con respecto al valor máximo de la entrada.
Los valores máximos y mínimos de soundav y sensorValue deberían ser los mismos, o muy parecidos.

Si pones aquí los resultados (no todos, solo máximos y mínimos), les echo un vistazo.

Saludos y suerte.

M64.
Subir
#3 por Ejoejo el 13/03/2013
Hola muchas gracias por contestar, te explico lo del pin 8 tienes razon y lo de la suma tambien pero conectarlo lo conecto en el pin 8 analogico ya lo canviare en el codigo, i lo del potenciometro no creo q tenga nada que ver porque quitando el potenciometro y la parte del codigo del potenciometro ya hacia eso osea hacia lo mismo, probare de cambiar lo del pin y lo de la suma haber que pasa y cuando tenga un rato hare lo que me has dicho, te comento que estoy empezando justo ahora y aun no se casi nada probablemente haya sido fallo mio al adaptar el codigo ya que fue cogido de otro proyecto y tuve que adaptarlo porque no disponia de los mismos materiales, muchas gracias por la ayuda
Subir
#4 por mustang64 el 13/03/2013
¿Qué arduino tienes? Supongo que es un mega, por los pines.
¿Qué le has modificado al código original?
Subir
#5 por Ejoejo el 13/03/2013
Tengo el arduino mega, si t digo la verdad no me acuerdo d lo que le modifique, se que lo hice porque el montaje del proyecto original era diferente yo lo he hecho con leds independientes cada uno con su resistencia el original era con algo parecido a una tira de leds supongo que eso no influira o eso creo porque lo conecte todo parecido al original para no tener que modificar muchas cosas y luego lo que cambie era lo de la suma que me has dicho porque donde encontre el proyecto habia un usuario que decia que habia que ponerlo asi ya que de la otra forma no funcionaba
Subir
#6 por Ejoejo el 15/03/2013
hola he pensado una solucion pero no se si seria la correcta y tampoco se como programar el codigo la idea seria hacer una funcion if osea condicional que cuando el valor de entrada del sonido fuera muy grande bajara la sensibilidad para mapear los leds, no se si me e explicado bien es que lo que pasa es que cuando el volumen de entrada es muy alto los leds se quedan todos encendidos y se queda bloqueado y no vuelve a su sitio aunque el volumen bajo por eso creo que habria que poner alguna funcion que dependiera del volumen de entrada y el numero de leds que estaban encendidos antes de que el volumen aumentara porque me dado cuenta de que toma como referencia el ultimo led encendido y deberia tomar como referencia el primer led pero todo eso no se cambiarlo.
Subir
#7 por mustang64 el 15/03/2013
Hola Ejoejo,
Para eso es necesario conocer el rango de valores (mínimo y máximo) que recibes de sensorValue y que tienes en soundav.
No entiendo qué significa "toma como referencia el último led encendido". El programa hace los cálculos y al final, en los dos últimos bucles enciende los leds que corresponden (firstLed..y-1) y apaga el resto (y..lastLed).

firstLed y lastLed son constantes, así que su valor siempre será, respectivamente, 34 y 53. Si se encienden todos los leds es porque 'y' es mayor o igual que lastLed, lo que también puede hacer que se "cuelgue". Imagínate que 'y' vale 100. El primer bucle encendería los leds del 34 al 100, y el segundo bucle no apagaría nada.

Como parece que el problema está en el valor de 'y', es necesario saber qué valores maneja. 'y' depende directamente de 'x', que es el resultado del mapeo. Siento repetirme, pero el problema puede estar en el mapeo.

Escribe los resultados mínimo y máximo que puse en el otro post y vemos qué se puede hacer.

Saludos.

M64.
Subir
#8 por Ejoejo el 15/03/2013
Hola, antes de nada perdona por lo que voy a preguntar soy muy novato en esto y me condenareis jajaja, e puesto lo q me dijiste para saber los valores pero en el ordenador no sale nada
Subir
#9 por mustang64 el 15/03/2013
No te preocupes! Perdona tú, que olvidé decirte que pusieras dentro de setup() la línea Serial.begin(9600);

Si usas el entorno de Arduino, cuando cargues el sketch, tienes que abrir la ventana Serial Monitor, que es pulsando un icono con una lupa a la derecha de la barra de iconos.

Se te abre la ventana de monitorización y abajo a la derecha tienes que poner 9600. Te adjunto una imagen (en la que pone 115200). Tienes que poner el mismo valor en la ventana y en el Serial.begin(...).

Con esto ya debe aparecer.
Archivos adjuntos:
Portapapeles01.jpg
BBCode:
Subir
#10 por Ejoejo el 16/03/2013
x=0
sensorValue=1023
soundav=0

x=1
sensorValue=0
soundav=0


x=65
sensorValue=159
soundav=460

estos son los valores que he obtenido, sin saber mucho del tema creo que se vuelve un poco loco, no se si valdria mas la pena volver a programarlo.
Subir
#11 por mustang64 el 16/03/2013
Ejoejo,
El problema está en el map. Los valores que debe tener x deben estar entre 0 y 21. En el tercer valor que muestras, x vale 65, que significa que se deben encender 65 leds, y eso no nos mola nada.
No sé cuál es el valor máximo que puede tener soundav, y lo necesitamos.
Vamos a suponer que también es 1023.
En ese caso la línea x=map, será x=map(soundav, 0, 1023, 0, leds);
Esto dará un valor entre 0 (cuando soundav sea 0) y 21 (cuando soundav sea 1023). Como ahora quieres atenuar este valor en función de cómo ajustes el potenciómetro, habrá que dividir el valor.
Si el pote está al máximo (sensorValue=1023) el divisor será 1.
Si el pote está al mínimo (sensorValue=0) el divisor será 0, pero como no se puede dividir por 0, pondremos el valor 0.
Si el pote está en el medio (sensorValue=512) el divisor será 2.
Si el pote está a 1/4 el divisor será 4...

Después del x=map(...) nuevo, pon la siguiente línea:
x=x/(1023/sensorValue>0?sensorValue:1);

El Serial.print("x="); Serial.println(x); ponlo después de esta nueva línea y nos dices cómo ha ido.

Saludos.

M64.
Subir
#12 por Ejoejo el 21/03/2013
hola, siento por no haber podido contestar antes, he probado lo que me has dicho y ahora solo se encienden 3 leds y solo cuando el potenciometro esta en un extremo, si esta en el otro extremo no se enciende nada y si esta en medio tampoco creo que cuando tenga tiempo lo programare yo.
Subir
#13 por mustang64 el 21/03/2013
¿Y qué valores te dan x, sensorValue y soundav?
Subir
Respuesta rápida

Regístrate o para poder postear en este hilo