Problème liaison MIDI au démarrage mais pas au téléversement

Bonjour,

J'espère que quelqu'un pourra m'aider parce que là je sèche !

J'essais de fabriquer un contrôleur MIDI pour une table de mixage MIDAS.
Lorsque je téléverse mon programme tout fonctionne bien lorsque j'appui sur le bouton poussoir les commandes MIDI sont bien envoyées à la table, la LED Tx clignote et une LED programmée sur une des sorties s'allume bien.
Si je débranche l'Arduino et que je le rebranche lorsque j'appui sur mon bouton la LED sur la sortie s'allume bien par contre le Tx ne clignote pas et aucune commande est envoyée.

Je pense à un problème d'initialisation de la liaison série mais quoi ??
Mon code

#include <MIDI.h>


const int ButtonOne = 3;    // the pin that the pushbutton is attached to
const int L1 = 2;
// Variables will change:
int ButtonState1 = 0;         // current state of the button
int LastButtonState1 = 0;     // previous state of the button
int L1State = 0;              //état LED
MIDI_CREATE_DEFAULT_INSTANCE();

void setup() {
  // initialize the button pin as a input:
  pinMode(ButtonOne,INPUT);
  pinMode(L1,OUTPUT);
  // initialize serial communication:
  MIDI.begin(MIDI_CHANNEL_OFF);//31250);
}

void loop() {

  // read the pushbutton input pin:
  ButtonState1 = digitalRead(ButtonOne);

  // compare the buttonState to its previous state
  if (ButtonState1 != LastButtonState1) {
    if (ButtonState1 == 1) 
    {
      if (L1State==1)
      {
        L1State = 0;
        MIDI.sendControlChange ( 29, 127 ,2 ); // send a MIDI CC -- 38 = note, 0 = velocity, 1 = channel
      }
      else
      {
        L1State = 1;
        MIDI.sendControlChange ( 29, 0  ,2 ); // send a MIDI CC -- 38 = note, 0 = velocity, 1 = channel
      }
  
//      digitalWrite(L1, HIGH); // Allumer L1
      
    }
    LastButtonState1 = ButtonState1;
  }
      // Delay a little bit to avoid bouncing
    digitalWrite(L1, L1State); // Allumer L1
    delay(50);

}

Merci d'avance

Bonjour
est qu'un appui sur le bouton reset de l'arduino aprés rebranchement "regle le probléme" ?

Non j'ai essayé ça ne change rien.
Si j'ai bien compris sur l'adruino UNO le port série est en commun avec l'USB, le problème ne viendrait-il pas de là ?

Comment a tu physiquement connecté la sortie midi de l'arduino vers ta table ?

lorsque tu upload un programme par usb , il ne faut rien connecter sur RX/TX de l'arduino .

Suite à ta réponse je pense avoir résolu le problème.
J'ai dans un premier temps créer un port série virtuel grace à la librairie Softwareserial :

#include <SoftwareSerial.h>           // import de la bibliothèque
SoftwareSerial portSecondaire(2, 3);  // définition de portSecondaire (Rx, Tx)

Comme cela ça fonctionne après un redemarrage de l'arduino et sans re-televerser.

Par contre ça ne m'arrangeais pas car j'aurais voulu avoir 12 entrées/sorties et le j'en perd 2.
Donc j'ai tenté de faire ça :

#include <SoftwareSerial.h>           // import de la bibliothèque
SoftwareSerial portSecondaire(0, 1);  // définition de portSecondaire (Rx, Tx)

Et là ça fonctionne parfaitement, mais je n'ai pas l'explication.
Le code complet avec la déclaration de l'objet MIDI :

#include <MIDI.h>
#include <SoftwareSerial.h>           // import de la bibliothèque
SoftwareSerial portSecondaire(0, 1);  // définition de portSecondaire (Rx, Tx)

const int ButtonOne = 5;    // the pin that the pushbutton is attached to
const int L1 = 4;
// Variables will change:
int ButtonState1 = 0;         // current state of the button
int LastButtonState1 = 0;     // previous state of the button
int L1State = 0;              //état LED
int val = 0;
int lastVal = 0;

MIDI_CREATE_INSTANCE(SoftwareSerial, portSecondaire, midiOut);

void setup() {
  // initialize the button pin as a input:
  pinMode(ButtonOne, INPUT);
  pinMode(L1, OUTPUT);
  // initialize serial communication:
  portSecondaire.begin(31250);
}
 
void loop() {
 
  //Analogique
  val = analogRead(0) / 8; // Divide by 8 to get range of 0-127 for midi
  if (val != lastVal)
  {
    Serial.print (val);
    midiOut.sendControlChange ( 31, val , 1 );
  }
  lastVal = val;
  // read the pushbutton input pin:
  ButtonState1 = digitalRead(ButtonOne);

  // compare the buttonState to its previous state
  if (ButtonState1 != LastButtonState1) {
    if (ButtonState1 == 1)
    {
      if (L1State == 1)
      {
        L1State = 0;
        midiOut.sendControlChange ( 31, 127 ,2 ); // send a MIDI CC -- 38 = note, 0 = velocity, 1 = channel

      }
      else
      {
        L1State = 1;
        midiOut.sendControlChange ( 31, 0  ,2 ); // send a MIDI CC -- 38 = note, 0 = velocity, 1 = channel
      }
 
      //      digitalWrite(L1, HIGH); // Allumer L1
    }
    LastButtonState1 = ButtonState1;
  }
  // Delay a little bit to avoid bouncing
  digitalWrite(L1, L1State); // Allumer L1
  delay(50);

 }

Ce qui revient strictement au même que d'utiliser Serial :

    #define MIDI_CREATE_DEFAULT_INSTANCE()                                      \
        MIDI_CREATE_INSTANCE(HardwareSerial, Serial,  MIDI);

Dans les deux cas D0 et D1 sont utilisées.

A0 à A5 sont utilisables en tant qu'IO digitales.

bonjour
toutafé !
avec en plus , l'inconvénient de passer en software serial qui n'est pas très à l'aise dans les vitesses relativement hautes (ici 31250)

Cela peut aller pour de très faible quantités de données, mais la fiabilité n'est absolument pas garantie.

Je ne le savais pas merci !

Je me rends bien compte que ça revient au même qu'utiliser Serial mais par contre je n'ai plus le problème à l'initialisation lors d'un redémarrage sans téléversement. Et c'est la que je ne comprends pas !

Le problème est qu'utiliser D0 D1 peut amener des problèmes de téléversement.
L'autre problème est que cela oblige à utiliser un convertisseur USB/série + SoftwareSerial si l'on veut déboguer avec un terminal.
Une solution est d'utiliser une MEGA avec ses 3 ports série.

C'est cette ligne que j'utilisais pour créer l'instance. Par contre la ligne :
#define MIDI_CREATE_DEFAULT_INSTANCE()
Elle sert à quoi ?

Cela définit MIDI_CREATE_DEFAULT_INSTANCE() comme étant équivalent à MIDI_CREATE_INSTANCE(HardwareSerial, Serial, MIDI)
Une macro.

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