Talaan ng mga Nilalaman:

EAL - Arduino MIDI Controller: 7 Mga Hakbang
EAL - Arduino MIDI Controller: 7 Mga Hakbang

Video: EAL - Arduino MIDI Controller: 7 Mga Hakbang

Video: EAL - Arduino MIDI Controller: 7 Mga Hakbang
Video: Управляйте своим Arduino с iPhone, iPad, iWatch и Mac - поддерживается голосовая команда Siri! 2024, Hulyo
Anonim
EAL - Arduino MIDI Controller
EAL - Arduino MIDI Controller

Ginawa ni Søren Østergaard Petersen, OEAAM16EDA

Ang itinuturo na ito ay naglalarawan ng isang arduino batay sa MIDI controller. Ito ay isang proyekto sa paaralan. Sa pamamagitan ng paggamit ng iyong kamay maaari kang maglaro ng mga simpleng himig sa pamamagitan ng koneksyon sa MIDI at isang konektadong instrumento ng MIDI (o tulad ng sa kasong ito isang notebook na nagpapatakbo ng isang softsynth software). Maaari kang maglaro ng mga tala mula sa isang pangunahing sukat ng C, d-e-f-g-a-b-c. Upang maiugnay ang MIDI controller sa isang notebook, kakailanganin mo ng isang MIDI sa USB interface tulad ng m-audio Uno.

Hakbang 1: Video ng Pagpapakita

Image
Image

I-up ang lakas ng tunog at mag-enjoy!

Paano ito gumagana:

Gumagamit ang MIDI controller ng isang Arduino MEGA 2560 board. Dalawang ilaw (LDR) sensor na binuo sa 16mm electrical tube ay bumubuo ng isang dobleng sistema ng sensor at ginagamit para sa paglikha ng isang matatag na gatilyo nang walang anumang maling pag-trigger ng dobleng. Ang isang flashlight ay lumilikha ng isang light beam, kapag ang sinag ay nagambala ng kamay na nagpe-play ng controller, nadarama ng mas mababang sensor ng ilaw ang nawawalang sinag, at sinusukat ng isang ultrasonikong sensor ng HC-SR04 ang distansya mula sa sensor patungo sa kamay.

Ang sinusukat na distansya ay ginagamit sa programa ng Arduino para sa pagkalkula at pag-set up ng naaangkop na halaga ng tala ng numero na naka-pack sa isang mensahe ng MIDI Note On at transmittet sa interface ng MIDI. Ang interface ng output ng MIDI ay gumagamit ng isang 74HC14 hex inverter at medyo isang karaniwang circuit. Gumagamit ang komunikasyon ng MIDI ng serial1, ginagamit ang karaniwang serial port para sa pag-debug.

Kapag ang kamay ay inililipat nang diretso at palayo sa light beam, nadarama muli ng pang-itaas na sensor ng ilaw ang sinag ng ilaw at isang mensahe na MIDI Note Off ang naka-pack at transmittet sa output ng MIDI.

Ang lugar ng paglalaro sa pagitan ng mga sensor ay nasa paligid ng 63cm, at ang kabuuang haba ng MIDI controller ay nasa paligid ng 75cm.

Hakbang 2: Mga Detalye ng Mga Light Sensor

Mga detalye ng Light Sensors
Mga detalye ng Light Sensors
Mga detalye ng Light Sensors
Mga detalye ng Light Sensors

Ang dalawang light sensor ay naka-mount sa bawat isa upang makabuo ng isang dobleng sistema ng sensor. Pinipigilan nito ang maling pag-trigger kapag ginamit nang tama sa software. Ang bawat light sensor ay binubuo ng isang module ng resistor ng larawan na binuo sa isang 16 mm na karaniwang electrical tube. Ang isang puwang ay ginawa sa bawat tubo na may isang hacksaw at ang resistor ng PCB ng larawan ay maaaring mapindot sa puwang. Ang mga sensor ay naka-tape kasama ng duct tape at naayos din sa isang dulo ng isang piraso ng kahoy. Walang ilaw na dapat maabot ang mga sensor mula sa likuran. Ang mga light sensor ay nakabuo ng 10k na pull-up resistors.

Hakbang 3: Mga detalye ng HC-SR04 Ultrasonic Sensor

Mga detalye ng HC-SR04 Ultrasonic Sensor
Mga detalye ng HC-SR04 Ultrasonic Sensor

Ang HC-SR04 ultra sonic sensor ay naayos sa kabilang dulo ng MIDI controller. Ang isang maliwanag na flashlight ay nakalagay din dito, lumilikha ito ng kinakailangang light beam.

Hakbang 4: Ang Aduino Circuit

Ang Aduino Circuit
Ang Aduino Circuit
Ang Aduino Circuit
Ang Aduino Circuit

Ang MIDI output circuit ay karaniwang isang karaniwang 74HC14 hex inverter at ilang resistors kasama ang isang 5 pin DIN na babaeng konektor. Ang 74HC14 circuit ay nagtutulak ng output ng MIDI at kasabay nito ay nagbibigay ng ilang paraan ng proteksyon para sa Arduino board laban sa "totoong mundo" na konektado sa MIDI out. Ang isang labis na praktikal na tampok ay ang LED aktibidad ng MIDI na nagpapahiwatig ng signal kapag naipadala ang data.

Gumamit ako ng tamang prototype PCB para sa aking hardware dahil marami akong mga problema sa hindi magagandang koneksyon sa aking breadboard. Ang iskematiko ay ginawa sa Fritzing, ang isang mataas na resolusyon na kopya ng pdf ay maaaring ma-download sa pamamagitan ng pagpindot sa link sa ibaba. Mas gusto ko ang paggamit ng wastong iskema ng programa tulad ng Kicad, sa palagay ko ang Fritzing ay limitado para sa anumang bagay ngunit ang pinakasimpleng mga eksperimento.

Mga ginamit na materyal:

1 pcs Arduino MEGA 2560

2 pcs Photo resistor (LDR) na may built-in na pull up risistor (mula sa 37 sensor kit)

1 mga PC HC-SR04 ultrasonic sensor

1 pcs 74HC14 hex inverting Schmitt gatilyo

2 pcs risistor 220 Ohm 0.25W

1 pcs risistor 1k Ohm 0.25W

1 pcs LED mababang kasalukuyang 2mA

1 pcs 100nF ceramic capacitor (para sa decoupling ng power supply, direkta sa mga power pin ng 74HC14)

Breadboard o prototype PCB

2 pcs 16mm electrical tube, haba 65mm

1 pcs ng kahoy, haba 75cm

Duct tape

Mga wire

Hakbang 5: Listahan ng I / O

Listahan ng I / O
Listahan ng I / O

Hakbang 6: Ang Aduino Code

Gumagamit ang sketch test_Midi6 ng library ng NewPing na dapat mong isama sa iyong kapaligiran ng programa ng Arduino, upang magamit ang HC-SC04 ultrasonic sensor. Ang sketch ay nagkomento sa danish, sorry.. Upang mapanatili ang balangkas na maayos, ang mga magkakahiwalay na pag-andar ay binubuo para sa iba't ibang mga bahagi ng lohika ng sketch at ang mga pandaigdigan na variable ay halos naiwasan. Ang programflow ay makikita sa MIDI controller flowchart na pdf.

// 15-05-2017 bersyon: test_Midi6

// 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. (tandaan ang kommando) para sa en oktav C-C, C dur scale. // Der spilles med en "karate hånd" på et brædt // hvor sensorerne er monteret. Ang MIDI kommandoerne ay nagpapalitaw sa sensor ng LDR na hindi nakakakuha ng sensor, kung saan nakakakuha ng isang detalyadong tao (na naka-nota), samt når hånden fjernes igen (note off). // MIDI kommandoerne "note on" at "note off" pinakamahusay sa loob ng 3 bytes som sendes sa serial1 porten // vha det i hardware opbyggede MIDI interface. // Tonehøjden bestemmes vha ultralydssensor HC-SR04 #include // bibliotek til den anvendte ultralydssensor HC-SR04 #define TRIGGER_PIN 3 // Arduino pin til trigger pin by ultrasonic sensor #define ECHO_PIN 2 // Arduino pin til echo pin på ultrasonic sensor tukuyin ang MAX_DISTANCE 100 // Maximum afstand para sa 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); // Lumilikha ng Bagay ng NewPing. int Senspin1 = 53; // Underste LDR1 føler int Senspin2 = 52; // Øverste LDR2 føler byte MIDIByte2; // Variabel deklaration for MIDIByte2 bool klar_note_on = 1; // Variabel deklaration for klar_note_on, styrer afsendelse af note on kommando. Første kommando er en note on kommando bool klar_note_off = 0; // Variabel deklaration for klar_note_off, styrer afsendelse af note off kommando void setup () {pinMode (Senspin1, INPUT); // sæt sensor input pinMode (Senspin2, INPUT); // sæt sensor input Serial1.begin (31250); // Serial1 bruges til MIDI kommunikation: 31250 bit / sekundt Serial.begin (9600); // serial monitor, til test} 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 at iba pang tala sa {byte Note_Byte = Hent_tonehojde (); // Hent tone højde via ultralyds sensor MIDIByte2 = Hent_MidiByte2 (Note_Byte); // Hent MidByte2, numero ng tala ng MIDI, ang 0xFF ay wala sa saklaw na 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 sendes note off kommando gøres det her.. {Send_Note_Off (MIDIByte2); // send note off 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; }} byte Hent_MidiByte2 (byte NoteByte) {// Denne funktion returnerer MIDI note number, valgt ud fra NoteByte byte MIDIB2; switch (NoteByte) // her defineres hvilken værdi MIDIByte2 skal have ud fra værdien af Note_Byte {case 0: {MIDIB2 = 0x3C; // tonen 'C'} masira; kaso 1: {MIDIB2 = 0x3E; // tonen 'D'} masira; kaso 2: {MIDIB2 = 0x40; // tonen 'E'} masira; kaso 3: {MIDIB2 = 0x41; // tonen 'F'} masira; kaso 4: {MIDIB2 = 0x43; // tonen 'G'} masira; kaso 5: {MIDIB2 = 0x45; // tonen 'A'} masira; kaso 6: {MIDIB2 = 0x47; // tonen 'B'} masira; kaso 7: {MIDIB2 = 0x48; // tonen 'C'} masira; default: {MIDIB2 = 0xFF; // out of range}} ibalik ang 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 byte resultat; // 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); // Send ping, få tid retur i uS, gennemsint af Median målinger Afstand = Tid_uS / Omregningsfaktor; // Omregn tid til afstand i cm (0 = labas ng saklaw ng distansya) resulta = Afstand / 8; // Beregn resultat return resultat; // Returner resultat} void Send_Note_On (byte tonenr) {// Denne funktion sender en note on kommando på MIDI interfacet const byte kommando = 0x90; // Note on kommando på MIDI kanal 1 const byte volumen = 0xFF; // volumen / Velocity = 127 Serial1.write (kommando); // send note on kommando Serial1.write (tonenr); // send tone nummer Serial1.write (volumen); // send volumen (velocity)} void Send_Note_Off (byte tonenr) {// Denne funktion sender note off kommando på MIDI interfacet const byte kommando = 0x80; // Note off kommando på MIDI kanal 1 const byte volumen = 0xFF; // volumen / Velocity = 127 Serial1.write (kommando); // send note off kommando Serial1.write (tonenr); // send tone nummer Serial1.write (volumen); // send volumen (velocity)}

Hakbang 7: Ang Mga Pangunahing Kaalaman ng Komunikasyon ng MIDI

Ang MIDI (Musical Instrument Digital Interface) ay isang unibersal na serial protocol ng komunikasyon para sa interfacing ng mga elektronikong instrumento sa musika at iba pang mga aparato. Ginamit ang serial na komunikasyon (31250 bit / s, medium ng paghahatid ay isang kasalukuyang loop, na naka-isolate sa pagtatapos ng tatanggap. Ginagamit ang mga 5pin DIN na konektor. Posible ang 16 na lohikal na mga channel ng komunikasyon sa isang pisikal na koneksyon sa MIDI. Maraming mga utos ang tinukoy sa MIDI pamantayan, gumagamit ako ng dalawang mga utos sa proyektong ito, ang mga utos na ito ay binubuo ng 3 bytes:

a) Tandaan Sa utos:

1. byte send = 0x90 nangangahulugang tala sa utos sa MIDI channel 1

2. byte send = 0xZZ ZZ ay note number, ginagamit ko ang saklaw na 0x3C hanggang 0x48

3. byte send = 0xFF FF = 255 ibig sabihin max volume, saklaw 0x00 hanggang 0xFF

b) Tandaan Off na utos: 1. byte send = 0x80 ibig sabihin tandaan ang utos sa MIDI channel 1

2. byte send = 0xZZ ZZ ay note number, ginagamit ko ang saklaw na 0x3C hanggang 0x48

3. byte send = 0xFF FF = 255 ibig sabihin max volume, saklaw 0x00 hanggang 0xFF

Inirerekumendang: