top of page

5. MiDispositivoMidi: El Código

En este post voy a explicar cómo se hizo la biblioteca MiDispositivoMidi. Fue programado en C ++ para la v1.0 MiDispositivoMidi usando Arduino UNO. Registro de la versión:

 

v1.0 versión real. Utiliza Arduino UNO. Descarga biblioteca: v1.0 MiDispositivoMidi:
Esta es la v1.0 biblioteca desarrollada en C ++ para MiDispositivoMidi. El código está escrito en español, así que lo siento por no hablan español. No te preocupes, estamos trabajando en una nueva versión en Inglés, con más funcionalidades y código más limpio.

 

Si no lo puede hacer la biblioteca, utilice los ejemplos. Con ellos aprenderás paso a paso las diferentes funciones, las variables, ... Para el uso con Logic, Ableton, Nuendo o lo utilizan el Ejemplo 11 (MiDispositivoConSecuencidor).

 

Breve explicación de cada ejemplo. Utilice siempre una velocidad de transmisión de 115.200.

 

1_ManejoLeds1: Este primer ejemplo es para comprobar que el led se sueldan correctamente. El son 7 colores disponibles.
2_ManejoLeds2: Utiliza el encenderArray función (). Esta función le permite a la luz hasta el led en un patrón determinado dada por una matriz.
3_PotenciometroSerial: Comprobar los potenciómetros.
4_BotonesSerial: Compruebe los botones.
5_BotonesModificarNotasSerial: Mostrar cómo cambiar las notas enviadas.
6_MidiYPotenciómetros: Le permite empezar a utilizar midi! Usted necesitará sin pelo y Midiyoke 
7_MidiYBotonesYPotenciometros: Igual que el ejemplo 6, sino también el uso de los potenciómetros.
8_MidiYPaginas: Cada vez que se pulsa el botón del interruptor (ubicado debajo MiDispositivoMidi) 16 se añade a la nota que envíe.
10_MiDispositivoMidiConSampler: Ejemplo no se recomienda. Este ejemplo sólo enviar mensaje NoteOn al empujar un botón. Se envía ningún mensaje NoteOff.
11_MiDispositivoConSecuenciador: Este ejemplo es para el uso con un DAW (Ableton, Logic, Nuendo, ..)


v2.0 Esta versión está todavía en construcción. Estamos planeando sobre el uso de Teensy lugar de Arduino UNO. También tendrá mucho más funcionalidades, como la recepción de midi, el manejo de una extensión de ocho potenciómetros, no necesitarán sin pelo y MidiYoke, ... También estamos trabajando en un código más limpio.


Le permite explicar cómo se hizo la biblioteca. Esta parte es muy difícil de leer y tal vez aburrido, pero hay conceptos muy importantes que son muy recomendables para entender.

 

1. Manejo de las entradas

 

Esta parte fue bastante fácil, sólo utiliza una biblioteca de Arduino llamado teclado. El uso de esta biblioteca que necesitábamos 8 pines conectados a SWITCH 1,2,3,4 Y SWT-GND 1,2,3,4. La biblioteca hizo el resto.

 

Información sobre el teclado de biblioteca: la biblioteca del Teclado
Información acerca de cómo funciona una matriz: aquí y aquí. También explica los problemas de efecto fantasma y enmascaramiento.
Este esquema se muestra también cuenta con conexión para RGB LED, ignorarlos. Ver esquema en Sparkfun.

 

 

2. Manejo 16 LEDs RGB (48 LEDs)

 

¿Cuál es el 74HC595?

 

Es un registro de desplazamiento que le permite controlar hasta ocho salidas utilizando sólo tres pines de Arduino (enganche, de reloj y datos). Usted puede agregar más registros de desplazamiento para el manejo de más salidas. En este post voy a mostrar cómo manejar hasta 48 leds utilizando dos registros de desplazamiento. Echa un vistazo a la hoja de datos del 74HC595 y este vínculo interesante.

¿Por qué el uso de registros de desplazamiento?

 

Imaginemos que queremos utilizar 8 LEDs para nuestro proyecto. Si no utilizamos registros de desplazamiento que tendremos que utilizar 8 pines de Arduino (Arduino tiene 13 pines digitales). Sólo tenemos 5 pines a la izquierda y eso no es cool. Si utilizamos un registro de desplazamiento podemos ahorrar 5 pines (el 74HC595 sólo necesita 3 pines de Arduino). Deja cómo:

 

Necesitaremos:

 

  1. r)UNO Arduino (o simila

  2. x02 74HC595

  3. resistencias x16 220 Ohm

  4. LED x16

  5. Algunos de alambre y protoboard

Vamos a ver la función de cada pin del 74HC595:

  1. Q0 ... Q7 Estos son los 8 salidas disponibles. Aquí vamos a conectar nuestras resistencias seguidas de los leds.

  2. Pin GND Tierra. Sólo tiene que conectar este pin a tierra de la placa Arduino.

  3. Vcc Fuente de alimentación de 5 voltios. Conectarse a 5v del Arduino.

  4. OE "habilitación de salida". Conectar a GND, es de bajo activo.

  5. MR "Maestro Reclear". Es activa baja. Conectarse a 5v de Arduino.

  6. DS "Serie Digital". Conectar al pin 11 de Arduino. Este pin se utiliza para enviar datos de Arduino para el registro de desplazamiento.

  7. SH_CP despertador, Conectar al pin 12 de Arduino.

  8. ST_CP Latch. Conectar al pin 8 de Arduino.

  9. Q7 'Nosotros no utilizará este pin en este ejemplo. Se utiliza cuando se conecta más de un registro de desplazamiento.

 

Ejemplo 1 utilizando registro de desplazamiento

 

¿Demasiado rapido? Vamos a ver paso a paso lo que tenemos que hacer. Supongo que usted sabe cómo usar un protoboard. Haga esta conexión:

 

  • Vcc (74HC595) -> 5v (Arduino)

  • MR (74HC595) -> 5v (Arduino)

  • OE (74HC595) -> GND (Arduino)

  • GND (74HC595) -> GND (Arduino)

Ahora conecte el siguiente:

 

  • SH_CP (74HC595) -> pin 12 (Arduino)

  • ST_CP (74HC595) -> pin 8 (Arduino)

  • DS (74HC595) -> pin 11 (Arduino)

Conectar el Q0 salidas ... Q7 a las resistencias. ADVERTENCIA! Asegúrese de realizar las conexiones correctamente, Q0 es la primera salida y se encuentra a la derecha del 74HC595.

Conectar el ánodo de cada LED a la resistencia y el cátodo a masa. Ver este esquema en caso de duda (no la mía copiado de aquí). No utilicé el condensador pero si usted está interesado en, busco sobre "condensador de desacoplamiento".

Ahora es el momento de código. Copia este código a su Arduino Sketch.

  • const int latchPin = 8; //latch pin

  • const int clockPin = 12; //clock pin

  • const int dataPin = 11; //data pin

  •  

  • void setup(){

  • pinMode(latchPin, OUTPUT);

  • pinMode(dataPin, OUTPUT);

  • pinMode(clockPin, OUTPUT);

  • }

  • void loop(){

  • encender(B01000000);

  • }

  • void encender(byte valorLeds){

  • //Turn off the output

  • digitalWrite(latchPin, LOW);

  • //Move the data

  • shiftOut(dataPin, clockPin, LSBFIRST, valorLeds);

  • //Turn on the output

  • digitalWrite(latchPin, HIGH);

  • }

El código es bastante fácil. Definir los pasadores, que usan pines como salida, utilice la función "Encender", que significa encender. Cero significa off y uno significa sucesivamente. Este código debe encender el segundo dirigido. Si cambiamos el loop () para este código de abajo, veremos algo fresco. Puede codificarse mejor, pero el propósito es entender cómo funciona la función.

 

  • void loop(){

  • encender(B11111111);

  • delay(100);

  • encender(B10111111);

  • delay(100);

  • encender(B11011111);

  • delay(100);

  • encender(B11101111);

  • delay(100);

  • encender(B11110111);

  • delay(100);

  • encender(B11111101);

  • delay(100);

  • encender(B11111110);

  • delay(100);

  • encender(B01111111);

  • delay(100);

  • }

Uso de 2 registros de desplazamiento

 

Ahora vamos a manejar 8 leds más, así que vamos a necesitar otro registro de desplazamiento. Las conexiones del segundo registro de desplazamiento son las mismas que la primera, pero no se conectan la DS de la segunda.

 

Conexiones de la segunda regsiter turno:

 

  • Q0 ... Q7 del nuevo registro de desplazamiento, conectado a 8 leds más.

  • GND a GND de Arduino, igual que el primero 595.

  • Vcc a 5V, mismo que primero 595.

  • OE conectado a GND, mismo que en primer lugar.

  • MR 5v de Arduino, mismo que primero

  • DS No conecte AÚN

  • SH_CP Pin 12 de Arduino (o SH_CP del primer 595, que es el mismo)

  • ST_CP Pin 8 de Arduino (o ST_CP del primer 595, es lo mismo)

Ahora es el momento de hacer una conexión entre los registros de desplazamiento. Vamos a utilizar Q7 'del primer registro de desplazamiento conectado a DS del segundo.

Ver este esquema copiado desde aquí.

Utilice el código de abajo. Hay que ver todos los leds encendidos.

 

  1. Si utiliza Encender (B00000000, B11111111), sólo los últimos ocho leds se encenderán.

  2. Si utiliza Encender (B10101010, B10101010) ¿qué pasaría?

 

  • const int latchPin = 8; //latch pin

  • const int clockPin = 12; //clock pin

  • const int dataPin = 11; //data pin

  •  

  • void setup(){

  • pinMode(latchPin, OUTPUT);

  • pinMode(dataPin, OUTPUT);

  • pinMode(clockPin, OUTPUT);

  • }

  •  

  • void loop(){

  • encender(B11111111,B11111111);

  • }

  • void encender(byte parteAlta, byte parteBaja){

  • //Turn off the output

  • digitalWrite(latchPin, LOW);

  • //Move the data

  • shiftOut(dataPin, clockPin, LSBFIRST, parteBaja);

  • shiftOut(dataPin, clockPin, LSBFIRST, parteAlta);

  • //Turn on

  • digitalWrite(latchPin, HIGH);

  • }

También podemos hacer algo más divertido que podemos cambiar algo de código.

Manejo de LED usando la matriz

 

Anteriormente hemos explicado cómo utilizar 16 led regular (no rgb) utilizando dos registros de desplazamiento. Ahora es el momento de utilizar 16 leds rgb que significa que tendremos que manejar 48 leds. Así que tendremos que utilizar los leds como una matriz (4 × 4). Es así como se hizo MiDispositivoMidi.

 

Ver este esquema e ignorar las etiquetas de conmutación (nos explicó que antes).

(Es muy importante comprender este esquema). Fundada aquí.

 

Tendremos que conectar cada etiqueta a un pin de nuestra par de registros de desplazamiento. Usted elige el orden, sino que es preferible poner en un orden lógico como RED1,2,3,4 BLUE1,2,3,4 al primer registro de desplazamiento de Q0 a Q7 y GREEN1,2,3,4LED-GND1, 2,3,4 a la Q0, Q7 del segundo registro de desplazamiento.

 

  • ROJO 1, 2 ROJO, ROJO 3, RED 4: Esto controlará el color rojo de cada fila.

  • AZUL 1, 2 AZUL, AZUL 3, 4 AZUL: El color azul de cada fila.

  • VERDE 1, 2 VERDE, VERDE 3, 4 VERDE: El color verde de cada fila.

  • LED-GND1, LED-GND2, LED-GND3, GND4 LED. "Activa" de cada columna.


Puede ser un poco desordenado, así que vamos a ver un ejemplo. Imagen que queremos encender el (1,1) elemento de nuestra matriz en color rojo.

LED-GNDn funciona como la habilitación de cada columna. Estamos utilizando ánodo común por lo que la habilitación es activa alta. Queremos permitir a la primera columna (véase la imagen de arriba) por lo que necesitamos LED-GND1 = 1.
También tenemos que activar el color rojo de la primera fila, por lo RED1 = 0 (los colores son baja activa)
El resto de permite-GND2,3,4 LED = 0 (inactivo) y el resto de los colores 1 (inactivo).
Vea lo ánodo común o cátodo aquí. Este puesto supone que está utilizando ánodo común. Esa es la razón por la cual permiten son activos de alto y color son baja activa.

Otro ejemplo:

 

  • LED-GND1 = 1

  • LED-GND2 = 1

  • LED-GND3 = 1

  • LED-GND4 = 0

  • RED1 = 0

  • Colores Resto = 1


Nosotros permitimos a los tres primeros cols y nos permitimos el color rojo de la primera fila. El resultado será la siguiente:

En el proyecto MiDispositivoMidi hemos utilizado los siguientes pines para la conexión de los registros de desplazamiento.

 

  • pin 10 Arduino -> Latch

  • pin 11 Arduino -> Datos

  • pin 12 Arduino -> Reloj


Este es el esquema utilizado en nuestro PCB. Si desea cambiar los datos para activar algunos leds se cambia el orden, por lo que es diferente del ejemplo anterior.

 

  • Primer byte: RED4-RED3-RED2-RED1-Blue4-Blue3-BLUE2-Blue1 (Q0 ... Q7 del primer 595)

  • Segundo byte: green4-green3-Green2-green1-LEDGND4-LEDGND3-LEDGND2-LEDGND1 (Q0 ... Q7 de la segunda 595)

  • Recuerde: Los colores activos de bajo y permite activa-alta.


Así que si queremos encender el primero llevado en verde color de la primera fila (1,1 en verde) vamos a tener que cambiar lo siguiente:

 

1111 1111 1110 0001

bottom of page