สารบัญ:

EAL - Arduino MIDI Controller: 7 ขั้นตอน
EAL - Arduino MIDI Controller: 7 ขั้นตอน

วีดีโอ: EAL - Arduino MIDI Controller: 7 ขั้นตอน

วีดีโอ: EAL - Arduino MIDI Controller: 7 ขั้นตอน
วีดีโอ: EP.01# DIY Line6 M5 Midi Foot Controller Part1 (arduino midi program change) 2024, กรกฎาคม
Anonim
EAL - คอนโทรลเลอร์ Arduino MIDI
EAL - คอนโทรลเลอร์ Arduino MIDI

ผลิตโดย Søren Østergaard Petersen, OEAAM16EDA

คำแนะนำนี้อธิบายตัวควบคุม MIDI ที่ใช้ Arduino นี่เป็นโครงการของโรงเรียน ด้วยการใช้มือของคุณ คุณสามารถเล่นท่วงทำนองง่ายๆ ผ่านการเชื่อมต่อ 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 ใช้อินเวอร์เตอร์ hex 74HC14 และเป็นวงจรมาตรฐานที่ค่อนข้างมาก การสื่อสาร MIDI ใช้ serial1 พอร์ตอนุกรมมาตรฐานใช้สำหรับการแก้ไขข้อบกพร่อง

เมื่อเข็มนาฬิกาเคลื่อนขึ้นตรงและออกจากลำแสง เซ็นเซอร์แสงด้านบนจะตรวจจับลำแสงอีกครั้ง และข้อความ MIDI Note Off จะถูกบรรจุและส่งสัญญาณไปที่เอาต์พุต MIDI

พื้นที่เล่นระหว่างเซ็นเซอร์อยู่ที่ประมาณ 63 ซม. และความยาวรวมของตัวควบคุม MIDI อยู่ที่ประมาณ 75 ซม.

ขั้นตอนที่ 2: รายละเอียดของเซนเซอร์ตรวจจับแสง

รายละเอียดของเซนเซอร์ตรวจจับแสง
รายละเอียดของเซนเซอร์ตรวจจับแสง
รายละเอียดของเซนเซอร์ตรวจจับแสง
รายละเอียดของเซนเซอร์ตรวจจับแสง

เซ็นเซอร์วัดแสงสองตัวติดตั้งอยู่ด้านบนของกันและกันเพื่อสร้างระบบเซ็นเซอร์คู่ ป้องกันการทริกเกอร์ที่ผิดพลาดเมื่อใช้อย่างถูกต้องในซอฟต์แวร์ เซ็นเซอร์วัดแสงแต่ละตัวประกอบด้วยโมดูลตัวต้านทานภาพถ่ายที่ติดตั้งในหลอดไฟฟ้ามาตรฐานขนาด 16 มม. สล็อตถูกสร้างขึ้นในแต่ละหลอดด้วยเลื่อยเลือยตัดโลหะและสามารถกด PCB ตัวต้านทานภาพถ่ายลงในสล็อตได้ เซ็นเซอร์ถูกติดเทปไว้ด้วยกันด้วยเทปพันสายไฟและยึดกับปลายไม้ด้านหนึ่งด้วย แสงจะต้องไม่สามารถเข้าถึงเซ็นเซอร์จากด้านหลังได้ เซ็นเซอร์วัดแสงมีตัวต้านทานแบบดึงขึ้น 10k ในตัว

ขั้นตอนที่ 3: รายละเอียดของ HC-SR04 Ultrasonic Sensor

รายละเอียดของ HC-SR04 Ultrasonic Sensor
รายละเอียดของ HC-SR04 Ultrasonic Sensor

เซ็นเซอร์อัลตราโซนิก HC-SR04 ได้รับการแก้ไขที่ปลายอีกด้านหนึ่งของตัวควบคุม MIDI ไฟฉายสว่างก็ถูกวางไว้ที่นี่เช่นกัน มันสร้างลำแสงที่จำเป็น

ขั้นตอนที่ 4: วงจร Aduino

Aduino Circuit
Aduino Circuit
Aduino Circuit
Aduino Circuit

วงจรเอาต์พุต MIDI นั้นเป็นอินเวอร์เตอร์ hex มาตรฐาน 74HC14 และตัวต้านทานสองสามตัวพร้อมขั้วต่อตัวเมีย DIN 5 พิน วงจร 74HC14 ขับเอาต์พุต MIDI และในขณะเดียวกันก็มีวิธีการป้องกันบอร์ด Arduino จาก "โลกแห่งความจริง" ที่เชื่อมต่อกับ MIDI out คุณลักษณะที่ใช้งานได้จริงเพิ่มเติมคือ LED กิจกรรม MIDI ที่ส่งสัญญาณเมื่อมีการส่งข้อมูล

ฉันใช้ PCB ต้นแบบที่เหมาะสมสำหรับฮาร์ดแวร์ของฉันเพราะฉันมีปัญหามากมายเกี่ยวกับการเชื่อมต่อที่ไม่ดีบนเขียงหั่นขนมของฉัน แผนผังนี้สร้างขึ้นใน Fritzing สามารถดาวน์โหลดสำเนา PDF ความละเอียดสูงได้โดยกดลิงก์ด้านล่าง ฉันชอบใช้โปรแกรมแผนผังที่เหมาะสม เช่น Kicad ฉันคิดว่า Fritzing ถูกจำกัดไว้สำหรับอะไรก็ได้ยกเว้นการทดลองที่ง่ายที่สุด

วัสดุที่ใช้:

1 ชิ้น Arduino MEGA 2560

ตัวต้านทานภาพถ่าย (LDR) 2 ชิ้นพร้อมตัวต้านทานดึงขึ้นในตัว (จากชุดเซ็นเซอร์ 37 ชุด)

1 ชิ้น HC-SR04 เซ็นเซอร์อัลตราโซนิก

1 ชิ้น 74HC14 hex inverting Schmitt trigger

ตัวต้านทาน 2 ชิ้น 220 โอห์ม 0.25W

ตัวต้านทาน 1 ชิ้น 1k โอห์ม 0.25W

1 ชิ้น LED กระแสไฟต่ำ 2mA

1 pcs 100nF ตัวเก็บประจุเซรามิก (สำหรับตัวแยกแหล่งจ่ายไฟโดยตรงที่หมุดจ่ายไฟของ 74HC14)

เขียงหั่นขนมหรือ PCB ต้นแบบ

หลอดไฟฟ้า 16 มม. 2 ชิ้น ยาว 65 มม.

ไม้ 1 ชิ้น ยาว 75 ซม.

เทปพันท่อ

สายไฟ

ขั้นตอนที่ 5: รายชื่อ I/O

รายการ I/O
รายการ I/O

ขั้นตอนที่ 6: รหัส Aduino

Sketch test_Midi6 ใช้ไลบรารี NewPing ซึ่งคุณต้องรวมไว้ในสภาพแวดล้อมการเขียนโปรแกรม Arduino ของคุณเพื่อใช้เซ็นเซอร์อัลตราโซนิก HC-SC04 ร่างนี้มีความคิดเห็นเป็นภาษาเดนมาร์ก ขออภัย.. เพื่อให้ร่างภาพร่างมีโครงสร้างที่ดี ฟังก์ชันแยกกันถูกสร้างขึ้นสำหรับส่วนตรรกะต่างๆ ของภาพร่าง และส่วนใหญ่จะหลีกเลี่ยงตัวแปรส่วนกลาง ผังโปรแกรมถูกแสดงเป็นภาพในผังงานตัวควบคุม MIDI pdf

// 15-05-2017 เวอร์ชัน: test_Midi6

// Søren Østergaard Petesen // Arduino MEGA 2560 // Dette โปรแกรม udgør en simpel MIDI controller และ en ekstern MIDI enhed, f.eks en softsynt på en PC. // MIDI controlleren kan sende toneanslag (หมายเหตุในคอมมานโด) hhv. (note off kommando) สำหรับ en oktav C-C, C dur skala // Der หก med en "คาราเต้ 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 (หมายเหตุ), samt når hånden fjernes igen (หมายเหตุ) // MIDI kommandoerne "note on" และ "note off" består hver af 3 bytes som sendes på serial1 porten // vha det i hardware opbyggede อินเทอร์เฟซ 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 สำหรับเซ็นเซอร์อัลตราโซนิก #define ECHO_PIN 2 // Arduino pin til echo pinå ultrasonic sensor # กำหนด MAX_DISTANCE 100 // ค่า afstand สูงสุดสำหรับ Ping #define ค่ามัธยฐาน 5 // Antal målinger der beregnes gennemsnit af สำหรับที่ få en sikker afstandsbestemmelse โซนาร์ NewPing (TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE); // การสร้างวัตถุ NewPing int Senspin1 = 53; // Underste LDR1 føler int Senspin2 = 52; //Øverste LDR2 สำหรับไบต์ MIDIByte2; //การแยกตัวแปรสำหรับ MIDIByte2 bool klar_note_on = 1; //การแยกตัวแปรสำหรับ klar_note_on, styer afsendelse af note on kommando. Første kommando er en note on kommando bool klar_note_off = 0; // deklaration Varibel สำหรับ klar_note_off, styer afsendelse af note ปิดการตั้งค่า kommando void () {pinMode (Senspin1, INPUT); // ตั้งค่าเซ็นเซอร์อินพุต pinMode (Senspin2, INPUT); // เซ็นเซอร์อินพุต Serial1.begin(31250); // Serial1 bruges จนถึง MIDI kommunikation: 31250 bit/sekundt Serial.begin(9600); // มอนิเตอร์แบบอนุกรม til ทดสอบ } 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 aktiveret og klar til note on { ไบต์ Note_Byte = Hent_tonehojde (); //เฮ็นท์โทนผ่านเซ็นเซอร์ ultralyds MIDIByte2 = Hent_MidiByte2 (Note_Byte); // Hent MidByte2, MIDI note number, værdien 0xFF er out of range Send_Note_On(MIDIByte2); // kald Send_Note_On funktion klar_note_on = 0; // der skal kun ส่ง en note บน 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) {// หมายเลขบันทึก MIDI ของ Denne funktion returner, valgt ud fra NoteByte ไบต์ MIDIB2; สวิตช์ (NoteByte) // คำจำกัดความของเธอ hvilken værdi MIDIByte2 skal have ud fra værdien af Note_Byte { กรณี 0: { MIDIB2 = 0x3C; // โทน 'C' } แตก; กรณีที่ 1: { MIDIB2 = 0x3E; // โทน 'D' } แตก; กรณีที่ 2: { MIDIB2 = 0x40; // โทน 'E' } แตก; กรณีที่ 3: { MIDIB2 = 0x41; // โทน 'F' } แตก; กรณีที่ 4: { MIDIB2 = 0x43; // โทน 'G' } แตก; กรณีที่ 5: { MIDIB2 = 0x45; // โทน 'A' } แตก; กรณีที่ 6: { MIDIB2 = 0x47; // โทน 'B' } แตก; กรณีที่ 7: { MIDIB2 = 0x48; // โทน 'C' } แตก; ค่าเริ่มต้น: { MIDIB2 = 0xFF; // อยู่นอกช่วง } } ส่งคืน MIDIB2; // หมายเลขบันทึก MIDI ผู้ส่งคืน } ไบต์ Hent_tonehojde () {// Denne funktion henter resultatet af ultralydsmålingen unsigned int Tid_uS; // målt tid i uS byte Afstand; // beregnet ยอมรับ i cm byte resultat; // inddeling af การรั่วไหล område const float Omregningsfaktor = 58.3; // 2*(1/343 m/s)/100 = 58, 3uS/cm, มากกว่า ganges กับ 2 da tiden er summen af tiden frem og tilbage Tid_uS = sonar.ping_median (ค่ามัธยฐาน); // ส่ง ping, få tid retur i uS, gennemsint af Median målinger Afstand = Tid_uS / Omregningsfaktor; // Omregn tid til afstand i cm (0 = ระยะนอกระยะ) resultat = Afstand / 8; //Beregn resultat ส่งคืน resultat; //Returner resultat } เป็นโมฆะ Send_Note_On (byte tonr) {// Denne funktion sender en note บน kommando på MIDI interfacet const byte kommando = 0x90; // หมายเหตุเกี่ยวกับ kommando på MIDI kanal 1 const byte volumen = 0xFF; // ปริมาตร / ความเร็ว = 127 Serial1.write (คอมมานโด); // ส่งข้อความไปที่ kommando Serial1.write(tonenr); //ส่งโทนเสียง Serial1.write(volumen); //send volumen (velocity) } เป็นโมฆะ Send_Note_Off (byte tonr) {// Denne funktion sender note off kommando på MIDI interfacet const byte kommando = 0x80; // จดบันทึก kommando på MIDI kanal 1 const byte volumen = 0xFF; // ปริมาตร / ความเร็ว = 127 Serial1.write (คอมมานโด); // ส่งข้อความไปที่ kommando Serial1.write(tonenr); //ส่งโทนเสียง Serial1.write(volumen); // ส่งปริมาตร (ความเร็ว) }

ขั้นตอนที่ 7: พื้นฐานของการสื่อสาร MIDI

MIDI (Musical Instrument Digital Interface) เป็นโปรโตคอลการสื่อสารแบบอนุกรมสากลสำหรับเชื่อมต่อเครื่องดนตรีอิเล็กทรอนิกส์และอุปกรณ์อื่นๆ ใช้การสื่อสารแบบอนุกรม (31250 บิต/วินาที สื่อส่งเป็นลูปปัจจุบัน แยกออปโตที่ปลายตัวรับสัญญาณ ใช้ตัวเชื่อมต่อ DIN 5 พิน ช่องการสื่อสารแบบลอจิคัล 16 ช่องเป็นไปได้ในการเชื่อมต่อ MIDI ทางกายภาพครั้งเดียว คำสั่งจำนวนมากถูกกำหนดไว้ใน MIDI มาตรฐาน ฉันใช้สองคำสั่งในโครงการนี้ คำสั่งเหล่านี้ประกอบด้วย 3 ไบต์:

ก) หมายเหตุเกี่ยวกับคำสั่ง:

1. ไบต์ส่ง = 0x90 หมายถึงบันทึกคำสั่งบนช่อง MIDI 1

2. byte send = 0xZZ ZZ เป็นเลขโน้ต ผมใช้ช่วง 0x3C ถึง 0x48

3. ไบต์ส่ง =0xFF FF = 255 หมายถึงปริมาณสูงสุด ช่วง 0x00 ถึง 0xFF

ข) คำสั่งปิดหมายเหตุ:1. ไบต์ส่ง = 0x80 หมายถึงคำสั่งปิดบันทึกบนช่อง MIDI 1

2. byte send = 0xZZ ZZ เป็นเลขโน้ต ผมใช้ช่วง 0x3C ถึง 0x48

3. ไบต์ส่ง =0xFF FF = 255 หมายถึงปริมาณสูงสุด ช่วง 0x00 ถึง 0xFF

แนะนำ: