Spisu treści:

EAL - kontroler Arduino MIDI: 7 kroków
EAL - kontroler Arduino MIDI: 7 kroków

Wideo: EAL - kontroler Arduino MIDI: 7 kroków

Wideo: EAL - kontroler Arduino MIDI: 7 kroków
Wideo: Amazing arduino project 2024, Lipiec
Anonim
EAL - kontroler MIDI Arduino
EAL - kontroler MIDI Arduino

Wykonane przez Sørena Østergaarda Petersena, OEAAM16EDA

Ta instrukcja opisuje kontroler MIDI oparty na arduino. To jest projekt szkolny. Używając ręki możesz grać proste melodie za pośrednictwem połączenia MIDI i podłączonego instrumentu MIDI (lub jak w tym przypadku notebooka z oprogramowaniem softsynth). Możesz grać nuty ze skali C-dur, c-d-e-f-g-a-b-c. Aby móc podłączyć kontroler MIDI do notebooka, potrzebujesz interfejsu MIDI do USB, takiego jak m-audio Uno.

Krok 1: Film demonstracyjny

Image
Image

Podkręć głośność i ciesz się!

Jak to działa:

Kontroler MIDI wykorzystuje płytkę Arduino MEGA 2560. Dwa czujniki światła (LDR) wbudowane w 16 mm rurkę elektryczną tworzą podwójny system czujników i służą do tworzenia stabilnego wyzwalania bez fałszywego podwójnego wyzwalania. Latarka wytwarza wiązkę światła, gdy wiązka zostaje przerwana przez rękę poruszającą kontrolerem, dolny czujnik światła wykrywa brakującą wiązkę, a czujnik ultradźwiękowy HC-SR04 mierzy odległość od czujnika do dłoni.

Zmierzona odległość jest używana w programie Arduino do obliczania i ustawiania odpowiedniej wartości numeru nuty, która ma być spakowana do komunikatu MIDI Note On i transmitowanego przez interfejs MIDI. Interfejs wyjściowy MIDI wykorzystuje inwerter szesnastkowy 74HC14 i jest w zasadzie standardowym obwodem. Komunikacja MIDI wykorzystuje serial1, standardowy port szeregowy służy do debugowania.

Gdy ręka jest przesuwana prosto w górę i oddalona od wiązki światła, górny czujnik światła ponownie wykrywa wiązkę światła, a komunikat MIDI Note Off jest pakowany i przesyłany na wyjście MIDI.

Obszar gry pomiędzy czujnikami to około 63cm, a całkowita długość kontrolera MIDI to około 75cm.

Krok 2: Szczegóły czujników światła

Szczegóły czujników światła
Szczegóły czujników światła
Szczegóły czujników światła
Szczegóły czujników światła

Dwa czujniki światła są montowane jeden na drugim, tworząc podwójny system czujników. Zapobiega fałszywemu wyzwalaniu, gdy jest prawidłowo używany w oprogramowaniu. Każdy czujnik światła składa się z modułu fotorezystora wbudowanego w standardową rurkę elektryczną 16 mm. W każdej tubie wykonuje się szczelinę piłą do metalu, a płytkę fotorezystora można wcisnąć w szczelinę. Czujniki są sklejone taśmą klejącą, a także przymocowane do jednego końca kawałka drewna. Żadne światło nie może dotrzeć do czujników od tyłu. Czujniki światła mają wbudowane rezystory podciągające 10k.

Krok 3: Szczegóły czujnika ultradźwiękowego HC-SR04

Szczegóły czujnika ultradźwiękowego HC-SR04
Szczegóły czujnika ultradźwiękowego HC-SR04

Czujnik ultradźwiękowy HC-SR04 jest zamocowany na drugim końcu kontrolera MIDI. Tutaj również umieszczona jest jasna latarka, która tworzy niezbędną wiązkę światła.

Krok 4: Obwód Aduino

Obwód Aduino
Obwód Aduino
Obwód Aduino
Obwód Aduino

Obwód wyjściowy MIDI to w zasadzie standardowy inwerter szesnastkowy 74HC14 i kilka rezystorów oraz 5-pinowe złącze żeńskie DIN. Obwód 74HC14 steruje wyjściem MIDI, a jednocześnie zapewnia pewne środki ochrony płytki Arduino przed „światem rzeczywistym” podłączonym do wyjścia MIDI. Dodatkową praktyczną funkcją jest dioda LED aktywności MIDI, która sygnalizuje wysyłanie danych.

Użyłem odpowiedniej prototypowej płytki drukowanej do mojego sprzętu, ponieważ miałem wiele problemów ze złymi połączeniami na mojej płytce stykowej. Schemat jest wykonany we Fritzing, kopię pdf w wysokiej rozdzielczości można pobrać, klikając poniższy link. Wolę używać odpowiedniego programu do tworzenia schematów, takiego jak Kicad, myślę, że Fritzing jest ograniczony do wszystkiego poza najprostszymi eksperymentami.

Użyte materiały:

1 szt. Arduino MEGA 2560

2 szt. Fotorezystor (LDR) z wbudowanym rezystorem podciągającym (z zestawu 37 czujników)

1 szt. Czujnik ultradźwiękowy HC-SR04

1 szt. 74HC14 hex odwracający wyzwalacz Schmitta

2 szt. Rezystor 220 Ohm 0,25 W

1 szt. Rezystor 1k Ohm 0,25 W

1 szt. Niski prąd LED 2mA

1 szt. Kondensator ceramiczny 100nF (do odsprzęgnięcia zasilania, bezpośrednio na pinach zasilania 74HC14)

Płytka do krojenia chleba lub prototypowa płytka drukowana

2 szt. 16mm rura elektryczna, długość 65mm

1 szt. drewna o długości 75 cm

Taśma klejąca

Przewody

Krok 5: Lista we/wy

Lista we/wy
Lista we/wy

Krok 6: Kod Aduino

Szkic test_Midi6 wykorzystuje bibliotekę NewPing, którą należy dołączyć do środowiska programowania Arduino, aby korzystać z czujnika ultradźwiękowego HC-SC04. Szkic jest skomentowany w języku duńskim, przepraszam. Aby zachować dobrą strukturę szkicu, tworzone są oddzielne funkcje dla różnych części logicznych szkicu i w większości unika się zmiennych globalnych. Przebieg programu jest wizualizowany na schemacie blokowym kontrolera MIDI w formacie pdf.

// 15-05-2017 wersja: test_Midi6

// Søren Østergaard Petesen // Arduino MEGA 2560 // Uprość programowanie i prosty kontroler MIDI, który można odtwarzać na zewnętrz MIDI enhed, f.eks en softsynt na PC. // MIDI controlleren kan sende toneanslag (uwaga na komando) hhv. (odnotuj komando) dla en oktav C-C, C dur skala. // Der spilles med en "karate hånd" på et brædt // hvor sensorerne er monteret. MIDI kommandoerne trigges af en dobbelt LDR sensor, da der skal laves en sikker // detektering af både når hånden lander på brættet (przypis do), samt når hånden fjernes igen (przypis). // MIDI komenda "note on" og "note off" består hver af 3 bytes som sendes på serial1 porten // vha det i hardware opbyggede interfejs MIDI. // Tonehøjden bestemmes vha ultralydssensor HC-SR04 #include // biblioteka do anvendte ultralydssensor HC-SR04 #define TRIGGER_PIN 3 // Arduino pin do wyzwalacza na czujniku ultradźwiękowym #define ECHO_PIN 2 // Arduino pin do czujnika ultradźwiękowego # p define MAX_DISTANCE 100 // Maximum afstand for 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); // Tworzenie obiektu NewPing. intSpin1 = 53; //Underste LDR1 føler int Senspin2 = 52; //Overste LDR2 føler byte MIDIByte2; //deklaracja Variabel dla MIDIByte2 bool klar_note_on = 1; //Variabel deklaracja dla klar_note_on, styrer afsendelse af notatka o kommandzie. Første kommando er en notatka o kommandzie bool klar_note_off = 0; // Deklaracja zmiennej dla klar_note_off, styrer afsendelse af note off komando void setup() { pinMode(Senspin1, INPUT); // ustaw wejście czujnika pinMode(Senspin2, INPUT); // ustaw wejście czujnika Serial1.begin(31250); // Operacje Serial1 do komunikacji MIDI: 31250 bitów/sekundt Serial.begin(9600); //monitor szeregowy, til test } void loop() { bool Sensor1 = digitalRead(Senspin1); //Læs LDR1 - underte LDR bool Sensor2 = digitalRead(Senspin2); //wykryj LDR2 - pomiń LDR if (Sensor1 && klar_note_on) //aktywuj LDR1 i przejrzyj notatkę na { byte Note_Byte = Hent_tonehojde(); //Hent tone højde przez czujnik ultralyds MIDIByte2 = Hent_MidiByte2(Note_Byte); // Hent MidByte2, numer nuty MIDI, værdien 0xFF jest poza zakresem Send_Note_On(MIDIByte2); // kald funkcja Send_Note_On 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 wysyła notatkę off kommando gøres det her.. { Send_Note_Off(MIDIByte2); // wyślij notatkę 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) { // Funkcja zwracania funkcji Numer nuty MIDI, wartość 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; // ton 'C' } przerwa; przypadek 1: { MIDIB2 = 0x3E; // ton 'D' } przerwa; przypadek 2: { MIDIB2 = 0x40; // ton 'E' } break; przypadek 3: { MIDIB2 = 0x41; // ton 'F' } przerwa; przypadek 4: { MIDIB2 = 0x43; // ton 'G' } break; przypadek 5: { MIDIB2 = 0x45; // ton 'A' } break; przypadek 6: { MIDIB2 = 0x47; // ton 'B' } break; przypadek 7: { MIDIB2 = 0x48; // ton 'C' } przerwa; domyślnie: { MIDIB2 = 0xFF; // poza zakresem } } return MIDIB2; //returner numer nuty MIDI } 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(mediana); // Wyślij ping, få tid retur i us, gennemsint af Median målinger Afstand = Tid_uS / Omregningsfaktor; // Omregn tid til afstand i cm (0 = poza zakresem odległości) resultat = Afstand / 8; //Bregn 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; //Uwaga na komendę w kanale MIDI 1 const byte volumen = 0xFF; // objętość / Velocity = 127 Serial1.write(kommando); //wyślij notatkę do komanda Serial1.write(tonenr); //wyślij numer tonu Serial1.write(volumen); //send volumen (velocity) } void Send_Note_Off(byte tonenr) {//Denne funkcja sender note off kommando på MIDI interfacet const byte kommando = 0x80; //Note off kommando på MIDI kanal 1 const byte volumen = 0xFF; // objętość / Velocity = 127 Serial1.write(kommando); //wyślij notatkę do kommando Serial1.write(tonenr); //wyślij numer tonu Serial1.write(volumen); //wyślij objętość (szybkość) }

Krok 7: Podstawy komunikacji MIDI

MIDI (Musical Instrument Digital Interface) to uniwersalny protokół komunikacji szeregowej do łączenia elektronicznych instrumentów muzycznych i innych urządzeń. Wykorzystywana jest komunikacja szeregowa (31250 bit/s, medium transmisyjnym jest pętla prądowa, optoizolowana po stronie odbiornika. Stosowane są 5-pinowe złącza DIN. W jednym fizycznym połączeniu MIDI możliwych jest 16 logicznych kanałów komunikacyjnych. Wiele poleceń jest zdefiniowanych w MIDI standardowo używam w tym projekcie dwóch komend, te komendy składają się z 3 bajtów:

a) Uwaga na polecenie:

1. wysyłanie bajtów = 0x90 oznaczające notatkę przy komendzie na kanale MIDI 1

2. Wysyłanie bajtów = 0xZZ ZZ to numer nuty, używam zakresu od 0x3C do 0x48

3. wysyłanie bajtów =0xFF FF = 255 oznacza maksymalną głośność, zakres od 0x00 do 0xFF

b) Polecenie Note Off:1. wysyłanie bajtów = 0x80 oznacza polecenie wyłączenia nut na kanale MIDI 1

2. Wysyłanie bajtów = 0xZZ ZZ to numer nuty, używam zakresu od 0x3C do 0x48

3. wysyłanie bajtów =0xFF FF = 255 oznacza maksymalną głośność, zakres od 0x00 do 0xFF

Zalecana: