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);
}
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à ?
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);
}
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)
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.