Mündəricat:

EAL - Arduino MIDI Controller: 7 addım
EAL - Arduino MIDI Controller: 7 addım

Video: EAL - Arduino MIDI Controller: 7 addım

Video: EAL - Arduino MIDI Controller: 7 addım
Video: 7.Несколько потенциометров на мультиплексоре CD74HC4067| Arduino | Midi | Hiduino 2024, Iyul
Anonim
EAL - Arduino MIDI Nəzarətçisi
EAL - Arduino MIDI Nəzarətçisi

Søren Østergaard Petersen, OEAAM16EDA tərəfindən hazırlanmışdır

Bu təlimat arduino əsaslı MIDI nəzarətçisini təsvir edir. Bu bir məktəb layihəsidir. Əlinizi istifadə edərək, MIDI bağlantısı və bağlı bir MIDI aləti (və ya bu vəziyyətdə bir softsynth proqramı ilə işləyən bir notebook) vasitəsilə sadə melodiyalar çala bilərsiniz. C böyük ölçülü, c-d-e-f-g-a-b-c notlarını oynaya bilərsiniz. MIDI nəzarətçisini notbuka qoşa bilmək üçün m-audio Uno kimi MIDI-USB interfeysinə ehtiyacınız olacaq.

Addım 1: Nümayiş videosu

Image
Image

Səsi artırın və zövq alın!

Bu necə işləyir:

MIDI nəzarətçi Arduino MEGA 2560 lövhəsindən istifadə edir. 16 mm elektrik borusuna quraşdırılmış iki işıq (LDR) sensoru ikiqat sensor sistemi yaradır və heç bir yalan ikiqat tetiklemesiz sabit bir tətik yaratmaq üçün istifadə olunur. Bir fənər bir işıq şüası yaradır, şüa nəzarətçini çalan əllə kəsildikdə, aşağı işıq sensoru itkin şüanı hiss edir və HC-SR04 ultrasəs sensoru sensordan ələ olan məsafəni ölçür.

Ölçülmüş məsafə, Arduino proqramında, MIDI interfeysində bir mesaj və ötürücünün MIDI Qeydinə yığılması üçün uyğun qeyd nömrəsi dəyərinin hesablanması və qurulması üçün istifadə olunur. MIDI çıxış interfeysi 74HC14 altıbucaqlı çeviricidən istifadə edir və demək olar ki, standart bir sxemdir. MIDI əlaqəsi serial1 istifadə edir, standart serial portu ayıklama üçün istifadə olunur.

Əl birbaşa işıq şüasından yuxarı və uzaqlaşdırıldıqda, yuxarı işıq sensoru yenidən işıq şüasını hiss edir və MIDI Note Off mesajı paketlənir və MIDI çıxışında ötürülür.

Sensorlar arasındakı oyun sahəsi təxminən 63 sm, MIDI nəzarətçinin ümumi uzunluğu isə 75 sm -dir.

Addım 2: İşıq Sensorlarının Təfərrüatları

İşıq Sensorlarının Təfərrüatları
İşıq Sensorlarının Təfərrüatları
İşıq Sensorlarının Təfərrüatları
İşıq Sensorlarının Təfərrüatları

İki işıq sensoru bir cüt sensor sistemi yaratmaq üçün bir -birinin üstünə quraşdırılmışdır. Proqramda düzgün istifadə edildikdə yanlış tetiklemenin qarşısını alır. Hər bir işıq sensoru 16 mm standart elektrik borusuna quraşdırılmış foto rezistor moduldan ibarətdir. Hər boruda bir mişar maşını olan bir yuva hazırlanır və foto rezistor PCB yuvaya bərkidilə bilər. Sensorlar yapışan bantla yapışdırılır və taxta parçanın bir ucuna bərkidilir. Heç bir işığın arxadan sensorlara çata bilməməsi lazımdır. İşıq sensorlar 10k çəkmə müqavimətinə malikdir.

Addım 3: HC-SR04 Ultrasonik Sensorun təfərrüatları

HC-SR04 Ultrasonik Sensorun təfərrüatları
HC-SR04 Ultrasonik Sensorun təfərrüatları

HC-SR04 ultra sonik sensoru MIDI nəzarətçisinin digər ucuna sabitlənmişdir. Burada da parlaq bir fənər qoyulur, lazım olan işıq şüasını yaradır.

Addım 4: Aduino Dövrü

Aduino Dövrü
Aduino Dövrü
Aduino Dövrü
Aduino Dövrü

MIDI çıxış dövrəsi əsasən standart 74HC14 hex çeviricisi və bir neçə müqavimət və 5 pinli DIN dişi konnektordur. 74HC14 dövrəsi MIDI çıxışını idarə edir və eyni zamanda Arduino lövhəsini MIDI -yə qoşulmuş "real dünyaya" qarşı bəzi müdafiə vasitələri təmin edir. Əlavə bir praktik xüsusiyyət, məlumat göndərildikdə siqnal verən MIDI fəaliyyət LED -dir.

Çörək lövhəmdəki pis bağlantılarla əlaqədar bir çox problemim olduğu üçün cihazım üçün uyğun bir prototip PCB istifadə etdim. Şematik Fritzing -də hazırlanmışdır, yüksək dəqiqlikli bir pdf nüsxəsi aşağıdakı linkə basaraq yüklənə bilər. Kicad kimi uyğun bir sxem proqramından istifadə etməyi üstün tuturam, düşünürəm ki, Fritzing ən sadə təcrübələrdən başqa bir şeylə məhdudlaşır.

İstifadə olunan materiallar:

1 ədəd Arduino MEGA 2560

Daxili çəkmə müqaviməti olan 2 ədəd foto rezistor (LDR) (37 sensor dəstindən)

1 ədəd HC-SR04 ultrasəs sensoru

1 ədəd 74HC14 altıbucaqlı ters çevirici Schmitt tətiyi

2 ədəd müqavimət 220 Ohm 0.25W

1 ədəd müqavimət 1k Ohm 0.25W

1 ədəd LED aşağı cərəyan 2mA

1 ədəd 100nF keramika kondansatörü (enerji təchizatı ayırmaq üçün, birbaşa 74HC14 -ün elektrik pinlərində)

Çörək paneli və ya PCB prototipi

2 ədəd 16 mm elektrik borusu, uzunluğu 65 mm

1 ədəd ağac, uzunluğu 75 sm

Yapışqan bant

Tellər

Addım 5: I/O Siyahısı

I/O Siyahısı
I/O Siyahısı

Addım 6: Aduino Kodu

Eskiz test_Midi6, HC-SC04 ultrasəs sensorundan istifadə etmək üçün Arduino proqramlaşdırma mühitinizə daxil etməli olduğunuz NewPing kitabxanasından istifadə edir. Eskiz Danimarka dilində şərh olunur, üzr istəyirəm.. Eskizin yaxşı qurulmasını təmin etmək üçün, eskizin fərqli məntiq hissələri üçün ayrı-ayrı funksiyalar hazırlanır və qlobal dəyişənlərdən daha çox çəkinilir. Proqram axını MIDI nəzarətçi axın cədvəlində pdf olaraq görüntülənir.

// 15-05-2017 versiyası: test_Midi6

// Søren Østergaard Petesen // Arduino MEGA 2560 // Proqram MIDI nəzarətçisinin MIDI idarə etməsini asanlaşdıran bir proqramdır. // MIDI nəzarətçi ilə əlaqə qura bilərsiniz (kommando haqqında qeyd) hhv. (not off kommando) en oktav C-C, C dur skala üçün. // Dərhal "karate haqqında" yazın və ya oxuyun/ yoxlayın. MIDI əmrləri LDR sensoru işə saldıqda və ya açdıqda məlumatları yoxlamaq üçün istifadə olunur. // MIDI "not" haqqında "qeyd" ən yaxşı şəkildə 3 baytdan bir seriya 1 -ə göndərildikdə // MIDI interfeysi ilə təchiz olunmuşdur. // HC-SR04 ultralydssensor vasitəsilə ən yaxşı nəticələr #daxil edin // biblioteklər ultrasenssensor HC-SR04 #define TRIGGER_PIN 3 // ultrasəs sensoru üçün pin pinini təyin edin #ECHO_PIN ultrason sensoru təyin edin // Arduino pin pin # MAX_DISTANCE 100 -ü təyin edin // Ping üçün #ən yüksək məsafəni təyin edin #Median 5 -i təyin edin və NewPing -in son versiyasını (TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE) seçin; // NewPing obyektinin yaradılması. int Senspin1 = 53; // Underste LDR1 düymələri Senspin2 = 52; // Øverste LDR2 üçün bayt MIDIByte2; // MIDIByte2 bool üçün dəyişkən deklarasiya klar_note_on = 1; // Variabel deklaration for klar_note_on, styrer afsendelse af not on kommando. Første kommando er en note on kommando bool klar_note_off = 0; // Variabel deklaration for klar_note_off, styrer afsendelse off not off kommando void setup () {pinMode (Senspin1, INPUT); // giriş sensoru pinMode (Senspin2, INPUT); // sæt sensor girişi Serial1.begin (31250); // Serial1 MIDI kommunikasiyasına keçid edir: 31250 bit/sekund Serial.begin (9600); // serial monitor, testə qədər} void loop () {bool Sensor1 = digitalRead (Senspin1); // LDRs LDR1 - LDR bool Sensor2 = digitalRead (Senspin2); // LDRs LDR2 - øverste LDR if (Sensor1 && klar_note_on) // {Lite Note_Byte = Hent_tonehojde () ilə əlaqədar qeydlər LDR1 -ə daxil edilir. // Ultralyds sensoru vasitəsi ilə səs tonu MIDIByte2 = Hent_MidiByte2 (Note_Byte); // Hent MidByte2, MIDI qeyd nömrəsi, Send_Note_On (MIDIByte2) aralığından kənarda 0xFF; // göndər Send_Note_On funksiyasında klar_note_on = 0; // komanda klar_note_off = 1 ilə əlaqədar qeyd göndərir; // næste kommando er not off} if (Sensor2 &&! Sensor1 && klar_note_off) // Hvis der skal notes off kommando gøres det…. {Send_Note_Off (MIDIByte2); // not göndər kommando klar_note_off = 0; // der skal kun sendes en not off kommando} if (! Sensor1 &&! Sensor2) // kommando haqqında hər hansı bir qeyd etməzsə, hər şeydən əvvəl {klar_note_on = 1; }} bayt Hent_MidiByte2 (bayt NoteByte) {// Denge funksiyasını qaytaran MIDI qeyd nömrəsi, NoteByte baytı MIDIB2; keçid (NoteByte) // onun MIDIByte2 sənədlərini müəyyən etmək üçün Note_Byte {case 0: {MIDIB2 = 0x3C; // ton 'C'} qırılma; hal 1: {MIDIB2 = 0x3E; // ton 'D'} qırılma; vəziyyət 2: {MIDIB2 = 0x40; // ton 'E'} qırılma; hal 3: {MIDIB2 = 0x41; // ton 'F'} qırılma; hal 4: {MIDIB2 = 0x43; // ton 'G'} qırılma; hal 5: {MIDIB2 = 0x45; // ton 'A'} qırılma; hal 6: {MIDIB2 = 0x47; // ton 'B'} qırılma; vəziyyət 7: {MIDIB2 = 0x48; // ton 'C'} qırılma; standart: {MIDIB2 = 0xFF; // sıra xaricində}} MIDIB2 qaytar; // qaytaran MIDI qeyd nömrəsi} bayt Hent_tonehojde () {// Denne funksiyası son nəticədə imzalanmamış int Tid_uS; // ABŞ -ın baytını yoxlayın; // bir sm bayt nəticə əldə edin; // indeksləşdirmək üçün hər şeyi etmək lazımdır = 58.3; // 2*(1/343 m/s)/100 = 58, 3uS/sm, dər ganges med 2 da tiden er summen af tiden frem og tilbage. Tid_uS = sonar.ping_median (Orta); // Ping göndərin, ABŞ -da bir neçə gündən sonra, Orta hesabla göndərin Afstand = Tid_uS / Omregningsfaktor; // Bir neçə sm (0 = kənar məsafə aralığında) nəticə əldə edin = Afstand / 8; // nəticəni geri qaytarın; // Returner nəticəsində} void Send_Note_On (bayt tonenr) {// Denni funksiyası göndərən MIDI interfeys quruluşu ilə bağlı qeyd edir kommando = 0x90; // MIDI kanal 1 ilə bağlı qeyd 1 bayt həcmi = 0xFF; // həcm / Sürət = 127 Serial1.write (kommando); // kommando haqqında qeyd göndər Serial1.write (tonenr); // ton nömrəsi göndər Serial1.write (cild); // həcmi göndər (sürət)} void Send_Note_Off (bayt tonenr) {// Denni funksiyasını göndərən qeyd MIDI interfeysi const bayt kommando = 0x80; // MIDI kanalının 1 bayt həcmi = 0xFF olduğunu unutmayın; // həcm / Sürət = 127 Serial1.write (kommando); // not göndər kommando Serial1.write (tonenr); // ton nömrəsi göndər Serial1.write (cild); // həcm göndər (sürət)}

Addım 7: MIDI ünsiyyətinin əsasları

MIDI (Musiqili Alət Rəqəmsal İnterfeysi), elektron musiqi alətləri və digər qurğularla əlaqə qurmaq üçün universal serial rabitə protokoludur. Serial rabitə istifadə olunur (31250 bit/s, ötürücü mühit cərəyan halqasıdır, alıcı ucunda opto-izolyasiya olunmuşdur. 5pin DIN konnektorları istifadə olunur. Bir fiziki MIDI bağlantısında 16 məntiqi əlaqə kanalı mümkündür. MIDI-də bir çox əmrlər müəyyən edilmişdir. standart, bu layihədə iki əmr istifadə edirəm, bu əmrlər 3 baytdan ibarətdir:

a) Komanda haqqında qeyd:

1. bayt göndər = 0x90 MIDI kanal 1 -də əmr haqqında qeyd deməkdir

2. bayt göndər = 0xZZ ZZ qeyd nömrəsidir, 0x3C ilə 0x48 aralığını istifadə edirəm

3. bayt göndərmə = 0xFF FF = 255 maksimum həcmi, 0x00 ilə 0xFF aralığını ifadə edir

b) Not Off əmri: 1. bayt göndər = 0x80, MIDI kanal 1 -də qeyd etmə əmrini bildirir

2. bayt göndər = 0xZZ ZZ qeyd nömrəsidir, 0x3C ilə 0x48 aralığını istifadə edirəm

3. bayt göndərmə = 0xFF FF = 255 maksimum həcmi, 0x00 ilə 0xFF aralığını ifadə edir

Tövsiyə: