[Aporte] VUMETRO GIGANTE cuatro efectos

#1
Hola, Amigos quiero compartir con ustedes este pequeño proyectillo que en lo personal me ha dado muchas satisfacciones.

Se trata de un medidor de sonido echo a base de micro-controlador PIC18F4550 y una interface transistor-izada para comandar LEDs de alto brillo

El Vumetro posee cuatro efectos y quince niveles de medición que pueden seleccionarse la sensibilidad y el efecto a través de un potenciometro conectado al canal AN0 del PIC. mientras que en el canal AN1 se conecta el sensor de sonido.

por ahora no dejo mayor detalle pero, prometo seguir con el tema en los días venideros, siempre que encuentre el interés por parte de vosotros.

bueno aquí dejo un par de vídeos:



bueno gracias, hasta pronto! :)
 
#2
Que tal? Primero que todo, excelente proyecto pero me surge una duda. Cual es la necesidad de usar un micro tan "complejo"? Aqui en Venezuela, la familia 18 cuesta hasta 3 veces mas que la 16. En todo caso, un 16f877 podria hacer el trabajo.

Saludos
 
#3
Gracias por comentar, Anthony.
Estoy de acuerdo contigo, se puede realizar con un PIC16F877A, pero yo tenía a la mano el 18F4550 y por eso utilicé ese PIC.
Sin embargo, me extraña la diferencia de costo entre los dos PICS allá en Venezuela.
Acá en Ecuador los primeros están en 5,50 y los otros a 8 dolares.

Bueno, aquí dejo el esquemático para el vumetro.
Como ves, no es muy complicado, no requiere de cristal pues utilizo el oscilador interno del PIC.
vum.PNG Y acá está la interfaz al LED de potencia.
El vumetro consta de 15 módulos LED cuyo circuito se muestra a continuación:
led interface.PNG El código está realizado en PIC C.
Código:
#include <18F4550.h>
#device adc=8
#FUSES NOMCLR, INTRC_IO, WDT               
#use delay(clock=8000000, RESTART_WDT)
int8 andata0,andata1;
void main(){
setup_adc_ports(NO_ANALOGS);
set_tris_a(0b00000011);
set_tris_b(0);
set_tris_c(0);
set_tris_d(0);
setup_adc_ports(AN0_TO_AN1);
setup_adc(ADC_CLOCK_INTERNAL);
while(true){
set_adc_channel(0);
andata0=read_adc();
if(andata0<=64){
//lineal
if(andata1<=35)              {output_d(0b00000000);output_b(0b00000000);}
if(andata1>35 && andata1<=40){output_d(0b00000000);output_b(0b01100000);}
if(andata1>40 && andata1<=45){output_d(0b00000000);output_b(0b01111000);}
if(andata1>45 && andata1<=50){output_d(0b00000000);output_b(0b01111110);}
if(andata1>50 && andata1<=55){output_d(0b10000000);output_b(0b01111111);}
if(andata1>55 && andata1<=60){output_d(0b11100000);output_b(0b01111111);}
if(andata1>60 && andata1<=65){output_d(0b11111000);output_b(0b01111111);}
if(andata1>65 && andata1<=70){output_d(0b11111110);output_b(0b01111111);}
if(andata1>70)               {output_d(0b11111111);output_b(0b01111111);}
}
if(andata0>64 && andata0<=128){
//logaritmica
if(andata1<=75)                {output_d(0b00000000);output_b(0b00000000);}
if(andata1>75 && andata1<=80)  {output_d(0b10000000);output_b(0b00000000);}
if(andata1>80 && andata1<=85)  {output_d(0b11000000);output_b(0b00000001);}
if(andata1>85 && andata1<=90)  {output_d(0b11100000);output_b(0b00000011);}
if(andata1>90 && andata1<=95)  {output_d(0b11110000);output_b(0b00000111);}
if(andata1>95 && andata1<=100) {output_d(0b11111000);output_b(0b00001111);}
if(andata1>100 && andata1<=105){output_d(0b11111100);output_b(0b00011111);}
if(andata1>105 && andata1<=110){output_d(0b11111110);output_b(0b00111111);}
if(andata1>110)                {output_d(0b11111111);output_b(0b01111111);}
}
if(andata0>128 && andata0<=192){
//logaritmica2
if(andata1<=100)                {output_d(0b00000000);output_b(0b00000000);}
if(andata1>100 && andata1<=105)  {output_d(0b00000001);output_b(0b01000000);}
if(andata1>105 && andata1<=110)  {output_d(0b00000011);output_b(0b01100000);}
if(andata1>110 && andata1<=115) {output_d(0b00000111);output_b(0b01110000);}
if(andata1>115 && andata1<=120){output_d(0b00001111);output_b(0b01111000);}
if(andata1>120 && andata1<=125){output_d(0b00011111);output_b(0b01111100);}
if(andata1>125 && andata1<=130){output_d(0b00111111);output_b(0b01111110);}
if(andata1>130 && andata1<=135){output_d(0b01111111);output_b(0b01111111);}
if(andata1>135)                {output_d(0b11111111);output_b(0b01111111);}
}
if(andata0>192){
//lineal2
if(andata1<=150)                {output_d(0b00000000);output_b(0b00000000);}
if(andata1>155 && andata1<=160) {output_d(0b00000011);output_b(0b00000000);}
if(andata1>160 && andata1<=165){output_d(0b00001111);output_b(0b00000000);}
if(andata1>165 && andata1<=170){output_d(0b00111111);output_b(0b00000000);}
if(andata1>170 && andata1<=175){output_d(0b11111111);output_b(0b00000000);}
if(andata1>175 && andata1<=180){output_d(0b11111111);output_b(0b00000011);}
if(andata1>180 && andata1<=185){output_d(0b11111111);output_b(0b00001111);}
if(andata1>185 && andata1<=190){output_d(0b11111111);output_b(0b00111111);}
if(andata1>190)                {output_d(0b11111111);output_b(0b01111111);}
}
set_adc_channel(1);
andata1=read_adc();
}
}
 
Última edición por un moderador:

Ratmayor

Moderatroll
#4
Interesante proyecto, incluso se me ocurre que podrías usar los puertos que te sobran para multiplexar y así ampliar la cantidad de LEDs...
 
#5
Gracias Ratmayor te cuento que tengo miles de LED los compre de esos que vienen en alambre para adornar arboles de navidad, comprarlos así me resultan mucho mas económicos, eso me esta haciendo pensar si lo hago aun mas grande. Saludos!
 
#6
Luego de darme varios cabezazos contra la pared y de jalarme los cabellos :cabezon:, estuve a punto de volverme loco.
No conseguía hacer que los LEDs tiemblen menos.
El problema principal del diseño anterior, era el bendito condensador C2 que nunca debió estar ahí.
En lugar de filtrar la señal, hacia todo lo contrario, introducía ruido y esa era la causa de todos mis males :cry:
Retirar el condensador y re-calibrar la programación del PIC solucionó el problema.
Les comento amigos, mi penosa experiencia, por si de pronto algún día se animan a construir un vumetro, para que no pasen las de Caín.
El buen carácter ha regreso a mi y orgullosamente les muestro mi progreso. :)
Saludos!!
VUMETRO.PNG
Código:
#include <18F4550.h>
#device adc=8
#FUSES NOMCLR, INTRC_IO, WDT               
#use delay(clock=8000000, RESTART_WDT)
int8 SELECTOR1,SELECTOR2,SELECTOR3; 
int8 andata0,andata1;
void main(){
setup_adc_ports(NO_ANALOGS);
set_tris_a(0b00000011);
set_tris_b(0);
set_tris_c(0);
set_tris_d(0);
setup_adc_ports(AN0_TO_AN1);
setup_adc(ADC_CLOCK_INTERNAL);
while(true){
set_adc_channel(0);
andata0=read_adc();
if(andata0<=64){
//lineal
if(andata1<=45)              {output_d(0b00000000);output_b(0b00000000);}
if(andata1>45 && andata1<=50){output_d(0b00000000);output_b(0b01100000);}
if(andata1>50 && andata1<=55){output_d(0b00000000);output_b(0b01111000);}
if(andata1>55 && andata1<=60){output_d(0b00000000);output_b(0b01111110);}
if(andata1>60 && andata1<=65){output_d(0b10000000);output_b(0b01111111);}
if(andata1>65 && andata1<=70){output_d(0b11100000);output_b(0b01111111);}
if(andata1>70 && andata1<=75){output_d(0b11111000);output_b(0b01111111);}
if(andata1>75 && andata1<=80){output_d(0b11111110);output_b(0b01111111);}
if(andata1>80)               {output_d(0b11111111);output_b(0b01111111);}
}
if(andata0>64 && andata0<=128){
//logaritmica
if(andata1<=45)              {output_d(0b00000000);output_b(0b00000000);}
if(andata1>45 && andata1<=50){output_d(0b10000000);output_b(0b00000000);}
if(andata1>50 && andata1<=55){output_d(0b11000000);output_b(0b00000001);}
if(andata1>55 && andata1<=60){output_d(0b11100000);output_b(0b00000011);}
if(andata1>60 && andata1<=65){output_d(0b11110000);output_b(0b00000111);}
if(andata1>65 && andata1<=70){output_d(0b11111000);output_b(0b00001111);}
if(andata1>70 && andata1<=75){output_d(0b11111100);output_b(0b00011111);}
if(andata1>75 && andata1<=80){output_d(0b11111110);output_b(0b00111111);}
if(andata1>80)               {output_d(0b11111111);output_b(0b01111111);}
}
if(andata0>128 && andata0<=192){
//logaritmica2
if(andata1<=45)              {output_d(0b00000000);output_b(0b00000000);}
if(andata1>45 && andata1<=50){output_d(0b00000001);output_b(0b01000000);}
if(andata1>50 && andata1<=55){output_d(0b00000011);output_b(0b01100000);}
if(andata1>55 && andata1<=60){output_d(0b00000111);output_b(0b01110000);}
if(andata1>60 && andata1<=65){output_d(0b00001111);output_b(0b01111000);}
if(andata1>65 && andata1<=70){output_d(0b00011111);output_b(0b01111100);}
if(andata1>70 && andata1<=75){output_d(0b00111111);output_b(0b01111110);}
if(andata1>75 && andata1<=80){output_d(0b01111111);output_b(0b01111111);}
if(andata1>80)               {output_d(0b11111111);output_b(0b01111111);}
}
if(andata0>192){
//lineal2
if(andata1<=45)              {output_d(0b00000000);output_b(0b00000000);}
if(andata1>45 && andata1<=50){output_d(0b00000011);output_b(0b00000000);}
if(andata1>50 && andata1<=55){output_d(0b00001100);output_b(0b00000000);}
if(andata1>55 && andata1<=60){output_d(0b00110000);output_b(0b00000000);}
if(andata1>60 && andata1<=65){output_d(0b11000000);output_b(0b00000000);}
if(andata1>65 && andata1<=70){output_d(0b00000000);output_b(0b00000011);}
if(andata1>70 && andata1<=75){output_d(0b00000000);output_b(0b00001100);}
if(andata1>75 && andata1<=80){output_d(0b00000000);output_b(0b00110000);}
if(andata1>80)               {output_d(0b00000000);output_b(0b01100000);}
}
set_adc_channel(1);
andata1=read_adc();
}
}
 
Última edición por un moderador:
#7
hola
Luego de darme varios cabezasos contra la pared, de alarme los cabellos :cabezon:, estuve a punto de volverme loco, No conseguía hacer que los LEDs tiemblen menos,... el problema principal del diseño anterior, era el bendito condensador C2 que nunca debió estar ahí, en lugar de filtrar la señal, hacia todo lo contrario, introducía ruido y esa era la causa de todos mis males :cry:.. retirar el condensador y re-calibrar la programación del PIC solucionó el problema. Les comento amigos mi penosa experiencia, por si de pronto algún día se animan a construir un vumetro, para que no la pasen las de cain... El buen carácter ha regreso a mi y orgullosamente le muestro mi progreso :) Saludos!!

https://lh5.googleusercontent.com/-...AAAAAEMQ/J-qB7Cb3MxA/w902-h553-no/VUMETRO.PNG
https://www.youtube.com/watch?v=8gGViiqN3ek
como anda mi amigaso querido., bueno amigo esto esta fabuloso., la verdad expextacular.,​
lo del capacitor., no me di cuenta., y es error en el video anterior tampoco lo note pero esta muy bueno (y)
 

Ratmayor

Moderatroll
#8
Una preguntonta... Si colocas los valores fijos en hexadecimal dentro de un arreglo y llamas a cada uno por medio de un número que le asignes, no te ahorrarías algunas líneas de código? :unsure:

Luego coloco el ejemplo, estoy lejos de la PC y no quiero que se me vaya la idea :LOL:

Saludos...
 
#9
Una preguntonta... Si colocas los valores fijos en hexadecimal dentro de un arreglo y llamas a cada uno por medio de un número que le asignes, no te ahorrarías algunas líneas de código? :unsure:

Luego coloco el ejemplo, estoy lejos de la PC y no quiero que se me vaya la idea :LOL:

Saludos...
don rat ¿¿¿¿ usted dice algo como una tabla ????
 
#11
Última edición:
#12
Gracias, Ratmayor y locodelafonola, por sus sugerencias.
¿Y el código mediante tablas? ¿Cómo sería? :unsure:

Publico esta imagen para aquellos que están interesados en ver más de cerca el circuito.
Saludos y hasta la próxima!

20150110_090145.jpg
 
Última edición por un moderador:
#13
Gracias Ratmayor, locodelafonola, por sus sugerencias ¿Y el codigo mediante tablas? ¿como seria? :unsure:
Bien, te mostraré un código que uso para multiplexar displays y supongo que lo podrás aplicar a este proyecto...

PHP:
unsigned char segunit[10] = {0x04,0x0C,0x44,0x4C,0x24,0x2C,0x64,0x6C,0x14,0x1C};
unsigned char segdecs[10] = {0x02,0x0A,0x42,0x4A,0x22,0x2A,0x62,0x6A,0x12,0x1A};
unsigned char segcent[10] = {0x01,0x09,0x41,0x49,0x21,0x29,0x61,0x69,0x11,0x19};

if(value > 99){
	cent = (value / 100) > 99 ? ((value / 100) % 100) : (value / 100);
	output_c(segcent[cent]);
	delay_ms(30);
}
if(value > 9){
	decs = (value / 10) > 9 ? ((value / 10) % 10) : (value / 10);
	output_c(segdecs[decs]);
	delay_ms(30);
}
unit = value % 10;
output_c(segunit[unit]);
delay_ms(30);
Como ves, guardé en un array (arreglo)los valores fijos, donde cada posición se encuentra asignado un número HEX, para que encendieran cada salida del puerto y así manejar un 7447 y a su vez encender la salida que activa cada display por separado...

Para no volverme un desastre y saber que puerto voy a encender, uso esta pagina :D

http://www.mathsisfun.com/binary-decimal-hexadecimal-converter.html

por ejemplo si quiero encender del puerto C las salidas 0 1 y 4 coloco en "Binary" 00010011 y el resultado en hex sería 26 ó 0x26, entonces si lo pongo así:

PHP:
output_c(0x26);
tendré los mismos resultados que:

PHP:
output_d(0b00010011)
 
Última edición:
#14
Gracias ratmayor voy a intentarlo, con tablas,

he aumentado dos efectos ahora el vumetro posee seis efectos, como se muestra en e video, espero les guste. saludos!!

 
Última edición:
#15
Gracias ratmayor voy a intentarlo, con tablas,

he aumentado dos efectos ahora el vumetro posee seis efectos, como se muestra en e video, espero les guste. saludos!!
dinoelectro, muy bueno. Recuerda que desde el año pasado tengo una deuda pendiente contigo y con los foreros de poner los efectos de luces y por raro que parezca se me ha ido el santo al cielo.
Pido mil disculpas. Esta noche sin falta pondré el video de cómo quedaron los juegos de luces, porque el árbol ya lo he quitado.
Pondré también el código tal y cómo lo he hecho a mi manera para que veas el tema de los arrays, por si te sirve algún ejemplo.
 
Última edición por un moderador:
#16
:Hola miglo, claro que me acuerdo, fue en la navidad anterior, igual yo empezaba con el asunto del vu-metro y hasta ahora recién lo vengo acabar,, :LOL: me interesaría bastante ver el código y aprender nuevas técnicas de programación. te agradezco bastante esa buena voluntad de compartir con todos nosotros (y)

Saludos miglo, :D
 
#17
Hola,tengo una consulta de pronto ustedes saben de algun circuito para conectar el vumetro a la salida de audio de un equipo de sonido.. es decir no recibir el audio desde un microfono electret, sino directo, para que no se vea afectado por el ruido ambiente... de antemano agradezco a esa alma caritativa que me asesore con esto.. saludos!!
 
#19
Gracias, Don Rat.
¿Y de pronto, sabes si hay forma de conectar a la salida de audio sin callar a los parlantes?
Ese es otro problema que no consigo resolver.
 
Última edición por un moderador:
Arriba