Taula de continguts:

EAL - Controlador MIDI Arduino: 7 passos
EAL - Controlador MIDI Arduino: 7 passos

Vídeo: EAL - Controlador MIDI Arduino: 7 passos

Vídeo: EAL - Controlador MIDI Arduino: 7 passos
Vídeo: #2 Como construir um controlador MIDI DIY: Fazendo Música com Arduino 2024, Desembre
Anonim
EAL - Controlador MIDI Arduino
EAL - Controlador MIDI Arduino

Fet per Søren Østergaard Petersen, OEAAM16EDA

Aquesta instrucció descriu un controlador MIDI basat en arduino. Es tracta d’un projecte escolar. Mitjançant la mà podeu reproduir melodies senzilles mitjançant la connexió MIDI i un instrument MIDI connectat (o com en aquest cas un ordinador portàtil que utilitza un programari softsynth). Podeu reproduir notes des d’una escala de Do major, c-d-e-f-g-a-b-c. Per poder connectar el controlador MIDI a un portàtil, necessitareu una interfície MIDI a USB com m-audio Uno.

Pas 1: vídeo de demostració

Image
Image

Augmenteu el volum i gaudiu-ne!

Com funciona:

El controlador MIDI utilitza una placa Arduino MEGA 2560. Dos sensors de llum (LDR) integrats en un tub elèctric de 16 mm formen un sistema de doble sensor i s’utilitzen per crear un activador estable sense que es produeixi un doble activador fals. Una llanterna crea un feix de llum, quan el feix s’interromp amb la mà que toca el controlador, el sensor de llum inferior detecta el feix que falta i un sensor d’ultrasons HC-SR04 mesura la distància del sensor a la mà.

La distància mesurada s’utilitza al programa Arduino per calcular i configurar el valor del número de nota adequat per empaquetar-lo en un missatge MIDI Note On i un transmissor a la interfície MIDI. La interfície de sortida MIDI utilitza un inversor hexagonal 74HC14 i és pràcticament un circuit estàndard. La comunicació MIDI utilitza serial1, el port sèrie estàndard s’utilitza per a la depuració.

Quan la mà es mou cap amunt i lluny del feix de llum, el sensor de llum superior torna a detectar el feix de llum i s’omple un missatge MIDI Note Off i es transmet la sortida MIDI.

L’àrea de joc entre els sensors és d’uns 63 cm i la longitud total del controlador MIDI d’uns 75 cm.

Pas 2: detalls dels sensors de llum

Detalls dels sensors de llum
Detalls dels sensors de llum
Detalls dels sensors de llum
Detalls dels sensors de llum

Els dos sensors de llum es munten els uns sobre els altres per formar un sistema de doble sensor. Evita l'activació falsa quan s'utilitza correctament al programari. Cada sensor de llum consisteix en un mòdul de resistència fotogràfica integrat en un tub elèctric estàndard de 16 mm. Es fa una ranura a cada tub amb una serra mecànica i es pot prémer la PCB de resistència fotogràfica a la ranura. Els sensors s’enganxen amb cinta adhesiva i també es fixen en un extrem d’un tros de fusta. Cap llum ha de poder arribar als sensors per darrere. Els sensors de llum han incorporat resistències de tracció de 10 k.

Pas 3: detalls del sensor d'ultrasons HC-SR04

Detalls del sensor d'ultrasons HC-SR04
Detalls del sensor d'ultrasons HC-SR04

El sensor ultra sonor HC-SR04 està fixat a l’altre extrem del controlador MIDI. Aquí es col·loca una llanterna brillant, que crea el feix de llum necessari.

Pas 4: el circuit Aduino

El Circuit Aduino
El Circuit Aduino
El Circuit Aduino
El Circuit Aduino

El circuit de sortida MIDI és bàsicament un inversor hexagonal estàndard 74HC14 i algunes resistències més un connector femella DIN de 5 pins. El circuit 74HC14 condueix la sortida MIDI i, al mateix temps, proporciona alguns mitjans de protecció per a la placa Arduino contra el "món real" connectat a la sortida MIDI. Una característica pràctica addicional és el LED d'activitat MIDI que indica quan s'envien dades.

He utilitzat un prototip de PCB adequat per al meu maquinari perquè tenia molts problemes amb connexions defectuoses a la taula de suport. L’esquema es realitza a Fritzing, es pot descarregar una còpia en pdf d’alta resolució prement l’enllaç següent. Prefereixo fer servir un programa d’esquemes adequat com Kicad, crec que Fritzing està limitat a qualsevol cosa menys als experiments més senzills.

Materials utilitzats:

1 unitat Arduino MEGA 2560

2 unitats de resistència fotogràfica (LDR) amb resistència incorporada incorporada (a partir del kit de 37 sensors)

1 sensor de ultrasons HC-SR04

1 gatet Schmitt d'inversió hexagonal 74HC14

2 peces de resistència de 220 Ohm 0.25W

1 unitat de resistència 1k Ohm 0,25W

1 peça LED de baixa intensitat 2mA

Condensador ceràmic d'1 unitat 100nF (per al desacoblament de la font d'alimentació, directament als pins d'alimentació del 74HC14)

Tauler de pa o prototip de PCB

2 peces de tub elèctric de 16 mm, longitud 65 mm

1 unitats de fusta, longitud 75cm

Cinta adhesiva

Filferros

Pas 5: llistat d'E / S

Llistat d'E / S
Llistat d'E / S

Pas 6: el codi Aduino

El sketch test_Midi6 utilitza la biblioteca NewPing que heu d’incloure al vostre entorn de programació Arduino per utilitzar el sensor d’ultrasons HC-SC04. L’esbós es comenta en danès, ho sento. Per mantenir l’esbós ben estructurat, es composen funcions separades per a diferents parts lògiques de l’esbós i s’eviten les variables globals. El flux de programa es visualitza al diagrama de flux del controlador MIDI pdf.

// 15-05-2017 versió: test_Midi6

// Søren Østergaard Petesen // Arduino MEGA 2560 // Dette program udgør en simpel MIDI controller som kan styre en extern MIDI enhed, f.eks en softsynt på en PC. // MIDI controleren kan sende toneanslag (note on kommando) hhv. (note off kommando) for en oktav C-C, C dur skala. // Der spilles med en "karate hånd" på et brædt // hvor sensorerne er monteret. MIDI kommandoerne trigges af en dobbelt LDR sensor, da der skal laves en sikker // detektering af både når hånden lander på brættet (note on), samt når hånden fjernes igen (note off). // MIDI commandoerne "note on" og "note off" består hver af 3 bytes som sendes on serial1 porten // vha det i hardware opbyggede MIDI interface. // Tonehøjden bestemmes vha ultralydssensor HC-SR04 #include // bibliotek til den anvendte ultralydssensor HC-SR04 #define TRIGGER_PIN 3 // Arduino pin til trigger pin på ultrasonic sensor #define ECHO_PIN 2 // Arduino pin til echo pin på ultrasonic define MAX_DISTANCE 100 // Maximum stand for Ping #define Median 5 // Antal målinger der beregnes gennemsnit af for at få en sikker afstandsbestemmelse NewPing sonar (TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE); // Creació de l'objecte NewPing. int Senspin1 = 53; // Underste LDR1 føler int Senspin2 = 52; // Øverste LDR2 føler byte MIDIByte2; // Declaració variable per MIDIByte2 bool klar_note_on = 1; // Variabel deklaration for klar_note_on, styrer afsendelse af note on kommando. Første kommando er en note on kommando bool klar_note_off = 0; // Variabel deklaration for klar_note_off, styrer afsendelse af note off kommando void setup () {pinMode (Senspin1, INPUT); // sæt sensor input pinMode (Senspin2, INPUT); // entrada del sensor Serial1.begin (31250); // Serial1 bruges til MIDI kommunikation: 31250 bit / sekundt Serial.begin (9600); // monitor sèrie, fins a prova} void loop () {bool Sensor1 = digitalRead (Senspin1); // Læs LDR1 - LTE sub boole Sensor2 = digitalRead (Senspin2); // læs LDR2 - Løverste LDR if (Sensor1 && klar_note_on) // hvis LDR1 activeret og klar til note on {byte Note_Byte = Hent_tonehojde (); // Hent to to Hent via sensor ultralyds MIDIByte2 = Hent_MidiByte2 (Note_Byte); // Hent MidByte2, número de nota MIDI, værdien 0xFF er fora del rang Send_Note_On (MIDIByte2); // kald Send_Note_On funktion klar_note_on = 0; // der skal kun sendes en note on kommando klar_note_off = 1; // næste kommando er note off} if (Sensor2 &&! Sensor1 && klar_note_off) // Hvis der skal sendes note off kommando gøres det her.. {Send_Note_Off (MIDIByte2); // enviar nota desactivant kommando klar_note_off = 0; // der skal kun sendes en note off kommando} if (! Sensor1 &&! Sensor2) // her gøres klar til ny note on kommando, hånd er væk fra brædt {klar_note_on = 1; }} byte Hent_MidiByte2 (byte NoteByte) {// Denne funktion returnerer MIDI note number, valgt ud fra NoteByte byte MIDIB2; switch (NoteByte) // her defineres hvilken værdi MIDIByte2 skal have ud fra værdien af Note_Byte {case 0: {MIDIB2 = 0x3C; // tonen 'C'} trencament; cas 1: {MIDIB2 = 0x3E; // tonen 'D'} trencar; cas 2: {MIDIB2 = 0x40; // tonen 'E'} trencar; cas 3: {MIDIB2 = 0x41; // tonen 'F'} trencar; cas 4: {MIDIB2 = 0x43; // tonen 'G'} trencament; cas 5: {MIDIB2 = 0x45; // tonen 'A'} trencament; cas 6: {MIDIB2 = 0x47; // tonen 'B'} trencar; cas 7: {MIDIB2 = 0x48; // tonen 'C'} trencament; per defecte: {MIDIB2 = 0xFF; // fora de l'abast}} retorna MIDIB2; // returner MIDI note number} byte Hent_tonehojde () {// Denne funktion henter resultatet af ultralydsmålingen unsigned int Tid_uS; // målt tid i uS byte Afstand; // beregnet afstand i cm byte resultat; // inddeling af spille område const float Omregningsfaktor = 58.3; // 2 * (1/343 m / s) / 100 = 58, 3uS / cm, der ganges med 2 da tiden er summen af tiden frem og tilbage. Tid_uS = sonar.ping_median (Mediana); // Send ping, få tid retur i uS, gennemsint af Median målinger Afstand = Tid_uS / Omregningsfaktor; // Omregn tid til afstand i cm (0 = outside distance range) resultat = Afstand / 8; // Beregn resultat return result; // Returner resultats} void Send_Note_On (byte tonenr) {// Denne funktion sender en note on kommando på MIDI interfacet const byte kommando = 0x90; // Note on kommando på MIDI kanal 1 const byte volumen = 0xFF; // volumen / Velocity = 127 Serial1.write (kommando); // enviar nota sobre kommando Serial1.write (tonenr); // envia ton numèric Serial1.write (volumen); // send volumen (velocity)} void Send_Note_Off (byte tonenr) {// Denne funktion sender note off kommando på MIDI interfacet const byte kommando = 0x80; // Note off kommando på MIDI kanal 1 const byte volumen = 0xFF; // volumen / Velocity = 127 Serial1.write (kommando); // enviar nota fora de comandament Serial1.write (tonenr); // envia ton numèric Serial1.write (volumen); // enviar volumen (velocitat)}

Pas 7: els fonaments de la comunicació MIDI

MIDI (Musical Instrument Digital Interface) és un protocol de comunicació serial universal per a la interfície d’instruments musicals electrònics i altres dispositius. S'utilitza la comunicació en sèrie (31250 bit / s, el mitjà de transmissió és un bucle de corrent, aïllat opto a l'extrem del receptor. S'utilitzen connectors DIN de 5 pols. 16 canals de comunicació lògics són possibles en una connexió MIDI física. Moltes ordres es defineixen al MIDI estàndard, faig servir dues ordres en aquest projecte, aquestes ordres consten de 3 bytes:

a) Ordre Nota sobre:

1. byte send = 0x90 que significa nota sobre l'ordre del canal MIDI 1

2. byte send = 0xZZ ZZ és el número de nota, faig servir l'interval de 0x3C a 0x48

3. enviament de bytes = 0xFF FF = 255 que significa volum màxim, rang de 0x00 a 0xFF

b) Ordre Nota desactivada: 1. byte send = 0x80 que significa ordre nota desactivada al canal MIDI 1

2. byte send = 0xZZ ZZ és el número de nota, faig servir el rang de 0x3C a 0x48

3. enviament de bytes = 0xFF FF = 255 que significa volum màxim, rang de 0x00 a 0xFF

Recomanat: