DIY MIDI USB CONTROLEUR Project Arduino Uno Besoin d'aide
- 76 réponses
- 10 participants
- 13 097 vues
- 10 followers
Mat Martigan
105
Posteur·euse AFfiné·e
Membre depuis 12 ans
Sujet de la discussion Posté le 24/01/2019 à 13:39:48DIY MIDI USB CONTROLEUR Project Arduino Uno Besoin d'aide
Bonjour a tous
Mon projet est de réaliser un contrôleur MIDI
uniquement dans le but de commander des paramètres de mon logiciel mao et autres Vst
6 Potentiometres ( 10kohm )
8 boutons
je peux programmer via le logiciel Arduino ,la carte est bien reconnu par le port USB ,et je peux également flasher le contrôleur USB ATMEGA16U2 via le logiciel FLIP afin de pouvoir transmettre les Données Midi via L'usb manipulation que se fait sans problème
https://dartmobo.com/midi-over-usb/
Ci joint voici les programmes ainsi que les projets dont je me suis inspiré
https://www.hackster.io/etiennedesportes/ableton-live-midi-controller-9182b3
Les boutons fonctionnent le mappage se fait correctement dans mon logiciel Mao
Mais les potentiomètres ne fonctionnent pas
Leur course est différente
Leur mappage en midi est impossible car selon la position des potentiomètres la diode TX clignote en permanence
Même si je réussie a mapper un ou 2 potentiomètres le mappage des autres est impossible
Car des que je touche un autre potentiomètre la diode TX clignote donc le mappage est aléatoire
J'ai également testé avant avec ce programme
https://www.instructables.com/id/Easy-3-Pot-Potentiometer-Arduino-Uno-Effects-Midi-/
et le logiciel Hailess Midi et loopBe1
Les 3 potentiomètres (2k2ohm) fonctionnaient
Mon schéma de câblage
Est ce que Le problème vient du code ou bien est ce que mon câblage au niveau des potentiomètres n'est pas bon ?
Sur D'autres projets similaires comme celui ci
https://www.instructables.com/id/Custom-Arduino-MIDI-Controller/
il est conseillé de mettre des condensateurs de 100nf entre le masse et la commande ainsi qu'entre le + et la masse de chaque potentiomètres dans le but d’éliminer les bruits
je vous remercie par avance pour votre aide
Le code principale
La bibliothèque Midi.h
Mon projet est de réaliser un contrôleur MIDI
uniquement dans le but de commander des paramètres de mon logiciel mao et autres Vst
6 Potentiometres ( 10kohm )
8 boutons
je peux programmer via le logiciel Arduino ,la carte est bien reconnu par le port USB ,et je peux également flasher le contrôleur USB ATMEGA16U2 via le logiciel FLIP afin de pouvoir transmettre les Données Midi via L'usb manipulation que se fait sans problème
https://dartmobo.com/midi-over-usb/
Ci joint voici les programmes ainsi que les projets dont je me suis inspiré
https://www.hackster.io/etiennedesportes/ableton-live-midi-controller-9182b3
Les boutons fonctionnent le mappage se fait correctement dans mon logiciel Mao
Mais les potentiomètres ne fonctionnent pas
Leur course est différente
Leur mappage en midi est impossible car selon la position des potentiomètres la diode TX clignote en permanence
Même si je réussie a mapper un ou 2 potentiomètres le mappage des autres est impossible
Car des que je touche un autre potentiomètre la diode TX clignote donc le mappage est aléatoire
J'ai également testé avant avec ce programme
https://www.instructables.com/id/Easy-3-Pot-Potentiometer-Arduino-Uno-Effects-Midi-/
et le logiciel Hailess Midi et loopBe1
Les 3 potentiomètres (2k2ohm) fonctionnaient
Mon schéma de câblage
Est ce que Le problème vient du code ou bien est ce que mon câblage au niveau des potentiomètres n'est pas bon ?
Sur D'autres projets similaires comme celui ci
https://www.instructables.com/id/Custom-Arduino-MIDI-Controller/
il est conseillé de mettre des condensateurs de 100nf entre le masse et la commande ainsi qu'entre le + et la masse de chaque potentiomètres dans le but d’éliminer les bruits
je vous remercie par avance pour votre aide
Le code principale
Spoiler - Cliquer ici pour lire la suite
#include <MIDI.h> // INlcude MIDI library
const int buttonPin = 2; // the number of the Button pin
const int buttonPin2 = 3;
const int buttonPin3 = 4;
const int buttonPin4 = 5;
const int buttonPin5 = 6;
const int buttonPin6 = 7;
const int buttonPin7 = 8;
const int buttonPin8 = 9;
// the number of the pushbutton pin
const int ledPin = 11; // the number of the LED pin
const int ledPin2 = 12;
const int ledPin3 = 13;
const int ledPin4 = 14;
const int ledPin5 = 15;
const int ledPin6 = 16;
const int ledPin7 = 17;
const int ledPin8 = 18;
// variables will change:
boolean currentState = LOW;//stroage for current button state
boolean lastState = LOW;//storage for last button state
boolean currentState2 = LOW;
boolean lastState2 = LOW;
boolean currentState3 = LOW;
boolean lastState3 = LOW;
boolean currentState4 = LOW;
boolean lastState4 = LOW;
boolean currentState5 = LOW;
boolean lastState5 = LOW;
boolean currentState6 = LOW;
boolean lastState6 = LOW;
boolean currentState7 = LOW;
boolean lastState7 = LOW;
boolean currentState8 = LOW;
boolean lastState8 = LOW;
void setup() {
Serial.begin(31250); // default midi speed rate
// initialize the LED pin as an output:
pinMode(ledPin, OUTPUT);
// initialize the pushbutton pin as an input:
pinMode(buttonPin, INPUT_PULLUP);
pinMode(ledPin2, OUTPUT);
pinMode(buttonPin2, INPUT_PULLUP);
pinMode(ledPin3, OUTPUT);
pinMode(buttonPin3,INPUT_PULLUP);
pinMode(ledPin4, OUTPUT);
pinMode(buttonPin4, INPUT_PULLUP);
pinMode(ledPin5, OUTPUT);
pinMode(buttonPin5, INPUT_PULLUP);
pinMode(ledPin6, OUTPUT);
pinMode(buttonPin6, INPUT_PULLUP);
pinMode(ledPin7, OUTPUT);
pinMode(buttonPin7,INPUT_PULLUP);
pinMode(ledPin8, OUTPUT);
pinMode(buttonPin8, INPUT_PULLUP);
MIDI.begin();
}
static int iAn0Val, iAn1Val, iAn2Val, iAn3Val, iAn4Val, iAn5Val;
void loop(){
// read the state of the pushbutton value:
currentState = digitalRead(buttonPin);
// check if the pushbutton is pressed.
// if it is, the buttonState is HIGH:
if (currentState == LOW && lastState == HIGH) {
digitalWrite(ledPin,HIGH);
MIDI.sendNoteOff(42,0,1);
// turn LED off
}
else if (currentState == HIGH && lastState == LOW) {
digitalWrite(ledPin, LOW);
MIDI.sendNoteOn(42,127,1);
// turn LED on
delay(20);
MIDI.sendNoteOff(42,0,1);
// turn LED off
}
lastState = currentState;
currentState2 = digitalRead(buttonPin2);
if (currentState2 == LOW && lastState2 == HIGH) {
digitalWrite(ledPin2,HIGH);
MIDI.sendNoteOff(39,0,1);
}
else if (currentState2 == HIGH && lastState2 == LOW) {
digitalWrite(ledPin2, LOW);
MIDI.sendNoteOn(39,127,1);
delay(20);
MIDI.sendNoteOff(39,0,1);
}
lastState2 = currentState2;
currentState3 = digitalRead(buttonPin3);
if (currentState3 == LOW && lastState3 == HIGH) {
digitalWrite(ledPin3,HIGH);
MIDI.sendNoteOff(40,0,1);
}
else if (currentState3 == HIGH && lastState3 == LOW) {
digitalWrite(ledPin3, LOW);
MIDI.sendNoteOn(40,127,1);
delay(20);
MIDI.sendNoteOff(40,0,1);
}
lastState3 = currentState3;
currentState4 = digitalRead(buttonPin4);
if (currentState4 == LOW && lastState4 == HIGH) {
digitalWrite(ledPin4,HIGH);
MIDI.sendNoteOff(41,0,1);
}
else if (currentState4 == HIGH && lastState4 == LOW) {
digitalWrite(ledPin4, LOW);
MIDI.sendNoteOn(41,127,1);
delay(20);
MIDI.sendNoteOff(41,0,1);
}
lastState4 = currentState4;
currentState5 = digitalRead(buttonPin5);
if (currentState5 == LOW && lastState5 == HIGH) {
digitalWrite(ledPin5,HIGH);
MIDI.sendNoteOff(38,0,1);
}
else if (currentState5 == HIGH && lastState5 == LOW) {
digitalWrite(ledPin5, LOW);
MIDI.sendNoteOn(38,127,1);
delay(20);
MIDI.sendNoteOff(38,0,1);
}
lastState5 = currentState5;
currentState6 = digitalRead(buttonPin6);
if (currentState6 == LOW && lastState6 == HIGH) {
digitalWrite(ledPin6,HIGH);
MIDI.sendNoteOff(43,0,1);
}
else if (currentState6 == HIGH && lastState6 == LOW) {
digitalWrite(ledPin6, LOW);
MIDI.sendNoteOn(43,127,1);
delay(20);
MIDI.sendNoteOff(43,0,1);
}
lastState6 = currentState6;
currentState7 = digitalRead(buttonPin7);
if (currentState7 == LOW && lastState7 == HIGH) {
digitalWrite(ledPin7,HIGH);
MIDI.sendNoteOff(37,0,1);
}
else if (currentState7 == HIGH && lastState7 == LOW) {
digitalWrite(ledPin7, LOW);
MIDI.sendNoteOn(37,127,1);
delay(20);
MIDI.sendNoteOff(37,0,1);
}
lastState7 = currentState7;
currentState8 = digitalRead(buttonPin8);
if (currentState8 == LOW && lastState8 == HIGH) {
digitalWrite(ledPin8,HIGH);
MIDI.sendNoteOff(44,0,1);
}
else if (currentState8 == HIGH && lastState8 == LOW) {
digitalWrite(ledPin8, LOW);
MIDI.sendNoteOn(44,127,1);
delay(20);
MIDI.sendNoteOff(44,0,1);
}
lastState8 = currentState8;
static int iAn0ValPrev;
iAn0ValPrev = iAn0Val; // previous value
iAn0Val = analogRead(A0)/8; // Divide by 8 to get range of 0-127 for midi
analogPinMidiTX(1,iAn0Val,iAn0ValPrev); //TX value
static int iAn1ValPrev;
iAn1ValPrev = iAn1Val;
iAn1Val = analogRead(A1)/8;
analogPinMidiTX(2,iAn1Val,iAn1ValPrev);
static int iAn2ValPrev;
iAn2ValPrev = iAn2Val;
iAn2Val = analogRead(A2)/8;
analogPinMidiTX(3,iAn2Val,iAn2ValPrev);
static int iAn3ValPrev;
iAn3ValPrev = iAn3Val;
iAn3Val = analogRead(A3)/8;
analogPinMidiTX(4,iAn3Val,iAn3ValPrev);
static int iAn4ValPrev;
iAn4ValPrev = iAn4Val;
iAn4Val = analogRead(A4)/8;
analogPinMidiTX(5,iAn4Val,iAn4ValPrev);
static int iAn5ValPrev;
iAn5ValPrev = iAn5Val;
iAn5Val = analogRead(A5)/8;
analogPinMidiTX(6,iAn5Val,iAn5ValPrev);
}
void analogPinMidiTX(int iChan, int iVal, int iValPrev)
{
// TX Value only if it has changed
if(iValPrev != iVal)
{
MidiTX(176,iChan,iVal); // 176 = CC command, 1 = Which Control, val = value read from Potentionmeter
}
}
void MidiTX(unsigned char MESSAGE, unsigned char CONTROL, unsigned char VALUE) //Valeur en Midi Command
{
Serial.write(MESSAGE);
Serial.write(CONTROL);
Serial.write(VALUE);
}
const int buttonPin = 2; // the number of the Button pin
const int buttonPin2 = 3;
const int buttonPin3 = 4;
const int buttonPin4 = 5;
const int buttonPin5 = 6;
const int buttonPin6 = 7;
const int buttonPin7 = 8;
const int buttonPin8 = 9;
// the number of the pushbutton pin
const int ledPin = 11; // the number of the LED pin
const int ledPin2 = 12;
const int ledPin3 = 13;
const int ledPin4 = 14;
const int ledPin5 = 15;
const int ledPin6 = 16;
const int ledPin7 = 17;
const int ledPin8 = 18;
// variables will change:
boolean currentState = LOW;//stroage for current button state
boolean lastState = LOW;//storage for last button state
boolean currentState2 = LOW;
boolean lastState2 = LOW;
boolean currentState3 = LOW;
boolean lastState3 = LOW;
boolean currentState4 = LOW;
boolean lastState4 = LOW;
boolean currentState5 = LOW;
boolean lastState5 = LOW;
boolean currentState6 = LOW;
boolean lastState6 = LOW;
boolean currentState7 = LOW;
boolean lastState7 = LOW;
boolean currentState8 = LOW;
boolean lastState8 = LOW;
void setup() {
Serial.begin(31250); // default midi speed rate
// initialize the LED pin as an output:
pinMode(ledPin, OUTPUT);
// initialize the pushbutton pin as an input:
pinMode(buttonPin, INPUT_PULLUP);
pinMode(ledPin2, OUTPUT);
pinMode(buttonPin2, INPUT_PULLUP);
pinMode(ledPin3, OUTPUT);
pinMode(buttonPin3,INPUT_PULLUP);
pinMode(ledPin4, OUTPUT);
pinMode(buttonPin4, INPUT_PULLUP);
pinMode(ledPin5, OUTPUT);
pinMode(buttonPin5, INPUT_PULLUP);
pinMode(ledPin6, OUTPUT);
pinMode(buttonPin6, INPUT_PULLUP);
pinMode(ledPin7, OUTPUT);
pinMode(buttonPin7,INPUT_PULLUP);
pinMode(ledPin8, OUTPUT);
pinMode(buttonPin8, INPUT_PULLUP);
MIDI.begin();
}
static int iAn0Val, iAn1Val, iAn2Val, iAn3Val, iAn4Val, iAn5Val;
void loop(){
// read the state of the pushbutton value:
currentState = digitalRead(buttonPin);
// check if the pushbutton is pressed.
// if it is, the buttonState is HIGH:
if (currentState == LOW && lastState == HIGH) {
digitalWrite(ledPin,HIGH);
MIDI.sendNoteOff(42,0,1);
// turn LED off
}
else if (currentState == HIGH && lastState == LOW) {
digitalWrite(ledPin, LOW);
MIDI.sendNoteOn(42,127,1);
// turn LED on
delay(20);
MIDI.sendNoteOff(42,0,1);
// turn LED off
}
lastState = currentState;
currentState2 = digitalRead(buttonPin2);
if (currentState2 == LOW && lastState2 == HIGH) {
digitalWrite(ledPin2,HIGH);
MIDI.sendNoteOff(39,0,1);
}
else if (currentState2 == HIGH && lastState2 == LOW) {
digitalWrite(ledPin2, LOW);
MIDI.sendNoteOn(39,127,1);
delay(20);
MIDI.sendNoteOff(39,0,1);
}
lastState2 = currentState2;
currentState3 = digitalRead(buttonPin3);
if (currentState3 == LOW && lastState3 == HIGH) {
digitalWrite(ledPin3,HIGH);
MIDI.sendNoteOff(40,0,1);
}
else if (currentState3 == HIGH && lastState3 == LOW) {
digitalWrite(ledPin3, LOW);
MIDI.sendNoteOn(40,127,1);
delay(20);
MIDI.sendNoteOff(40,0,1);
}
lastState3 = currentState3;
currentState4 = digitalRead(buttonPin4);
if (currentState4 == LOW && lastState4 == HIGH) {
digitalWrite(ledPin4,HIGH);
MIDI.sendNoteOff(41,0,1);
}
else if (currentState4 == HIGH && lastState4 == LOW) {
digitalWrite(ledPin4, LOW);
MIDI.sendNoteOn(41,127,1);
delay(20);
MIDI.sendNoteOff(41,0,1);
}
lastState4 = currentState4;
currentState5 = digitalRead(buttonPin5);
if (currentState5 == LOW && lastState5 == HIGH) {
digitalWrite(ledPin5,HIGH);
MIDI.sendNoteOff(38,0,1);
}
else if (currentState5 == HIGH && lastState5 == LOW) {
digitalWrite(ledPin5, LOW);
MIDI.sendNoteOn(38,127,1);
delay(20);
MIDI.sendNoteOff(38,0,1);
}
lastState5 = currentState5;
currentState6 = digitalRead(buttonPin6);
if (currentState6 == LOW && lastState6 == HIGH) {
digitalWrite(ledPin6,HIGH);
MIDI.sendNoteOff(43,0,1);
}
else if (currentState6 == HIGH && lastState6 == LOW) {
digitalWrite(ledPin6, LOW);
MIDI.sendNoteOn(43,127,1);
delay(20);
MIDI.sendNoteOff(43,0,1);
}
lastState6 = currentState6;
currentState7 = digitalRead(buttonPin7);
if (currentState7 == LOW && lastState7 == HIGH) {
digitalWrite(ledPin7,HIGH);
MIDI.sendNoteOff(37,0,1);
}
else if (currentState7 == HIGH && lastState7 == LOW) {
digitalWrite(ledPin7, LOW);
MIDI.sendNoteOn(37,127,1);
delay(20);
MIDI.sendNoteOff(37,0,1);
}
lastState7 = currentState7;
currentState8 = digitalRead(buttonPin8);
if (currentState8 == LOW && lastState8 == HIGH) {
digitalWrite(ledPin8,HIGH);
MIDI.sendNoteOff(44,0,1);
}
else if (currentState8 == HIGH && lastState8 == LOW) {
digitalWrite(ledPin8, LOW);
MIDI.sendNoteOn(44,127,1);
delay(20);
MIDI.sendNoteOff(44,0,1);
}
lastState8 = currentState8;
static int iAn0ValPrev;
iAn0ValPrev = iAn0Val; // previous value
iAn0Val = analogRead(A0)/8; // Divide by 8 to get range of 0-127 for midi
analogPinMidiTX(1,iAn0Val,iAn0ValPrev); //TX value
static int iAn1ValPrev;
iAn1ValPrev = iAn1Val;
iAn1Val = analogRead(A1)/8;
analogPinMidiTX(2,iAn1Val,iAn1ValPrev);
static int iAn2ValPrev;
iAn2ValPrev = iAn2Val;
iAn2Val = analogRead(A2)/8;
analogPinMidiTX(3,iAn2Val,iAn2ValPrev);
static int iAn3ValPrev;
iAn3ValPrev = iAn3Val;
iAn3Val = analogRead(A3)/8;
analogPinMidiTX(4,iAn3Val,iAn3ValPrev);
static int iAn4ValPrev;
iAn4ValPrev = iAn4Val;
iAn4Val = analogRead(A4)/8;
analogPinMidiTX(5,iAn4Val,iAn4ValPrev);
static int iAn5ValPrev;
iAn5ValPrev = iAn5Val;
iAn5Val = analogRead(A5)/8;
analogPinMidiTX(6,iAn5Val,iAn5ValPrev);
}
void analogPinMidiTX(int iChan, int iVal, int iValPrev)
{
// TX Value only if it has changed
if(iValPrev != iVal)
{
MidiTX(176,iChan,iVal); // 176 = CC command, 1 = Which Control, val = value read from Potentionmeter
}
}
void MidiTX(unsigned char MESSAGE, unsigned char CONTROL, unsigned char VALUE) //Valeur en Midi Command
{
Serial.write(MESSAGE);
Serial.write(CONTROL);
Serial.write(VALUE);
}
La bibliothèque Midi.h
Spoiler - Cliquer ici pour lire la suite
#include <MIDI.h>
/*
Basic I/O MIDI tutorial
by Franky
28/07/2009
*/
#define LED 13 // LED pin on Arduino board
void setup() {
pinMode(LED, OUTPUT);
MIDI.begin(4); // Launch MIDI with default options
// input channel is set to 4
}
void loop() {
if (MIDI.read()) {
digitalWrite(LED,HIGH); // Blink the LED
MIDI.sendNoteOn(42,127,1); // Send a Note (pitch 42, velo 127 on channel 1)
delay(1000); // Wait for a second
MIDI.sendNoteOff(42,0,1); // Stop the note
digitalWrite(LED,LOW);
}
}
/*
Basic I/O MIDI tutorial
by Franky
28/07/2009
*/
#define LED 13 // LED pin on Arduino board
void setup() {
pinMode(LED, OUTPUT);
MIDI.begin(4); // Launch MIDI with default options
// input channel is set to 4
}
void loop() {
if (MIDI.read()) {
digitalWrite(LED,HIGH); // Blink the LED
MIDI.sendNoteOn(42,127,1); // Send a Note (pitch 42, velo 127 on channel 1)
delay(1000); // Wait for a second
MIDI.sendNoteOff(42,0,1); // Stop the note
digitalWrite(LED,LOW);
}
}
Spoiler - Cliquer ici pour lire la suite
#include <MIDI.h>
// This function will be automatically called when a NoteOn is received.
// It must be a void-returning function with the correct parameters,
// see documentation here:
// http://arduinomidilib.sourceforge.net/class_m_i_d_i___class.html
void HandleNoteOn(byte channel, byte pitch, byte velocity) {
// Do whatever you want when you receive a Note On.
if (velocity == 0) {
// This acts like a NoteOff.
}
// This function will be automatically called when a NoteOn is received.
// It must be a void-returning function with the correct parameters,
// see documentation here:
// http://arduinomidilib.sourceforge.net/class_m_i_d_i___class.html
void HandleNoteOn(byte channel, byte pitch, byte velocity) {
// Do whatever you want when you receive a Note On.
if (velocity == 0) {
// This acts like a NoteOff.
}
Spoiler - Cliquer ici pour lire la suite
#include <MIDI.h>
/*
MIDI Input tutorial
by Franky
28/07/2009
NOTE: for easier MIDI input reading,
take a look a the Callbacks example.
*/
#define LED 13 // LED pin on Arduino board
void BlinkLed(byte num) { // Basic blink function
for (byte i=0;i<num;i++) {
digitalWrite(LED,HIGH);
delay(50);
digitalWrite(LED,LOW);
delay(50);
}
}
void setup() {
pinMode(LED, OUTPUT);
MIDI.begin(); // Launch MIDI with default options
// (input channel is default set to 1)
}
void loop() {
if (MIDI.read()) { // Is there a MIDI message incoming ?
switch(MIDI.getType()) { // Get the type of the message we caught
case ProgramChange: // If it is a Program Change
BlinkLed(MIDI.getData1()); // Blink the LED a number of times
// correponding to the program number
// (0 to 127, it can last a while..)
break;
// See the online reference for other message types
default:
break;
}
}
}
/*
MIDI Input tutorial
by Franky
28/07/2009
NOTE: for easier MIDI input reading,
take a look a the Callbacks example.
*/
#define LED 13 // LED pin on Arduino board
void BlinkLed(byte num) { // Basic blink function
for (byte i=0;i<num;i++) {
digitalWrite(LED,HIGH);
delay(50);
digitalWrite(LED,LOW);
delay(50);
}
}
void setup() {
pinMode(LED, OUTPUT);
MIDI.begin(); // Launch MIDI with default options
// (input channel is default set to 1)
}
void loop() {
if (MIDI.read()) { // Is there a MIDI message incoming ?
switch(MIDI.getType()) { // Get the type of the message we caught
case ProgramChange: // If it is a Program Change
BlinkLed(MIDI.getData1()); // Blink the LED a number of times
// correponding to the program number
// (0 to 127, it can last a while..)
break;
// See the online reference for other message types
default:
break;
}
}
}
Anonyme
1096
2 Posté le 24/01/2019 à 22:10:46
Salut MM.
Je vois que tu as participé à la discussion autour de mon contrôleur qui comprend une Nano:
https://fr.audiofanzine.com/les-mains-dans-le-cambouis/forums/t.675837,un-controleur-midi-tres-diy,post.9724444.html
Par rapport à ton schéma:
Tu peux te passer des 8 resistances de rappel pour les switchs, pour ça l'arduino propose la commande "INPUT_PULLUP" qui permet d'accéder aux résistances internes du microcontrôleur. Je remarque que ton code utilise justement cette fonction.
http://gilles.thebault.free.fr/local/cache-vignettes/L500xH186/pullup_input-ee7c2.jpg
Ensuite je ne comprends pas ton montage qui semble vraiment approximatif. Par exemple les pattes des 3 premières Leds sont finalement toutes reliées au + 5V, il y a un problème avec le deuxième potard dont deux pattes sont aussi reliées au +5V... etc...
Quand tu parles de mappage, tu veux dire quand tu essayes d'assigner un potentiomètre dans ton séquenceur?
Quand tu dis que la course des potentiomètres est différente, ça veut dire que tu obtiens quelles valeurs?
Tu peux facilement checker tes faders avec l'exemple "AnalogReadSerial" inclus dans l'IDE.
Check déjà ton hardware de ce côté là...
Je vois que tu as participé à la discussion autour de mon contrôleur qui comprend une Nano:
https://fr.audiofanzine.com/les-mains-dans-le-cambouis/forums/t.675837,un-controleur-midi-tres-diy,post.9724444.html
Par rapport à ton schéma:
Tu peux te passer des 8 resistances de rappel pour les switchs, pour ça l'arduino propose la commande "INPUT_PULLUP" qui permet d'accéder aux résistances internes du microcontrôleur. Je remarque que ton code utilise justement cette fonction.
http://gilles.thebault.free.fr/local/cache-vignettes/L500xH186/pullup_input-ee7c2.jpg
Ensuite je ne comprends pas ton montage qui semble vraiment approximatif. Par exemple les pattes des 3 premières Leds sont finalement toutes reliées au + 5V, il y a un problème avec le deuxième potard dont deux pattes sont aussi reliées au +5V... etc...
Quand tu parles de mappage, tu veux dire quand tu essayes d'assigner un potentiomètre dans ton séquenceur?
Quand tu dis que la course des potentiomètres est différente, ça veut dire que tu obtiens quelles valeurs?
Tu peux facilement checker tes faders avec l'exemple "AnalogReadSerial" inclus dans l'IDE.
Check déjà ton hardware de ce côté là...
[ Dernière édition du message le 24/01/2019 à 23:30:12 ]
Mat Martigan
105
Posteur·euse AFfiné·e
Membre depuis 12 ans
3 Posté le 25/01/2019 à 14:13:54
Salut King C
effectivement c'est bien moi qui est participé à ta discussion
j'ai trouvé ton contrôleur très bien fait surtout quand il y a des gros knob bien vintage
Pour le schéma c'est pas des incohérences mais bien des erreurs de ma part
pour les diodes elles sont toutes reliés au +5v et à la masse car je veux juste avoir du retro éclairage des boutons pour l'instant
pour le mappage c'est effectivement l'assignement d'une commande dans mon DAW
J'ai fait un check "AnalogreadSerial" avec un potentiomètre
Premièrement Sans rien de branché j'ai la Diode TX clignote en permanence
Dans le moniteur serie j'ai une transmission en permanence
Par contre lorsque je touche le potentiomètre la valeur varie bien de 0 a 1023 et la carte continue a transmettre sur la valeur ou j'ai laissé le potentiomètre
effectivement c'est bien moi qui est participé à ta discussion
j'ai trouvé ton contrôleur très bien fait surtout quand il y a des gros knob bien vintage
Pour le schéma c'est pas des incohérences mais bien des erreurs de ma part
pour les diodes elles sont toutes reliés au +5v et à la masse car je veux juste avoir du retro éclairage des boutons pour l'instant
pour le mappage c'est effectivement l'assignement d'une commande dans mon DAW
J'ai fait un check "AnalogreadSerial" avec un potentiomètre
Premièrement Sans rien de branché j'ai la Diode TX clignote en permanence
Dans le moniteur serie j'ai une transmission en permanence
Par contre lorsque je touche le potentiomètre la valeur varie bien de 0 a 1023 et la carte continue a transmettre sur la valeur ou j'ai laissé le potentiomètre
Anonyme
1096
4 Posté le 26/01/2019 à 00:39:06
Là c'est normal que la diode TX clignote en permanence, c'est parce l'exemple utilise justement la fonction Serial: elle transmet des données à l'ordi.
Tester sur un seul potentiomètre c'est pas très utile... tu ne t'es pas fait une PCB avec les potentiomètres? Le hardware est encore breadboardé ou en chantier?
Tester sur un seul potentiomètre c'est pas très utile... tu ne t'es pas fait une PCB avec les potentiomètres? Le hardware est encore breadboardé ou en chantier?
[ Dernière édition du message le 26/01/2019 à 00:41:47 ]
Anonyme
1096
5 Posté le 26/01/2019 à 11:41:52
Je t'explique pourquoi c'est important de tester tout tes potentiomètres en configuration:
Apparement ton code ne devrait envoyer des MIDI CC que lorsque les potentiomètres bougent:
void analogPinMidiTX(int iChan, int iVal, int iValPrev)
{
// TX Value only if it has changed
if (iValPrev != iVal)
{
MidiTX(176, iChan, iVal); // 176 = CC command, 1 = Which Control, val = value read from Potentionmeter
}
}
Hors c'est pas normal que tes valeurs de pot bougent en permanence, il faut donc déjà être certain qu'électriquement les signaux qui arrivent à l'arduino sont tous propres, il suffit d'un potentiomètre qui crache pour mettre le bazar dans l'interface.... et puis comme le schéma que tu as fourni est approximatif...
Apparement ton code ne devrait envoyer des MIDI CC que lorsque les potentiomètres bougent:
void analogPinMidiTX(int iChan, int iVal, int iValPrev)
{
// TX Value only if it has changed
if (iValPrev != iVal)
{
MidiTX(176, iChan, iVal); // 176 = CC command, 1 = Which Control, val = value read from Potentionmeter
}
}
Hors c'est pas normal que tes valeurs de pot bougent en permanence, il faut donc déjà être certain qu'électriquement les signaux qui arrivent à l'arduino sont tous propres, il suffit d'un potentiomètre qui crache pour mettre le bazar dans l'interface.... et puis comme le schéma que tu as fourni est approximatif...
[ Dernière édition du message le 26/01/2019 à 11:44:06 ]
Rémy M. (chimimic)
14200
Modérateur·trice thématique
Membre depuis 22 ans
6 Posté le 26/01/2019 à 16:30:54
Citation de King :
c'est pas normal que tes valeurs de pot bougent en permanence, il faut donc déjà être certain qu'électriquement les signaux qui arrivent à l'arduino sont tous propres
Si le pot est en position centrale et que les valeurs bougent sans cesse sur une toute petite plage de variation (par exemple 510-511-512 pour un max de 1023, codage sur 10 bits, ce n'est pas anormal du tout, si le code se contente de créer une nouvelle valeur de CC pour chaque nouvelle acquisition du CAN, sans tenir compte des précédentes.
Si par contre les écarts de valeur sont élevés avec pot en position fixe, il y a problème.
Formateur en techniques sonores ; électronicien ; auteur @ sonelec-musique.com
christian_r
2141
AFicionado·a
Membre depuis 15 ans
7 Posté le 26/01/2019 à 16:43:03
Le montage est testé sur breadbord avec des fils volants et des contacts électriques approximatifs, ou c'est soudé proprement sur un pcb ?
Christian
Mat Martigan
105
Posteur·euse AFfiné·e
Membre depuis 12 ans
8 Posté le 26/01/2019 à 19:05:05
Les 6 potentiomètres sont mis en place sur la plaque du boitier de mon controleur pas de plaque pcb
Ce sont ces potentiomètres
https://www.conrad.fr/p/potentiometre-rotatif-10-k-lineaire-potentiometer-service-9305-mono-02-w-1-pcs-450034
D’après l'avis d'un client il semblerait que ces potentiomètres soient atteint de "Dyslexie"
j'ai soude des fils et vérifier la continuité aucun faut contact
Une petite plaque pcb me permet de relier toutes les extremites 1 et 2 des potentiomètres (5V et GND)
ainsi que les curseurs qui sont connectés sur les entres analogique de l'arduino
en soudant chaques extrémités les une aux autres (en theorie sa revient au même il me semble)
c’était plutôt un potentiomètres pour les contrôler tous dans mon daw
J'utilise egalement une breadboard avec des cables avec enbouts series
Ce sont ces potentiomètres
https://www.conrad.fr/p/potentiometre-rotatif-10-k-lineaire-potentiometer-service-9305-mono-02-w-1-pcs-450034
D’après l'avis d'un client il semblerait que ces potentiomètres soient atteint de "Dyslexie"
j'ai soude des fils et vérifier la continuité aucun faut contact
Une petite plaque pcb me permet de relier toutes les extremites 1 et 2 des potentiomètres (5V et GND)
ainsi que les curseurs qui sont connectés sur les entres analogique de l'arduino
en soudant chaques extrémités les une aux autres (en theorie sa revient au même il me semble)
c’était plutôt un potentiomètres pour les contrôler tous dans mon daw
J'utilise egalement une breadboard avec des cables avec enbouts series
Anonyme
1096
9 Posté le 26/01/2019 à 23:35:08
Citation de chimimic :
Si le pot est en position centrale et que les valeurs bougent sans cesse sur une toute petite plage de variation (par exemple 510-511-512 pour un max de 1023, codage sur 10 bits, ce n'est pas anormal du tout, si le code se contente de créer une nouvelle valeur de CC pour chaque nouvelle acquisition du CAN, sans tenir compte des précédentes.
Si par contre les écarts de valeur sont élevés avec pot en position fixe, il y a problème.
Dans le code De MM la valeur est divisée par 8 ( donc encodée en 7 bits) avant d'être comparée.
Pour moi la méthode n'est pas idéale mais ça devrait déjà limiter les sauts de valeurs.
Spoiler - Cliquer ici pour lire la suite
static int iAn0ValPrev;
iAn0ValPrev = iAn0Val; // previous value
iAn0Val = analogRead(A0)/8; // Divide by 8 to get range of 0-127 for midi
analogPinMidiTX(1,iAn0Val,iAn0ValPrev); //TX value
iAn0ValPrev = iAn0Val; // previous value
iAn0Val = analogRead(A0)/8; // Divide by 8 to get range of 0-127 for midi
analogPinMidiTX(1,iAn0Val,iAn0ValPrev); //TX value
Dans mon propre contrôleur j'utilise une méthode qui limite les effets de seuil:
(J'avais déjà posté le code entier ici :https://fr.audiofanzine.com/les-mains-dans-le-cambouis/forums/t.675837,un-controleur-midi-tres-diy,post.9781177.html)
Spoiler - Cliquer ici pour lire la suite
pot_0 = analogRead (A0); // lecture de l'entrée analogique en 10bits
if ( abs( pot_0 - old_pot_0) > 3) { // si la valeur absolue de la différence est supérieure à 3
old_pot_0 = pot_0;
pot_0 = pot_0 >> 3; // la valeur est encodée en 7 bits ( >> 3 équivaut à une division par 2^3 = 8 )
midiOut.sendControlChange( cc0 , pot_0, midi_Ch );
}
if ( abs( pot_0 - old_pot_0) > 3) { // si la valeur absolue de la différence est supérieure à 3
old_pot_0 = pot_0;
pot_0 = pot_0 >> 3; // la valeur est encodée en 7 bits ( >> 3 équivaut à une division par 2^3 = 8 )
midiOut.sendControlChange( cc0 , pot_0, midi_Ch );
}
Ici je lis les valeurs en 10 bits, la différence doit être au moins de +3 / -3 avant d'être prise en compte.
Ensuite seulement la valeur est divisée par 8 pour être encodée en 7 bits.
MM c'est difficile de t'aider sans connaître ton niveau.
Tu comprends le code que tu utilises ou tu l'a juste copié?
Comprends tu la feinte que j'utilises?
Là on met la tête dans le code mais moi je veux déjà être certain que les potentiomètres/branchements de MM sont inattaquables.
[ Dernière édition du message le 27/01/2019 à 00:09:59 ]
Anonyme
1096
10 Posté le 27/01/2019 à 00:04:12
Revenons donc au début.
MM voici un code que tu peux tester avec tes branchements actuels.
Ce programme te permettra de checker tout tes potentiomètres en même temps.
Ici on affiche les valeurs des 6 entrées analogiques.
Il s'agit des valeurs brutes encodées en 10bits (de 0 à 1023).
Comme le fait remarquer chimimic les valeurs peuvent varier de 1, 2 ou 3... mais pas beaucoup plus si les potentiomètres sont immobiles.
Qu'est-ce que ça dis?
Tu peux effectuer un deuxième test avec ce programme ci:
ici les valeurs sont déjà réduite en 7 bits (plage de 0 à 127) avant d'être affichée, c'est la même méthode que celle utilisée dans ton code.
A quel genre de sauts de valeurs es-tu confronté?
Voilà avec ces deux programmes ça te permettra déjà de mieux apprécier d'où vient le problème.
MM voici un code que tu peux tester avec tes branchements actuels.
Ce programme te permettra de checker tout tes potentiomètres en même temps.
Spoiler - Cliquer ici pour lire la suite
void setup() {
Serial.begin(9600);
}
void loop() {
int sensorValue_0 = analogRead(A0);
int sensorValue_1 = analogRead(A1);
int sensorValue_2 = analogRead(A2);
int sensorValue_3 = analogRead(A3);
int sensorValue_4 = analogRead(A4);
int sensorValue_5 = analogRead(A5);
Serial.print(sensorValue_0);
Serial.print(" - ");
Serial.print(sensorValue_1);
Serial.print(" - ");
Serial.print(sensorValue_2);
Serial.print(" - ");
Serial.print(sensorValue_3);
Serial.print(" - ");
Serial.print(sensorValue_4);
Serial.print(" - ");
Serial.println(sensorValue_5);
delay(1);
}
Serial.begin(9600);
}
void loop() {
int sensorValue_0 = analogRead(A0);
int sensorValue_1 = analogRead(A1);
int sensorValue_2 = analogRead(A2);
int sensorValue_3 = analogRead(A3);
int sensorValue_4 = analogRead(A4);
int sensorValue_5 = analogRead(A5);
Serial.print(sensorValue_0);
Serial.print(" - ");
Serial.print(sensorValue_1);
Serial.print(" - ");
Serial.print(sensorValue_2);
Serial.print(" - ");
Serial.print(sensorValue_3);
Serial.print(" - ");
Serial.print(sensorValue_4);
Serial.print(" - ");
Serial.println(sensorValue_5);
delay(1);
}
Ici on affiche les valeurs des 6 entrées analogiques.
Il s'agit des valeurs brutes encodées en 10bits (de 0 à 1023).
Comme le fait remarquer chimimic les valeurs peuvent varier de 1, 2 ou 3... mais pas beaucoup plus si les potentiomètres sont immobiles.
Qu'est-ce que ça dis?
Tu peux effectuer un deuxième test avec ce programme ci:
Spoiler - Cliquer ici pour lire la suite
void setup() {
Serial.begin(9600);
}
void loop() {
int sensorValue_0 = analogRead(A0);
int sensorValue_1 = analogRead(A1);
int sensorValue_2 = analogRead(A2);
int sensorValue_3 = analogRead(A3);
int sensorValue_4 = analogRead(A4);
int sensorValue_5 = analogRead(A5);
sensorValue_0 = sensorValue_0 / 8;
sensorValue_1 = sensorValue_1 / 8;
sensorValue_2 = sensorValue_2 / 8;
sensorValue_3 = sensorValue_3 / 8;
sensorValue_4 = sensorValue_4 / 8;
sensorValue_5 = sensorValue_5 / 8;
Serial.print(sensorValue_0);
Serial.print(" - ");
Serial.print(sensorValue_1);
Serial.print(" - ");
Serial.print(sensorValue_2);
Serial.print(" - ");
Serial.print(sensorValue_3);
Serial.print(" - ");
Serial.print(sensorValue_4);
Serial.print(" - ");
Serial.println(sensorValue_5);
delay(1);
}
Serial.begin(9600);
}
void loop() {
int sensorValue_0 = analogRead(A0);
int sensorValue_1 = analogRead(A1);
int sensorValue_2 = analogRead(A2);
int sensorValue_3 = analogRead(A3);
int sensorValue_4 = analogRead(A4);
int sensorValue_5 = analogRead(A5);
sensorValue_0 = sensorValue_0 / 8;
sensorValue_1 = sensorValue_1 / 8;
sensorValue_2 = sensorValue_2 / 8;
sensorValue_3 = sensorValue_3 / 8;
sensorValue_4 = sensorValue_4 / 8;
sensorValue_5 = sensorValue_5 / 8;
Serial.print(sensorValue_0);
Serial.print(" - ");
Serial.print(sensorValue_1);
Serial.print(" - ");
Serial.print(sensorValue_2);
Serial.print(" - ");
Serial.print(sensorValue_3);
Serial.print(" - ");
Serial.print(sensorValue_4);
Serial.print(" - ");
Serial.println(sensorValue_5);
delay(1);
}
ici les valeurs sont déjà réduite en 7 bits (plage de 0 à 127) avant d'être affichée, c'est la même méthode que celle utilisée dans ton code.
A quel genre de sauts de valeurs es-tu confronté?
Voilà avec ces deux programmes ça te permettra déjà de mieux apprécier d'où vient le problème.
[ Dernière édition du message le 27/01/2019 à 00:18:31 ]
- < Liste des sujets
- Charte