DIY MIDI USB CONTROLEUR Project Arduino Uno Besoin d'aide
- 76 réponses
- 10 participants
- 13 093 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;
}
}
}
Mat Martigan
105
Posteur·euse AFfiné·e
Membre depuis 12 ans
41 Posté le 12/03/2019 à 17:51:44
J'ai remplacé l'instruction Midi.SendNote par l'instruction Midi.SendControlChange avec un changement de valeur de 0 > 127
le paramétrage de l'interface fonctionne mais ça ne fonctionne toujours pas comme un bouton on/off
J’appuie sur le bouton la valeur passe de 0 à 127 je relâche le bouton la valeur passe a 0
Je voudrai que lorsque j’appuie la valeur passe à 127 et reste à 127 et lorsque je rappuie la valeur passe a 0 est y reste
Bref un interrupteur on off
J'ai teste plusieurs modification du code mais sans résultat
le paramétrage de l'interface fonctionne mais ça ne fonctionne toujours pas comme un bouton on/off
J’appuie sur le bouton la valeur passe de 0 à 127 je relâche le bouton la valeur passe a 0
Je voudrai que lorsque j’appuie la valeur passe à 127 et reste à 127 et lorsque je rappuie la valeur passe a 0 est y reste
Bref un interrupteur on off
J'ai teste plusieurs modification du code mais sans résultat
void loop()
{
{
int sensorVal[] =
{
!digitalRead(2), !digitalRead(3),
!digitalRead(4), !digitalRead(5),
!digitalRead(6), !digitalRead(7),
!digitalRead(8), !digitalRead(9),
};
for (int j = 0; j < 8; j++)
{
if (sensorVal [j] != mem [j])
{
mem [j] = sensorVal [j];
if (mem[j])
{
MIDI.sendControlChange(j + 48, 0, 1);
}
else
{
MIDI.sendControlChange(j + 48, 127, 1);
}
}
}
}
Anonyme
1096
42 Posté le 12/03/2019 à 18:25:54
Resalut.
Un début de réponse rapide: Il faut utiliser une variable binaire (boolean) qui change d'état (0 ou 1) à chaque fois que tu appuies sur le switch.
Cependant tu remarqueras que ça génère des rebonds au moment du contact: le switch peut générer une série d'impulsion quand tu appuies dessus.
Il faut trouver une parade soit électronique (condensateur) soit logicielle ( quand il y a contact on ne prend plus en considération les quelques millisecondes suivantes).
Voilà.
Un début de réponse rapide: Il faut utiliser une variable binaire (boolean) qui change d'état (0 ou 1) à chaque fois que tu appuies sur le switch.
Cependant tu remarqueras que ça génère des rebonds au moment du contact: le switch peut générer une série d'impulsion quand tu appuies dessus.
Il faut trouver une parade soit électronique (condensateur) soit logicielle ( quand il y a contact on ne prend plus en considération les quelques millisecondes suivantes).
Voilà.
Beatless
13649
Drogué·e à l’AFéine
Membre depuis 20 ans
43 Posté le 12/03/2019 à 22:23:26
Pour la gestion de l'anti-rebond (debounce) regarde par ici:
https://www.arduino.cc/en/Tutorial/Debounce
Et pour la gestion du ON/OFF maintenu (toogle) regarde là:
https://forum.arduino.cc/index.php?PHPSESSID=cenh49nq8m4jl924hh75bgguh0&topic=58284.0
https://www.arduino.cc/en/Tutorial/Debounce
Et pour la gestion du ON/OFF maintenu (toogle) regarde là:
https://forum.arduino.cc/index.php?PHPSESSID=cenh49nq8m4jl924hh75bgguh0&topic=58284.0
S'il n'y a pas de solution, c'est qu'il n'y a pas de problème.
[ Dernière édition du message le 12/03/2019 à 22:24:05 ]
Mat Martigan
105
Posteur·euse AFfiné·e
Membre depuis 12 ans
44 Posté le 13/03/2019 à 16:31:16
Bonjour
En cherchant j'ai trouvé une autre Méthode que j'ai trouvé sur le forum d’Arduino puisqu'un membre avait l'intention de faire la même chose que moi
https://forum.arduino.cc/index.php?topic=385843.0
méthode qui consiste a utiliser 3 changements d'état pour les boutons (toggle)
J'ai donc adapté cette méthode a mon programme
C'est un peu lourd je trouve car il faut générer le code et les changements d’État pour chaque bouton
Je pense qu'il est possible de faire un tableau
L'avantage est que ça marche impeccable comme ça
Comme un interrupteur on/off
En cherchant j'ai trouvé une autre Méthode que j'ai trouvé sur le forum d’Arduino puisqu'un membre avait l'intention de faire la même chose que moi
https://forum.arduino.cc/index.php?topic=385843.0
méthode qui consiste a utiliser 3 changements d'état pour les boutons (toggle)
J'ai donc adapté cette méthode a mon programme
C'est un peu lourd je trouve car il faut générer le code et les changements d’État pour chaque bouton
Je pense qu'il est possible de faire un tableau
L'avantage est que ça marche impeccable comme ça
Comme un interrupteur on/off
#include <MIDI.h> // INlcude MIDI library
const int buttonPin = 2 ;
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;
int buttonState = 0;
int buttonState2 = 0;
int buttonState3 = 0;
int buttonState4 = 0;
int buttonState5 = 0;
int buttonState6 = 0;
int buttonState7 = 0;
int buttonState8 = 0;
int lastButtonState = 0;
int lastButtonState2 = 0;
int lastButtonState3 = 0;
int lastButtonState4 = 0;
int lastButtonState5 = 0;
int lastButtonState6 = 0;
int lastButtonState7 = 0;
int lastButtonState8 = 0;
int toggleState = 0;
int toggleState2 = 0;
int toggleState3 = 0;
int toggleState4 = 0;
int toggleState5 = 0;
int toggleState6 = 0;
int toggleState7 = 0;
int toggleState8 = 0;
void setup()
{
Serial.begin(9600); // default midi speed rate
pinMode(2, INPUT_PULLUP); // initialize the pushbutton pin as an input:
pinMode(3, INPUT_PULLUP);
pinMode(4,INPUT_PULLUP);
pinMode(5, INPUT_PULLUP);
pinMode(6,INPUT_PULLUP);
pinMode(7, INPUT_PULLUP);
pinMode(8, INPUT_PULLUP);
pinMode(9, INPUT_PULLUP);
MIDI.begin();
}
static int iAn0Val, iAn1Val, iAn2Val, iAn3Val, iAn4Val, iAn5Val;
void loop()
{
//BUTTON 01
{
buttonState = digitalRead(buttonPin);
if(buttonState != lastButtonState && buttonState == 1 && toggleState == 0) {
MIDI.sendControlChange(51, 127, 1);
toggleState = 1;
}
else if(buttonState != lastButtonState && buttonState == 1 && toggleState == 1) {
MIDI.sendControlChange(51,0, 1);
toggleState = 0;
}
lastButtonState = buttonState;
}
/BUTTON 02
{
buttonState2 = digitalRead(buttonPin2);
if(buttonState2 != lastButtonState2 && buttonState2 == 1 && toggleState2 == 0) {
MIDI.sendControlChange(52, 127, 1);
toggleState2 = 1;
}
else if(buttonState2 != lastButtonState2 && buttonState2 == 1 && toggleState2 == 1) {
MIDI.sendControlChange(52, 0, 1);
toggleState2 = 0;
}
lastButtonState2 = buttonState2;
}
//BUTTON 03
{
buttonState3 = digitalRead(buttonPin3);
if(buttonState3 != lastButtonState3 && buttonState3 == 1 && toggleState3 == 0) {
MIDI.sendControlChange(53, 127, 1);
toggleState3 = 1;
}
else if(buttonState3 != lastButtonState3 && buttonState3 == 1 && toggleState3 == 1) {
MIDI.sendControlChange(53, 0, 1);
toggleState3 = 0;
}
lastButtonState3 = buttonState3;
}
//BUTTON 04
{
buttonState4 = digitalRead(buttonPin4);
if(buttonState4 != lastButtonState4 && buttonState4 == 1 && toggleState4 == 0) {
MIDI.sendControlChange(54, 127, 1);
toggleState4 = 1;
}
else if(buttonState4 != lastButtonState4 && buttonState4 == 1 && toggleState4 == 1) {
MIDI.sendControlChange(54, 0, 1);
toggleState4 = 0;
}
lastButtonState4 = buttonState4;
}
//BUTTON 05
{
buttonState5 = digitalRead(buttonPin5);
if(buttonState5 != lastButtonState5 && buttonState5 == 1 && toggleState5 == 0) {
MIDI.sendControlChange(55, 127, 1);
toggleState5 = 1;
}
else if(buttonState5 != lastButtonState5 && buttonState5 == 1 && toggleState5 == 1) {
MIDI.sendControlChange(55, 0, 1);
toggleState5 = 0;
}
lastButtonState5 = buttonState5;
}
//BUTTON 06
{
buttonState6 = digitalRead(buttonPin6);
if(buttonState6 != lastButtonState6 && buttonState6 == 1 && toggleState6 == 0) {
MIDI.sendControlChange(56, 127, 1);
toggleState6 = 1;
}
else if(buttonState6 != lastButtonState6 && buttonState6 == 1 && toggleState6 == 1) {
MIDI.sendControlChange(56, 0, 1);
toggleState6 = 0;
}
lastButtonState6 = buttonState6;
}
//BUTTON 07
{
buttonState7 = digitalRead(buttonPin7);
if(buttonState7 != lastButtonState7 && buttonState7 == 1 && toggleState7 == 0) {
MIDI.sendControlChange(57, 127, 1);
toggleState7 = 1;
}
else if(buttonState7 != lastButtonState7 && buttonState7 == 1 && toggleState7 == 1) {
MIDI.sendControlChange(57, 0, 1);
toggleState7 = 0;
}
lastButtonState7 = buttonState7;
}
//BUTTON 08
{
buttonState8 = digitalRead(buttonPin8);
if(buttonState8 != lastButtonState8 && buttonState8 == 1 && toggleState8 == 0) {
MIDI.sendControlChange(58, 127, 1);
toggleState8 = 1;
}
else if(buttonState8 != lastButtonState8 && buttonState8 == 1 && toggleState8 == 1) {
MIDI.sendControlChange(58, 0, 1);
toggleState8 = 0;
}
lastButtonState8 = buttonState8;
}
Mat Martigan
105
Posteur·euse AFfiné·e
Membre depuis 12 ans
45 Posté le 09/06/2019 à 23:04:23
Bonsoir a tous a toute me revoilou
Mon premier "prototype" est fini et tout fonctionne a merveille
Mais comme je suis du genre à vouloir faire simple je compte effectuer des upgrades
en y a ajoutant un cercle de led (Neopixel) sur chaque potentiomètre
Pour commencer j'ai effectue les test avec 2 Potentiomètres et 2 cercles de 12 leds connectes sur une ARDUINO UNO REV3 La transmission midi etait ok lors de la rotation des potentiomètres avec cercle de led
Je posterai par la suite un schema de la connectique sur L'arduino Mega 2650
Comme vous pouvez le constater cela fonctionne en partie :
En partie Car je me trouve confronter a un problème au niveau de l'envoie du midi
Je m'explique lors de la rotation d'un potentiomètre
a partir d'un certain nombre de led qui s'allume l'envoi midi (TX) s'emballe et ce n'est plus stable
lorsque que j'atteins ce seuil de led dans l'autre sens ça se stabilise a nouveau plus de transmission aléatoire
Ce problème semble être lié au cercle de 24 Leds ça s'emballe à partir de 12 Led
Voici le programme que j'utilise pour un cercle de led et un potentiomètre
Ne serait t'il pas judicieux de mettre plutôt des potentiomètres a double résistance afin de bénéficier de sortie analogique séparé (une pour les cercles de led et une autre pour le midi)?
Mon premier "prototype" est fini et tout fonctionne a merveille
Mais comme je suis du genre à vouloir faire simple je compte effectuer des upgrades
en y a ajoutant un cercle de led (Neopixel) sur chaque potentiomètre
Pour commencer j'ai effectue les test avec 2 Potentiomètres et 2 cercles de 12 leds connectes sur une ARDUINO UNO REV3 La transmission midi etait ok lors de la rotation des potentiomètres avec cercle de led
Je posterai par la suite un schema de la connectique sur L'arduino Mega 2650
Comme vous pouvez le constater cela fonctionne en partie :
En partie Car je me trouve confronter a un problème au niveau de l'envoie du midi
Je m'explique lors de la rotation d'un potentiomètre
a partir d'un certain nombre de led qui s'allume l'envoi midi (TX) s'emballe et ce n'est plus stable
lorsque que j'atteins ce seuil de led dans l'autre sens ça se stabilise a nouveau plus de transmission aléatoire
Ce problème semble être lié au cercle de 24 Leds ça s'emballe à partir de 12 Led
Voici le programme que j'utilise pour un cercle de led et un potentiomètre
// Read analog potentiometer on Circuit Playground Express or other board with changes
// released under the GPLv3 license to match the rest of the AdaFruit NeoPixel library
#include <MIDI.h> // INlcude MIDI library
#include <Adafruit_NeoPixel.h>
#ifdef __AVR__
#include <avr/power.h>
#endif
// Which pin on the microcontroller board is connected to the NeoPixels?
#define PIN 40 // 12 For Circuit Playground Express
// How many NeoPixels are attached to the board?
#define NUMPIXELS 24
// When we setup the NeoPixel library, we tell it how many pixels, and which pin to use to send signals.
// Note that for older NeoPixel strips you might need to change the third parameter--see the strandtest
// example for more information on possible values.
Adafruit_NeoPixel pixels = Adafruit_NeoPixel(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);
int delayval = 5; // delay for half a second
int brightness = 200;
const int buttonPin = 2 ;
int buttonState = 0;
int lastButtonState = 0;
int toggleState = 0;
// the number of the pushbutton pin
const int ledPin = 10; // the number of the LED pin
static int iAn0Val ;
void setup()
{
Serial.begin(9600);
pinMode(2, INPUT_PULLUP);
pinMode(ledPin, OUTPUT);
pixels.begin(); // This initializes the NeoPixel library.
pixels.setBrightness(brightness);
MIDI.begin();
}
void loop()
{
static int iAn0ValPrev;
iAn0ValPrev = 0 ;
iAn0ValPrev = iAn0Val ;
iAn0Val = analogRead(A0);
if (abs (iAn0Val - iAn0ValPrev)>3)
analogPinMidiTX(1,iAn0Val,iAn0ValPrev); //TX value
delay(10);
ring1();
button();
}
void button ()
{
{
buttonState = digitalRead(buttonPin);
if(buttonState != lastButtonState && buttonState == 1 && toggleState == 0)
{
digitalWrite(ledPin,HIGH);
MIDI.sendControlChange(51, 127, 1);
toggleState = 1;
}
else if(buttonState != lastButtonState && buttonState == 1 && toggleState == 1)
{
digitalWrite(ledPin, LOW);
MIDI.sendControlChange(51,0, 1);
toggleState = 0;
}
lastButtonState = buttonState;
}
}
void ring1 ()
{
int i; // loop variable
int value; // analog read of potentiometer
int display_value; // number of NeoPixels to display out of NUMPIXELS
// Read PIN value and scale from 0 to NUMPIXELS -1
value = analogRead(A0);
display_value = int(value * NUMPIXELS / 1023);
// For a set of NeoPixels the first NeoPixel is 0, second is 1, all the way up to the count of pixels minus one
for(i=0; i<display_value; i++)
{
// pixels.Color takes RGB values, from 0,0,0 up to 255,255,255
pixels.setPixelColor(i, 050, 050, 050); // Moderately bright green color
}
for(i=display_value; i<NUMPIXELS; i++)
{
pixels.setPixelColor(i, 0, 0, 0); // turn off all pixels after value displayed
}
//int value = analogRead(A0); // read brightness pot
value = map(value, 0, 1023, 1, 200); //sets brightRead to a value between 1 and 100
if (brightness != value)
{ // only update brightness if changed
brightness = value;
pixels.setBrightness(brightness);
}
pixels.show(); // This sends the updated pixel color to the hardware.
delay(delayval); // Delay for a period of time (in milliseconds).
}
void analogPinMidiTX(int iChan, int iVal, int iValPrev)
{
// TX Value only if it has changed
if(iValPrev != iVal)
{
iValPrev != iVal ;
iVal = iVal >> 3 ;
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);
}
Ne serait t'il pas judicieux de mettre plutôt des potentiomètres a double résistance afin de bénéficier de sortie analogique séparé (une pour les cercles de led et une autre pour le midi)?
[ Dernière édition du message le 10/06/2019 à 09:17:25 ]
Anonyme
1096
46 Posté le 10/06/2019 à 00:35:49
Bravo!! c'est chouette!
Vu l'heure je n'ai pas trop la tête à me remettre dans le code mais pour répondre simplement à ta question: non il n'y a pas de raison d'utiliser un potentiomètre stéréo.
Vu l'heure je n'ai pas trop la tête à me remettre dans le code mais pour répondre simplement à ta question: non il n'y a pas de raison d'utiliser un potentiomètre stéréo.
[ Dernière édition du message le 10/06/2019 à 00:36:12 ]
Anonyme
1096
47 Posté le 10/06/2019 à 08:01:45
Bon , MM tu n'as pas pu tester le code que tu as posté pour la simple raison qu'il ne peut pas être compilé.
Il manque au moins un ";" en fin de ligne 31: static int iAn0Val. C'est pas moi qui pinaille c'est le compilateur!
Depuis le début tu manques de rigueur, ton schéma du début de discussion m'a laissé un certain souvenir..
Stp fais attention, il est difficile de faire la différence entre erreurs de programmation et les problèmes d'étourderie lors des copies!
Fourni nous un code propre et on en reparle!
Il manque au moins un ";" en fin de ligne 31: static int iAn0Val. C'est pas moi qui pinaille c'est le compilateur!
Depuis le début tu manques de rigueur, ton schéma du début de discussion m'a laissé un certain souvenir..
Stp fais attention, il est difficile de faire la différence entre erreurs de programmation et les problèmes d'étourderie lors des copies!
Fourni nous un code propre et on en reparle!
[ Dernière édition du message le 10/06/2019 à 08:05:26 ]
Mat Martigan
105
Posteur·euse AFfiné·e
Membre depuis 12 ans
48 Posté le 11/06/2019 à 13:55:46
Ci Apres un schéma de câblage pour 1 cercle de led et un potentiomètre ainsi qu'un bouton on/off
Apres d'autres essais une info midi (TX) est transmise des lors que je dépasse la moitie de la valeur du potentiomètre
Ca deconne a partir de +5v au niveau de l'activation des led j'entends
Lorsque je debranche le cercle de led l'info midi est transmise sur la totalite de la course du potentiomtre
Apres d'autres essais une info midi (TX) est transmise des lors que je dépasse la moitie de la valeur du potentiomètre
Ca deconne a partir de +5v au niveau de l'activation des led j'entends
Lorsque je debranche le cercle de led l'info midi est transmise sur la totalite de la course du potentiomtre
Mat Martigan
105
Posteur·euse AFfiné·e
Membre depuis 12 ans
49 Posté le 11/06/2019 à 14:47:51
// Read analog potentiometer on Circuit Playground Express or other board with changes
#include <MIDI.h> // INlcude MIDI library
#include <Adafruit_NeoPixel.h>
#ifdef __AVR__
#include <avr/power.h>
#endif
// Which pin on the microcontroller board is connected to the NeoPixels?
#define PIN 40 // For Circuit Playground Express
// How many NeoPixels are attached to the board?
#define NUMPIXELS 24
// When we setup the NeoPixel library, we tell it how many pixels, and which pin to use to send signals.
// Note that for older NeoPixel strips you might need to change the third parameter--see the strandtest
// example for more information on possible values.
Adafruit_NeoPixel pixels = Adafruit_NeoPixel(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);
int delayval = 10; // delay for half a second
int brightness = 200;
const int buttonPin = 2 ;
int buttonState = 0;
int lastButtonState = 0;
int toggleState = 0;
// the number of the pushbutton pin
const int ledPin = 10; // the number of the LED pin
static int iAn0Val, iAn1Val, iAn2Val, iAn3Val, iAn4Val, iAn5Val ;
void setup()
{
Serial.begin(9600);
pinMode(2, INPUT_PULLUP);
pinMode(ledPin, OUTPUT);
pixels.begin(); // This initializes the NeoPixel library.
MIDI.begin();
}
void loop()
{
rotary ();
ring1();
button();
}
void rotary ()
{
static int iAn0ValPrev;
iAn0ValPrev = 0 ;
iAn0ValPrev = iAn0Val ; // previous value
iAn0Val = analogRead(A0);
if (abs (iAn0Val - iAn0ValPrev)>3)
analogPinMidiTX(1,iAn0Val,iAn0ValPrev); //TX value
delay(10);
}
void button ()
{
// PAD 1
{
buttonState = digitalRead(buttonPin);
if(buttonState != lastButtonState && buttonState == 1 && toggleState == 0)
{
digitalWrite(ledPin,HIGH);
MIDI.sendControlChange(51, 127, 1);
toggleState = 1;
}
else if(buttonState != lastButtonState && buttonState == 1 && toggleState == 1)
{
digitalWrite(ledPin, LOW);
MIDI.sendControlChange(51,0, 1);
toggleState = 0;
}
lastButtonState = buttonState;
}
}
void ring1 ()
{
int i; // loop variable
int value ; // analog read of potentiometer
int display_value; // number of NeoPixels to display out of NUMPIXELS
value = analogRead(A0);
// Read PIN value and scale from 0 to NUMPIXELS -1
display_value = int( value * NUMPIXELS / 1023);
// For a set of NeoPixels the first NeoPixel is 0, second is 1, all the way up to the count of pixels minus one
for(i=0; i<display_value; i++)
{
// pixels.Color takes RGB values, from 0,0,0 up to 255,255,255
pixels.setPixelColor(i, 050, 050, 050); // Moderately bright green color
}
for(i=display_value; i<NUMPIXELS; i++)
{
pixels.setPixelColor(i, 0, 0, 0); // turn off all pixels after value displayed
}
value = map(value, 0, 1023, 1, 200); //sets brightRead to a value between 1 and 100
if (brightness != value)
{ // only update brightness if changed
brightness = value;
pixels.setBrightness(brightness);
}
pixels.show(); // This sends the updated pixel color to the hardware.
delay(delayval); // Delay for a period of time (in milliseconds).
}
void analogPinMidiTX(int iChan, int iVal, int iValPrev)
{
// TX Value only if it has changed
if(iValPrev != iVal)
{
iValPrev != iVal ;
iVal = iVal >> 3 ;
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);
}
Anonyme
1096
50 Posté le 11/06/2019 à 18:22:44
Citation de Mat :
Ci Apres un schéma de câblage pour 1 cercle de led et un potentiomètre ainsi qu'un bouton on/off
Apres d'autres essais une info midi (TX) est transmise des lors que je dépasse la moitie de la valeur du potentiomètre
Ca deconne a partir de +5v au niveau de l'activation des led j'entends
Lorsque je debranche le cercle de led l'info midi est transmise sur la totalite de la course du potentiomtre
Hummmmm, les choses ne sont pas aussi claires pour moi qu'elles le semblent pour toi.
En particulier: "Ca deconne a partir de +5v au niveau de l'activation des led j'entends" euh..mais justement 5V c'est la tension maximale avec laquelle tu peux travailler sur les entrées arduino. Comment se fait-il que tu veux dépasser 5Volts?
Donc en résumé et si je comprends bien le simple fait de connecter le néopixel fait planter ton programme.
Naturellement j'en viens à réfléchir à un problème purement électronique.
Et c'est là que je réalise que tu as 24 leds sur ton ring et que c'est sensé consommer pas mal.
Tu alimentes uniquement par USB ou tu as tenté de rajouter une alim externe sur l'arduino? ... ça risque de faire la différence.
[ Dernière édition du message le 11/06/2019 à 18:23:24 ]
- < Liste des sujets
- Charte