Paduino 0.1 (pads MIDI basados en arduino)

#1 por Man with the x-ray eyes el 26/10/2012
Hola,
Aquí os cuelgo mi último proyecto, que podría añadirse a la lista de proyectos DIY.
Después de mucho tiempo viendo proyestos de baterías electrónicas hechas con arduino y no encontrar ninguno que (a mí) me funcionasen bien, me puse manos a la obra y finalmente lo tengo terminado. (Gracias por su ayuda a Víctor y a Diego)
El bicho consiste en dos pads reciclados de una batería de PlayStation que alguien tiró a la basura. La batería en sí no funcionaba, pero yo he reutilizado los pads que tiene a modo de platos, los he conectado a un arduino y p'alante!
Lo que me parece más interesante de este proyecto es que le he incluido unos botones con el que se puede seleccionar la nota que envía el Pad, y tiene dos botones por pad (uno para subir de nota y otro para bajar) que nos permiten seleccionar independientemente qué sonidos queremos usar en cada uno. así se convierte en algo realmente útil. En mi caso, estos pads se acoplarán a la batería de mi grupo y el batera podrá disparar diferentes efectos.
Mis conocimientos de electrónica y de programación son escasos, así que si alguien con más conocimiento ve algo que no debería ser así agradecería su opinión

Ingredientes:
Arduino Duemilanove
Piezos x2 (o róbale la batería de la PlayStation a tu hermano pequeño)
pushbuttons x4
Resistencias de 220 Ohms x1 (para el cable MIDI)
Resistencias de 10k x6
Protoboard x1
Conector MIDI x1
cable
(Arduíno incluido saldría por unos 35€)

Código

/*
PADUINO based on MIDI note player (by Tom Igoe)

This sketch shows how to use two piezos to send Midi notes. It's able to change the note of wich one, using pushbuttons.

The circuit:
* digital pin 1 connected to MIDI jack pin 5
* MIDI jack pin 2 connected to ground
* MIDI jack pin 4 connected to +5V through 220-ohm resistor
Attach a MIDI cable to the jack, then to a MIDI synth, and play music.
PiezoA connected to analog pin 0
PiezoB connected to analog pin 1
buttonmasA connected to digital pin2
buttonmenosA connected to digital pin3
buttonmasB connected to digital pin4
buttonmenosB connected to digital pin5
created 13 Jun 2006
modified 2 Jul 2009

modified 21 may 2012 by The man with the x-ray eyes
This example code is in the public domain.
https://elcastizo-vpn/wiki/index.php/Incluir_dos_botones_de_selecci%C3%B3n_de_sonido_al_piezo_MIDI
*/
#define PIEZOATHRESHOLD 14//change this value
#define PIEZOBTHRESHOLD 14
#define piezoAPin 0
#define piezoBPin 1
// this constant won't change:
const int buttonmasAPin = 2;
const int buttonmenosAPin = 3;// the pin that the pushbutton is attached to
const int buttonmasBPin = 4;
const int buttonmenosBPin = 5;// the pin that the pushbutton is attached to
const int ledPin = 13; // the pin that the LED is attached to
// Variables will change:
int noteA = 69; //MIDI note 69=A (440hz)
int noteB = 74;
int buttonmasAState = 0; // current state of the button
int lastButtonmasAState = 0; // previous state of the button
/// int buttonmenosPushCounter = 0; // counter for the number of button presses
int buttonmenosAState = 0; // current state of the button
int lastButtonmenosAState = 0; // previous state of the button

int buttonmasBState = 0; // current state of the button
int lastButtonmasBState = 0; // previous state of the button
/// int buttonmenosPushCounter = 0; // counter for the number of button presses
int buttonmenosBState = 0; // current state of the button
int lastButtonmenosBState = 0; // previous state of the button

int valA;
int valB;
void setup() {
// initialize the button pin as a input:
pinMode(buttonmasAPin, INPUT);
pinMode(buttonmenosAPin, INPUT);
pinMode(buttonmasBPin, INPUT);
pinMode(buttonmenosBPin, INPUT);
// initialize the LED as an output:
pinMode(ledPin, OUTPUT);
// initialize serial communication:
// Set MIDI baud rate:
Serial.begin(31250);
}

void loop() {
valA = analogRead(piezoAPin);
if( valA >= PIEZOATHRESHOLD ) {

while(analogRead(piezoAPin) >= PIEZOATHRESHOLD/3) {

}
noteOn(0x90,noteA,0x45);
// delay(0);
noteOn(0x90,noteA,0x40);
}
valB = analogRead(piezoBPin);
if( valB >= PIEZOBTHRESHOLD ) {

while(analogRead(piezoBPin) >= PIEZOBTHRESHOLD/3) {

}
noteOn(0x90,noteB,0x45);
// delay(0);
noteOn(0x90,noteB,0x40);//0x00 = note off, but 0x40= no velocity
}

buttonmasAState = digitalRead(buttonmasAPin);
buttonmenosAState = digitalRead(buttonmenosAPin);
buttonmasBState = digitalRead(buttonmasBPin);
buttonmenosBState = digitalRead(buttonmenosBPin);

// compare the buttonState to its previous state
if (buttonmasAState != lastButtonmasAState) {
// if the state has changed, increment the counter
if (buttonmasAState == HIGH) {
// if the current state is HIGH then the button
// wend from off to on:
if (noteA <127)
{ noteA++; }
else { noteA = 0; }
// compare the buttonState to its previous state
}
}
if (buttonmenosAState != lastButtonmenosAState) {
// if the state has changed, increment the counter
if (buttonmenosAState == HIGH) {
// if the current state is HIGH then the button
// wend from off to on:
if (noteA > 0)
{ noteA--; }
else { noteA = 127; }

}
// compare the buttonState to its previous state
// if the current state is LOW then the button wend from on to off:

}

// save the current state as the last state,
//for next time through the loop
lastButtonmasAState = buttonmasAState;
lastButtonmenosAState = buttonmenosAState;

if (buttonmasBState != lastButtonmasBState) {
if (buttonmasBState == HIGH) {
if (noteB <127)
{ noteB++; }
else { noteB = 0; }
}
}
if (buttonmenosBState != lastButtonmenosBState) {
if (buttonmenosBState == HIGH) {
if (noteB > 0)
{ noteB--; }
else { noteB = 127; }

}
}

// save the current state as the last state,
//for next time through the loop

lastButtonmasBState = buttonmasBState;
lastButtonmenosBState = buttonmenosBState;
}
// plays a MIDI note. Doesn't check to see that
// cmd is greater than 127, or that data values are less than 127:
void noteOn(int cmd, int pitch, int velocity) {
Serial.write(byte (cmd));
Serial.write(byte (pitch));
Serial.write(byte (velocity));
}

Bueno, creo que eso es todo, si alguien se anima a hacerlo y le surge cualquier duda, ya sabéis donde me tenéis
saludos
The Man
Archivos adjuntos:
600px-Midi_piezo_2_botones_bb.jpg
BBCode:
paduino proto.JPG
BBCode:
pad play.JPG
BBCode:
batería play.JPG
BBCode:
pad abierto.JPG
BBCode:
Subir
3
#2 por landrux el 22/11/2012
Buenas muy bueno tu proyecto mi duda es, como conecto la parte del MIDI ya que no tengo ningun controlador MIDI o solamente se tiene que conectar asi, y la otra pregunta es para cuantos pads o sensores piezoelectricos seria, muchas gracias y saludos.
Leandro.
Subir
1
#3 por Man with the x-ray eyes el 22/11/2012
Hola Leandro,
Lo que hay aquí es un controlador MIDI en sí mismo, osea que solo tendrías que conectar el cable MIDi a tu tarjeta de sonido, abrir un instrumento virtual y al golpear el Pad sonaría. Luego con los botones podrías cambiar la nota que envías.
En cuanto al número de Pads, en este proyecto son dos, que era lo que necesitaba para el batera de mi grupo (aunque en el esquema solo tengo uno, el código está preparado para dos). en este caso, el primer piezo está conectado por un lado al Pin "Analog In 0 " del arduino y por otro a 5 volts. segundo piezo tendría que ir conectado a 5 volts y al Pin "Analog IN 1" del arduino. Si quieres incluir más piezos es tan sencillo como realizar la misma operación siguiendo por el Analog In 2, etc, y eso sí, escribiendo en el código todo lo referente a ese nuevo piezo: p.ej:
Al principio del código aparece lo siguiente:
#define PIEZOATHRESHOLD 14//change this value
#define PIEZOBTHRESHOLD 14
#define piezoAPin 0
#define piezoBPin 1
a esto tendríamos que añadir:
#define PIEZOCTHRESHOLD 14
#define piezoCPin 2,
qudando la cosa como:
#define PIEZOATHRESHOLD 14//change this value
#define PIEZOBTHRESHOLD 14
#define PIEZOCTHRESHOLD 14
#define piezoAPin 0
#define piezoBPin 1
#define piezoCPin 2,

y así sucesivamente...

Espero haber solucionado tus dudas y a ver si os animáis a realizar el proyecto y a añadirle mejoras..
Gracias,
saludos
Subir
#4 por landrux el 22/11/2012
Muy claro y rapido gracias por la respuesta voy a probar, yo hice el proyecto de spikenzielabs.com/.../DrumKitKit.html y anda bien, solo que tengo un arduino uno y puedo utilizar 6 entradas analogas las cuales son pocas (necesito 12) como para armar una bateria electrica como la gente jaja. tu proyecto lo puedo utilizar para el hit hat voy a probar en modo abierto cerrado y para el snare tal vez me sea muy util gracias de nuevo y espero compartir mis proyectos pronto saludos.
PD.: cuando me decis que lo conecte a la placa de sonido queres decir que tendria que tener un conversor de midi a pc o se puede hacer algo casero.
Subir
1
#5 por Man with the x-ray eyes el 22/11/2012
Una solución para poder usar más entradas analógicas es multiplexar, pero yo ahí todavía me pierdo. He visto algunos proyectos para controlar leds con arduino, y tengo por ahí algún esquema para hacerlo (con leds, no de MIDI) pero al fin y al cabo será algo similar, pero yo es que soy un poco lento para estas cosas y todavía no he tenido tiempo de mirarlo. Pero esa es la solución definitiva. A ver si para estas navidades tengo tiempo de mirarlo porque me quiero hacer esto mismo pero con 9 pads, y voy a necesitar multiplexar para poder hacerlo, por esto mismo que dices. La otra solución es un arduino Mega, que tiene más entradas, pero el precio.... y además es bastante grande.
En cuanto a la salida, tiene que ser con un cable MIDI, me imagino que con tu pregunta te refieres a conectarlo directamente por puerto usb. Ni idea de cómo hacerlo, debe ser algo bastante complejo. El usb en mi proyecto lo uso solo para alimentar el arduino, y esto podría hacerlo con una pila o con un adaptador de corriente, pero no transmite datos. Necesitas una tarjeta de sonido con entrada MIDI. Si no, podrías usar un cable de estos:
http://www.thomann.de/es/miditech_midilinkmini.htm
Saludos, y espero ver por aquí tus novedades! :birras:
Subir
#6 por Man with the x-ray eyes el 22/11/2012
Y por cierto... Bienvenido a este foro!!!
Subir
#7 por Man with the x-ray eyes el 22/11/2012
Una cosa importante que se me olvidaba comentarte es que el PIEZOTHRESHOLD, es el umbral en el que la señal enviada por el piezo es interpretada por el arduino como un golpe. Te recomiendo que hagas varias pruebas para ajustarlo porque el de mi código está ajustado para los pads de la batería de PlayStation, cuando he hecho pruebas con otros piezos tuve que cambiar bastante este valor para obtener la sensibilidad adecuada.
Saludos!
Subir
#8 por landrux el 22/11/2012
Gracias por la respueta y por la bienvenida.
Con respecto a los multiplexores estoy probando con varios, el 4051 y una placa de sparckfun.com (The CD74HC4067 + Arduino) , la cual tiene 16 entradas analogas pero por ahora sin resultado 100 % efectivo, buscando por la web esta lleno de foros y de esquemas pero a mi me pasa lo que te pasa a vos de electrónica se muy poco y lo que hago lo hago de corajudo, bueno te mando un abrazo y estaremos en contacto, saludos y muchas gracias.
Subir
#9 por Man with the x-ray eyes el 22/11/2012
"corajudo", jejeje... me gusta la palabra...
Cualquier cosa que te surja estamos en contacto, a ver si entre los dos podemos solucionarlo (una lástima que ya no pase San Mudo por aquí, es un crack el tío!!)
Subir
#10 por mustang64 el 22/11/2012
Buenas noches,
Yo tengo el mux de sparkfun y me funciona estupendamente. La plaquita de sparkfun tiene de bueno que ya está soldado y ocupa poco (es smd). Sólo tienes que soldarle los conectores/pines. También te lo puedes hacer a mano, pero tienes que hacer muchas soldaduras, y depende de cómo se te dé.
Al principio se puede sufrir un poco, pero en cuanto lo pones en marcha no hay quien te pare.

Para la salida midi del arduino hay que poner un conector como dice en la página de arduino: http://arduino.cc/en/uploads/Tutorial/MIDI_schem.png. Es muy fácil y funciona. Recomiendo no conectarlo al pin 1, que es el del puerto serie (y se usa para comunicarse con el pc mientras se programa) y usarlo conectado a otro puerto por medio de la librería SoftwareSerial. De velocidad es igual que los UART, pero mientras manda, el programa no continúa, vamos, que no tiene búfer. La conexión de un MIDI IN al arduino es algo más complicada.

Saludos.

M64
Subir
1
#11 por Man with the x-ray eyes el 22/11/2012
Interesante el Mux...
Lo que me preocupa de multiplexar sobre todo es el tema del código, porque nunca lo he hecho, pero bueno con paciencia, y viendo otros ejemplos seguro que termina saliendo. En mi caso el midi es out, por eso no hay problema.
Gracias por el aporte,
Saludos!
Subir
#12 por mustang64 el 23/11/2012
El código es muy sencillo. En esta página te lo pone: http://bildr.org/2011/02/cd74hc4067-arduino/

Para leer una entrada tienes que poner los pines S0..S3 del mux con el número de entrada que quieres leer: 0 --> 0000 (S0..S3), 1 --> 1000, 2 -->0100, hasta la 15 --> 1111. La única pega es que tienes que andar haciendo máscaras, para extraer los bits. En la página que indico, lía un poco el direccionamiento, pero este método es más sencillo:

void muxWrite(int whichChannel) {
for (int thisPin = 0; thisPin < 4; thisPin++) { // Para los 4 pines S0..S3
int pinState = bitRead(whichChannel, thisPin); // extrae del canal (0..15) el bit para ponerlo
digitalWrite(channel[thisPin],pinState); // Pone el Sx al valor que corresponde
}
}

Una vez que has puesto S0..S3 con los valores que necesitas (con esta función), lees del pin analógico con int valor = analogRead(MUXINPUT); (por ejemplo)
Subir
1
#13 por landrux el 23/11/2012
Gracias por contestar y por los aportes yo soy de argentina y por donde vivo no hay mucha gente que este en el tema de arduino por eso es muy importante sus colaboraciones los estare molestando seguramente en breve gracias saludos
Subir
1
#14 por landrux el 23/11/2012
buenas mustang64 queria saber si tienes el codigo completo de la placa de sparkun con lo que agregas en tu respuesta y si podrias ver esto que te mando que son dos codigos, 1 el de la placa y el otro de drumkit que lo saque de aca spikenzielabs.com/.../DrumKitKit.html, mi duda es como hago para unir estos dos codigos y que los pueda usar para fabricar una bateria electrica, o sea para que funcionen 16 piezoelectricos que a su vez lo aplico a serial midi converter y lo corro con el fl studio 10 con el addictive drum, espero me hayas entendido cualquier cosa avisame y te explico mas claro.
Muchisimas gracias y saludos.
PD.: no soy muy bueno en programar asi que si puedes ser los mas simple posible te lo agradeceria mucho, saludos y gracias nuevamente.
el codigo de drumm kit es para 6 pads, habria que cambiar valores para hacerlo de 16.
Subir
#15 por jruizcaballero el 23/11/2012
Buenas, yo estoy también liado haciendo algo con arduino.

Respecto a lo de midi sin necesidad de una pcb con un conector de midi y tal, yo consigo mandar midi a través del usb. Para ello utilizo "HIDUINO" que desde mi desconocimiento (lo he conseguido pero no me sé la teoría) hay que "flashear" un chip del arduino (tengo arduino UNO Rev3) y con eso mi pc reconoce a arduino como un controlador midi. El problema es que cada vez que quiera cambiar algo en la programacion del arduino tengo que flashear el firmware original, cargar el sketch y flashear el firmware de hiduino.

Respecto a los multiplexores, aún estoy investigando/probando como puedo obtener las salidas que yo quiera. De momento he probado con los multiplexores 4051 para obtener más entradas analógicas y no he obtenido los resultados deseados, puesto que me he informado que se pueden poner en cascada para tener más entradas todavía pero entre poco tiempo y tal pues de momento nada... Por lo que tengo medio entendido es que con estos no sé si podré detectar dos pulsadores presionados a la vez, sigo averiguando jeje

Estoy esperando unos desplazadores de registro (no se qué 595) para probar a aumentar las digitales. A ver si me llegan y me lío con ellos...

Saludos y si algún entendido del tema ve en mis párrafos alguna aberrosidad ruego me disculpe jajaj (soy un super novato)
Subir
1
Respuesta rápida

Regístrate o para poder postear en este hilo