Cuprins:

EAL - Controller MIDI Arduino: 7 pași
EAL - Controller MIDI Arduino: 7 pași

Video: EAL - Controller MIDI Arduino: 7 pași

Video: EAL - Controller MIDI Arduino: 7 pași
Video: Arduino MIDI Button Controller 2024, Iulie
Anonim
EAL - Arduino MIDI Controller
EAL - Arduino MIDI Controller

Realizat de Søren Østergaard Petersen, OEAAM16EDA

Acest instructable descrie un controler MIDI bazat pe arduino. Acesta este un proiect școlar. Folosind mâna, puteți reda melodii simple prin conexiunea MIDI și un instrument MIDI conectat (sau ca în acest caz un notebook care rulează un software softsynth). Puteți reda note de la o scală majoră, c-d-e-f-g-a-b-c. Pentru a putea conecta controlerul MIDI la un notebook, veți avea nevoie de o interfață MIDI la USB, cum ar fi m-audio Uno.

Pasul 1: Video demonstrativ

Image
Image

Măriți volumul și bucurați-vă!

Cum functioneaza:

Controlerul MIDI utilizează o placă Arduino MEGA 2560. Doi senzori de lumină (LDR) încorporați într-un tub electric de 16 mm formează un sistem de senzori dubli și sunt utilizați pentru crearea unui declanșator stabil fără declanșare dublă falsă. O lanternă creează un fascicul de lumină, când fasciculul este întrerupt de mâna care joacă controlerul, senzorul de lumină inferior detectează fasciculul lipsă, iar un senzor cu ultrasunete HC-SR04 măsoară distanța de la senzor la mână.

Distanța măsurată este utilizată în programul Arduino pentru calcularea și configurarea valorii corespunzătoare a numărului de notă care trebuie ambalată într-un mesaj MIDI Note On și un transmițător pe interfața MIDI. Interfața de ieșire MIDI utilizează un invertor hexagonal 74HC14 și este aproape un circuit standard. Comunicarea MIDI utilizează serial1, portul serial standard este utilizat pentru depanare.

Când mâna este deplasată direct în sus și departe de fasciculul de lumină, senzorul de lumină superior detectează din nou fasciculul de lumină și un mesaj MIDI Note Off este ambalat și transmite pe ieșirea MIDI.

Zona de joc dintre senzori este de aproximativ 63cm, iar lungimea totală a controlerului MIDI este de aproximativ 75cm.

Pasul 2: Detalii despre senzorii de lumină

Detalii despre senzorii de lumină
Detalii despre senzorii de lumină
Detalii despre senzorii de lumină
Detalii despre senzorii de lumină

Cei doi senzori de lumină sunt montați unul peste celălalt pentru a forma un sistem de senzori dubli. Previne declanșarea falsă atunci când este utilizat corect în software. Fiecare senzor de lumină constă dintr-un modul de rezistență foto încorporat într-un tub electric standard de 16 mm. În fiecare tub se face un slot cu un ferăstrău, iar PCB-ul cu rezistență foto poate fi apăsat în slot. Senzorii sunt lipiți împreună cu bandă adezivă și, de asemenea, fixați la un capăt al unei bucăți de lemn. Nicio lumină nu trebuie să poată ajunge la senzori din spate. Senzorii de lumină au încorporat rezistențe de tracțiune de 10k.

Pasul 3: Detalii despre senzorul cu ultrasunete HC-SR04

Detalii despre senzorul cu ultrasunete HC-SR04
Detalii despre senzorul cu ultrasunete HC-SR04

Senzorul ultra sonic HC-SR04 este fixat în celălalt capăt al controlerului MIDI. O lanternă strălucitoare este plasată și aici, creează fasciculul de lumină necesar.

Pasul 4: Circuitul Aduino

Circuitul Aduino
Circuitul Aduino
Circuitul Aduino
Circuitul Aduino

Circuitul de ieșire MIDI este practic un invertor hexagonal standard 74HC14 și câteva rezistențe plus un conector femelă DIN cu 5 pini. Circuitul 74HC14 conduce ieșirea MIDI și oferă în același timp unele mijloace de protecție pentru placa Arduino împotriva „lumii reale” conectate la ieșirea MIDI. O caracteristică suplimentară practică este LED-ul de activitate MIDI care semnalizează când sunt trimise date.

Am folosit un PCB prototip adecvat pentru hardware-ul meu, deoarece am avut o mulțime de probleme cu conexiunile defecte pe panoul meu. Schema este realizată în Fritzing, o copie pdf de înaltă rezoluție poate fi descărcată apăsând linkul de mai jos. Prefer să folosesc un program schematic adecvat, cum ar fi Kicad, cred că Fritzing este limitat la orice, în afară de cele mai simple experimente.

Materiale utilizate:

1 buc Arduino MEGA 2560

2 buc foto rezistor (LDR) cu rezistență de tragere încorporată (din setul de 37 senzori)

1 buc senzor cu ultrasunete HC-SR04

1 buc 74HC14 declanșator Schmitt cu inversare hexagonală

2 buc rezistor 220 Ohm 0.25W

1 buc rezistor 1k Ohm 0,25W

1 buc LED curent redus 2mA

1 buc condensator ceramic 100nF (pentru decuplarea sursei de alimentare, direct la pinii de alimentare ai 74HC14)

Placă de pâine sau PCB prototip

2 buc tub electric de 16mm, lungime 65mm

1 buc de lemn, lungime 75cm

Banda adeziva

Fire

Pasul 5: listarea I / O

Listare I / O
Listare I / O

Pasul 6: Codul Aduino

Schița test_Midi6 folosește biblioteca NewPing pe care trebuie să o includeți în mediul de programare Arduino, pentru a utiliza senzorul cu ultrasunete HC-SC04. Schița este comentată în daneză, îmi pare rău. Pentru a menține schița bine structurată, sunt alcătuite funcții separate pentru diferite părți logice ale schiței, iar variabilele globale sunt în mare parte evitate. Fluxul de programe este vizualizat în diagrama de flux a controlerului MIDI pdf.

// 15-05-2017 versiune: test_Midi6

// Søren Østergaard Petesen // Arduino MEGA 2560 // Dette program udgør en simpel MIDI controller som kan styre en ekstern MIDI enhed, f.eks en softsynt på en PC. // MIDI controleren kan sende toneanslag (note on kommando) hhv. (not 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 på 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 afstand 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); // Crearea obiectului NewPing. int Senspin1 = 53; // Underste LDR1 føler int Senspin2 = 52; // Øverste LDR2 føler byte MIDIByte2; // Variabel declarație pentru 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); // intrare senzor Serial1.begin (31250); // Serial1 bruges til MIDI kommunikation: 31250 bit / sekundt Serial.begin (9600); // monitor serial, până la testare} bucla de gol () {bool Sensor1 = digitalRead (Senspin1); // Læs LDR1 - underte LDR bool Sensor2 = digitalRead (Senspin2); // læs LDR2 - øverste LDR if (Sensor1 && klar_note_on) // hvis LDR1 aktiveret og klar til note on {byte Note_Byte = Hent_tonehojde (); // Hent ton højde via ultralyds sensor MIDIByte2 = Hent_MidiByte2 (Note_Byte); // Hent MidByte2, numărul notei MIDI, værdien 0xFF er în afara 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); // trimite nota de pe 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'} pauză; cazul 1: {MIDIB2 = 0x3E; // tonen 'D'} pauză; cazul 2: {MIDIB2 = 0x40; // tonen 'E'} pauză; caz 3: {MIDIB2 = 0x41; // tonen 'F'} pauză; caz 4: {MIDIB2 = 0x43; // tonen 'G'} pauză; caz 5: {MIDIB2 = 0x45; // tonen 'A'} pauză; cazul 6: {MIDIB2 = 0x47; // tonen 'B'} pauză; caz 7: {MIDIB2 = 0x48; // tonen 'C'} pauză; implicit: {MIDIB2 = 0xFF; // în afara razei}} returnează 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 (Median); // 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) rezultat = Afstand / 8; // Beregn resultat return resultat; // Returner resultat} 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); // trimiteți o notă despre kommando Serial1.write (tonenr); // trimite ton nummer 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); // trimite nota de pe commando Serial1.write (tonenr); // trimite ton nummer Serial1.write (volumen); // trimite volumen (viteza)}

Pasul 7: Bazele comunicării MIDI

MIDI (Musical Instrument Digital Interface) este un protocol de comunicare serial universal pentru interfața instrumentelor muzicale electronice și a altor dispozitive. Se utilizează comunicația în serie (31250 biți / s, mediul de transmisie este o buclă de curent, optoizolat la capătul receptorului. Sunt folosiți conectori DIN 5 pini. Sunt posibile 16 canale de comunicații logice într-o conexiune MIDI fizică. Multe comenzi sunt definite în MIDI standard, folosesc două comenzi în acest proiect, aceste comenzi sunt formate din 3 octeți:

a) Comanda Note On:

1. octet trimite = 0x90 însemnând notă la comandă pe canalul MIDI 1

2. octet trimite = 0xZZ ZZ este numărul notei, eu folosesc intervalul 0x3C la 0x48

3. octet trimite = 0xFF FF = 255 adică volum maxim, intervalul 0x00 la 0xFF

b) Comanda Note Off: 1. octet trimite = 0x80 ceea ce înseamnă comanda notă de pe canalul MIDI 1

2. octet trimite = 0xZZ ZZ este numărul notei, eu folosesc intervalul 0x3C la 0x48

3. octet trimite = 0xFF FF = 255 adică volum maxim, intervalul 0x00 la 0xFF

Recomandat: