Inhaltsverzeichnis:

EAL - Arduino MIDI-Controller - Gunook
EAL - Arduino MIDI-Controller - Gunook

Video: EAL - Arduino MIDI-Controller - Gunook

Video: EAL - Arduino MIDI-Controller - Gunook
Video: How to Build Arduino MIDI Controllers - The Complete Guide 2024, Juli
Anonim
EAL - Arduino-MIDI-Controller
EAL - Arduino-MIDI-Controller

Hergestellt von Søren Østergaard Petersen, OEAAM16EDA

Dieses anweisbare beschreibt einen arduino-basierten MIDI-Controller. Dies ist ein Schulprojekt. Mit der Hand können Sie über den MIDI-Anschluss und ein angeschlossenes MIDI-Instrument (oder wie in diesem Fall ein Notebook mit einer Softsynth-Software) einfache Melodien spielen. Sie können Noten aus einer C-Dur-Tonleiter spielen, c-d-e-f-g-a-b-c. Um den MIDI-Controller an ein Notebook anschließen zu können, benötigen Sie ein MIDI-zu-USB-Interface wie m-audio Uno.

Schritt 1: Demonstrationsvideo

Image
Image

Erhöhen Sie die Lautstärke und genießen Sie!

Wie es funktioniert:

Der MIDI-Controller verwendet ein Arduino MEGA 2560-Board. Zwei Lichtsensoren (LDR), die in ein 16-mm-Elektrorohr eingebaut sind, bilden ein Doppelsensorsystem und werden verwendet, um einen stabilen Trigger ohne falsche Doppeltriggerung zu erzeugen. Eine Taschenlampe erzeugt einen Lichtstrahl, wenn der Strahl von der Hand unterbrochen wird, die den Controller spielt, erkennt der untere Lichtsensor den fehlenden Strahl und ein HC-SR04-Ultraschallsensor misst den Abstand von Sensor zu Hand.

Der gemessene Abstand wird im Arduino-Programm zur Berechnung und Einstellung des entsprechenden Notennummernwertes verwendet, der in eine MIDI-Note-On-Nachricht gepackt und auf die MIDI-Schnittstelle übertragen wird. Die MIDI-Ausgangsschnittstelle verwendet einen 74HC14-Hex-Inverter und ist so ziemlich eine Standardschaltung. Die MIDI-Kommunikation verwendet serial1, die standardmäßige serielle Schnittstelle wird zum Debuggen verwendet.

Wenn die Hand gerade nach oben und vom Lichtstrahl weg bewegt wird, erfasst der obere Lichtsensor den Lichtstrahl erneut und eine MIDI-Note-Off-Nachricht wird gepackt und auf den MIDI-Ausgang übertragen.

Die Spielfläche zwischen den Sensoren beträgt ca. 63cm, die Gesamtlänge des MIDI-Controllers ca. 75cm.

Schritt 2: Details der Lichtsensoren

Details zu den Lichtsensoren
Details zu den Lichtsensoren
Details zu den Lichtsensoren
Details zu den Lichtsensoren

Die beiden Lichtsensoren sind übereinander montiert und bilden ein Doppelsensorsystem. Es verhindert Fehlauslösungen, wenn es richtig in der Software verwendet wird. Jeder Lichtsensor besteht aus einem Fotowiderstandsmodul, das in ein 16-mm-Standard-Elektrorohr eingebaut ist. In jedes Rohr wird mit einer Bügelsäge ein Schlitz eingebracht und die Fotowiderstandsplatine kann in den Schlitz gedrückt werden. Die Sensoren werden mit Klebeband zusammengeklebt und ebenfalls an einem Ende eines Holzstücks befestigt. Von hinten darf kein Licht die Sensoren erreichen können. Die Lichtsensoren verfügen über eingebaute 10k Pull-Up-Widerstände.

Schritt 3: Details des Ultraschallsensors HC-SR04

Details zum Ultraschallsensor HC-SR04
Details zum Ultraschallsensor HC-SR04

Der Ultraschallsensor HC-SR04 ist am anderen Ende des MIDI-Controllers befestigt. Auch hier wird eine helle Taschenlampe platziert, die den nötigen Lichtstrahl erzeugt.

Schritt 4: Der Aduino-Circuit

Der Aduino-Circuit
Der Aduino-Circuit
Der Aduino-Circuit
Der Aduino-Circuit

Die MIDI-Ausgangsschaltung ist im Grunde ein Standard 74HC14 Hex-Inverter und ein paar Widerstände plus eine 5-polige DIN-Buchse. Die 74HC14-Schaltung steuert den MIDI-Ausgang und bietet gleichzeitig einen Schutz für das Arduino-Board vor der "realen Welt", die mit dem MIDI-Ausgang verbunden ist. Ein zusätzliches praktisches Feature ist die MIDI-Aktivitäts-LED, die signalisiert, wenn Daten gesendet werden.

Ich habe eine richtige Prototyp-Platine für meine Hardware verwendet, weil ich viele Probleme mit schlechten Verbindungen auf meinem Steckbrett hatte. Der Schaltplan wurde in Fritzing erstellt, eine hochauflösende PDF-Kopie kann über den untenstehenden Link heruntergeladen werden. Ich bevorzuge es, ein richtiges Schaltplanprogramm wie Kicad zu verwenden, ich denke, Fritzing ist für alles andere als für die einfachsten Experimente zu beschränkt.

Verwendete Materialien:

1 Stück Arduino MEGA 2560

2 Stück Fotowiderstand (LDR) mit eingebautem Pull-Up-Widerstand (aus 37-Sensor-Kit)

1 Stück HC-SR04 Ultraschallsensor

1 Stk. 74HC14 Hex invertierender Schmitt-Trigger

2 Stk. Widerstand 220 Ohm 0.25W

1 Stück Widerstand 1k Ohm 0.25W

1 Stück LED Schwachstrom 2mA

1 Stk. 100nF Keramikkondensator (zur Netzteilentkopplung, direkt an den Powerpins des 74HC14)

Steckbrett oder Prototyp-PCB

2 Stk. 16mm Elektroschlauch, Länge 65mm

1 Stück Holz, Länge 75cm

Klebeband

Drähte

Schritt 5: E/A-Auflistung

E/A-Auflistung
E/A-Auflistung

Schritt 6: Der Aduino-Code

Der Sketch test_Midi6 verwendet die NewPing-Bibliothek, die Sie in Ihre Arduino-Programmierumgebung aufnehmen müssen, um den Ultraschallsensor HC-SC04 zu verwenden. Der Sketch ist auf Dänisch kommentiert, sorry.. Um den Sketch übersichtlich zu halten, werden für verschiedene Logikteile des Sketches separate Funktionen erstellt und globale Variablen weitgehend vermieden. Der Programmablauf wird im MIDI-Controller-Flussdiagramm pdf visualisiert.

// 15.05.2017 version: test_Midi6

// Søren Østergaard Petesen // Arduino MEGA 2560 // Dette program udgør en simple MIDI controller som kan styre and ekstern MIDI enhed, f.eks en softsynt på en PC. // MIDI controlleren kan sende tonanslag (note on kommando) hhv. (Kommando notieren) für en oktav C-C, C dur skala. // Der spilles med en "karate hånd" på et brædt // hvor sensorerne er monteret. MIDI kommandoerne triggers af en dobbelt LDR sensor, da der skal laves en 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" und "note off" består hver af 3 bytes som sendes på serial1 porten // vha det i hardware opbyggede MIDI interface. // Tonehøjden bestemmes vha ultralydssensor HC-SR04 #include // Bibliotek für den anvendte ultralydssensor HC-SR04 #define TRIGGER_PIN 3 // Arduino-Pin für Trigger-Pin für Ultraschallsensor #define ECHO_PIN 2 // Arduino-Pin für Echo-Pin für Ultraschallsensor # 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); // Erstellen des NewPing-Objekts. int Senspin1 = 53; // Unterste LDR1 für int Senspin2 = 52; //Øverste LDR2 für Byte MIDIByte2; //Variabeldeklaration für MIDIByte2 bool klar_note_on = 1; //Variabeldeklaration für klar_note_on, styrer afsendelse af note on kommando. Første kommando er en note on kommando bool klar_note_off = 0; // Variablendeklaration für klar_note_off, styrer afsendelse af note off kommando void setup () { PinMode (Senspin1, INPUT); // Sensoreingang PinMode (Senspin2, INPUT); // sæt Sensoreingang Serial1.begin (31250); // Serial1 bruges für MIDI-Kommunikation: 31250 bit/sekundt Serial.begin (9600); // serieller Monitor, bis Test} Void Schleife () { 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 aktivret og klar til note on { byte Note_Byte = Hent_tonehojde(); // Hent Tone højde über Ultralyds Sensor MIDIByte2 = Hent_MidiByte2 (Note_Byte); // Hent MidByte2, MIDI-Notennummer, værdien 0xFF er außerhalb des zulässigen Bereichs 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æste kommando er note off } if (Sensor2 && !Sensor1 && klar_note_off) // Hvis der skal sendet note off kommando gøres det her.. { Send_Note_Off(MIDIByte2); // Nachricht senden aus 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) { // Denne funktion returnerer MIDI-Notennummer, 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; Fall 1: {MIDIB2 = 0x3E; // tonen 'D' } Pause; Fall 2: {MIDIB2 = 0x40; // tonen 'E' } Pause; Fall 3: {MIDIB2 = 0x41; // tonen 'F' } break; Fall 4: {MIDIB2 = 0x43; // tonen 'G' } Pause; Fall 5: {MIDIB2 = 0x45; // tonen 'A' } Pause; Fall 6: {MIDIB2 = 0x47; // tonen 'B' } Pause; Fall 7: {MIDIB2 = 0x48; // tonen 'C' } Pause; Standard: { MIDIB2 = 0xFF; // außerhalb des Bereichs } } MIDIB2 zurückgeben; //Returner MIDI-Notennummer } 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 sumen af tiden frem og tilbage. Tid_uS = sonar.ping_median(Median); // Sende ping, få tid retur i uS, gennemsint af Median målinger Afstand = Tid_uS / Omregningsfaktor; // Omregn tid til afstand i cm (0 = außerhalb des Entfernungsbereichs) resultat = Afstand / 8; //Beregn 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; //Hinweis zum Kommando på MIDI kanal 1 const byte volumen = 0xFF; // Volumen / Geschwindigkeit = 127 Serial1.write (Kommando); // Hinweis zum Kommando senden Serial1.write (tonenr); // Tonnummer senden Serial1.write (volumen); // Sendevolumen (Geschwindigkeit) } void Send_Note_Off(byte tonenr) {//Denne funktion send note off kommando på MIDI interfacet const byte kommando = 0x80; //Note off kommando på MIDI kanal 1 const byte volumen = 0xFF; // Volumen / Geschwindigkeit = 127 Serial1.write (Kommando); // Nachricht vom Kommando senden Serial1.write (tonenr); // Tonnummer senden Serial1.write (volumen); // Sendevolumen (Geschwindigkeit) }

Schritt 7: Die Grundlagen der MIDI-Kommunikation

MIDI (Musical Instrument Digital Interface) ist ein universelles serielles Kommunikationsprotokoll zur Verbindung elektronischer Musikinstrumente und anderer Geräte. Es wird serielle Kommunikation verwendet (31250 Bit/s, Übertragungsmedium Stromschleife, empfängerseitig optoisoliert. 5-polige DIN-Anschlüsse werden verwendet. 16 logische Kommunikationskanäle sind in einer physikalischen MIDI-Verbindung möglich. Viele Befehle sind im MIDI. definiert Standard verwende ich in diesem Projekt zwei Befehle, diese Befehle bestehen aus 3 Bytes:

a) Hinweis zum Befehl:

1. byte send = 0x90 bedeutet Note auf Befehl auf MIDI-Kanal 1

2. byte send = 0xZZ ZZ ist Notennummer, ich verwende den Bereich 0x3C bis 0x48

3. byte send =0xFF FF = 255 bedeutet maximale Lautstärke, Bereich 0x00 bis 0xFF

b) Note-Off-Befehl:1. Byte send = 0x80 bedeutet Note-Off-Befehl auf MIDI-Kanal 1

2. byte send = 0xZZ ZZ ist Notennummer, ich verwende den Bereich 0x3C bis 0x48

3. byte send =0xFF FF = 255 bedeutet maximale Lautstärke, Bereich 0x00 bis 0xFF

Empfohlen: