جدول المحتويات:

EAL - وحدة تحكم Arduino MIDI: 7 خطوات
EAL - وحدة تحكم Arduino MIDI: 7 خطوات

فيديو: EAL - وحدة تحكم Arduino MIDI: 7 خطوات

فيديو: EAL - وحدة تحكم Arduino MIDI: 7 خطوات
فيديو: World’s SMALLEST MIDI Controller | Made with Teensy & Arduino 2024, شهر نوفمبر
Anonim
EAL - وحدة تحكم Arduino MIDI
EAL - وحدة تحكم Arduino MIDI

صنع بواسطة Søren Østergaard Petersen ، OEAAM16EDA

يصف هذا التوجيه وحدة تحكم MIDI قائمة على اردوينو. هذا مشروع مدرسي. باستخدام يدك ، يمكنك تشغيل ألحان بسيطة عبر اتصال MIDI وأداة MIDI المتصلة (أو كما في هذه الحالة كمبيوتر محمول يعمل ببرنامج softsynth). يمكنك عزف النغمات من المقياس الرئيسي C ، c-d-e-f-g-a-b-c. لتتمكن من توصيل وحدة تحكم MIDI بجهاز كمبيوتر محمول ، ستحتاج إلى واجهة MIDI إلى USB مثل m-audio Uno.

الخطوة 1: فيديو توضيحي

Image
Image

ارفع الصوت واستمتع

كيف تعمل:

تستخدم وحدة تحكم MIDI لوحة Arduino MEGA 2560. يشكل مستشعران للضوء (LDR) مدمجان في أنبوب كهربائي بحجم 16 مم نظام استشعار مزدوج ويتم استخدامهما لإنشاء مشغل ثابت دون أي تشغيل مزدوج كاذب. يقوم مصباح يدوي بإنشاء شعاع ضوئي ، عندما يتم مقاطعة الحزمة بواسطة اليد التي تلعب وحدة التحكم ، يستشعر مستشعر الضوء السفلي الحزمة المفقودة ، ويقيس مستشعر الموجات فوق الصوتية HC-SR04 المسافة من المستشعر إلى اليد.

يتم استخدام المسافة التي تم قياسها في برنامج Arduino لحساب وإعداد قيمة رقم الملاحظة المناسبة ليتم تعبئتها في رسالة MIDI Note On والإرسال على واجهة MIDI. تستخدم واجهة إخراج MIDI عاكس سداسي عشري 74HC14 وهو إلى حد كبير دائرة قياسية. يستخدم اتصال MIDI serial1 ، ويستخدم المنفذ التسلسلي القياسي لتصحيح الأخطاء.

عندما يتم تحريك اليد بشكل مستقيم وبعيدًا عن شعاع الضوء ، يستشعر مستشعر الضوء العلوي شعاع الضوء مرة أخرى ويتم تعبئة رسالة MIDI Note Off وإرسالها على خرج MIDI.

تبلغ مساحة اللعب بين المستشعرات حوالي 63 سم ، ويبلغ الطول الإجمالي لوحدة التحكم MIDI حوالي 75 سم.

الخطوة الثانية: تفاصيل مجسات الضوء

تفاصيل مجسات الضوء
تفاصيل مجسات الضوء
تفاصيل مجسات الضوء
تفاصيل مجسات الضوء

تم تثبيت مستشعري الضوء فوق بعضهما البعض لتشكيل نظام استشعار مزدوج. يمنع التشغيل الخاطئ عند استخدامه بشكل صحيح في البرنامج. يتكون كل مستشعر ضوء من وحدة مقاومة ضوئية مدمجة في أنبوب كهربائي قياسي 16 مم. يتم عمل فتحة في كل أنبوب بمنشار ويمكن الضغط على المقاوم للصور PCB في الفتحة. يتم لصق المستشعرات مع شريط لاصق ويتم تثبيتها أيضًا في أحد طرفي قطعة من الخشب. يجب ألا يصل أي ضوء إلى المستشعرات من الخلف. تحتوي مستشعرات الضوء على مقاومات سحب 10 كيلو.

الخطوة 3: تفاصيل حساس الموجات فوق الصوتية HC-SR04

تفاصيل مستشعر الموجات فوق الصوتية HC-SR04
تفاصيل مستشعر الموجات فوق الصوتية HC-SR04

تم إصلاح مستشعر الصوت الفائق HC-SR04 في الطرف الآخر من وحدة تحكم MIDI. يتم وضع مصباح يدوي ساطع هنا أيضًا ، فهو يخلق شعاع الضوء الضروري.

الخطوة 4: حلبة Aduino

حلبة Aduino
حلبة Aduino
حلبة Aduino
حلبة Aduino

دارة إخراج MIDI هي في الأساس محول سداسي عشري 74HC14 وعدد قليل من المقاومات بالإضافة إلى موصل أنثى DIN 5 سنون. تقوم الدائرة 74HC14 بتشغيل إخراج MIDI وفي نفس الوقت توفر بعض وسائل الحماية للوحة Arduino ضد "العالم الحقيقي" المتصل بخرج MIDI. ميزة عملية إضافية هي مؤشر LED لنشاط MIDI الذي يشير عند إرسال البيانات.

لقد استخدمت نموذجًا أوليًا مناسبًا لثنائي الفينيل متعدد الكلور لجهازي لأنني واجهت الكثير من المشاكل مع الاتصالات السيئة على لوح التجارب. تم إنشاء المخطط في Fritzing ، ويمكن تنزيل نسخة PDF عالية الدقة بالضغط على الرابط أدناه. أفضل استخدام برنامج تخطيطي مناسب مثل Kicad ، أعتقد أن Fritzing يقتصر على أي شيء باستثناء أبسط التجارب.

المواد المستخدمة:

1 قطعة اردوينو ميجا 2560

2 قطعة مقاوم للصور (LDR) مع مقاوم سحب مدمج (من 37 مجموعة مستشعر)

1 قطعة HC-SR04 جهاز استشعار بالموجات فوق الصوتية

1 قطعة 74HC14 عرافة الزناد شميت

2 قطعة المقاوم 220 أوم 0.25 واط

1 قطعة المقاوم 1 كيلو أوم 0.25 واط

1 قطعة LED تيار منخفض 2mA

1 قطعة مكثف سيراميك 100nF (لفصل إمداد الطاقة ، مباشرة عند دبابيس الطاقة 74HC14)

اللوح أو النموذج الأولي ثنائي الفينيل متعدد الكلور

2 قطعة أنبوب كهربائي 16 مللي متر ، طول 65 مللي متر

قطعة واحدة من الخشب بطول 75 سم

شريط لاصق

الأسلاك

الخطوة 5: قائمة الإدخال / الإخراج

قائمة الإدخال / الإخراج
قائمة الإدخال / الإخراج

الخطوة 6: كود Aduino

يستخدم اختبار الرسم التخطيطي Midi6 مكتبة NewPing التي يجب عليك تضمينها في بيئة برمجة Arduino الخاصة بك ، لاستخدام مستشعر الموجات فوق الصوتية HC-SC04. تم التعليق على الرسم باللغة الدنماركية ، آسف.. للحفاظ على المخطط جيدًا ، يتم تكوين وظائف منفصلة لأجزاء منطقية مختلفة من المخطط ويتم تجنب المتغيرات العامة في الغالب. يتم تصور تدفق البرنامج في مخطط انسيابي لوحدة تحكم MIDI بتنسيق pdf.

// 15-05-2017 الإصدار: test_Midi6.0

// 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 controlleren kan sende toneanslag (note on kommando) hhv. (note off kommando) لـ en oktav C-C، C dur skala. // Der spilles med en "karate hånd" på et brædt // hvor sensorerne er monteret. يقوم MIDI kommandoerne بتشغيل مستشعر af en dobbelt LDR ، و da der skal laves en sikker // detektering af både når hånden lander på brættet (ملاحظة على) ، samt når hånden fjernes igen (ملاحظة إيقاف). // MIDI kommandoerne "note on" og "note off" består hver af 3 bytes Som sendes på serial1 porten // vha det i الأجهزة opbyggede MIDI interface. // Tonehøjden bestemmes vha ultralydssensor HC-SR04 # يتضمن // bibliotek til den anvendte ultralydssensor HC-SR04 # تعريف TRIGGER_PIN 3 // Arduino pin til Tril Trig pin på حساس فوق صوتي # محدد ECHO_PIN 2 // Arduino pin til تحديد MAX_DISTANCE 100 // أقصى مسافة لـ Ping #define Median 5 // // إنشاء كائن NewPing. كثافة العمليات Senspin1 = 53 ؛ // Underste LDR1 føler int Senspin2 = 52 ؛ // Øverste LDR2 føler byte MIDIByte2 ؛ // تعريف المتغير لـ MIDIByte2 bool klar_note_on = 1 ؛ // إعلان متغير لـ klar_note_on ، مصمم afsendelse af note على kommando. Første kommando er en note on kommando bool klar_note_off = 0 ؛ // إعلان متغير لـ klar_note_off ، Styrer afsendelse af note off kommando void setup () {pinMode (Senspin1، INPUT)؛ // وضع إدخال مستشعر pinMode (Senspin2 ، INPUT) ؛ // دخل مستشعر sæt Serial1.begin (31250) ؛ // Serial1 bruges til MIDI kommunikation: 31250 bit / sekundt Serial.begin (9600) ؛ // جهاز العرض التسلسلي ، til test} الحلقة الفارغة () {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 højde عبر مستشعر ultralyds MIDIByte2 = Hent_MidiByte2 (Note_Byte) ؛ // Hent MidByte2 ، رقم ملاحظة MIDI ، værdien 0xFF er خارج النطاق Send_Note_On (MIDIByte2) ؛ // kald Send_Note_On funktion klar_note_on = 0 ؛ // der skal kun ترسل ملاحظة en على kommando klar_note_off = 1 ؛ // næste kommando er note off} if (Sensor2 &&! Sensor1 && klar_note_off) // Hvis der skal ترسل ملاحظة من kommando gøres det her.. {Send_Note_Off (MIDIByte2)؛ // أرسل ملاحظة من 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؛ }} بايت Hent_MidiByte2 (بايت NoteByte) {// رقم ملاحظة Denne funktion returnerer MIDI ، valgt ud fra NoteByte byte MIDIB2؛ switch (NoteByte) // تعريفاتها hvilken værdi MIDIByte2 skal لديها ud fra værdien af Note_Byte {case 0: {MIDIB2 = 0x3C؛ // tonen 'C'} استراحة ؛ الحالة 1: {MIDIB2 = 0x3E ؛ // tonen 'D'} استراحة ؛ الحالة 2: {MIDIB2 = 0x40 ؛ // tonen 'E'} استراحة ؛ الحالة 3: {MIDIB2 = 0x41 ؛ // tonen 'F'} استراحة ؛ الحالة 4: {MIDIB2 = 0x43 ؛ // tonen 'G'} استراحة ؛ الحالة 5: {MIDIB2 = 0x45 ؛ // tonen 'A'} استراحة ؛ الحالة 6: {MIDIB2 = 0x47 ؛ // tonen 'B'} استراحة ؛ الحالة 7: {MIDIB2 = 0x48 ؛ // tonen 'C'} استراحة ؛ الافتراضي: {MIDIB2 = 0xFF ؛ // خارج النطاق}} إرجاع 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 بايت نتيجة ؛ // inddeling af spille område const float Omregningsfaktor = 58.3 ؛ // 2 * (1/343 م / ث) / 100 = 58 ، 3uS / سم ، der ganges med 2 da tiden er Summen af tiden frem og tilbage. Tid_uS = sonar.ping_median (متوسط) ؛ // Send ping، få tid retur i uS، gennemsint af Median målinger Afstand = Tid_uS / Omregningsfaktor؛ // Omregn tid til afstand i cm (0 = خارج نطاق المسافة) نتيجة = Afstand / 8 ؛ // Beregn resultat إرجاع النتائج ؛ // Returner resultat} void Send_Note_On (بايت Tonenr) {// Denne funktion sender en note on kommando på MIDI interface const byte kommando = 0x90؛ // ملاحظة على kommando på MIDI kanal 1 const بايت حجم البايت = 0xFF ؛ // volumen / Velocity = 127 Serial1.write (kommando) ؛ // أرسل ملاحظة على kommando Serial1.write (tonenr) ؛ // إرسال نغمة nummer Serial1.write (volumen) ؛ // send volumen (velocity)} void Send_Note_Off (byte tonenr) {// Denne funktion sender note off kommando på MIDI interface const byte kommando = 0x80؛ // ملحوظة من kommando på MIDI kanal 1 const بايت حجم البايت = 0xFF ؛ // volumen / Velocity = 127 Serial1.write (kommando) ؛ // أرسل ملاحظة من kommando Serial1.write (tonenr) ؛ // إرسال نغمة nummer Serial1.write (volumen) ؛ // إرسال الحجم (السرعة)}

الخطوة السابعة: أساسيات اتصالات MIDI

MIDI (الواجهة الرقمية للآلات الموسيقية) هو بروتوكول اتصال تسلسلي عالمي لربط الآلات الموسيقية الإلكترونية والأجهزة الأخرى. يتم استخدام الاتصال التسلسلي (31250 بت / ثانية ، وسيط الإرسال عبارة عن حلقة حالية ، معزولة بصريًا في نهاية المستقبل. يتم استخدام موصلات DIN ذات 5 سنون.يمكن استخدام 16 قناة اتصال منطقي في اتصال MIDI مادي واحد. يتم تحديد العديد من الأوامر في MIDI قياسي ، أستخدم أمرين في هذا المشروع ، تتكون هذه الأوامر من 3 بايت:

أ) ملاحظة حول الأمر:

1. إرسال البايت = 0x90 بمعنى ملاحظة عند الأمر على قناة MIDI 1

2. إرسال البايت = 0xZZ ZZ هو رقم الملاحظة ، يمكنني استخدام النطاق 0x3C إلى 0x48

3. إرسال البايت = 0xFF FF = 255 يعني الحجم الأقصى ، النطاق من 0x00 إلى 0xFF

ب) ملاحظة إيقاف الأمر: 1. إرسال البايت = 0x80 بمعنى ملاحظة إيقاف الأمر على قناة MIDI 1

2. إرسال البايت = 0xZZ ZZ هو رقم الملاحظة ، يمكنني استخدام النطاق 0x3C إلى 0x48

3. إرسال البايت = 0xFF FF = 255 مما يعني الحجم الأقصى ، والمدى من 0x00 إلى 0xFF

موصى به: