Table des matières:

EAL - Contrôleur MIDI Arduino : 7 étapes
EAL - Contrôleur MIDI Arduino : 7 étapes

Vidéo: EAL - Contrôleur MIDI Arduino : 7 étapes

Vidéo: EAL - Contrôleur MIDI Arduino : 7 étapes
Vidéo: Build an Arduino MIDI Controller (D.I.Y.) 2024, Novembre
Anonim
EAL - Contrôleur Arduino MIDI
EAL - Contrôleur Arduino MIDI

Réalisé par Søren Østergaard Petersen, OEAAM16EDA

Cette instructable décrit un contrôleur MIDI basé sur arduino. Il s'agit d'un projet scolaire. En utilisant votre main, vous pouvez jouer des mélodies simples via la connexion MIDI et un instrument MIDI connecté (ou comme dans ce cas un ordinateur portable exécutant un logiciel softsynth). Vous pouvez jouer des notes à partir d'une gamme de do majeur, c-d-e-f-g-a-b-c. Pour pouvoir connecter le contrôleur MIDI à un ordinateur portable, vous aurez besoin d'une interface MIDI vers USB comme m-audio Uno.

Étape 1: Vidéo de démonstration

Image
Image

Montez le volume et profitez-en !

Comment ça fonctionne:

Le contrôleur MIDI utilise une carte Arduino MEGA 2560. Deux capteurs de lumière (LDR) intégrés dans un tube électrique de 16 mm forment un système à double capteur et sont utilisés pour créer un déclencheur stable sans faux double déclenchement. Une lampe de poche crée un faisceau lumineux, lorsque le faisceau est interrompu par la main jouant le contrôleur, le capteur de lumière inférieur détecte le faisceau manquant et un capteur à ultrasons HC-SR04 mesure la distance entre le capteur et la main.

La distance mesurée est utilisée dans le programme Arduino pour calculer et configurer la valeur appropriée du numéro de note à emballer dans un message MIDI Note On et à transmettre sur l'interface MIDI. L'interface de sortie MIDI utilise un inverseur hexagonal 74HC14 et est à peu près un circuit standard. La communication MIDI utilise serial1, le port série standard est utilisé pour le débogage.

Lorsque la main est déplacée vers le haut et loin du faisceau lumineux, le capteur de lumière supérieur détecte à nouveau le faisceau lumineux et un message MIDI Note Off est emballé et transmis sur la sortie MIDI.

La zone de jeu entre les capteurs est d'environ 63 cm, et la longueur totale du contrôleur MIDI est d'environ 75 cm.

Étape 2: Détails des capteurs de lumière

Détails des capteurs de lumière
Détails des capteurs de lumière
Détails des capteurs de lumière
Détails des capteurs de lumière

Les deux capteurs de lumière sont montés l'un sur l'autre pour former un système à double capteur. Il empêche les faux déclenchements lorsqu'il est utilisé correctement dans le logiciel. Chaque capteur de lumière est constitué d'un module photorésistance intégré dans un tube électrique standard de 16 mm. Une fente est faite dans chaque tube avec une scie à métaux et le PCB de la photorésistance peut être enfoncé dans la fente. Les capteurs sont collés avec du ruban adhésif en toile et également fixés à une extrémité d'un morceau de bois. Aucune lumière ne doit pouvoir atteindre les capteurs par l'arrière. Les capteurs de lumière sont dotés de résistances pull-up de 10k.

Étape 3: Détails du capteur à ultrasons HC-SR04

Détails du capteur à ultrasons HC-SR04
Détails du capteur à ultrasons HC-SR04

Le capteur ultrasonique HC-SR04 est fixé à l'autre extrémité du contrôleur MIDI. Une lampe de poche lumineuse est placée ici aussi, elle crée le faisceau lumineux nécessaire.

Étape 4: Le circuit Aduino

Le circuit Aduino
Le circuit Aduino
Le circuit Aduino
Le circuit Aduino

Le circuit de sortie MIDI est essentiellement un inverseur hexagonal 74HC14 standard et quelques résistances plus un connecteur femelle DIN à 5 broches. Le circuit 74HC14 pilote la sortie MIDI et fournit en même temps des moyens de protection pour la carte Arduino contre le "monde réel" connecté à la sortie MIDI. Une fonction supplémentaire pratique est la LED d'activité MIDI qui signale lorsque des données sont envoyées.

J'ai utilisé un prototype de PCB approprié pour mon matériel car j'ai eu beaucoup de problèmes avec de mauvaises connexions sur ma maquette. Le schéma est réalisé en Fritzing, une copie pdf haute résolution peut être téléchargée en cliquant sur le lien ci-dessous. Je préfère utiliser un programme de schémas approprié comme Kicad, je pense que Fritzing est limité pour tout sauf les expériences les plus simples.

Les matériaux utilisés:

1 pièces Arduino MEGA 2560

2 photorésistances (LDR) avec résistance de rappel intégrée (à partir du kit de 37 capteurs)

1 capteur à ultrasons HC-SR04

1 gâchette de Schmitt à inversion hexagonale 74HC14

2 résistances 220 Ohm 0.25W

1 résistance 1k Ohm 0.25W

1 pcs LED faible courant 2mA

1 condensateur céramique 100nF (pour le découplage de l'alimentation, directement sur les broches d'alimentation du 74HC14)

Planche à pain ou prototype de PCB

2 tubes électriques de 16 mm, longueur 65 mm

1 pièce de bois, longueur 75 cm

Ruban adhésif

Fils

Étape 5: liste des E/S

Liste des E/S
Liste des E/S

Étape 6: Le code Aduino

Le sketch test_Midi6 utilise la bibliothèque NewPing que vous devez inclure dans votre environnement de programmation Arduino, pour utiliser le capteur à ultrasons HC-SC04. Le sketch est commenté en danois, désolé. Pour garder le sketch bien structuré, des fonctions séparées sont créées pour les différentes parties logiques du sketch et les variables globales sont généralement évitées. Le déroulement du programme est visualisé dans l'organigramme du contrôleur MIDI 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 en softsynt på en PC. // Contrôleur MIDI kan sende toneanslag (note sur kommando) hhv. (note hors kommando) pour en oktav C-C, C dur skala. // Der déversements med en "karaté hånd" på et brædt // hvor sensorerne er monteret. MIDI kommandoerne déclenche un capteur LDR dobbelt, da der skal laves en sikker // detektering af både når hånden lander på brættet (note activée), samt når hånden fjernes igen (note désactivée). // kommandoerne MIDI "note on" og "note off" består hver af 3 bytes so sendes på serial1 porten // vha det i hardware opbyggede MIDI interface. // Tonehøjden bestemmes vha ultralydssensor HC-SR04 #include // bibliotek til den anvendte ultralydssensor HC-SR04 #define TRIGGER_PIN 3 // Arduino pin til trigger pin på capteur à ultrasons #define ECHO_PIN 2 // Arduino pin til echo pin på define MAX_DISTANCE 100 // Afstand maximum pour 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); // Création de l'objet NewPing. int Senspin1 = 53; //Underste LDR1 føler int Senspin2 = 52; //Øverste LDR2 føler byte MIDIByte2; //Déclaration de variable pour 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 capteur d'entrée pinMode(Senspin2, INPUT); // entrée du capteur sæt Serial1.begin(31250); // Serial1 bruges jusqu'à la communication MIDI: 31250 bits/sekundt Serial.begin (9600); //moniteur série, jusqu'au 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 le capteur ultralyds MIDIByte2 = Hent_MidiByte2(Note_Byte); // Hent MidByte2, numéro de note MIDI, værdien 0xFF er hors de portée Send_Note_On(MIDIByte2); // kald Send_Note_On funktion klar_note_on = 0; // der skal kun envoie une note sur kommando klar_note_off = 1; // Næste kommando er note off } if (Sensor2 && !Sensor1 && klar_note_off) // Hvis der skal envoie la note off kommando gøres det her.. { Send_Note_Off(MIDIByte2); // envoyer la note kommando klar_note_off = 0; // der skal kun envoie une note hors kommando } if (!Sensor1 && !Sensor2) // ses gøres klar til ny note on kommando, hånd er væk fra brædt { klar_note_on = 1; } } octet Hent_MidiByte2(octet NoteByte) { // Denne funktion returnerer numéro de note MIDI, valgt ud fra NoteByte octet MIDIB2; switch (NoteByte) // ses definitions hvilken værdi MIDIByte2 skal have ud fra værdien af Note_Byte { case 0: { MIDIB2 = 0x3C; // ton 'C' } break; cas 1: { MIDIB2 = 0x3E; // ton 'D' } break; cas 2: { MIDIB2 = 0x40; // ton 'E' } break; cas 3: { MIDIB2 = 0x41; // ton 'F' } break; cas 4: { MIDIB2 = 0x43; // ton 'G' } break; cas 5: { MIDIB2 = 0x45; // ton 'A' } break; cas 6: { MIDIB2 = 0x47; // ton 'B' } break; cas 7: { MIDIB2 = 0x48; // ton 'C' } break; par défaut: { MIDIB2 = 0xFF; // hors limites } } return MIDIB2; //Returner MIDI note number } byte Hent_tonehojde() { //Denne funktion heenter resultatet af ultralydsmålingen unsigned int Tid_uS; // målt tid i uS byte Afstand; // beregnet afstand i cm octet resultat; // inddeling af 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); // Envoyer le ping, få tid retur i uS, gennemsint af Median målinger Afstand = Tid_uS / Omregningsfaktor; // Omregn tid til afstand i cm (0 = hors plage de distance) 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; //Note sur kommando på MIDI kanal 1 const byte volumen = 0xFF; // volumen / Velocity = 127 Serial1.write(kommando); //Envoyer une note sur kommando Serial1.write(tonenr); //envoyer le numéro de tonalité Serial1.write(volumen); //envoyer le volumen (vitesse) } void Send_Note_Off(byte tonenr) {//Denne funktion sender 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); //envoyer une note hors kommando Serial1.write(tonenr); //envoyer le numéro de tonalité Serial1.write(volumen); //envoi du volume (vitesse) }

Étape 7: Les bases de la communication MIDI

MIDI (Musical Instrument Digital Interface) est un protocole de communication série universel pour l'interfaçage d'instruments de musique électroniques et d'autres appareils. La communication série est utilisée (31 250 bit/s, le support de transmission est une boucle de courant, opto-isolée à l'extrémité du récepteur. Des connecteurs DIN 5 broches sont utilisés. 16 canaux de communication logiques sont possibles dans une connexion MIDI physique. De nombreuses commandes sont définies dans le MIDI standard, j'utilise deux commandes dans ce projet, ces commandes se composent de 3 octets:

a) Remarque sur commande:

1. octet send = 0x90 signifiant note sur commande sur le canal MIDI 1

2. octet envoyé = 0xZZ ZZ est le numéro de note, j'utilise la plage 0x3C à 0x48

3. octet envoyé = 0xFF FF = 255 signifiant volume maximum, plage 0x00 à 0xFF

b) Remarque sur la commande Off:1. byte send = 0x80 signifiant note off commande sur le canal MIDI 1

2. octet envoyé = 0xZZ ZZ est le numéro de note, j'utilise la plage 0x3C à 0x48

3. octet envoyé = 0xFF FF = 255 signifiant volume maximum, plage 0x00 à 0xFF

Conseillé: