Webcervices. Con la tecnología de Blogger.
RSS

Unete a nuestro grupo de facebook

Unete a nuestro grupo de facebook
Hola que tal lectores de esta pagina tan maravillosa que es arduino Tec ...Los invito a que amplíen mas sus conocimientos en Arduino y Raspberry Pi Uniéndose a mi grupo Arduino Tec

3 - ENVIANDO SEÑALES MIDI VARIABLES CON DOS POTENCIOMETROS

MIDI - CAPITULO 3 - ENVIANDO SEÑALES MIDI VARIABLES CON DOS POTENCIOMETROS


Hola de nuevo. He avanzado un poco mas y, por si no se te ocurre como colocar dos potenciómetros, en este ejercicio vamos a llevar la tarea a cabo.

Tengo que comentar que si he tardado tanto en ponerlo es porque yo he tenido problemas a la hora de recibir los datos en el ordenador, y en algunas ocasiones giraba el potenciómetro 0 y cuando veía los datos en el programa s2midi me salía entre medio una nota del potenciómetro 1. En este código que coloco mas adelante no me ha pasado, pero me extraña, porque he modificado varias veces los datos y siempre me pasaba lo mismo. No se, quizás me faltaba algo por cambiar en el código.

Edito: EL MOTIVO POR EL QUE ME SALIA UNA NOTA DEL POTENCIOMETRO 1 ENTRE MEDIO DE LA DEL POTENCIOMETRO 0 Y VICEVERSA, ES DEBIDO A LA TOLERANCIA DEL POTENCIOMETRO.

- ¿QUE QUIERE DECIR? PUES QUE SI EL POTENCIOMETRO TIENE UNA TOLERANCIA DEL 5% SIGNIFICA QUE SU RESISTENCIA PUEDE VARIAR LIGERAMENTE EN CUALQUIER MOMENTO.

- ¿COMO ME AFECTA ESTO? PUES AFECTA PORQUE AL VARIAR LIGERAMENTE CAMBIA EL VALOR Y EL PROGRAMA ENTIENDE QUE HEMOS GIRADO EL POTENCIOMETRO, POR ESO ENVIA ESA NOTA.

- ¿COMO SE PUEDE ARREGLAR? PUES LIGERAMENTE SE PUEDE ARREGLAR AL ESTILO CHAPUZA, VARIANDO EL VALOR DE LAS VARIABLES analogSmoothx = 2; por analogSmoothx = 6; CON ESTO ES MAS DIFICIL DE QUE SALGA ESA NOTA, PERO TIENE UNA DESVENTAJA, TENEMOS QUE GIRAR MAS EL POTENCIOMETRO PARA QUE SE DETECTE EL CAMBIO.

- ¿HAY OTRA SOLUCION? SI, PUEDES GASTARTE MAS DINERO EN COMPRAR POTENCIOMETROS DE MAS CALIDAD, O PUEDES ESPERAR A QUE ENCUENTRE UN CODIGO QUE EVITE ESTO, PERO DE MOMENTO NO SE ME OCURRE NINGUNO.

ES TODO.

Bien, la colocación de dos potenciómetros es igual que cuando colocamos uno, solo que la patilla central del segundo potenciómetro tiene que ir a 1 analógico.


Después subimos el siguiente código a la placa y listo.

int midiChannel0 = 1;
int analogPin0 = 0;
int lastAnalog0 = 0;
int analogSmooth0 = 2;

int midiChannel1 = 1;
int analogPin1 = 1;
int lastAnalog1 = 0;
int analogSmooth1 = 2;

void setup()
{
Serial.begin(31250);
}

void loop()
{
Potenciometro0();
Potenciometro1();
}

void Potenciometro0()
{
int reading0 = 0;
reading0 = analogRead(analogPin0)/8;
if (abs(reading0-lastAnalog0) > analogSmooth0)
{
lastAnalog0 = reading0;
controlChange(midiChannel0,10,reading0);
}
}

void Potenciometro1()
{
int reading1 = 0;
reading1 = analogRead(analogPin1)/8;
if (abs(reading1-lastAnalog1) > analogSmooth1)
{
lastAnalog1 = reading1;
controlChange(midiChannel1,127,reading1);
}
}

void controlChange(byte channel, byte controller, byte value)
{
midiMsg(channel+0xB0, controller, value);
}

void midiMsg(byte cmd, byte data1, byte data2)
{
Serial.print(cmd, BYTE);
Serial.print(data1, BYTE);
Serial.print(data2, BYTE);
}

Cualquier programador normalito sabrá que este código se puede reducir mucho, pero después de lo que he sudado para llegar aquí no tengo muchas ganas de ponerme a recortarlo. Se que es muy importante recortar código para que tengamos espacio suficiente en la placa donde meterlo, pero por el momento no tengo ganas de complicarme mas la existencia. Por suerte, la versión duemilanove con el ATMEGA 328 tiene mucho espacio, y Serra cuestión de tiempo que tengamos placas con mucho mas donde almacenar, de hecho, ya hay placas arduino con muchísimo mas espacio y mucha mas velocidad de procesamiento, pero no podemos comprarnos una cada dos por tres.

Seguimos. He puesto en color rojo el código que forma parte del potenciómetro 0 (que es el 1º potenciómetro) y en verde el del potenciómetro 1 (que es el 2º potenciómetro). El resto del código es común a los dos y creo que con esto deberías saber como conectar mas de dos.

Ahora pasamos a describir el código.

Como puedes observar, al principio del código tenemos las cuatro variables que son del potenciómetro 0 y después las otras cuatro que son del potenciómetro 1.

A continuación configuramos el puerto serial a 31250.

Seguimos con el código y entramos en la función loop(), donde llamamos primero a la función Potenciometro0(). Una vez allí leemos el potenciómetro y si lo hemos variado llamamos a la función controlChange y le pasamos el canal (1), la nota (10) y por ultimo el valor del potenciómetro. La función controlChange() hace una pequeña modificación de los datos recibidos y llama a midiMsg() pasándole los datos y esta ultima coloca los 3 datos en el puerto usb uno detrás de otro. Aquí es donde S2Midi entra en acción, convirtiendo los 3 datos en señal midi y enviándolos al puerto midi virtual.

(En el código del articulo anterior olvide comentaros que la división entre 8 que se hace en la línea "reading0 = analogRead(analogPin0)/8;" es para convertir el valor del potenciómetro en un numero entre 0 y 127, es decir, en el volumen de la nota)

¿Por donde íbamos? Si, ya me acuerdo, habíamos terminado de comentar lo que pasaba si se había movido el potenciómetro 0. Si no lo hubiéramos movido sencillamente hubiéramos vuelto a la función loop() y seguiríamos por la segunda instrucción, que llama a la función Potenciometro1() y hace exactamente lo mismo que en la anterior, es decir, si varia, llama a controlChange pasándole los datos, después controlChange llama a midiMsg tras hacer una modificación de los datos y esta por ultimo envía las tres señales al puerto usb.

Todo esto sucede a una velocidad bastante alta y se estaría ejecutando constantemente para comprobar si hay algún cambio en los potenciómetros.

Por ultimo quiero indicaros que en este código estamos mandando los datos del siguiente modo:

Potenciometro0 -- Canal 1 -- Nota 10 -- Valor del potenciometro0/8
Potenciometro1 -- Canal 1 -- Nota 127 -- Valor del potenciometro1/8

Por esto, podemos observar que en la línea controlChange(midiChannel0,10,reading0); de la función Potenciometro0() estamos mandando la nota 10, en cambio, en la de la función Potenciometro1() mandamos la nota 127.

Es todo por hoy. Saludos y por favor, si alguien me lee que me deje un comentario, aunque sea un saludo o algo para saber que no estoy escribiendo para que nadie me lea :D

  • Digg
  • Del.icio.us
  • StumbleUpon
  • Reddit
  • RSS

1 comentarios:

Pablo dijo...

Hola, te felicito por este artículo, estoy muy interesado en crear me una controladora de DJ,
Si quiero poner más potenciometros, solo tengo que duplicar las líneas de Código que están en rojo y verde? , el total de potenciometros son 16 los que quiero poner en una Arduino mega,
No tengo nada de idea de programar, solo intento adaptar los códigos a mis necesidades
Gracias, un saludo

Publicar un comentario

Objetivo Y Reclamaciones

Este blog es un portal en el cual se publican contenidos de diferentes blogs.En los cuales se les anexa al pie de pagina un enlace a su pagina original aquí encontraran toda clase de proyectos de arduino y linux
Espero tengan una gran experiencia en este blog un Gran Saludo
de parte de la organización WebCervices..
objetivo
O del grupo ArduinoTec De arduino
Cualquier reclamación o petición comunicar al Administrador principal o hacer un comentario en la publicación que se sientan inconformes en los correos
electriarias@gmail.com
y para temas de suma importancia mi correo personal
pabioarias@hotmail.com

Siguenos en Twitter

Like

Unete a nuestro grupo de facebook

Hola que tal lectores de esta pagina tan maravillosa que es arduino Tec ...Los invito a que amplíen mas sus conocimientos en Arduino y Raspberry Pi Uniéndose a La mi grupo Arduino Tec

Unete Al Grupo De facebook

Unete Al Grupo De facebook
Amplia tus conocimientos debatiendo temas de Arduino y Raspberry pi