DIY MIDI USB CONTROLEUR Project Arduino Uno Besoin d'aide
- 76 réponses
- 10 participants
- 13 188 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;
}
}
}
static volatile
1793
AFicionado·a
Membre depuis 7 ans
11 Posté le 27/01/2019 à 08:23:31
Le sujet est intéressant, mais s'il vous plait, postez le code convenablement, en l’état c'est tout bonnement illisible.
Il y a des balises [ code ] et [ /code ] (enlever les espaces pour que ça fonctionne) qui servent a ça:
Ceci, avec en sus une indentation correcte, augmentera énormément les chances que d'autres viennent donner un coup de main.
Merci d'avance.
Il y a des balises [ code ] et [ /code ] (enlever les espaces pour que ça fonctionne) qui servent a ça:
int main(int argc, char **argv)
{
(void)argc, (void)argv;
int err;
init();
for (;[img alt=";)"]https://static.audiofanzine.com/images/audiofanzine/interface/smileys/icon_wink.gif[/img] {
err = do_work();
if (err) {
return -1;
}
}
return 0;
}
Ceci, avec en sus une indentation correcte, augmentera énormément les chances que d'autres viennent donner un coup de main.
Merci d'avance.
Resistance is not futile... it's voltage divided by current
[ Dernière édition du message le 27/01/2019 à 08:26:26 ]
Anonyme
12 Posté le 27/01/2019 à 11:07:22
Je suppose que ta carte arduino est bien celle du dessin, à savoir une UNO rev 3, et pas autre chose comme par exemple une NANO. C'est juste pour être sur que tout le monde parle de la même chose.
Au passage ton programmateur attaque l'Atmega328, pas le 16U2 qui ne sert que de passerelle (traducteur) entre ton ordi et l'Atmega328, via une connexion USB (mais on avait tous corrigé )
Les spec de la carte t'indiquent une conso absolue Imax de 200mA pour le 5V (c'est le petit régulateur intégré sur la carte).
Or, l'Atmega consomme quelques mA (une dizaine je crois) de ce même 5V, et tes leds pompent aussi 8x23mA, soit 184mA.
La dessus, tu rajoutes tes potards de 10K qui sont reliés d'un coté à la masse, et de l'autre toujours au +5V.
Dans le meilleur des cas, chacun d'eux pompe 500µA (ce qui est acceptable)...
... ou met le 5V en cours-jus via l'entrée analo selon l'état réel de l'Atmega à cet instant (5V à genoux, état des pinouilles non défini pour différentes raisons, etc...)
Pas glop
Chaque switch à lui aussi besoin d'un peu de courant pour donner son état.
Donc (environ 10) + 184 + 3 + quelques pouillèmes = limite Imax (pour les conséquences, voir plus haut)
Avant de toucher le code, cela veux dire que l'Atmega est certainement déjà très perturbé, sa propre alimentation n'étant pas assurée non plus, et il lit 6 valeurs (pattes milieu de tes potards) qui fluctuent en fonction de la stabilité du 5V fournit... il te donne donc n'importe quoi
Ok, ce fut long, mais voici le résumé :
D'après ton image de la carte, c'est à droite, la 3ème à partir du haut.
@ suivre...
Au passage ton programmateur attaque l'Atmega328, pas le 16U2 qui ne sert que de passerelle (traducteur) entre ton ordi et l'Atmega328, via une connexion USB (mais on avait tous corrigé )
Les spec de la carte t'indiquent une conso absolue Imax de 200mA pour le 5V (c'est le petit régulateur intégré sur la carte).
Or, l'Atmega consomme quelques mA (une dizaine je crois) de ce même 5V, et tes leds pompent aussi 8x23mA, soit 184mA.
La dessus, tu rajoutes tes potards de 10K qui sont reliés d'un coté à la masse, et de l'autre toujours au +5V.
Dans le meilleur des cas, chacun d'eux pompe 500µA (ce qui est acceptable)...
... ou met le 5V en cours-jus via l'entrée analo selon l'état réel de l'Atmega à cet instant (5V à genoux, état des pinouilles non défini pour différentes raisons, etc...)
Pas glop
Chaque switch à lui aussi besoin d'un peu de courant pour donner son état.
Donc (environ 10) + 184 + 3 + quelques pouillèmes = limite Imax (pour les conséquences, voir plus haut)
Avant de toucher le code, cela veux dire que l'Atmega est certainement déjà très perturbé, sa propre alimentation n'étant pas assurée non plus, et il lit 6 valeurs (pattes milieu de tes potards) qui fluctuent en fonction de la stabilité du 5V fournit... il te donne donc n'importe quoi
Ok, ce fut long, mais voici le résumé :
- Je préconise de débrancher tes leds qui font jouli-jouli et tu t'en occuperas plus tard, ce n'est pas le plus important.
- Je suis d'accord avec King C pour virer les résistances de rappel et utiliser la commande "INPUT_PULLUP"
- Je suis d'accord aussi avec aaB pour l'utilisation des balises [ code ] et [ /code ], c'est vachement plus lisible.
- Je te propose d'utiliser une résistance "talon" entre le coté "-" de tes potards et la masse de l'alim.
- Enfin (pour le moment), ce même point doit être relié à la patte "Aref" de ta carte (voir image ci après)
D'après ton image de la carte, c'est à droite, la 3ème à partir du haut.
@ suivre...
Mat Martigan
105
Posteur·euse AFfiné·e
Membre depuis 12 ans
13 Posté le 28/01/2019 à 11:01:17
Citation :
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?
Effectivement j'ai récupéré le programme en essayant de le comprendre
c'est l'occasion également de me remettre dans la programmation en C qui n'a jamais été ma tasse de thé je l'avoue
Mon bts électronique date un peu malheureusement
Merci en tous pour vos explications qui sont très limpide
J'ai effectué le test de KING C
Citation :
Ce programme te permettra de checker tout tes potentiomètres en même temps.
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);
}
il y a un potentiomètre ou les variations sont tres importantes et aléatoire
Pour les autres lorsque je les fait varier la valeur du moniteur varie proprement de 0 a 1023 et lorsque j’arrête de les tourner la valeur varie de +/- 1
Citation :
Je suppose que ta carte arduino est bien celle du dessin, à savoir une UNO rev 3
La carte est bien une arduino uno Rev Officielle
Citation :
Je préconise de débrancher tes leds qui font jouli-jouli et tu t'en occuperas plus tard, ce n'est pas le plus important.
Mes tests ce font uniquement sur les potentiomètres
[ Dernière édition du message le 28/01/2019 à 11:02:44 ]
Anonyme
1096
14 Posté le 28/01/2019 à 17:52:21
Citation de Mat :
il y a un potentiomètre ou les variations sont tres importantes et aléatoires.
Pour les autres lorsque je les fait varier la valeur du moniteur varie proprement de 0 a 1023 et lorsque j’arrête de les tourner la valeur varie de +/-
Voilà donc le premier problème à résoudre avant de pinailler sur le code, il peut y avoir 3 raisons:
- un fader mort
- tes connexions ne sont pas nickels (soudures?)
- une des entrées analogiques de l'arduino est morte (pour moi c'est moins probable)
Bref que des choses auxquelles on a pas accès derrière l'écran de l'ordinateur... la balle est un peu dans ton camp MM...
Sinon tu as un multimètre sous la main ?
Avec ton montage/PCB peux-tu intervertir les entrées analogiques de l'Arduino? Ca permettra déjà de checker que le problème ne vient pas de l'entrée analogique.
[ Dernière édition du message le 28/01/2019 à 18:41:18 ]
Mat Martigan
105
Posteur·euse AFfiné·e
Membre depuis 12 ans
15 Posté le 30/01/2019 à 16:55:39
- j'ai repris toutes mes soudures ( la continuité n’était pas très franche au niveau des connectiques, pauvre de moi ) =>ok
- J'ai ensuite testé les potentiomètres avec un multimetre (pour vérifier que les masses sont bien toutes au même endroit) => ok
- J'ai testé aussi leur résistance et la déjà 2 potentiomètres sont bien en dessous de 10khom en position max
Par la suite j'ai connecté séparément chaque potentiomètres sur un plaque de test en les reperants minutieusement
En démarrant le test on voit bien effectivement que de potentiomètres ne fonctionne pas ou de manière tres aleatoire
1 ne varie pas du tout et l'autre varie en restant bloque sur une plage
Lorsque je swap ces 2 potentiomètres sur les entres analogiques la panne se deplace
Il y a bien donc 2 potentiomètres HS
J'en ai commandés des nouveaux je dois les recevoir sous peu
a suivre...
- J'ai ensuite testé les potentiomètres avec un multimetre (pour vérifier que les masses sont bien toutes au même endroit) => ok
- J'ai testé aussi leur résistance et la déjà 2 potentiomètres sont bien en dessous de 10khom en position max
Par la suite j'ai connecté séparément chaque potentiomètres sur un plaque de test en les reperants minutieusement
En démarrant le test on voit bien effectivement que de potentiomètres ne fonctionne pas ou de manière tres aleatoire
1 ne varie pas du tout et l'autre varie en restant bloque sur une plage
Lorsque je swap ces 2 potentiomètres sur les entres analogiques la panne se deplace
Il y a bien donc 2 potentiomètres HS
J'en ai commandés des nouveaux je dois les recevoir sous peu
a suivre...
Mat Martigan
105
Posteur·euse AFfiné·e
Membre depuis 12 ans
16 Posté le 31/01/2019 à 16:25:06
Par contre j'ai testé avec le programme avec les 4 potentiomètres qui sont stables
C'est la galère pour assigner les potentiomètres dans le daw car j'ai un transmission très aléatoire (la led TX clignote)
m’empêchant d'assigner un autre potentiomètres convenablement par la suite
Une fois assigné la course du potentiomètre est très rapide (comparé a la variation lors du test)
Les valeurs bouge toutes seules sans rien toucher un fois que j'arrive à assigner
C'est la galère pour assigner les potentiomètres dans le daw car j'ai un transmission très aléatoire (la led TX clignote)
m’empêchant d'assigner un autre potentiomètres convenablement par la suite
Une fois assigné la course du potentiomètre est très rapide (comparé a la variation lors du test)
Les valeurs bouge toutes seules sans rien toucher un fois que j'arrive à assigner
Anonyme
1096
17 Posté le 31/01/2019 à 19:24:14
Ok.
...euh mais tu utilises le code original sans avoir virer les lignes concernant les deux potards en question?
Si c'est le cas il faut virer les lignes qui correspondent aux deux entrées analogiques détachées...
... ou encore relier ces 2 entrées à la masse pour éviter qu'elles soient flottantes. (Par rapport à ton application il n'y a rien de pire que d'essayer de lire des entrées analogiques flottantes)
Sinon on mettra un plan d'action au point.
Sinon quand tu dis que la course est très rapide, concrètement ça veut dire quoi ?? Es-tu certain qu'il s'agit de potentiomètres linéaires et non logarithmiques? C'est sur ce point qu'un utilisateur parlait de références "dyslexiques" sur le site du fournisseur.
...euh mais tu utilises le code original sans avoir virer les lignes concernant les deux potards en question?
Si c'est le cas il faut virer les lignes qui correspondent aux deux entrées analogiques détachées...
... ou encore relier ces 2 entrées à la masse pour éviter qu'elles soient flottantes. (Par rapport à ton application il n'y a rien de pire que d'essayer de lire des entrées analogiques flottantes)
Sinon on mettra un plan d'action au point.
Sinon quand tu dis que la course est très rapide, concrètement ça veut dire quoi ?? Es-tu certain qu'il s'agit de potentiomètres linéaires et non logarithmiques? C'est sur ce point qu'un utilisateur parlait de références "dyslexiques" sur le site du fournisseur.
[ Dernière édition du message le 31/01/2019 à 19:50:33 ]
Beatless
13738
Drogué·e à l’AFéine
Membre depuis 20 ans
18 Posté le 31/01/2019 à 22:59:10
Citation :
Les valeurs bougent toutes seules sans rien toucher un fois que j'arrive à assigner
Il faut définir une tolérance, un écart. Et quand celui-ci est atteint ou dépassé tu peux alors traiter avec ta nouvelle valeur et l'utiliser (assigner).
Demain je te colle un bout de code si tu veux.
S'il n'y a pas de solution, c'est qu'il n'y a pas de problème.
Mat Martigan
105
Posteur·euse AFfiné·e
Membre depuis 12 ans
19 Posté le 01/02/2019 à 09:04:56
Citation :
euh mais tu utilises le code original sans avoir virer les lignes concernant les deux potards en question?
J'ai bien retiré les 2 potentiomètres du code
Citation :
Sinon quand tu dis que la course est très rapide, concrètement ça veut dire quoi ??
Je veux dire par la que lorsque je fais le test des potentiomètres avec le programme "test"
les valeurs varient de façon linéaire de 0 à 127 ou 0 a 1023 (selon le programme utilisé) c'est tres propre
Des lors que j’affecte un potentiomètre a une fonction en midi (quand j'y arrive) la variation est très rapide
comme si je passai directement de 0 a 127 en tournant le potentiomètre
Citation :
Il faut définir une tolérance, un écart
C'est la methode qui est utilsé par King C dans son programme ?
C'est ce qu'on a appelle un Hystersis il me semble
static volatile
1793
AFicionado·a
Membre depuis 7 ans
20 Posté le 01/02/2019 à 11:00:37
Citation de Mat :
Citation :Il faut définir une tolérance, un écart
C'est la methode qui est utilsé par King C dans son programme ?
C'est ce qu'on a appelle un Hystersis il me semble
Ça n'est pas ce que King C fait, mais tu peux effectivement utiliser un seuil de variation en dessous duquel tu considères que le potentiomètre ne bouge pas.
Une autre technique consisterait à faire un filtre passe-bas rudimentaire (mais largement suffisant pour cette application).
Cela consiste tout simplement à travailler non pas avec la valeur instantanée mais avec sa moyenne sur un certain nombre d'échantillons.
Tu stockes la valeur de l'ADC dans un buffer (un tableau de taille N) et tu utilises la moyenne arithmétique du buffer (la somme de toutes les valeurs divisée par N) pour générer ton CC.
Il te faudra trouver un moyen pour rendre ton buffer circulaire, c'est à dire que chaque nouvelle valeur devra venir remplacer la valeur la plus ancienne déjà stockée.
Bien sûr, pour ne pas surcharger le bus, c'est une bonne idée de faire ce que King C fait au post 5: ne générer un message CC que si la valeur (en sortie du filtre si tu prends cette route) a changé.
Resistance is not futile... it's voltage divided by current
- < Liste des sujets
- Charte