İçindekiler:

EAL - Arduino MIDI Denetleyici: 7 Adım
EAL - Arduino MIDI Denetleyici: 7 Adım

Video: EAL - Arduino MIDI Denetleyici: 7 Adım

Video: EAL - Arduino MIDI Denetleyici: 7 Adım
Video: Arduino project 😎^ Arduino #arduino #2022 #2021 #2023 #dc #arduinoproject #diy #foryou 2024, Temmuz
Anonim
EAL - Arduino MIDI Denetleyici
EAL - Arduino MIDI Denetleyici

Søren Østergaard Petersen, OEAAM16EDA tarafından yapılmıştır.

Bu talimat, arduino tabanlı bir MIDI denetleyicisini açıklar. Bu bir okul projesidir. Elinizi kullanarak MIDI bağlantısı ve bağlı bir MIDI enstrümanı (veya bu durumda bir softsynth yazılımı çalıştıran bir dizüstü bilgisayar gibi) aracılığıyla basit melodileri çalabilirsiniz. C ana ölçeğinden notlar çalabilirsiniz, c-d-e-f-g-a-b-c. MIDI denetleyicisini bir dizüstü bilgisayara bağlayabilmek için, m-audio Uno gibi bir MIDI - USB arabirimine ihtiyacınız olacak.

1. Adım: Gösteri Videosu

Image
Image

Sesi açın ve keyfini çıkarın!

Nasıl çalışır:

MIDI denetleyicisi bir Arduino MEGA 2560 kartı kullanır. 16 mm'lik elektrik borusuna yerleştirilmiş iki ışık (LDR) sensörü, bir çift sensör sistemi oluşturur ve herhangi bir yanlış çift tetikleme olmadan kararlı bir tetikleyici oluşturmak için kullanılır. Bir el feneri bir ışık huzmesi oluşturur, huzme denetleyiciyi çalan el tarafından kesildiğinde, alt ışık sensörü eksik huzmeyi algılar ve bir HC-SR04 ultrasonik sensör, sensörden ele olan mesafeyi ölçer.

Ölçülen mesafe, MIDI arayüzünde bir MIDI Note On mesajı ve iletiminde paketlenecek uygun nota numarası değerini hesaplamak ve ayarlamak için Arduino programında kullanılır. MIDI çıkış arayüzü bir 74HC14 hex invertör kullanır ve hemen hemen standart bir devredir. MIDI iletişimi seri1'i kullanır, hata ayıklama için standart seri bağlantı noktası kullanılır.

El doğrudan yukarı ve ışık huzmesinden uzağa hareket ettirildiğinde, üst ışık sensörü ışık huzmesini tekrar algılar ve bir MIDI Not Kapalı mesajı paketlenir ve MIDI çıkışına iletilir.

Sensörler arasındaki oyun alanı yaklaşık 63 cm'dir ve MIDI denetleyicisinin toplam uzunluğu yaklaşık 75 cm'dir.

Adım 2: Işık Sensörlerinin Detayları

Işık Sensörlerinin Detayları
Işık Sensörlerinin Detayları
Işık Sensörlerinin Detayları
Işık Sensörlerinin Detayları

İki ışık sensörü, bir çift sensör sistemi oluşturmak için üst üste monte edilmiştir. Yazılımda doğru kullanıldığında yanlış tetiklemeyi engeller. Her ışık sensörü, 16 mm'lik standart bir elektrik borusuna yerleştirilmiş bir foto direnç modülünden oluşur. Her tüpte bir demir testeresi ile bir yuva yapılır ve foto direnç PCB'si yuvaya bastırılabilir. Sensörler, koli bandı ile birbirine bantlanmıştır ve ayrıca bir tahta parçasının bir ucuna sabitlenmiştir. Sensörlere arkadan ışık ulaşmamalıdır. Işık sensörlerinde 10k pull-up dirençler bulunur.

Adım 3: HC-SR04 Ultrasonik Sensörün Ayrıntıları

HC-SR04 Ultrasonik Sensörün Detayları
HC-SR04 Ultrasonik Sensörün Detayları

HC-SR04 ultrasonik sensör, MIDI denetleyicisinin diğer ucuna sabitlenmiştir. Buraya da parlak bir el feneri yerleştirilir, gerekli ışık huzmesini oluşturur.

Adım 4: Aduino Devresi

Aduino Devresi
Aduino Devresi
Aduino Devresi
Aduino Devresi

MIDI çıkış devresi temel olarak standart bir 74HC14 altıgen invertör ve birkaç direnç artı 5 pinli DIN dişi konnektördür. 74HC14 devresi MIDI çıkışını çalıştırır ve aynı zamanda Arduino kartı için MIDI çıkışına bağlı "gerçek dünyaya" karşı bazı koruma araçları sağlar. Ekstra pratik bir özellik, veri gönderildiğinde sinyal veren MIDI etkinlik LED'idir.

Donanımım için uygun bir prototip PCB kullandım çünkü breadboard'umda kötü bağlantılarla ilgili birçok problemim vardı. Şematik Fritzing'de yapılmıştır, aşağıdaki bağlantıya basarak yüksek çözünürlüklü bir pdf kopyası indirilebilir. Kicad gibi uygun bir şema programı kullanmayı tercih ediyorum, Fritzing'in en basit deneyler dışında her şey için sınırlı olduğunu düşünüyorum.

Kullanılan malzemeler:

1 adet Arduino MEGA 2560

2 adet Fotoğraf direnci (LDR) ve yerleşik yukarı çekme direnci (37 sensör kitinden)

1 adet HC-SR04 ultrasonik sensör

1 adet 74HC14 altıgen çevirmeli Schmitt tetik

2 adet rezistör 220 Ohm 0.25W

1 adet direnç 1k Ohm 0.25W

1 adet LED düşük akım 2mA

1 adet 100nF seramik kapasitör (doğrudan 74HC14'ün güç pinlerinde güç kaynağı ayırma için)

Breadboard veya prototip PCB

2 adet 16mm elektrik borusu, uzunluk 65mm

1 adet ahşap, uzunluk 75cm

Koli Bandı

teller

Adım 5: G/Ç Listeleme

G/Ç Listesi
G/Ç Listesi

Adım 6: Aduino Kodu

Sketch test_Midi6, HC-SC04 ultrasonik sensörü kullanmak için Arduino programlama ortamınıza dahil etmeniz gereken NewPing kitaplığını kullanır. Kroki Danimarka dilinde yorumlanmıştır, üzgünüm. Krokiyi iyi yapılandırılmış tutmak için, çizimin farklı mantık bölümleri için ayrı işlevler oluşturulur ve genel değişkenlerden çoğunlukla kaçınılır. Program akışı, MIDI denetleyici akış şeması pdf'de görselleştirilir.

// 15-05-2017 versiyonu: test_Midi6

// Søren Østergaard Petesen // Arduino MEGA 2560 // MIDI denetleyicisi için basit bir MIDI denetleyicisi ve PC'ye ek olarak MIDI enhed, f.eks en softsynt på en PC'yi denetle programı. // MIDI controlleren kan gönder toneanslag (kommando ile ilgili not) hhv. (kommando'yu not edin) en oktav için C-C, C dur skala. // Der med en "karate hånd" på et brædt // hvor sensorerne er monteret. MIDI kommandoerne, dobbelt LDR sensörünü tetikler, da der skal laves en sikker // af både når hånden lander på brættet (not açık), samt når hånden fjernes igen (not kapalı). // MIDI kommandoerne "not açık" ve "not kapalı" en iyi 3 baytlık bir dizi seri1 bağlantı noktası gönderir // MIDI arabiriminin donanımını belirleme. // ultralydssensor HC-SR04 #include // ultralydssensor HC-SR04 #define TRIGGER_PIN 3 // Arduino pin ile tetik pini ultrasonik sensör #define ECHO_PIN 2 // Ultrasonik sensör için Arduino pini ile yankı pini arasında #include // define MAX_DISTANCE 100 // Ping için maksimum afstand #define Median 5 // Antal målinger der beregnes gennemsnit af for at få en sikker afstandsbestemmelse NewPing sonar(TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE); // NewPing Nesnesini Oluşturma. int Senspin1 = 53; //Alt LDR1 føler int Senspin2 = 52; //Øverste LDR2 için bayt MIDIByte2; //MIDIByte2 için değişken bildirimi bool klar_note_on = 1; // klar_note_on için değişken bildirimi, kommando'da styrer afsendelse af notu. //klar_note_off için değişken deklarasyon, styrer afsendelse af not off kommando void setup() { pinMode(Senspin1, INPUT); // sæt sensör girişi pinMode(Senspin2, INPUT); // sæt sensör girişi Serial1.begin(31250); // MIDI iletişimine kadar Serial1 bruges: 31250 bit/sekundt Serial.begin(9600); //seri monitör, til testi } void loop() { 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 aktifret ve klar { byte Note_Byte = Hent_tonehojde(); //Ultralyds sensörü aracılığıyla ses tonu højde MIDIByte2 = Hent_MidiByte2(Note_Byte); // Hent MidByte2, MIDI nota numarası, værdien 0xFF er aralık dışı Send_Note_On(MIDIByte2); // kald Send_Note_On işlevi klar_note_on = 0; // der skal kun kommando'ya en notu gönderir klar_note_off = 1; // næste kommando er not off } if (Sensor2 && !Sensor1 && klar_note_off) // Hvis der skal notu kapalı kommando gores det gönderir. { Send_Note_Off(MIDIByte2); // kommando notu gönder klar_note_off = 0; // der skal kun kommando'dan not alır } if (!Sensor1 && !Sensor2) // onun kommando üzerine notları klar til ny, hånd er væk fra brædt { klar_note_on = 1; } } bayt Hent_MidiByte2(byte NoteByte) { // Denne funktion returnerer MIDI not numarası, valgt ud fra NoteByte bayt MIDIB2; switch (NoteByte) // onun tanımları hvilken værdi MIDIByte2 skal var ud fra værdien af Note_Byte { case 0: { MIDIB2 = 0x3C; // ton 'C' } ara; durum 1: { MIDIB2 = 0x3E; // ton 'D' } ara; durum 2: { MIDIB2 = 0x40; // ton 'E' } ara; durum 3: { MIDIB2 = 0x41; // ton 'F' } ara; durum 4: { MIDIB2 = 0x43; // ton 'G' } ara; durum 5: { MIDIB2 = 0x45; // ton 'A' } ara; durum 6: { MIDIB2 = 0x47; // ton 'B' } ara; durum 7: { MIDIB2 = 0x48; // ton 'C' } ara; varsayılan: { MIDIB2 = 0xFF; // aralık dışı } } MIDIB2'yi döndür; //döndürücü MIDI notu numarası } bayt Hent_tonehojde() { //Denne funktion henter sonuç değeri af ultralydsmålingen unsigned int Tid_uS; // t tid i us byte Afstand; // beregnet afstand i cm byte sonuç; // bir sızıntı område const şamandıra toplama Omregningsfaktor = 58.3; // 2*(1/343 m/s)/100 = 58, 3uS/cm, der ganges med 2 da tiden er summen af tiden fremog tilbage. Tid_uS = sonar.ping_median(Medyan); // Gönder ping, få tid retur i uS, gennemsint af Medyan målinger Afstand = Tid_uS / Omregningsfaktor; // Omregn tid til afstand i cm (0 = dış mesafe aralığı) sonuç = Karşıdan / 8; //Beregn sonuçdönüş sonuçat; //Döndürücü sonucu } void Send_Note_On(byte tonenr) { //Denne funktion sender on kommando på MIDI interfacet const byte kommando = 0x90; //Komando på MIDI kanal 1 const byte volumen = 0xFF; // hacim / Hız = 127 Seri1.write(kommando); //kommando üzerine not gönder Serial1.write(tonenr); // ton numarası gönder Serial1.write(hacim); //gönder hacim (hız) } void Send_Note_Off(byte tonenr) {//Denne funktion sender note off kommando på MIDI arayüzü const byte kommando = 0x80; //Komando på MIDI kanal 1 const bayt hacim = 0xFF; // hacim / Hız = 127 Seri1.write(kommando); //kommando Serial1.write(tonenr); // ton numarası gönder Serial1.write(hacim); // hacim (hız) gönder }

Adım 7: MIDI İletişiminin Temelleri

MIDI (Müzik Aleti Dijital Arayüzü), elektronik müzik aletlerinin ve diğer cihazların arayüzlenmesi için evrensel bir seri iletişim protokolüdür. Seri haberleşme kullanılır (31250 bit/s, iletim ortamı bir akım döngüsüdür, alıcı ucunda opto-izole edilmiştir. 5pin DIN konnektörleri kullanılmaktadır. Bir fiziksel MIDI bağlantısında 16 mantıksal iletişim kanalı mümkündür. MIDI'de birçok komut tanımlanmıştır. standart, bu projede iki komut kullanıyorum, bu komutlar 3 bayttan oluşuyor:

a) Komuta İlişkin Not:

1. bayt gönderme = 0x90, MIDI kanal 1'deki komutla ilgili not anlamına gelir

2. bayt gönderme = 0xZZ ZZ nota numarasıdır, 0x3C - 0x48 aralığını kullanıyorum

3. bayt gönderimi = 0xFF FF = 255, maksimum hacim anlamına gelir, 0x00 - 0xFF aralığı

b) Not Kapalı komutu:1. bayt gönderme = 0x80, MIDI kanal 1'de not kapatma komutu anlamına gelir

2. bayt gönderme = 0xZZ ZZ nota numarasıdır, 0x3C - 0x48 aralığını kullanıyorum

3. bayt gönderimi = 0xFF FF = 255, maksimum hacim anlamına gelir, 0x00 - 0xFF aralığı

Önerilen: