Indholdsfortegnelse:

EAL - Arduino MIDI -controller: 7 trin
EAL - Arduino MIDI -controller: 7 trin

Video: EAL - Arduino MIDI -controller: 7 trin

Video: EAL - Arduino MIDI -controller: 7 trin
Video: 🎹 Делаем ПИАНИНО на ARDUINO (с 7 октавами) 2024, Juli
Anonim
EAL - Arduino MIDI -controller
EAL - Arduino MIDI -controller

Lavet af Søren Østergaard Petersen, OEAAM16EDA

Denne instruktør beskriver en arduino -baseret MIDI -controller. Dette er et skoleprojekt. Ved at bruge din hånd kan du afspille enkle melodier via MIDI -forbindelsen og et tilsluttet MIDI -instrument (eller som i dette tilfælde en notebook, der kører en softsynth -software). Du kan spille noter fra en C-dur skala, c-d-e-f-g-a-b-c. For at kunne tilslutte MIDI-controlleren til en notebook, skal du bruge en MIDI til USB-grænseflade som m-audio Uno.

Trin 1: Demonstrationsvideo

Image
Image

Skru op for lydstyrken, og nyd det!

Hvordan det virker:

MIDI -controlleren bruger et Arduino MEGA 2560 -kort. To lys (LDR) sensorer indbygget i 16 mm elektrisk rør danner et dobbelt sensorsystem og bruges til at skabe en stabil trigger uden falsk dobbelt udløsning. En lommelygte skaber en lysstråle, når strålen afbrydes af den hånd, der spiller controlleren, registrerer den nederste lyssensor den manglende stråle, og en HC-SR04 ultralydssensor måler afstanden fra sensor til hånd.

Den målte afstand bruges i Arduino -programmet til beregning og opsætning af den passende notenummerværdi, der skal pakkes i en MIDI Note On -meddelelse og transmitter på MIDI -grænsefladen. MIDI output interface bruger en 74HC14 hex inverter og er stort set et standard kredsløb. MIDI -kommunikation bruger serial1, standard seriel port bruges til fejlfinding.

Når hånden flyttes lige op og væk fra lysstrålen, registrerer den øvre lyssensor lysstrålen igen, og en MIDI Note Off -meddelelse pakkes og transmitteres på MIDI -udgangen.

Afspilningsområdet mellem sensorerne er omkring 63 cm, og den samlede længde af MIDI -controlleren er omkring 75 cm.

Trin 2: Detaljer om lyssensorerne

Detaljer om lyssensorer
Detaljer om lyssensorer
Detaljer om lyssensorer
Detaljer om lyssensorer

De to lyssensorer er monteret oven på hinanden for at danne et dobbelt sensorsystem. Det forhindrer falsk udløsning, når det bruges korrekt i softwaren. Hver lyssensor består af et fotomodstandsmodul indbygget i et 16 mm standard elektrisk rør. En slids er lavet i hvert rør med en hacksav, og fotomodstandens printkort kan presses ind i åbningen. Sensorerne er tapet sammen med gaffatape og også fastgjort til den ene ende af et stykke træ. Intet lys skal kunne nå sensorerne bagfra. Lyssensorerne har indbygget 10k pull-up modstande.

Trin 3: Detaljer om ultralydssensoren HC-SR04

Detaljer om HC-SR04 ultralydssensor
Detaljer om HC-SR04 ultralydssensor

HC-SR04 ultralydssensoren er fastgjort i den anden ende af MIDI-controlleren. En lys lommelygte er også placeret her, det skaber den nødvendige lysstråle.

Trin 4: Aduino -kredsløbet

Aduino -kredsløbet
Aduino -kredsløbet
Aduino -kredsløbet
Aduino -kredsløbet

MIDI -udgangskredsløbet er dybest set en standard 74HC14 hexomformer og et par modstande plus et 5 -polet DIN -hunstik. 74HC14 -kredsløbet driver MIDI -udgangen og giver samtidig nogle midler til beskyttelse af Arduino -kortet mod den "virkelige verden", der er forbundet til MIDI -udgang. En ekstra praktisk funktion er MIDI -aktivitets -LED'en, der signalerer, når data sendes.

Jeg har brugt en ordentlig prototype PCB til min hardware, fordi jeg havde mange problemer med dårlige forbindelser på mit brødbræt. Skematikken er lavet i Fritzing, en pdf -kopi i høj opløsning kan downloades ved at trykke på linket herunder. Jeg foretrækker at bruge et ordentligt skematisk program som Kicad, jeg tror, at Fritzing er begrænset til alt andet end de enkleste eksperimenter.

Anvendte materialer:

1 stk Arduino MEGA 2560

2 stk. Fotomodstand (LDR) med indbygget pull up-modstand (fra 37 sensorsæt)

1 stk HC-SR04 ultralydssensor

1 stk 74HC14 hex inverterende Schmitt trigger

2 stk. Modstand 220 Ohm 0,25W

1 stk modstand 1k Ohm 0,25W

1 stk LED lav strøm 2mA

1 stk. 100nF keramisk kondensator (til afkobling af strømforsyning, direkte ved 74HC14's strømstifter)

Brødbræt eller prototype PCB

2 stk 16mm elektrisk rør, længde 65mm

1 stk træ, længde 75 cm

Gaffatape

Ledninger

Trin 5: I/O -fortegnelse

I/O -fortegnelse
I/O -fortegnelse

Trin 6: Aduino -koden

Skitsen test_Midi6 bruger NewPing-biblioteket, som du skal inkludere i dit Arduino-programmeringsmiljø, til at bruge HC-SC04 ultralydssensoren. Skitsen kommenteres på dansk, undskyld.. For at holde skitsen velstruktureret består separate funktioner til forskellige logiske dele af skitsen, og globale variabler undgås for det meste. Programforløbet visualiseres i MIDI controller flowchart pdf.

// 15-05-2017 version: 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. Softsynt på en PC. // MIDI controlleren kan sende toneanslag (note on 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 udløser en dobbelt LDR -sensor, der skal laves og sikker // detektering af både når hånden lander på brættet (note on), samt når hånden fjernes igen (note off). // MIDI kommandoerne "note on" og "note off" består hver af 3 bytes, der sender på serial1 porten // vha det i hardware opbygget MIDI interface. // Tonehøjden bestemmes vha ultralydssensor HC-SR04 #include // bibliotek til den anvendte ultralydssensor HC-SR04 #definer TRIGGER_PIN 3 // Arduino pin til trigger pin på ultrasonic sensor #define ECHO_PIN 2 // Arduino pin til echo pin på ultrasonic sensor # definere MAX_DISTANCE 100 // Maksimal afstand for Ping #define Median 5 // Antal målinger der beregnes tilsvarende af for at få en sikker afstandsbestemmelse NewPing sonar (TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE); // Oprettelse af NewPing -objektet. 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 Brugge til MIDI kommunikation: 31250 bit/sekundt Serial.begin (9600); // seriel skærm, 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 og klar til note on {byte Note_Byte = Hent_tonehojde (); // Hent tone højde via ultralyds sensor 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 sende en note om kommando klar_note_off = 1; // næste kommando er note off} if (Sensor2 &&! Sensor1 && klar_note_off) // Hvis der skal sende note fra kommando gøres det.. {Send_Note_Off (MIDIByte2); // Send note off kommando klar_note_off = 0; // der skal kun sende en note fra 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 nummer, 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'} pause; tilfælde 1: {MIDIB2 = 0x3E; // tonen 'D'} pause; tilfælde 2: {MIDIB2 = 0x40; // tonen 'E'} pause; sag 3: {MIDIB2 = 0x41; // tonen 'F'} pause; sag 4: {MIDIB2 = 0x43; // tonen 'G'} pause; sag 5: {MIDIB2 = 0x45; // tonen 'A'} pause; sag 6: {MIDIB2 = 0x47; // tonen 'B'} pause; sag 7: {MIDIB2 = 0x48; // tonen 'C'} pause; standard: {MIDIB2 = 0xFF; // uden for området}} returner MIDIB2; // returner MIDI note number} byte Hent_tonehojde () {// Denne funktion henter resultater af ultralydsmålingen unsigned int Tid_uS; // måltider 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 = udenfor afstandsområde) resultat = Afstand / 8; // Beregn resultat afkastresultat; // Returner resultat} void Send_Note_On (byte tonenr) {// Denne funktion afsender og note om kommando på MIDI interfacet const byte kommando = 0x90; // Note om kommando på MIDI kanal 1 const byte volumen = 0xFF; // volumen / Velocity = 127 Serial1.write (kommando); // send note på kommando Serial1.write (tonenr); // send tonenummer Serial1.write (volumen); // send volumen (velocity)} void Send_Note_Off (byte tonenr) {// Denne funktion sender note 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 tonenummer Serial1.write (volumen); // send volumen (hastighed)}

Trin 7: Det grundlæggende i MIDI -kommunikation

MIDI (Musical Instrument Digital Interface) er en universel seriel kommunikationsprotokol til grænseflade mellem elektroniske musikinstrumenter og andre enheder. Seriel kommunikation bruges (31250 bit/s, transmissionsmedium er en strømsløjfe, opto-isoleret i modtagerenden. 5pin DIN-stik bruges. 16 logiske kommunikationskanaler er mulige i en fysisk MIDI-forbindelse. Mange kommandoer er defineret i MIDI standard, jeg bruger to kommandoer i dette projekt, disse kommandoer består af 3 bytes:

a) Bemærk Ved kommando:

1. byte send = 0x90 betyder note om kommando på MIDI kanal 1

2. byte send = 0xZZ ZZ er note nummer, jeg bruger området 0x3C til 0x48

3. byte send = 0xFF FF = 255 betyder maks. Volumen, område 0x00 til 0xFF

b) Bemærk Off -kommando: 1. byte send = 0x80 betyder note off kommando på MIDI kanal 1

2. byte send = 0xZZ ZZ er note nummer, jeg bruger området 0x3C til 0x48

3. byte send = 0xFF FF = 255 betyder maks. Volumen, område 0x00 til 0xFF

Anbefalede: