Introduction: Vumetro ARDUINO Utilizando WINAMP
Hola amig@ le invito a revisar el siguiente instructable donde explico como construir un vumetro con 12 LEDS que reaccionan con la música que reproduce WINAMP.
MATERIALES
- ARDUINO UNO + CABLE USB
- 12 LEDS: 7 VERDES,
- 3 AMARILLOS,
- 2 ROJOS
- 12 RESISTENCIAS 330 OHM
- 1 PLACA UNIVERSAL
- 1 METRO DE ESTAÑO
- HERRAMIENTAS
- CAUTIN
- PINZA PELA CABLES
SOFTWARE
Step 1: Configuración Del Plugin
Después de Instalar el software WINLPT VERSION 2.09 y grabar el sketch en ARDUINO vamos a MENU INICIO/WINLPT y le damos clic en "launch WINAMP" (no iniciar winamp directamente ya que no se iniciará el plugin y posiblemente su computador deje de responder)
Dentor de winamp nos dirigimos al menú Opciones/vizualizacion/iniciar bajo la pestaña SETTINGS configurar los siguientes parámetros:
- COM el que esta conectado ARDUINO,
- Baudrate = 9600,
- Header = 1,
- DataBytesCount=12, numero de LEDS que vamos a utilizar
Step 2: Sketch
Para llevar a cabo este proyecto, se utilizo doce LED y doce resistencias de 330 ohm luego se las colocó en una placa perforada de manera que se la pueda montar sobre el ARDUINO y coincida con los pines 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13 y GND
El software winlpt envía una cadena de 0 hasta 32 bytes, en este caso, que solo encenderemos doce leds, programaremos para que el software envíe doce bytes únicamente; el primer byte enviado corresponde al inicio de la trama y siempre es 1, los siguientes 12 bytes corresponden a los datos: si el byte es 0 apaga el LED; si el byte es 255 enciende el LED
Ejemplos
1000000000000 Todos los Leds apagados
125500000000000 El primer led encendido
10000000255255255255255 los últimos cinco leds encendidos
El Programa para cargar en Arduino es el siguiente:
// 0 - APAGA TODO
// 255 - ENCIENDE EL LED
// CABECERA: 1
// 1 L1 L2 L3 L4 L5 L6 L7 L8 L9 L10 L11 L12
// PAQUETE COMPLETO: 1 0 0 0 0 0 0 0 0 0 0 0 0
// BYTES: 1..12
/////////////////////////////////////////////////////////////////////
// Program code
/////////////////////////////////////////////////////////////////////PINES DEL ARDUINO 2, 3, 4, 5,... 13
const int channels[] = {2,3,4,5,6,7,8,9,10,11,12,13};
const int baudrate = 9600;
// NUMERO DE CANALES
const int numChannels = sizeof(channels);
//CANAL ACTUAL
int curChannel = 0;
void setup()
{
Serial.begin(baudrate);
for(int i = 0; i < numChannels; i++)
{
pinMode(channels[i], OUTPUT);
digitalWrite(channels[i], LOW);
}
}void loop()
{
int y = Serial.available();
for (int i = 0; i < y; i++)
{
int inc = Serial.read(); // LEE EL DATO ENVIADO POR EL COMPUTADOR
if (inc == 1) // SI RECIBE EL NUMERO 1
{
curChannel = 0; //RESETEA EL CANAL ACTUAL A 0
continue;
}
if (curChannel < numChannels) // SI EL NUMERO DE CANAL ACTUAL ES MENOR AL NUMERO TOTAL DE CANALES
{
digitalWrite(channels[curChannel], !!inc); // ESCRIBE LA SEÑAL DE SALIDA
curChannel++;
}
}
}
Para comprender mejor la configuración del Plugin y ver al vumetro funcionando revise el vídeo.
Step 3: VUMETRO WINAMP CON MATRIZ P10
Ahora modificaremos el SKETCH para hacerlo funcionar con matrices P10; el código es el siguiente:
//CONEXIONES:
//ARDUINO________________DMD //PIN9___________________OE //PIN6___________________A //PIN7___________________B //PIN13__________________SLK //PIN8___________________SCLK //PIN11__________________SPI // Protocolo: // 0 - APAGA EL LED // 255 - ENCIENDE EL LED // 1 - CABECERA MARCA EL INICIO DE LA TRAMA // Baud Rate: 9600 // CABECERA: 1 // 1 L1 L2 L3 L4 L5 L6 L7 L8 L9 L10 L11 L12 // PAQUETE COMPLETO: 1 0 0 0 0 0 0 0 0 0 0 0 0 // BYTES: 1..12 ///////////////////////////////////////////////////////////////////// #include <DMD.h> #include <TimerOne.h> #include "Arial_black_16.h" #include "SystemFont5x7.h"//para letra pequeña #include "Arial_Black_16_ISO_8859_1.h"//para letra grande DMD display(1,2); const int baudrate = 9600; const int numChannels = 12; int curChannel = 0;void ScanDMD() { display.scanDisplayBySPI(); }
void writeLevel(int i, bool inc){ if (inc==1)display.drawCircle(15,15,i,GRAPHICS_NORMAL);else display.drawCircle(15,15,i,GRAPHICS_NOR); } void setup() { Timer1.initialize( 1000 ); Timer1.attachInterrupt(ScanDMD); Serial.begin(baudrate); }
void loop(){
int y = Serial.available();
for (int i = 0; i < y; i++) { int inc = Serial.read(); // LEE EL DATO ENVIADO POR EL COMPUTADOR if (inc == 1) // SI RECIBE EL NUMERO 1 { curChannel = 0; //RESETEA EL CANAL ACTUAL A 0 continue; } if (curChannel < numChannels) // SI EL NUMERO DE CANAL ACTUAL ES MENOR AL NUMERO TOTAL DE CANALES { inc = !!inc; //convierte 255 a 1 writeLevel(curChannel,inc); curChannel++; } } }