INHOUDSOPGAWE:

EAL - Arduino MIDI -beheerder: 7 stappe
EAL - Arduino MIDI -beheerder: 7 stappe

Video: EAL - Arduino MIDI -beheerder: 7 stappe

Video: EAL - Arduino MIDI -beheerder: 7 stappe
Video: И ЭТО ТОЖЕ ДАГЕСТАН? Приключения в долине реки Баараор. БОЛЬШОЙ ВЫПУСК (Путешествие по Дагестану #3) 2024, Julie
Anonim
EAL - Arduino MIDI -beheerder
EAL - Arduino MIDI -beheerder

Gemaak deur Søren Østergaard Petersen, OEAAM16EDA

Hierdie instruksies beskryf 'n arduino -gebaseerde MIDI -beheerder. Dit is 'n skoolprojek. Deur u hand te gebruik, kan u eenvoudige melodieë speel via die MIDI -verbinding en 'n gekoppelde MIDI -instrument (of soos in hierdie geval 'n notaboek met sagte sagteware). U kan notas speel vanaf 'n C-majeur-skaal, c-d-e-f-g-a-b-c. Om die MIDI-beheerder aan 'n notaboek te koppel, benodig u 'n MIDI-na-USB-koppelvlak, soos m-audio Uno.

Stap 1: Demonstrasievideo

Image
Image

Verhoog die volume en geniet!

Hoe dit werk:

Die MIDI -kontroleerder gebruik 'n Arduino MEGA 2560 -bord. Twee lig (LDR) sensors wat in die 16 mm elektriese buis ingebou is, vorm 'n dubbelsensorsisteem en word gebruik om 'n stabiele sneller te skep sonder om 'n valse dubbele sneller te veroorsaak. 'N Flitslig skep 'n ligstraal, as die straal onderbreek word deur die hand wat die kontroleerder speel, die onderste ligsensor die ontbrekende balk, en 'n HC-SR04 ultrasoniese sensor meet die afstand van sensor tot hand.

Die afstand wat gemeet word, word in die Arduino -program gebruik vir die berekening en opstel van die toepaslike nootgetalwaarde wat in 'n MIDI Note On -boodskap en transmitet op die MIDI -koppelvlak verpak moet word. Die MIDI -uitvoer -koppelvlak gebruik 'n 74HC14 -heksinverter en is amper 'n standaardkring. MIDI -kommunikasie gebruik serial1, die standaard seriële poort word gebruik vir ontfouting.

As die hand reguit en weg van die ligstraal beweeg word, voel die boonste ligsensor weer die ligstraal en word 'n MIDI Note Off -boodskap verpak en op die MIDI -uitset oorgedra.

Die speelarea tussen die sensors is ongeveer 63 cm, en die totale lengte van die MIDI -kontroleerder is ongeveer 75 cm.

Stap 2: Besonderhede van die ligsensors

Besonderhede van die ligsensors
Besonderhede van die ligsensors
Besonderhede van die ligsensors
Besonderhede van die ligsensors

Die twee ligsensors word bo -op mekaar gemonteer om 'n dubbelsensorsisteem te vorm. Dit voorkom dat valse snellering korrek in die sagteware gebruik word. Elke ligsensor bestaan uit 'n fotoresistormodule wat ingebou is in 'n standaard elektriese buis van 16 mm. Daar word 'n gleuf in elke buis gemaak met 'n ystersaag en die fotobestand PCB kan in die gleuf gedruk word. Die sensors word met kleefband vasgeplak en ook aan die een kant van 'n stuk hout vasgemaak. Geen lig moet die sensors van agter kan bereik nie. Die ligsensors het ingeboude 10k optrekweerstands.

Stap 3: Besonderhede van die HC-SR04 Ultrasoniese sensor

Besonderhede van die ultrasoniese sensor HC-SR04
Besonderhede van die ultrasoniese sensor HC-SR04

Die ultra-soniese sensor HC-SR04 is aan die ander kant van die MIDI-kontroleerder vasgemaak. 'N Helder flitslig word ook hier geplaas; dit skep die nodige ligstraal.

Stap 4: Die Aduino -baan

Die Aduino -baan
Die Aduino -baan
Die Aduino -baan
Die Aduino -baan

Die MIDI -uitgangskring is basies 'n standaard 74HC14 heksinverter en 'n paar weerstande plus 'n 5 -pins DIN -aansluiting. Die 74HC14 -stroombaan dryf die MIDI -uitset aan en bied terselfdertyd 'n beskermingsmiddel vir die Arduino -bord teen die 'regte wêreld' wat aan MIDI gekoppel is. 'N Ekstra praktiese kenmerk is die MIDI -aktiwiteits -LED wat aandui wanneer data gestuur word.

Ek het 'n behoorlike prototipe PCB vir my hardeware gebruik, want ek het baie probleme gehad met swak verbindings op my broodbord. Die skema is in Fritzing gemaak, 'n pdf -kopie met 'n hoë resolusie kan afgelaai word deur op die onderstaande skakel te druk. Ek verkies om 'n regte skematiese program soos Kicad te gebruik, ek dink Fritzing is beperk tot alles behalwe die eenvoudigste eksperimente.

Materiaal wat gebruik word:

1 stuks Arduino MEGA 2560

2 stuks fotoweerstand (LDR) met ingeboude optrekweerstand (vanaf 37 sensorset)

1 stuks HC-SR04 ultrasoniese sensor

1 stuks 74HC14 heks -omkerende Schmitt -sneller

2 stuks weerstand 220 Ohm 0.25W

1 stuks weerstand 1k Ohm 0.25W

1 stuks LED lae stroom 2mA

1 stuks 100nF keramiek kondensator (vir ontkoppeling van die kragtoevoer, direk by die kragpenne van die 74HC14)

Broodbord of prototipe PCB

2 stuks 16 mm elektriese buis, lengte 65 mm

1 stukke hout, 75 cm lank

Kleefband

Drade

Stap 5: I/O -lys

I/O -lys
I/O -lys

Stap 6: Die Aduino -kode

Die skets test_Midi6 gebruik die NewPing-biblioteek wat u in u Arduino-programmeringsomgewing moet insluit om die ultrasoniese sensor HC-SC04 te gebruik. Die skets word in die Deense kommentaar gelewer, jammer. Om die skets goed gestruktureerd te hou, word verskillende funksies vir verskillende logiese dele van die skets saamgestel en globale veranderlikes word meestal vermy. Die programstroom word gevisualiseer in die MIDI -bestuurder -vloeidiagram pdf.

// 15-05-2017 weergawe: test_Midi6

// Søren Østergaard Petesen // Arduino MEGA 2560 // Dit program kan slegs 'n eenvoudige MIDI -kontroleerder vir MIDI -toestelle, soos sagteware op 'n rekenaar, gebruik. // MIDI -kontroleurs kan toneanslag (let op kommando) hhv. (note off kommando) for en oktav C-C, C dur skala. // Der spilles med en "karate hånd" på et brædt // hvor sensorerne er monteret. MIDI kommandoerne aktiveer 'n dubbele LDR -sensor, en daar moet 'n veilige // opsporing van beide gevalle gemaak word wanneer die lander op brættet (let op), maar ook wanneer die afstand verwyder kan word (note off). // MIDI kommandoerne "note on" en "note off" bestaan uit elke 3 grepe wat op serial1 -portes gestuur kan word // wat die hardeware -opgeboude MIDI -koppelvlak bevat. // Tonehøjden bepaales vha ultralydssensor HC-SR04 #include // bibliotek to the applied ultralydssensor HC-SR04 #define TRIGGER_PIN 3 // Arduino pin to trigger pin on ultrasonic sensor #define ECHO_PIN 2 // Arduino pin to echo pin on ultrasonic sensor # definieer MAX_DISTANCE 100 // Maksimum afstand vir Ping #define mediaan 5 // Antal berekeninge van gemiddelde berekeninge vir en kry afstandsbestemmings NewPing sonar (TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE); // Die skep van die NewPing -voorwerp. int Senspin1 = 53; // Ondersteun LDR1 voel int Senspin2 = 52; // Øverste LDR2 gevoel 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 is en note on kommando bool klar_note_off = 0; // Variabel deklaration for klar_note_off, styrer afsending af note off kommando void setup () {pinMode (Senspin1, INPUT); // sæt sensor invoer pinMode (Senspin2, INPUT); // sæt sensorinvoer Serial1.begin (31250); // Serial1 gebruik vir MIDI -kommunikasie: 31250 bit/sekundt Serial.begin (9600); // seriële monitor, tot toets} leemte -lus () {bool Sensor1 = digitalRead (Senspin1); // Lees LDR1 - underte LDR bool Sensor2 = digitalRead (Senspin2); // læs LDR2 - hoogste LDR if (Sensor1 && klar_note_on) // hvis LDR1 aktiveret en klar to note on {byte Note_Byte = Hent_tonehojde (); // Hent toonhoogte via ultralyds sensor MIDIByte2 = Hent_MidiByte2 (Note_Byte); // Hent MidByte2, MIDI note number, waardeien 0xFF er out of range Send_Note_On (MIDIByte2); // kald Send_Note_On funksie klar_note_on = 0; // der skal kun sendes en note on kommando klar_note_off = 1; // volgende kommando is note off} if (Sensor2 &&! Sensor1 && klar_note_off) // As daar 'n nota van kommando af gestuur word, maak dit haar.. {Send_Note_Off (MIDIByte2); // stuur nota van kommando klar_note_off = 0; // daar kan slegs 'n nota van kommando gestuur word} as (! Sensor1 &&! Sensor2) }} byte Hent_MidiByte2 (byte NoteByte) {// Denne funksie returnerer MIDI noot nommer, gekies uit NoteByte byte MIDIB2; skakelaar (NoteByte) // haar definisies watter waarde MIDIByte2 vir u van waarde moet hê van Note_Byte {case 0: {MIDIB2 = 0x3C; // tonen 'C'} breek; geval 1: {MIDIB2 = 0x3E; // tonen 'D'} breek; geval 2: {MIDIB2 = 0x40; // tonen 'E'} breek; geval 3: {MIDIB2 = 0x41; // tonen 'F'} breek; geval 4: {MIDIB2 = 0x43; // tonen 'G'} breek; saak 5: {MIDIB2 = 0x45; // tonen 'A'} breek; geval 6: {MIDIB2 = 0x47; // tonen 'B'} breek; saak 7: {MIDIB2 = 0x48; // tonen 'C'} breek; verstek: {MIDIB2 = 0xFF; // buite bereik}} gee MIDIB2 terug; // returner MIDI note number} byte Hent_tonehojde () {// Denne funksie henter resultate van ultralydsmålingen unsigned int Tid_uS; // maaltyd in uS byte Afstand; // bereknet afstand i cm byte resultaat; // indeling van speel gebied 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 (mediaan); // Stuur ping, kry tyd terug in uS, inligting van Median målinger Afstand = Tid_uS / Omregningsfaktor; // Omregn tid to distance i cm (0 = buite -afstandsafstand) resultaat = Afstand / 8; // Beregn resultaat opbrengs resultaat; // Returner result} void Send_Note_On (byte tonenr) {// Denne funksie sender en let op kommando på MIDI interfacet const byte kommando = 0x90; // Nota oor kommando på MIDI kanaal 1 const byte volumen = 0xFF; // volumen / Velocity = 127 Serial1.write (kommando); // stuur 'n nota op kommando Serial1.write (tonenr); // stuur toon nommer Serial1.write (volume); // stuur volume (velocity)} void Send_Note_Off (byte tonenr) {// Denne funksie sender noot af kommando på MIDI interfacet const byte kommando = 0x80; // Let op kommando op MIDI kanaal 1 const byte volumen = 0xFF; // volumen / Velocity = 127 Serial1.write (kommando); // stuur nota van kommando Serial1.write (tonenr); // stuur toon nommer Serial1.write (volume); // stuur volume (snelheid)}

Stap 7: Die basiese beginsels van MIDI -kommunikasie

MIDI (Musical Instrument Digital Interface) is 'n universele seriële kommunikasieprotokol vir die koppeling van elektroniese musiekinstrumente en ander toestelle. Seriële kommunikasie word gebruik (31250 bit/s, transmissiemedium is 'n stroomlus, opto-geïsoleer aan die einde van die ontvanger. 5-pins DIN-aansluitings word gebruik. 16 logiese kommunikasiekanale is moontlik in een fisiese MIDI-verbinding. Baie opdragte word gedefinieer in die MIDI Standaard gebruik ek twee opdragte in hierdie projek; hierdie opdragte bestaan uit 3 grepe:

a) Let op opdrag:

1. byte send = 0x90 betekenis nota op opdrag op MIDI kanaal 1

2. byte stuur = 0xZZ ZZ is nootnommer, ek gebruik die reeks 0x3C tot 0x48

3. greep stuur = 0xFF FF = 255 wat maksimum volume beteken, reeks 0x00 tot 0xFF

b) Let op Off command: 1. byte send = 0x80, beteken opmerking uit die opdrag op MIDI kanaal 1

2. byte stuur = 0xZZ ZZ is nootnommer, ek gebruik die reeks 0x3C tot 0x48

3. byte stuur = 0xFF FF = 255 wat maksimum volume beteken, reeks 0x00 tot 0xFF

Aanbeveel: