Problème de sortie midi 5 pin avec Mega 2560

Bonjour à tous,

je suis nouveau dans l'univers de l'arduino et et l'électronique en général. Je me sers de ce projet (normalement basique) pour essayer de comprendre un peu mieux ce qui s'y passe.

Je suis en train de convertir un vieux pédalier d'orgue des 70's en contrôleur MIDI en passant par un arduino mega 2560. Il parait que ce n'est pas le top pour le midi mais c'est tout ce que vendait pour petit revendeur local.

La partie hardware du projet est terminée et semble fonctionner. J'ai relié chacune des 13 notes de mon orgue aux digital pins 22 à 34, toutes reliées à un même GND.

Le 2560 n'étant pas compatible MIDI over USB, j'utilise une fiche midi 5 pin pour le midi out et c'est là que ça se corse. L'arduino reçoit un signal midi quand j'actionne le pédale (la led RX clignote quand j'appuie et quand je relache) mais pas moyen de récupérer ce signal par la fiche 5 pin.

Voici le code que j'ai utilisé (auquel je ne comprends pas grand chose, mais ça vient doucement). Il est calqué sur le tuto youtube de LOOK MUM NO COMPUTER et adapté à mes besoins. Il utilise un UNO, c'est sans doute de là que vient le problème. Il y a aussi des petites blagues anglophiles que je n'ai pas effacées (comme buttonbeans pour buttonvalues).

Qu'est-ce que j'ai raté ?

//below is a code with slightly more complexity to only send midi on and off commands once for every button push
// this is quoting the code from the video https://youtu.be/wY1SRehZ9hM


#include <MIDI.h>




MIDI_CREATE_DEFAULT_INSTANCE();

int button1 = 22; //button1 on digital pin 22
int button2 = 23; //button2 on digital pin 23
int button3 = 24; //button3 on digital pin 24
int button4 = 25; //button4 on digital pin 25
int button5 = 26; //button5 on digital pin 26
int button6 = 27; //button6 on digital pin 27
int button7 = 28; //button7 on digital pin 28
int button8 = 29; //button8 on digital pin 29
int button9 = 30; //button9 on digital pin 30
int button10 = 31; //button10 on digital pin 31
int button11 = 32; //button11 on digital pin 32
int button12 = 33; //button12 on digital pin 33
int button13 = 34; //button13 on digital pin 34



int button1beans = 0;
int button2beans = 0;
int button3beans = 0;
int button4beans = 0;
int button5beans = 0;
int button6beans = 0;
int button7beans = 0;
int button8beans = 0;
int button9beans = 0;
int button10beans = 0;
int button11beans = 0;
int button12beans = 0;
int button13beans = 0;


int button1state = 0; //these state values help us only sendmidi commands once for every button put
int button2state = 0; //bear in mind this will only be a problem if you plan on having lots of midi things going on at once
int button3state = 0; //it just stops clogging up the midi feed with constant midi off commands.
int button4state = 0; //as themore keys you send the more midi off commands are constantly being sent
int button5state = 0; //so this just neatens the midi stream a bit to prevent mistakes. 
int button6state = 0;
int button7state = 0;
int button8state = 0;
int button9state = 0;
int button10state = 0;
int button11state = 0;
int button12state = 0;
int button13state = 0;



void setup()
{
  
    MIDI.begin(); //BEINNINFG IDIU TGHUBGS
    


pinMode(button1, INPUT_PULLUP); //pinMode means the pin is in input mode with an internal pull up resistor, so it is waiting to receive ground to do something
pinMode(button2, INPUT_PULLUP); //pinMode means the pin is in input mode with an internal pull up resistor, so it is waiting to receive ground to do something
pinMode(button3, INPUT_PULLUP); //pinMode means the pin is in input mode with an internal pull up resistor, so it is waiting to receive ground to do something
pinMode(button4, INPUT_PULLUP); //pinMode means the pin is in input mode with an internal pull up resistor, so it is waiting to receive ground to do something
pinMode(button5, INPUT_PULLUP); //pinMode means the pin is in input mode with an internal pull up resistor, so it is waiting to receive ground to do something
pinMode(button6, INPUT_PULLUP); //pinMode means the pin is in input mode with an internal pull up resistor, so it is waiting to receive ground to do something
pinMode(button7, INPUT_PULLUP); //pinMode means the pin is in input mode with an internal pull up resistor, so it is waiting to receive ground to do something
pinMode(button8, INPUT_PULLUP); //pinMode means the pin is in input mode with an internal pull up resistor, so it is waiting to receive ground to do something
pinMode(button9, INPUT_PULLUP); //pinMode means the pin is in input mode with an internal pull up resistor, so it is waiting to receive ground to do something
pinMode(button10, INPUT_PULLUP);//pinMode means the pin is in input mode with an internal pull up resistor, so it is waiting to receive ground to do something
pinMode(button11, INPUT_PULLUP);//pinMode means the pin is in input mode with an internal pull up resistor, so it is waiting to receive ground to do something
pinMode(button12, INPUT_PULLUP);
pinMode(button13, INPUT_PULLUP);


}



void loop()
{



  button1beans = digitalRead(button1); //read status of button
  button2beans = digitalRead(button2); //read status of button
  button3beans = digitalRead(button3); //read status of button
  button4beans = digitalRead(button4); //read status of button
  button5beans = digitalRead(button5); //read status of button
  button6beans = digitalRead(button6); //read status of button
  button7beans = digitalRead(button7); //read status of button
  button8beans = digitalRead(button8); //read status of button
  button9beans = digitalRead(button9); //read status of button
  button10beans = digitalRead(button10); //read status of button
  button11beans = digitalRead(button11); //read status of button
  button12beans = digitalRead(button12);
  button13beans = digitalRead(button13);


  if ((button1beans == LOW) && (button1state == 0))
  { MIDI.sendNoteOn(24,127,1); //turn midi note on 24 velocity 127, midi channel 1. 
    button1state = 1;}  
  if ((button1beans == HIGH) && (button1state == 1))
  { MIDI.sendNoteOff(24,0,1);  //turn midi note off 24 velocity 127, midi channel 1. 
    button1state = 0;
  }  


  if ((button2beans == LOW) && (button2state == 0))
  { MIDI.sendNoteOn(25,127,1); //turn midi note on 25 velocity 127, midi channel 1. 
    button2state = 1;}  
  if ((button2beans == HIGH) && (button2state == 1))
  { MIDI.sendNoteOff(25,0,1);  //turn midi note off 25 velocity 127, midi channel 1. 
    button2state = 0;
  }  
  
  if ((button3beans == LOW) && (button3state == 0))
  { MIDI.sendNoteOn(26,127,1); //turn midi note on 26 velocity 127, midi channel 1. 
    button3state = 1;}  
  if ((button3beans == HIGH) && (button3state == 1))
  { MIDI.sendNoteOff(26,0,1);  //turn midi note off 26 velocity 127, midi channel 1. 
    button3state = 0;
  }  
  
  if ((button4beans == LOW) && (button4state == 0))
  { MIDI.sendNoteOn(27,127,1); //turn midi note on 27 velocity 127, midi channel 1. 
    button4state = 1;}  
  if ((button4beans == HIGH) && (button4state == 1))
  { MIDI.sendNoteOff(27,0,1);  //turn midi note off 27 velocity 127, midi channel 1. 
    button4state = 0;
  }  
  
  if ((button5beans == LOW) && (button5state == 0))
  { MIDI.sendNoteOn(28,127,1); //turn midi note on 28 velocity 127, midi channel 1. 
    button5state = 1;}  
  if ((button5beans == HIGH) && (button5state == 1))
  { MIDI.sendNoteOff(28,0,1);  //turn midi note off 28 velocity 127, midi channel 1. 
    button5state = 0;
  }  
  
  if ((button6beans == LOW) && (button6state == 0))
  { MIDI.sendNoteOn(29,127,1); //turn midi note on 29 velocity 127, midi channel 1. 
    button6state = 1;}  
  if ((button6beans == HIGH) && (button6state == 1))
  { MIDI.sendNoteOff(29,0,1);  //turn midi note off 29 velocity 127, midi channel 1. 
    button6state = 0;
  }  
  
  if ((button7beans == LOW) && (button7state == 0))
  { MIDI.sendNoteOn(30,127,1); //turn midi note on 30 velocity 127, midi channel 1. 
    button7state = 1;}  
  if ((button7beans == HIGH) && (button7state == 1))
  { MIDI.sendNoteOff(30,0,1);  //turn midi note off 30 velocity 127, midi channel 1. 
    button7state = 0;
  }  
  
  if ((button8beans == LOW) && (button8state == 0))
  { MIDI.sendNoteOn(31,127,1); //turn midi note on 31 velocity 127, midi channel 1. 
    button8state = 1;}  
  if ((button8beans == HIGH) && (button8state == 1))
  { MIDI.sendNoteOff(31,0,1);  //turn midi note off 31 velocity 127, midi channel 1. 
    button8state = 0;
  }  
  
  if ((button9beans == LOW) && (button9state == 0))
  { MIDI.sendNoteOn(32,127,1); //turn midi note on 32 velocity 127, midi channel 1. 
    button9state = 1;}  
  if ((button9beans == HIGH) && (button9state == 1))
  { MIDI.sendNoteOff(32,0,1);  //turn midi note off 32 velocity 127, midi channel 1. 
    button9state = 0;
  }  

 
  if ((button10beans == LOW) && (button10state == 0))
  { MIDI.sendNoteOn(33,127,1); //turn midi note on 33 velocity 127, midi channel 1. 
    button10state = 1;}  
  if ((button10beans == HIGH) && (button10state == 1))
  { MIDI.sendNoteOff(33,0,1);  //turn midi note off 33 velocity 127, midi channel 1. 
    button10state = 0;
  } 
  
  if ((button11beans == LOW) && (button11state == 0))
  { MIDI.sendNoteOn(34,127,1); //turn midi note on 34 velocity 127, midi channel 1. 
    button11state = 1;}  
  if ((button11beans == HIGH) && (button11state == 1))
  { MIDI.sendNoteOff(34,0,1);  //turn midi note off 34 velocity 127, midi channel 1. 
    button11state = 0;
  }   

 if ((button12beans == LOW) && (button12state == 0))
  { MIDI.sendNoteOn(35,127,1); //turn midi note on 35 velocity 127, midi channel 1. 
    button12state = 1;}  
  if ((button12beans == HIGH) && (button12state == 1))
  { MIDI.sendNoteOff(35,0,1);  //turn midi note off 35 velocity 127, midi channel 1. 
    button12state = 0;
  } 
  
  if ((button13beans == LOW) && (button13state == 0))
  { MIDI.sendNoteOn(36,127,1); //turn midi note on 36 velocity 127, midi channel 1. 
    button13state = 1;}  
  if ((button13beans == HIGH) && (button13state == 1))
  { MIDI.sendNoteOff(36,0,1);  //turn midi note off 36 velocity 127, midi channel 1. 
    button13state = 0;
  } 

  }

merci d'avance :slight_smile:

Cyril

c'est dans ce fichier qu'il faut regarder s'il y a une config spéciale à faire pour un MEGA ou UNO sans doute

ah moins que ce ne soit la bibliothèque standard ? dans ce cas il faut peut être adapter le MIDI_CREATE_DEFAULT_INSTANCE();

EDIT

je suis allé voir son schéma

il faut que vous utilisiez une pin hardware Serial (Tx) de votre MEGA, prenez par exemple Tx2 qui est la pin 16

ensuite si vous regardez le code standard de MIDI_CREATE_DEFAULT_INSTANCE

on voit que l'on peut passer le port série utilisé donc si vous êtes connecté sur Tx2 vous changez votre

sans doute en

#include <MIDI.h>
MIDI_CREATE_INSTANCE(HardwareSerial, Serial2,  MIDI);

sinon il faut utiliser la pin 1 (le Tx standard) et auquel cas c'est Serial qui est utilisé, ce qui est la valeur par défaut. Mais brancher un truc sur Serial peut mettre le bazar lors du chargement du code. Comme vous avez plusieurs ports séries matériels sur la MEGA, autant en utiliser un autre

Merci de cette réponse !

pour l'instant je ne suis pas du tout en mesure de comprendre le code de MIDI_CREATE_DEFAULT_INSTANCE mais j'ai essayé ta modif du code et je suis passé sur la pin Tx2. Malheureusement ça n'a pas marché : plus de signal détecté par l'arduino (led rx éteinte) et a priori pas de signal en sortie non plus.

Par contre mon DAW s'est mis a détecter un signal de temps en temps (genre un par minute) que j'appuie ou non sur une touche à ce moment là...

j'ai remis ma config d'orgine et ma led clignote à nouveau. Et plus de résidu de signal intempestif.

expliquez comment est connecté votre prise MIDI
Capture d’écran 2023-11-29 à 19.09.12

avez vous les résistances, où vont les fils sur votre MEGA ?

la Pin 4 va sur le 5V et la Pin 5 va sur Tx1 (ici tx 2), je n'ai pas relié le GND. Le GND de mes interrupteurs est blanché tout en haut à gauche.

et effectivement je n'ai pas mis de résistance, elles n'étaient pas dans la vidéo d'origine. L'auteur du tuto les a rajouté après coup par sécu mais d'habitude il ne les mets pas. Je comptais les rajouter une fois tout le bazar opérationnel (et en l'occurrence, je n'en n'ai pas sous la main...) :-s

Il faut relier la broche 2 (centrale ) à la masse.

Cela n'a d'utilité que pour limiter les perturbations électromagnétiques reçues par le câble (blindage), aucunement dans le transfert des messages MIDI.
La dite broche 2 ne doit d'ailleurs pas être connectée au niveau de la prise MIDI IN pour éviter les risques de boucle de masse.

La câblage standard pour une prise MIDI OUT (c'est le cas ici) indique de relier la pin 2 à la masse. Ca ne coûte pas grand chose d'essayer.

que voulez vous dire par pin 4 et 5 ?

on est bien d'accord que c'est comme cela ? (et à mon avis mettre le GND est une sécurité mais j'y connais rien :slight_smile: )

Ouioui, c'est bien ça (à part que je n'ai pas mis ni le GND ni les résistances...). J'ai fait un test de continuité et mes soudures sont bonnes. Comme j'ai vu que look mum no computer ne relie jamais la terre dans ses tutos, je ne me suis pas embêté avec, mais je pourrais faire un test dans le doute.

je pense néanmoins vraiment que ça vient du code car quand j'ai fait les modif suggérées, je ne détectais plus rien en entrée mais il se passait quelque chose (de bizarre) en sortie, c'est donc bien que la **** de fiche midi transmettait quelque chose !

Ce qui me perturbe c'est que dans une autre vidéo, le même youtuber utilise le même schema avec un elegoo 2560, donc a priori avec les mêmes contraintes que mon arduino 2560.

J'ai l'impression qu'il faut que je refasse complètement mon code sur une autre base, je vais chercher dans d'autres tutos, mais celui ci était le plus basique. Tous les autres utilisent des multiplexeur et autres barbarismes dont je n'ose prononcer le nom...

merci de vos conseils en tout cas

As-tu vérifié si les fils vers les broches 4 et 5 de la prise DIN n'ont pas été inversés ?

Oui, j'ai déjà essayé d'inverser, sans succès...

ET si tu commençais par appliquer le conseil que tout le monde te donne, c-à-d câbler correctement ta prise MIDI ?

Ahah, le fait est que tout le monde n'est pas d'accord sur la définition de "correctement"

Du coup je viens de tester de relier le Pin du milieu au GND, sans succès

Tu peux continuer à essayer sans les résistances mais...
Es-tu certain que le port MIDI IN sur lequel tu te connectes fonctionne encore correctement ?
A force de le soumettre à des tensions pour lesquelles il n'est peut-être pas conçu, tu peux fort bien avoir grillé l'opto-coupleur.
Si l'opto-coupleur a bien résisté à ce sur-régime, c'est le port TX de ton Arduino qui peut avoir souffert de la surintensité qu'il a été contraint de fournir.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.