Innehållsförteckning:

EAL - Arduino MIDI Controller: 7 steg
EAL - Arduino MIDI Controller: 7 steg

Video: EAL - Arduino MIDI Controller: 7 steg

Video: EAL - Arduino MIDI Controller: 7 steg
Video: Arduino midi controller (все просто 🎛️) 2024, November
Anonim
EAL - Arduino MIDI Controller
EAL - Arduino MIDI Controller

Gjord av Søren Østergaard Petersen, OEAAM16EDA

Denna instruerbara beskriver en arduino -baserad MIDI -styrenhet. Detta är ett skolprojekt. Genom att använda din hand kan du spela enkla melodier via MIDI -anslutningen och ett anslutet MIDI -instrument (eller som i det här fallet en bärbar dator med mjukvara). Du kan spela noter från en C-dur skala, c-d-e-f-g-a-b-c. För att kunna ansluta MIDI-kontrollen till en bärbar dator behöver du ett MIDI till USB-gränssnitt som m-audio Uno.

Steg 1: Demonstrationsvideo

Image
Image

Höj volymen och njut!

Hur det fungerar:

MIDI -styrenheten använder ett Arduino MEGA 2560 -kort. Två ljussensorer (LDR) inbyggda i 16 mm elektriska rör bildar ett dubbelsensorsystem och används för att skapa en stabil utlösare utan falsk dubbelutlösning. En ficklampa skapar en ljusstråle, när strålen avbryts av handen som spelar kontrollen, känner den nedre ljussensorn av den saknade strålen, och en HC-SR04 ultraljudssensor mäter avståndet från sensor till hand.

Det uppmätta avståndet används i Arduino -programmet för att beräkna och ställa in lämpligt notnummervärde som ska packas in i ett MIDI Note On -meddelande och sändare på MIDI -gränssnittet. MIDI -utgångsgränssnittet använder en 74HC14 hexinverterare och är i stort sett en standardkrets. MIDI -kommunikation använder serial1, standard seriell port används för felsökning.

När handen flyttas rakt upp och bort från ljusstrålen känner den övre ljussensorn igen ljusstrålen och ett MIDI Note Off -meddelande packas och sänds på MIDI -utgången.

Lekområdet mellan sensorerna är cirka 63 cm och den totala längden på MIDI -kontrollen är cirka 75 cm.

Steg 2: Detaljer om ljussensorerna

Detaljer om ljussensorerna
Detaljer om ljussensorerna
Detaljer om ljussensorerna
Detaljer om ljussensorerna

De två ljussensorerna är monterade ovanpå varandra för att bilda ett dubbelsensorsystem. Den förhindrar falsk utlösning när den används korrekt i programvaran. Varje ljussensor består av en fotomotståndsmodul inbyggd i ett 16 mm standardrör. En slits görs i varje rör med en hacksåg och fotomotståndets PCB kan pressas in i spåret. Sensorerna tejpas ihop med gaffatejp och fästs även i ena änden av en träbit. Inget ljus måste kunna nå sensorerna bakifrån. Ljussensorerna har inbyggda 10k uppdragningsmotstånd.

Steg 3: Detaljer om HC-SR04 ultraljudssensor

Detaljer om HC-SR04 ultraljudssensor
Detaljer om HC-SR04 ultraljudssensor

HC-SR04 ultraljudsensorn är fixerad i den andra änden av MIDI-styrenheten. En ljus ficklampa placeras också här, det skapar den nödvändiga ljusstrålen.

Steg 4: Aduino -kretsen

Aduino -kretsen
Aduino -kretsen
Aduino -kretsen
Aduino -kretsen

MIDI -utgångskretsen är i grunden en standard 74HC14 hexinverterare och några motstånd plus en 5 -polig DIN -honkontakt. 74HC14 -kretsen driver MIDI -utgången och ger samtidigt vissa skydd för Arduino -kortet mot den "verkliga världen" som är ansluten till MIDI -utgången. En extra praktisk funktion är MIDI -aktivitets -LED: n som signalerar när data skickas.

Jag har använt en riktig prototyp PCB för min hårdvara eftersom jag hade många problem med dåliga anslutningar på min brödbräda. Schemat är gjort i Fritzing, en högupplöst pdf -kopia kan laddas ner genom att klicka på länken nedan. Jag föredrar att använda ett riktigt schemaprogram som Kicad, jag tror att Fritzing är begränsad till allt annat än de enklaste experimenten.

Material som används:

1 st Arduino MEGA 2560

2 st fotomotstånd (LDR) med inbyggt uppdragningsmotstånd (från 37 givarsatser)

1 st HC-SR04 ultraljudssensor

1 st 74HC14 hex inverterande Schmitt trigger

2 st motstånd 220 Ohm 0,25W

1 st motstånd 1 k Ohm 0,25W

1 st LED lågström 2mA

1 st 100nF keramisk kondensator (för avkoppling av strömförsörjning, direkt vid 74HC14: s strömstift)

Brödbräda eller prototyp PCB

2 st 16 mm elslang, längd 65 mm

1 st trä, längd 75 cm

Silvertejp

Trådar

Steg 5: I/O -lista

I/O -lista
I/O -lista

Steg 6: Aduino -koden

Skissen test_Midi6 använder NewPing-biblioteket som du måste inkludera i ditt Arduino-programmeringsmiljö för att använda ultraljudssensorn HC-SC04. Skissen kommenteras på danska, förlåt.. För att hålla skissen välstrukturerad består separata funktioner av olika logiska delar av skissen och globala variabler undviks mestadels. Programflödet visualiseras i flödesschemat för MIDI -styren pdf.

// 15-05-2017 version: test_Midi6

// Søren Østergaard Petesen // Arduino MEGA 2560 // Detta program kan inte göras på en enkel MIDI -controller som kan styra en ekstern MIDI -enhet, t.ex. en mjukvara på en PC. // MIDI -kontroller kan skicka toneanslag (notera om kommando) hhv. (notera kommando) för en oktav C-C, C dur skala. // Der spilles med en "karate hånd" på et brædt // hvor sensorerne är monteret. MIDI kommandoerne triggar av en dubbel LDR -sensor, där ska laves och säker // detektering av både när handen lander på brættet (notera på), samt när handen fjernes igen (notera). // MIDI kommandoerne "note on" og "note off" består varje av 3 bytes som skickas på serial1 porten // vha det i hardware opbygged MIDI interface. // Tonehøjden bestämmer vha ultralydssensor HC-SR04 #include // bibliotek för den använda ultralydssensor HC-SR04 #define TRIGGER_PIN 3 // Arduino pin till trigger pin på ultrasonic sensor #define ECHO_PIN 2 // Arduino pin to echo pin on ultrasonic sensor # definiera MAX_DISTANCE 100 // Maximal distans för Ping #define Median 5 // Antal målinger der beräknade medel för att få en säker distansbestämning NewPing sonar (TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE); // Skapa NewPing -objektet. int Senspin1 = 53; // Underste LDR1 känner int Senspin2 = 52; // Øverste LDR2 känsla 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 är 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 sensoringång Serial1.begin (31250); // Serial1 bruks till MIDI kommunikation: 31250 bit/sekundt Serial.begin (9600); // seriell bildskärm, till test} void loop () {bool Sensor1 = digitalRead (Senspin1); // Läs LDR1 - underte LDR bool Sensor2 = digitalRead (Senspin2); // læs LDR2 - högsta LDR if (Sensor1 && klar_note_on) // om LDR1 aktiverar och klarar att notera på {byte Note_Byte = Hent_tonehojde (); // Hent tonhöjd via ultralyds sensor MIDIByte2 = Hent_MidiByte2 (Note_Byte); // Hent MidByte2, MIDI -notnummer, värden 0xFF är utanför intervallet 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ästa kommando er note off} if (Sensor2 &&! Sensor1 && klar_note_off) // Om der ska sendes note off kommando gøres det her.. {Send_Note_Off (MIDIByte2); // skicka anteckning från kommando klar_note_off = 0; // der skal kun sendes en note off kommando} if (! Sensor1 &&! Sensor2) // her gøres klar to ny note on kommando, hand is away fra brædt {klar_note_on = 1; }} byte Hent_MidiByte2 (byte NoteByte) {// Denna funktion returnerer MIDI notnummer, valt ud från NoteByte byte MIDIB2; switch (NoteByte) // her defineres vilken värde MIDIByte2 ska ha ut från värden av Note_Byte {case 0: {MIDIB2 = 0x3C; // tonen 'C'} paus; fall 1: {MIDIB2 = 0x3E; // tonen 'D'} paus; fall 2: {MIDIB2 = 0x40; // tonen 'E'} paus; fall 3: {MIDIB2 = 0x41; // tonen 'F'} break; fall 4: {MIDIB2 = 0x43; // tonen 'G'} paus; fall 5: {MIDIB2 = 0x45; // tonen 'A'} paus; fall 6: {MIDIB2 = 0x47; // tonen 'B'} paus; fall 7: {MIDIB2 = 0x48; // tonen 'C'} paus; standard: {MIDIB2 = 0xFF; // utanför intervallet}} returnera MIDIB2; // returner MIDI note number} byte Hent_tonehojde () {// Denna funktion henter resultat av ultralydsmålingen unsigned int Tid_uS; // måltider tid i uS byte Afstand; // beräknat avstånd i cm byte resultat; // indeling af spela område const float Omregningsfaktor = 58.3; // 2*(1/343 m/s)/100 = 58, 3uS/cm, der ganges med 2 da tiden är summen af tiden frem och tillbaka. Tid_uS = sonar.ping_median (median); // Skicka ping, få tid retur i uS, information av Median målinger Afstand = Tid_uS / Omregningsfaktor; // Omregn tid till afstand i cm (0 = utanför avståndsintervall) resultat = Afstand / 8; // Beregn resultat avkastningsresultat; // Returner resultat} void Send_Note_On (byte tonenr) {// Denna funktion avsändare och anteckning om kommando på MIDI -gränssnitt const byte kommando = 0x90; // Anmärkning om kommando på MIDI kanal 1 const byte volumen = 0xFF; // volumen / Velocity = 127 Serial1.write (kommando); // skicka anteckning på kommando Serial1.write (tonenr); // skicka tonnummer Serial1.write (volym); // skicka volumen (hastighet)} void Send_Note_Off (byte tonenr) {// Denna funktion avsändare notera från kommando på MIDI -gränssnitt const byte kommando = 0x80; // Notera kommando på MIDI kanal 1 const byte volumen = 0xFF; // volumen / Velocity = 127 Serial1.write (kommando); // skicka anteckning från kommando Serial1.write (tonenr); // skicka tonnummer Serial1.write (volym); // skicka volumen (hastighet)}

Steg 7: Grunderna i MIDI -kommunikation

MIDI (Musical Instrument Digital Interface) är ett universellt seriekommunikationsprotokoll för gränssnitt mellan elektroniska musikinstrument och andra enheter. Seriell kommunikation används (31250 bit/s, överföringsmedium är en strömslinga, optoisolerad i mottagaränden. 5-stifts DIN-kontakter används. 16 logiska kommunikationskanaler är möjliga i en fysisk MIDI-anslutning. Många kommandon definieras i MIDI som standard använder jag två kommandon i detta projekt, dessa kommandon består av 3 byte:

a) Obs På kommando:

1. byte send = 0x90 betyder notering på kommando på MIDI -kanal 1

2. byte send = 0xZZ ZZ är notnummer, jag använder intervallet 0x3C till 0x48

3. byte send = 0xFF FF = 255 betyder max volym, intervall 0x00 till 0xFF

b) Obs Off -kommando: 1. byte send = 0x80 betyder notera av kommando på MIDI kanal 1

2. byte send = 0xZZ ZZ är notnummer, jag använder intervallet 0x3C till 0x48

3. byte send = 0xFF FF = 255 betyder max volym, intervall 0x00 till 0xFF

Rekommenderad: