[Résolu] Contrôleur midi - débogage ?

Bonjour à tous !

Je suis actuellement en train de travailler sur un petit contrôleur midi. Ce n'est pas le premier ni le plus complexe que j'ai fait, mais aujourd'hui je bute sur un problème que je n'arrive pas à comprendre... et donc à résoudre. Je sens que le problème est tout bête et se situe entre l'écran et le clavier, mais après 3 jours à faire des tests, je crois que j'ai besoin d'aide :smiley:

Le projet :
Tout bêtement, un contrôleur midi qui envoie un message à l'ordinateur quand un bouton est appuyé / un potentiomètre tourné.
Je précise que j'utilise la bibliothèque Midi

Le montage actuel :
Deux interrupteurs (devant envoyer les notes on / note off Bb et B) et un potentiomètre (ControlChange 1). Une petite photo ici pour se rendre compte (on ne se moque pas c'est encore très moche, les boites seront refaite et le projet sans doutes en wireless)

Le problème :
Le premier bouton (broche n°5 de l'arduino devant envoyer la note Bb) ne fonctionne pas.

Les tests réalisés et les conclusions que j'en tire :
Si je branche le bouton fantôme sur la branche 6 (à la place de l'autre), ça fonctionne --> ce n'est donc pas un problème électrique sur le bouton (j'ai aussi vérifié la continuité du courant est c'est ok)
Si je supprime la vérification du potentiomètre, les deux boutons fonctionnent --> le problème viendrait donc du recours à cette fonction ?
Si je redescends le nombre de bouton (MAX_BOUTONS dans le code) à 1, il fonctionne à nouveau et je reçois ma note Bb --> moi ça ne m'aide pas mais si vous ça peut vous aider :wink:

Voilà de mon côté, je pense donc que le problème se situe dans ma fonction de potentiomètre, mais je ne vois pas vraiment où. Je vous post donc le code général puis celui du potar :

Le code général :

#include "TESTBOUTON.h"
#include "TESTPOT.h"

#define MAX_BOUTONS 2
#define MAX_POTS 1

int etatBouton[MAX_BOUTONS]; //Je crée le tableau de flags d'état de mes boutons
int pinBouton[MAX_BOUTONS];  //Je crée le Tableau des pin de branchement de mes boutons
int valPot[MAX_POTS];
int pinPot[MAX_POTS];

MIDI_CREATE_DEFAULT_INSTANCE();

void setup()
{
	//Initialisation MIDI
	MIDI.begin();

	//Initialisation des boutons
	for (int i = 0 ; i < MAX_BOUTONS ; i++) 
	{
		etatBouton[i] = LOW;  //J'initialise tous mes boutons en HIGH
		pinBouton[i] = 5+i;  //J'initialise toutes mes pin à partir de la broche 5
		pinMode(pinBouton[i], INPUT); //J'initialise toutes mes pins de bouton comme des entrées
	}
 
  //Initialisation des Potentiometres
	for (int i = 0 ; i < MAX_BOUTONS ; i++) 
	{
		pinPot[i] = A0+i;  //J'initialise toutes mes pins de potentiomètre à partir de la broche A0
		pinMode(pinBouton[i], INPUT); //J'initialise toutes mes pins de potentiomètre comme des entrées
	}
}



void loop()
{
	MIDI_CREATE_DEFAULT_INSTANCE();

	//je vérifie les boutons et j'envoie le message 
	for (int i = 0 ; i < MAX_BOUTONS ; i++)
	{
	    etatBouton[i] = testbouton(etatBouton[i], pinBouton[i], pitchB0b+i);
	}


//Je vérifie l'état des potentiomètres et j'envoie le message
	for (int i = 0; i < MAX_POTS; i++)
	{
		valPot[i] = testpot(valPot[i], pinPot[i], 1+i);
	}
	delay(7);
}

La fonction "testpot" :

#include "TESTPOT.h"

int testpot(int valPrecedentPot, int pinPot, int numCC)
{
	MIDI_CREATE_DEFAULT_INSTANCE();

	int valActuelPot = analogRead(pinPot) / 8;

	if (valPrecedentPot != valActuelPot)
	{
		MIDI.sendControlChange(numCC, valActuelPot, 5);
	}
	
	return valActuelPot;
}

J'ai bien lu tous les topics avant de poster mais comme c'est mon premier post depuis (hormis présentation), n'hésitez pas à me dire si j'ai fait une bêtise sur la forme (balise, topic, etc.), je modifierai ça au plus vite !

Bonjour,

Déjà pour l'initialisation des pots:
//Initialisation des Potentiometres
for (int i = 0 ; i < MAX_POTS ; i++)
au lieu de:
//Initialisation des Potentiometres
for (int i = 0 ; i < MAX_BOUTONS ; i++)

Je n'ai pas regardé le reste.

bilbo83:
Bonjour,

Déjà pour l'initialisation des pots:
//Initialisation des Potentiometres
for (int i = 0 ; i < MAX_POTS ; i++)
au lieu de:
//Initialisation des Potentiometres
for (int i = 0 ; i < MAX_BOUTONS ; i++)

Je n'ai pas regardé le reste.

Et bien du coup tu n'auras pas besoin de le faire parce que tout est résolu \o/.
La faute saute tellement aux yeux maintenant que tu me l'as dit que je me sens un peu bête... une journée de perdue pour une bonne leçon : ça m'apprendra à trop vouloir copier-coller !
Merci beaucoup pour ton aide !

PS : cela dit pour aller plus loin si quelqu'un à une minute : pourquoi le fait d'initialiser un potentiomètre (non branché du coup) en plus fait bugger le premier bouton ?

Il y a une deuxième coquille :

for (int i = 0 ; i < MAX_BOUTONS ; i++)
	{
		pinPot[i] = A0+i;  //J'initialise toutes mes pins de potentiomètre à partir de la broche A0
//              pinMode(pinBouton[i], INPUT); //J'initialise toutes mes pins de potentiomètre comme des entrées
	}

1: pinBouton à la place de pinPot
2: on ne configure pas une entrée analogique en INPUT, cela la transforme en entrée logique

Comme il s'agit de pinBouton cela n'a pas d'incidence, mais si tu écrivais

pinMode(pinPot[i], INPUT);

cela en aurait une.

pourquoi le fait d'initialiser un potentiomètre (non branché du coup) en plus fait bugger le premier bouton ?

Je pense que lorsque i vaut 1 la ligne

pinPot[i] = A0+i;

écrase la valeur de la variable située immédiatement après en mémoire.

@+

Merci pour toutes vos réponses ! Je passe en résolu :slight_smile: