Innholdsfortegnelse:

EAL - Arduino MIDI -kontroller: 7 trinn
EAL - Arduino MIDI -kontroller: 7 trinn

Video: EAL - Arduino MIDI -kontroller: 7 trinn

Video: EAL - Arduino MIDI -kontroller: 7 trinn
Video: 7.Несколько потенциометров на мультиплексоре CD74HC4067| Arduino | Midi | Hiduino 2024, November
Anonim
EAL - Arduino MIDI -kontroller
EAL - Arduino MIDI -kontroller

Laget av Søren Østergaard Petersen, OEAAM16EDA

Denne instruksen beskriver en arduino -basert MIDI -kontroller. Dette er et skoleprosjekt. Ved å bruke hånden din kan du spille enkle melodier via MIDI -tilkoblingen og et tilkoblet MIDI -instrument (eller som i dette tilfellet en bærbar PC med softsynth -programvare). Du kan spille notater fra C-dur, c-d-e-f-g-a-b-c. For å kunne koble MIDI-kontrolleren til en bærbar datamaskin, trenger du et MIDI til USB-grensesnitt som m-audio Uno.

Trinn 1: Demonstrasjonsvideo

Image
Image

Skru opp volumet og nyt det!

Hvordan det fungerer:

MIDI -kontrolleren bruker et Arduino MEGA 2560 -kort. To lys (LDR) sensorer innebygd i 16 mm elektrisk rør danner et dobbelt sensorsystem og brukes til å lage en stabil utløser uten falsk dobbel utløsning. En lommelykt skaper en lysstråle, når strålen blir avbrutt av hånden som spiller kontrolleren, registrerer den nedre lyssensoren den manglende strålen, og en HC-SR04 ultralydssensor måler avstanden fra sensor til hånd.

Avstanden som måles, brukes i Arduino -programmet for å beregne og sette opp passende notenummerverdi som skal pakkes inn i en MIDI Note On -melding og transmitter på MIDI -grensesnittet. MIDI -utgangsgrensesnittet bruker en 74HC14 hex inverter og er ganske mye en standard krets. MIDI -kommunikasjon bruker serial1, standard seriell port brukes til feilsøking.

Når hånden flyttes rett opp og bort fra lysstrålen, registrerer den øvre lyssensoren lysstrålen igjen, og en MIDI Note Off -melding pakkes og sendes på MIDI -utgangen.

Avspillingsområdet mellom sensorene er rundt 63 cm, og den totale lengden på MIDI -kontrolleren er rundt 75 cm.

Trinn 2: Detaljer om lyssensorene

Detaljer om lyssensorene
Detaljer om lyssensorene
Detaljer om lyssensorene
Detaljer om lyssensorene

De to lyssensorene er montert oppå hverandre for å danne et dobbelt sensorsystem. Den forhindrer falsk utløsning når den brukes riktig i programvaren. Hver lyssensor består av en fotomotstandsmodul innebygd i et 16 mm standard elektrisk rør. Det er laget et spor i hvert rør med en baufil og fotomotstandens PCB kan presses inn i sporet. Sensorene er tapet sammen med duct tape og også festet til den ene enden av et treverk. Intet lys må kunne nå sensorene bakfra. Lyssensorene har innebygde 10k opptrekksmotstander.

Trinn 3: Detaljer om HC-SR04 ultralydssensor

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

Den ultralydssensoren HC-SR04 er festet i den andre enden av MIDI-kontrolleren. En lys lommelykt er plassert her også, den skaper den nødvendige lysstrålen.

Trinn 4: Aduino -kretsen

Aduino Circuit
Aduino Circuit
Aduino Circuit
Aduino Circuit

MIDI -utgangskretsen er i utgangspunktet en standard 74HC14 hex inverter og noen motstander pluss en 5 -pins DIN hunkontakt. 74HC14 -kretsen driver MIDI -utgangen og gir samtidig noen beskyttelsesmidler for Arduino -kortet mot den "virkelige verden" koblet til MIDI ut. En ekstra praktisk funksjon er MIDI -aktivitets -LED -en som signaliserer når data sendes.

Jeg har brukt en skikkelig prototype PCB for maskinvaren min fordi jeg hadde mange problemer med dårlige tilkoblinger på brødbrettet. Skjematikken er laget i Fritzing, en høyoppløselig pdf -kopi kan lastes ned ved å trykke på lenken nedenfor. Jeg foretrekker å bruke et skikkelig skjematisk program som Kicad, jeg tror Fritzing er begrenset til alt annet enn de enkleste eksperimentene.

Materialer som brukes:

1 stk Arduino MEGA 2560

2 stk fotomotstand (LDR) med innebygd opptrekkmotstand (fra 37 sensorsett)

1 stk HC-SR04 ultralydssensor

1 stk 74HC14 hex inverterende Schmitt trigger

2 stk motstand 220 Ohm 0,25W

1 stk motstand 1k Ohm 0.25W

1 stk LED lav strøm 2mA

1 stk 100nF keramisk kondensator (for frakobling av strømforsyning, direkte ved 74HC14s strømstift)

Brødbrett eller prototype PCB

2 stk 16mm elektrisk rør, lengde 65mm

1 stk tre, lengde 75 cm

Duct tape

Ledninger

Trinn 5: I/O -oppføring

I/O -oppføring
I/O -oppføring

Trinn 6: Aduino -koden

Skissen test_Midi6 bruker NewPing-biblioteket som du må inkludere i Arduino-programmeringsmiljøet for å bruke HC-SC04 ultralydssensoren. Skissen er kommentert på dansk, beklager.. For å beholde skissen godt strukturert, består separate funksjoner av forskjellige logiske deler av skissen, og globale variabler unngås stort sett. Programflyten visualiseres i MIDI -kontroller flytdiagram pdf.

// 15-05-2017 versjon: test_Midi6

// Søren Østergaard Petesen // Arduino MEGA 2560 // Dette programmet utgjør en enkel MIDI -kontroller som kan styre en ekstern MIDI -enhet, for eksempel en softsynt på en PC. // MIDI -kontroller kan sende toneanslag (merknad på 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 utløser en dobbelt LDR -sensor, da der skal laves og sikker // detektering av både når hånden lander på brættet (note on), samt når hånden fjernes igjen (note off). // MIDI kommandoerne "note on" og "note off" består hver av 3 bytes som kan sendes på serial1 porten // vha det i hardware opbygged 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 avstand for Ping #define Median 5 // Antall målinger der beregnes middels av for å få en sikker avstandsbestemmelse NewPing sonar (TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE); // Opprette 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 sensorinngang Serial1.begin (31250); // Serial1 Brugge til MIDI kommunikasjon: 31250 bit/sekundt Serial.begin (9600); // seriell skjerm, til test} void loop () {bool Sensor1 = digitalRead (Senspin1); // Les 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øyde via ultralyds sensor MIDIByte2 = Hent_MidiByte2 (Note_Byte); // Hent MidByte2, MIDI note number, verdien 0xFF er out of range Send_Note_On (MIDIByte2); // kald Send_Note_On funksjon klar_note_on = 0; // der skal kun sende en note om kommando klar_note_off = 1; // neste 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 notat av kommando klar_note_off = 0; // der skal kun sende en note off kommando} if (! Sensor1 &&! Sensor2) // her gøres klar til ny note on kommando, hånd er away fra brædt {klar_note_on = 1; }} byte Hent_MidiByte2 (byte NoteByte) {// Denne funksjon returnerer MIDI notatnummer, valgt ud fra NoteByte byte MIDIB2; switch (NoteByte) // her defineres hvilken verdi MIDIByte2 skal ha en verdi fra Note_Byte {case 0: {MIDIB2 = 0x3C; // tonen 'C'} pause; sak 1: {MIDIB2 = 0x3E; // tonen 'D'} pause; sak 2: {MIDIB2 = 0x40; // tonen 'E'} pause; sak 3: {MIDIB2 = 0x41; // tonen 'F'} pause; sak 4: {MIDIB2 = 0x43; // tonen 'G'} pause; sak 5: {MIDIB2 = 0x45; // tonen 'A'} pause; sak 6: {MIDIB2 = 0x47; // tonen 'B'} pause; sak 7: {MIDIB2 = 0x48; // tonen 'C'} pause; standard: {MIDIB2 = 0xFF; // utenfor området}} returner MIDIB2; // returner MIDI note number} byte Hent_tonehojde () {// Denne funksjonen henter resultatet av ultralydsmålingen unsigned int Tid_uS; // måltider tid i uS byte Afstand; // beregnet avstand i cm byte resultat; // inddeling av 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 tilbake. Tid_uS = sonar.ping_median (median); // Send ping, få tid retur i uS, informasjon av Median målinger Afstand = Tid_uS / Omregningsfaktor; // Omregn tid til afstand i cm (0 = utenfor avstandsområde) resultat = Afstand / 8; // Beregn resultat avkastningsresultat; // Returner resultat} void Send_Note_On (byte tonenr) {// Denne funksjon avsender og notat om kommando på MIDI grensesnitt const byte kommando = 0x90; // Merknad om kommando på MIDI kanal 1 const byte volumen = 0xFF; // volumen / Velocity = 127 Serial1.write (kommando); // send notat på kommando Serial1.write (tonenr); // send tonenummer Serial1.write (volumen); // send volumen (velocity)} void Send_Note_Off (byte tonenr) {// Denne funksjonen sender note note off kommando på MIDI grensesnitt const byte kommando = 0x80; // Note off kommando på MIDI kanal 1 const byte volumen = 0xFF; // volumen / Velocity = 127 Serial1.write (kommando); // send notat av kommando Serial1.write (tonenr); // send tonenummer Serial1.write (volumen); // send volumen (hastighet)}

Trinn 7: Grunnleggende om MIDI -kommunikasjon

MIDI (Musical Instrument Digital Interface) er en universell seriell kommunikasjonsprotokoll for grensesnitt mellom elektroniske musikkinstrumenter og andre enheter. Seriell kommunikasjon brukes (31250 bit/s, overføringsmedium er en strømsløyfe, opto-isolert i mottakerenden. 5-pins DIN-kontakter brukes. 16 logiske kommunikasjonskanaler er mulig i en fysisk MIDI-tilkobling. Mange kommandoer er definert i MIDI standard bruker jeg to kommandoer i dette prosjektet, disse kommandoene består av 3 byte:

a) Merknad på kommando:

1. byte send = 0x90 betyr notat på kommando på MIDI kanal 1

2. byte send = 0xZZ ZZ er notatnummer, jeg bruker området 0x3C til 0x48

3. byte send = 0xFF FF = 255 som betyr maks volum, område 0x00 til 0xFF

b) Merk av kommando: 1. byte send = 0x80 betyr note off kommando på MIDI kanal 1

2. byte send = 0xZZ ZZ er notatnummer, jeg bruker området 0x3C til 0x48

3. byte send = 0xFF FF = 255 som betyr maks volum, område 0x00 til 0xFF

Anbefalt: