Isi kandungan:

EAL - Arduino MIDI Controller: 7 Langkah
EAL - Arduino MIDI Controller: 7 Langkah

Video: EAL - Arduino MIDI Controller: 7 Langkah

Video: EAL - Arduino MIDI Controller: 7 Langkah
Video: How to Build Arduino MIDI Controllers - The Complete Guide 2024, Julai
Anonim
EAL - Arduino MIDI Pengawal
EAL - Arduino MIDI Pengawal

Dibuat oleh Søren Østergaard Petersen, OEAAM16EDA

Instruksional ini menerangkan pengawal MIDI berasaskan arduino. Ini adalah projek sekolah. Dengan menggunakan tangan anda, anda dapat memainkan melodi mudah melalui sambungan MIDI dan instrumen MIDI yang disambungkan (atau seperti dalam kes ini notebook yang menjalankan perisian softsynth). Anda boleh memainkan nota dari skala besar C, c-d-e-f-g-a-b-c. Untuk dapat menyambungkan pengawal MIDI ke buku nota, anda memerlukan antara muka MIDI ke USB seperti m-audio Uno.

Langkah 1: Video Demonstrasi

Image
Image

Naikkan kelantangan dan nikmati!

Bagaimana ia berfungsi:

Pengawal MIDI menggunakan papan Arduino MEGA 2560. Dua sensor cahaya (LDR) yang dibina dalam tiub elektrik 16mm membentuk sistem sensor berganda dan digunakan untuk membuat pemicu stabil tanpa pencetus ganda palsu. Lampu suluh membuat pancaran cahaya, apabila pancaran terganggu oleh tangan yang memainkan alat kawalan, sensor cahaya bawah merasakan sinar yang hilang, dan sensor ultrasonik HC-SR04 mengukur jarak dari sensor ke tangan.

Jarak yang diukur digunakan dalam program Arduino untuk mengira dan mengatur nilai nombor nota yang sesuai untuk dimasukkan ke dalam pesan MIDI Note On dan transmitet pada antara muka MIDI. Antara muka output MIDI menggunakan penyongsang heks 74HC14 dan litar standard. Komunikasi MIDI menggunakan serial1, port bersiri standard digunakan untuk penyahpepijatan.

Apabila tangan digerakkan lurus ke atas dan jauh dari pancaran cahaya, sensor cahaya atas merasakan lagi pancaran cahaya dan mesej MIDI Note Off dikemas dan dihantar pada output MIDI.

Kawasan permainan antara sensor adalah sekitar 63cm, dan panjang keseluruhan pengawal MIDI adalah sekitar 75cm.

Langkah 2: Perincian Sensor Cahaya

Perincian Sensor Cahaya
Perincian Sensor Cahaya
Perincian Sensor Cahaya
Perincian Sensor Cahaya

Kedua-dua sensor cahaya dipasang di atas satu sama lain untuk membentuk sistem sensor berganda. Ini mencegah pemicu palsu apabila digunakan dengan betul dalam perisian. Setiap sensor cahaya terdiri daripada modul perintang foto yang dibina ke dalam tiub elektrik standard 16 mm. Slot dibuat di setiap tiub dengan gergaji besi dan PCB perintang foto dapat ditekan ke dalam slot. Sensor ditempelkan bersama-sama dengan pita saluran dan juga dipasang pada salah satu hujung sekeping kayu. Tidak ada cahaya yang dapat mencapai sensor dari belakang. Sensor cahaya telah dibina dalam 10k perintang tarik.

Langkah 3: Perincian Sensor Ultrasonik HC-SR04

Perincian Sensor Ultrasonik HC-SR04
Perincian Sensor Ultrasonik HC-SR04

Sensor ultra sonik HC-SR04 terpaku di hujung pengawal MIDI yang lain. Lampu suluh yang terang diletakkan di sini juga, ia menghasilkan pancaran cahaya yang diperlukan.

Langkah 4: Litar Aduino

Litar Aduino
Litar Aduino
Litar Aduino
Litar Aduino

Litar keluaran MIDI pada dasarnya adalah penyongsang hex 74HC14 standard dan beberapa perintang ditambah penyambung wanita 5 pin DIN. Litar 74HC14 mendorong output MIDI dan pada masa yang sama memberikan beberapa kaedah perlindungan untuk papan Arduino terhadap "dunia nyata" yang dihubungkan dengan MIDI keluar. Ciri praktikal tambahan adalah aktiviti LED MIDI yang memberi isyarat semasa data dihantar.

Saya telah menggunakan prototaip PCB yang tepat untuk perkakasan saya kerana saya mempunyai banyak masalah dengan sambungan yang tidak baik di papan roti saya. Skema dibuat dalam Fritzing, salinan pdf beresolusi tinggi boleh dimuat turun dengan menekan pautan di bawah. Saya lebih suka menggunakan program skema yang betul seperti Kicad, saya rasa Fritzing adalah terhad untuk apa sahaja kecuali eksperimen paling mudah.

Bahan yang digunakan:

1 pcs Arduino MEGA 2560

2 pcs Photo resistor (LDR) dengan resistor pull up terbina dalam (dari 37 kit sensor)

Sensor ultrasonik 1 pcs HC-SR04

1 pcs 74HC14 hex membalikkan pencetus Schmitt

Perintang 2 pcs 220 Ohm 0.25W

1 pcs perintang 1k Ohm 0.25W

1 pcs LED arus rendah 2mA

1 pcs kapasitor seramik 100nF (untuk penyambungan bekalan kuasa, terus pada pin kuasa 74HC14)

Papan roti atau prototaip PCB

Tiub elektrik 2 pcs 16mm, panjang 65mm

1 keping kayu, panjang 75cm

Pita saluran

Wayar

Langkah 5: Penyenaraian I / O

Penyenaraian I / O
Penyenaraian I / O

Langkah 6: Kod Aduino

Sketsa test_Midi6 menggunakan perpustakaan NewPing yang mesti anda sertakan dalam persekitaran pengaturcaraan Arduino anda, untuk menggunakan sensor ultrasonik HC-SC04. Sketsa dikomentari dalam bahasa Denmark, maaf.. Untuk memastikan sketsa tersusun dengan baik, fungsi terpisah dibuat untuk bahagian logik yang berbeza dari lakaran dan pemboleh ubah global kebanyakannya dielakkan. Aliran program dilihat dalam carta alir pengawal MIDI pdf.

// 15-05-2017 versi: test_Midi6

// Søren Østergaard Petesen // Arduino MEGA 2560 // Dette program udgør en simpel Pengawal MIDI som kan gaya dan eksternal MIDI ditingkatkan, f.eks en softsynt på en PC. // MIDI controlleren kan sende toneanslag (note on kommando) hhv. (perhatikan kommando) untuk en-oktav C-C, C dur skala. // Der spilles med en "karate hånd" på et brædt // hvor sensorerne er monteret. MIDI kommandoerne memicu sensor LDR en dobbelt, da der skal laves en sikker // detektering af både når hånden lander på brættet (nota), samt når hånden fjernes igen (perhatikan). // MIDI kommandoerne "nota" og "note off" består hver af 3 bytes som sendes på serial1 porten // vha det i perkakasan opbyggede antara muka MIDI. // 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 ultr echo tentukan MAX_DISTANCE 100 // Maksimum maksimum untuk 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); // Membuat Objek NewPing. int Senspin1 = 53; // Fahami LDR1 føler int Senspin2 = 52; // Øverste LDR2 føler byte MIDIByte2; // Deklarasi pemboleh ubah untuk MIDIByte2 bool klar_note_on = 1; // Deklarasi pemboleh ubah untuk klar_note_on, nota styrer afsendelse af di kommando. Første kommando er en note on kommando bool klar_note_off = 0; // Deklarasi pemboleh ubah untuk klar_note_off, styrer afsendelse af note off kommando void setup () {pinMode (Senspin1, INPUT); // s input pinMode sensor (Senspin2, INPUT); // input sensor Serial1.begin (31250); // Serial1 bruges hingga komunikasi MIDI: 31250 bit / sekundt Serial.begin (9600); // monitor bersiri, ujian til} gelung kosong () {bool Sensor1 = digitalRead (Senspin1); // Læs LDR1 - underte LDR bool Sensor2 = digitalRead (Senspin2); // lss LDR2 - øverste LDR if (Sensor1 && klar_note_on) // hvis LDR1 aktiveret atau klar hingga nota pada {byte Note_Byte = Hent_tonehojde (); // Hent tone højde melalui sensor ultralyds MIDIByte2 = Hent_MidiByte2 (Note_Byte); // Hent MidByte2, nombor nota MIDI, værdien 0xFF di luar jangkauan 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 menghantar nota kommando gøres det dia.. {Send_Note_Off (MIDIByte2); // hantar nota dari kommando klar_note_off = 0; // der skal kun sendes en note off kommando} if (! Sensor1 &&! Sensor2) // nota dia klar til ny note on kommando, hånd er væk fra brædt {klar_note_on = 1; }} byte Hent_MidiByte2 (byte NoteByte) {// Nota nota MIDI pengembalian fungsi Denne, valgt ud fra NoteByte byte MIDIB2; beralih (NoteByte) // definisinya hvilken værdi MIDIByte2 skal mempunyai ud fra værdien dan Note_Byte {kes 0: {MIDIB2 = 0x3C; // tonen 'C'} rehat; kes 1: {MIDIB2 = 0x3E; // tonen 'D'} rehat; kes 2: {MIDIB2 = 0x40; // tonen 'E'} rehat; kes 3: {MIDIB2 = 0x41; // tonen 'F'} rehat; kes 4: {MIDIB2 = 0x43; // tonen 'G'} rehat; kes 5: {MIDIB2 = 0x45; // tonen 'A'} rehat; kes 6: {MIDIB2 = 0x47; // tonen 'B'} rehat; kes 7: {MIDIB2 = 0x48; // tonen 'C'} rehat; lalai: {MIDIB2 = 0xFF; // di luar jangkauan}} kembali MIDIB2; // pengembalian nombor nota MIDI} byte Hent_tonehojde () {// Denne funktion henter resultatet af ultralydsmålingen unsigned int Tid_uS; // mtl tid i uS byte Afstand; // beregnet di hadapan i cm byte hasil; // 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); // Hantar ping, fid tid retur i uS, gennemsint af Median målinger Afstand = Tid_uS / Omregningsfaktor; // Omregn tid til afstand i cm (0 = jarak jarak luar) hasil = Afstand / 8; // Hasil pengembalian hasil Beregn; // Returner resultat} batal Send_Note_On (byte tonenr) {// Denne funktion sender dan nota mengenai kommando på MIDI interfacet const byte kommando = 0x90; // Catatan mengenai kommando på MIDI kanal 1 const byte volumen = 0xFF; // volumen / Kecepatan = 127 Serial1.write (kommando); // hantar nota di kommando Serial1.write (tonenr); // hantar nada nombor Serial1.write (isi padu); // hantar volumen (halaju)} batal Send_Note_Off (byte tonenr) {// Denne funktion note note off kommando på MIDI interfacet const byte kommando = 0x80; // Perhatikan kommando på MIDI kanal 1 const byte volumen = 0xFF; // volumen / Velocity = 127 Serial1.write (kommando); // hantar nota dari kommando Serial1.write (tonenr); // hantar nada nombor Serial1.write (isi padu); // hantar volumen (halaju)}

Langkah 7: Asas Komunikasi MIDI

MIDI (Antarmuka Digital Alat Muzik) adalah protokol komunikasi bersiri sejagat untuk menghubungkan alat muzik elektronik dan peranti lain. Komunikasi bersiri digunakan (31250 bit / s, media penghantaran adalah gelung semasa, terpencil opto di hujung penerima. Penyambung DIN 5pin digunakan. 16 saluran komunikasi logik boleh dilakukan dalam satu sambungan MIDI fizikal. Banyak arahan ditentukan dalam MIDI standard, saya menggunakan dua perintah dalam projek ini, perintah ini terdiri daripada 3 bait:

a) Perintah Note On:

1. byte send = 0x90 makna nota arahan pada saluran MIDI 1

2. byte send = 0xZZ ZZ adalah nombor nota, saya menggunakan julat 0x3C hingga 0x48

3. bait hantar = 0xFF FF = 255 bermaksud isipadu maksimum, julat 0x00 hingga 0xFF

b) Perintah Catatan Mati: 1. byte send = 0x80 yang bermaksud arahan nota pada saluran MIDI 1

2. byte send = 0xZZ ZZ adalah nombor nota, saya menggunakan julat 0x3C hingga 0x48

3. bait hantar = 0xFF FF = 255 bermaksud isipadu maksimum, julat 0x00 hingga 0xFF

Disyorkan: