Besoin d'aide pour contrôleur MIDI à base d'Arduino.

Bonjour,

le schéma est correct, voire assez logique car il y a d'autres solutions. Note que tu peux diriger les sorties des multiplexeurs des boutons vers des entrées logiques

aussi, si tu te limites à 16 entrées analogiques, tu peux utiliser un arduino méga (un clone c'est donné ...), les multiplexeurs sont dans la puce, pour te simplifier grandement la vie

DGM13:
Comme ceci ?

Oui

Effectivement l'idée de trimarco232 d'utiliser une arduino mega2560 est aussi intéressante.

En faite je comptais plutôt utilisé un Arduino Mini pour le gain de place. Mais si je vois que je m'en sors pas au niveau du code, ça sera une Mega !! :slight_smile:

A mon avis, ce sera ok avec un arduino mini. L'avantage de l'arduino mega c'est qu'il a suffisamment d'entrées pour se passer des multiplexeurs.

Oui j'y avais penser aussi à la Mega mais je me suis dit que ça serait vraiment au cas ou si je galère vraiment avec les multiplexeurs ...

Au niveau du code j'ai commence à l'écrire mais je n'ai strictement aucune idée de si j'ai fais les choses bien lol je vous laisse vous foutre de moi ... :smiley:

#define pinS0 2
#define pinS1 3
#define pinS2 4
int pot1, pot2, pot3, pot4, pot5, pot6, pot7, pot8, pot9, pot10, pot11, pot12, pot13, pot14, pot15, pot16, sw1, sw2, sw3, sw4, sw5, sw6, sw7, sw8, sw9, sw10, sw11, sw12, sw13, sw14, sw15

void setup(){

  Serial.begin(31250); 
 
 digitalWrite(pinS2, LOW);
 digitalWrite(pinS1, LOW);
 digitalWrite(pinS0, LOW);
 pot1 = analogRead(A0) 
 
 digitalWrite(pinS2, LOW);
 digitalWrite(pinS1, LOW);
 digitalWrite(pinS0, HIGH);
 pot2 = analogRead(A0)

 digitalWrite(pinS2, LOW);
 digitalWrite(pinS1, HIGH);
 digitalWrite(pinS0, LOW);
 pot3 = analogRead(A0)

 digitalWrite(pinS2, HIGH);
 digitalWrite(pinS1, LOW);
 digitalWrite(pinS0, LOW);
 pot4 = analogRead(A0)

 digitalWrite(pinS2, HIGH);
 digitalWrite(pinS1, LOW);
 digitalWrite(pinS0, HIGH);
 pot5 = analogRead(A0)

 digitalWrite(pinS2, HIGH);
 digitalWrite(pinS1, HIGH);
 digitalWrite(pinS0, LOW);
 pot6 = analogRead(A0)

 digitalWrite(pinS2, HIGH);
 digitalWrite(pinS1, HIGH);
 digitalWrite(pinS0, HIGH);
 pot7 = analogRead(A0)

 digitalWrite(pinS2, LOW);
 digitalWrite(pinS1, HIGH);
 digitalWrite(pinS0, HIGH);
 pot8 = analogRead(A0)

  digitalWrite(pinS2, LOW);
 digitalWrite(pinS1, LOW);
 digitalWrite(pinS0, LOW);
 pot9 = analogRead(A1) 
 
 digitalWrite(pinS2, LOW);
 digitalWrite(pinS1, LOW);
 digitalWrite(pinS0, HIGH);
 pot10 = analogRead(A1)

 digitalWrite(pinS2, LOW);
 digitalWrite(pinS1, HIGH);
 digitalWrite(pinS0, LOW);
 pot11 = analogRead(A1)

 digitalWrite(pinS2, HIGH);
 digitalWrite(pinS1, LOW);
 digitalWrite(pinS0, LOW);
 pot12 = analogRead(A1)

 digitalWrite(pinS2, HIGH);
 digitalWrite(pinS1, LOW);
 digitalWrite(pinS0, HIGH);
 pot13 = analogRead(A1)

 digitalWrite(pinS2, HIGH);
 digitalWrite(pinS1, HIGH);
 digitalWrite(pinS0, LOW);
 pot14 = analogRead(A1)

 digitalWrite(pinS2, HIGH);
 digitalWrite(pinS1, HIGH);
 digitalWrite(pinS0, HIGH);
 pot15 = analogRead(A1)

 digitalWrite(pinS2, LOW);
 digitalWrite(pinS1, HIGH);
 digitalWrite(pinS0, HIGH);
 pot16 = analogRead(A1)

digitalWrite(pinS2, LOW);
 digitalWrite(pinS1, LOW);
 digitalWrite(pinS0, LOW);
 sw1 = analogRead(A2) 
 
 digitalWrite(pinS2, LOW);
 digitalWrite(pinS1, LOW);
 digitalWrite(pinS0, HIGH);
 sw2 = analogRead(A2)

 digitalWrite(pinS2, LOW);
 digitalWrite(pinS1, HIGH);
 digitalWrite(pinS0, LOW);
 sw3 = analogRead(A2)

 digitalWrite(pinS2, HIGH);
 digitalWrite(pinS1, LOW);
 digitalWrite(pinS0, LOW);
 sw4 = analogRead(A2)

 digitalWrite(pinS2, HIGH);
 digitalWrite(pinS1, LOW);
 digitalWrite(pinS0, HIGH);
 sw5 = analogRead(A2)

 digitalWrite(pinS2, HIGH);
 digitalWrite(pinS1, HIGH);
 digitalWrite(pinS0, LOW);
 sw6 = analogRead(A2)

 digitalWrite(pinS2, HIGH);
 digitalWrite(pinS1, HIGH);
 digitalWrite(pinS0, HIGH);
 sw7 = analogRead(A2)

 digitalWrite(pinS2, LOW);
 digitalWrite(pinS1, HIGH);
 digitalWrite(pinS0, HIGH);
 sw8 = analogRead(A2)

  digitalWrite(pinS2, LOW);
 digitalWrite(pinS1, LOW);
 digitalWrite(pinS0, LOW);
 sw9 = analogRead(A3) 
 
 digitalWrite(pinS2, LOW);
 digitalWrite(pinS1, LOW);
 digitalWrite(pinS0, HIGH);
 sw10 = analogRead(A3)

 digitalWrite(pinS2, LOW);
 digitalWrite(pinS1, HIGH);
 digitalWrite(pinS0, LOW);
 sw11 = analogRead(A3)

 digitalWrite(pinS2, HIGH);
 digitalWrite(pinS1, LOW);
 digitalWrite(pinS0, LOW);
 sw12 = analogRead(A3)

 digitalWrite(pinS2, HIGH);
 digitalWrite(pinS1, LOW);
 digitalWrite(pinS0, HIGH);
 sw13 = analogRead(A3)

 digitalWrite(pinS2, HIGH);
 digitalWrite(pinS1, HIGH);
 digitalWrite(pinS0, LOW);
 sw14 = analogRead(A3)

 digitalWrite(pinS2, HIGH);
 digitalWrite(pinS1, HIGH);
 digitalWrite(pinS0, HIGH);
 sw15 = analogRead(A3)

}

void loop() {
 // put your main code here, to run repeatedly:

}

Mets ton code entre balises de code

Tu n'as pas peur d'écrire des lignes de code!

Quelques conseils:

  • Il faut utiliser des tableaux
int pot[16];
bool sw[16];
  • Pour lire les switchs tu peux utiliser digitalRead qui te donne directement l'état
  • La lecture des entrées doit être faite dans la loop() si tu veux que ce soit rafraichi.

Lol désolé c'est vraiment la toute première fois que j'écris un code. J'attends de pouvoir commander un livre pour apprendre la programmation mais je sais vraiment pas quoi prendre, il y en a tellement ...

En attendant je tente des trucs certainement improbable lol

Ce n'est pas improbable, ça finira sans doute par fonctionner, mais c'est difficilement maintenable, il suffit que tu te trompes sur une ligne et tu vas chercher des heures dans toutes les lignes presque identiques.

En programmation, il faut rechercher les objet/fonctionnalités similaires et écrire un seul bout de code qui va les gérer tous.
Ici tu vois que tu as 2 fois 8 potentiomètres quasiment identiques, donc il faut essayer de les traiter dans une boucle qui va avoir comme index le numéro du potentiomètre.

D'accord. Donc dans mon code au lieu d'écrire "pot1, pot2, pot3,..." je devrait juste faire comprendre au programme que j'ai 16 potentiomètres (je ne sais pas encore comment), puis dans la boucle allé les récupérer au moyen d'un chiffre compris entre 1 et 16 ?

 #define pinS0 2
#define pinS1 3
#define pinS2 4
int pot[16]
int sw[15]

void setup(){

   Serial.begin(31250); 
  
 
}

void loop() {
 digitalWrite(pinS2, LOW);
  digitalWrite(pinS1, LOW);
  digitalWrite(pinS0, LOW);
  1 = analogRead(A0) 
  
  digitalWrite(pinS2, LOW);
  digitalWrite(pinS1, LOW);
  digitalWrite(pinS0, HIGH);
  2 = analogRead(A0)

  digitalWrite(pinS2, LOW);
  digitalWrite(pinS1, HIGH);
  digitalWrite(pinS0, LOW);
  3 = analogRead(A0)

  digitalWrite(pinS2, HIGH);
  digitalWrite(pinS1, LOW);
  digitalWrite(pinS0, LOW);
  4 = analogRead(A0)

  digitalWrite(pinS2, HIGH);
  digitalWrite(pinS1, LOW);
  digitalWrite(pinS0, HIGH);
  5 = analogRead(A0)

  digitalWrite(pinS2, HIGH);
  digitalWrite(pinS1, HIGH);
  digitalWrite(pinS0, LOW);
  6 = analogRead(A0)

  digitalWrite(pinS2, HIGH);
  digitalWrite(pinS1, HIGH);
  digitalWrite(pinS0, HIGH);
  7 = analogRead(A0)

  digitalWrite(pinS2, LOW);
  digitalWrite(pinS1, HIGH);
  digitalWrite(pinS0, HIGH);
  8 = analogRead(A0)

  digitalWrite(pinS2, LOW);
  digitalWrite(pinS1, LOW);
  digitalWrite(pinS0, LOW);
  9 = analogRead(A1) 
  
  digitalWrite(pinS2, LOW);
  digitalWrite(pinS1, LOW);
  digitalWrite(pinS0, HIGH);
  10 = analogRead(A1)

  digitalWrite(pinS2, LOW);
  digitalWrite(pinS1, HIGH);
  digitalWrite(pinS0, LOW);
  11 = analogRead(A1)

  digitalWrite(pinS2, HIGH);
  digitalWrite(pinS1, LOW);
  digitalWrite(pinS0, LOW);
  12 = analogRead(A1)

  digitalWrite(pinS2, HIGH);
  digitalWrite(pinS1, LOW);
  digitalWrite(pinS0, HIGH);
  13 = analogRead(A1)

  digitalWrite(pinS2, HIGH);
  digitalWrite(pinS1, HIGH);
  digitalWrite(pinS0, LOW);
  14 = analogRead(A1)

  digitalWrite(pinS2, HIGH);
  digitalWrite(pinS1, HIGH);
  digitalWrite(pinS0, HIGH);
  15 = analogRead(A1)

  digitalWrite(pinS2, LOW);
  digitalWrite(pinS1, HIGH);
  digitalWrite(pinS0, HIGH);
  16 = analogRead(A1)

 digitalWrite(pinS2, LOW);
  digitalWrite(pinS1, LOW);
  digitalWrite(pinS0, LOW);
  1 = digitalRead(A2) 
  
  digitalWrite(pinS2, LOW);
  digitalWrite(pinS1, LOW);
  digitalWrite(pinS0, HIGH);
  2 = digitalRead(A2)

  digitalWrite(pinS2, LOW);
  digitalWrite(pinS1, HIGH);
  digitalWrite(pinS0, LOW);
  3 = digitalRead(A2)

  digitalWrite(pinS2, HIGH);
  digitalWrite(pinS1, LOW);
  digitalWrite(pinS0, LOW);
  4 = digitalRead(A2)

  digitalWrite(pinS2, HIGH);
  digitalWrite(pinS1, LOW);
  digitalWrite(pinS0, HIGH);
  5 = digitalRead(A2)

  digitalWrite(pinS2, HIGH);
  digitalWrite(pinS1, HIGH);
  digitalWrite(pinS0, LOW);
  6 = digitalRead(A2)

  digitalWrite(pinS2, HIGH);
  digitalWrite(pinS1, HIGH);
  digitalWrite(pinS0, HIGH);
  7 = digitalRead(A2)

  digitalWrite(pinS2, LOW);
  digitalWrite(pinS1, HIGH);
  digitalWrite(pinS0, HIGH);
  8 = digitalRead(A2)

   digitalWrite(pinS2, LOW);
  digitalWrite(pinS1, LOW);
  digitalWrite(pinS0, LOW);
  9 = digitalRead(A3) 
  
  digitalWrite(pinS2, LOW);
  digitalWrite(pinS1, LOW);
  digitalWrite(pinS0, HIGH);
  10 = digitalRead(A3)

  digitalWrite(pinS2, LOW);
  digitalWrite(pinS1, HIGH);
  digitalWrite(pinS0, LOW);
  11 = digitalRead(A3)

  digitalWrite(pinS2, HIGH);
  digitalWrite(pinS1, LOW);
  digitalWrite(pinS0, LOW);
  12 = digitalRead(A3)

  digitalWrite(pinS2, HIGH);
  digitalWrite(pinS1, LOW);
  digitalWrite(pinS0, HIGH);
  13 = digitalRead(A3)

  digitalWrite(pinS2, HIGH);
  digitalWrite(pinS1, HIGH);
  digitalWrite(pinS0, LOW);
  14 = digitalRead(A3)

  digitalWrite(pinS2, HIGH);
  digitalWrite(pinS1, HIGH);
  digitalWrite(pinS0, HIGH);
  15 = digitalRead(A3)

}

Tu fais comme ça:

int pot[16];
bool sw[16];

void readInputs()
{
  for (int i = 0; i < 8; i++)
  {
    digitalWrite(pinS0, i & 0x01);
    digitalWrite(pinS1, i & 0x02);
    digitalWrite(pinS2, i & 0x04);
    sw[i] = digitalRead(A2);
    sw[i + 8] = digitalRead(A3);
    pot[i] = analogRead(A0);
    pot[i + 8] = analogRead(A1);
  }

Ou alors comme les deux groupes de potentiomètre et de switch ont des fonctionnalités différents tu peux les traiter en deux tables de 8

int potVolume[8];
int potFiltre[8];
bool swFiltre[8];
bool swDivers[8];

void readInputs()
{
  for (int i = 0; i < 8; i++)
  {
    digitalWrite(pinS0, i & 0x01);
    digitalWrite(pinS1, i & 0x02);
    digitalWrite(pinS2, i & 0x04);
    swFiltre[i] = digitalRead(A2);
    swDivers[i] = digitalRead(A3);
    potVolume[i] = analogRead(A0);
    potFiltre[i] = analogRead(A1);
  }
}

Il n'y a pas de solution universelle, la meilleurs solution va aussi dépendre de la façon dont des valeurs seront utilisées.

ça y est je suis perdu ! lol

Je pense que je vais commander un livre pour tout apprendre, je m'en sors pas !!

Tu aurais un livre à conseiller pour les noob dans mon genre ?

DGM13:
Tu aurais un livre à conseiller pour les noob dans mon genre ?

le tuto d'Eskimon

DGM13:
ça y est je suis perdu ! lol

Ce n'est pas si compiqué que ça:
on fait une boucle avec un compteur 0 à 7 pour sélectionner une des 8 voies des multiplexeurs
on dispose de 3 bits de sélection sur les multiplexeurs, il faut dont y écrire 000, 001, 010, ..., 111
ce qui correspond en décimal à 0 à 7
donc pour chacune des entrées on isole le bit correspondant dans le compteur et on l'écrit

   digitalWrite(pinS0, i & 0x01);
   digitalWrite(pinS1, i & 0x02);
   digitalWrite(pinS2, i & 0x04);

i & 0x01 fait un & binaire avec le compteur i donc retourne le bit 0. Après on l'écrit sur la sortie (si la valeur est 0 on écrit LOW, si la valeur est fifférente de 0 on écrit HIGH).

Ensuite il ne reste plus qu'à lire les sorties des multiplexeurs.

En espérant avoir été un peu plus clair.

Merci Rjnc j'avais vue ce tuto en regardant une video d'ExperimentBoy mais je n'arrive pas à télécharger le PDF :frowning:

Oui Kamill c'est un petit peu plus clair mais j'y comprend toujours rien lol je vais essayé de trouvé ce tuto et le feuilleter un peu !! Merci !!

Je pense que je vais finalement opté pour la Mega ... Trop complexe les multiplexeurs lol. Encore merci à tous pour votre aide j'y vois maintenant un peu plus clair et je réalise que je me suis lancer dans un projet au delà de mes capacités ... J'ai pu télécharger le tuto d'Eskimon en plusieurs parties, je vais imprimé tout ça puis m'y mettre !! :slight_smile: Encore merci !!!!!!

J'ai refait un schéma avec la Mega, quelqu'un peut-il me dire si mes branchements sont bon ?

Et pour les leds, est-ce que j'utilise les sorties Digital (entourée en rouge) ou je dois utiliser un multiplexeur type HC595 pour les alimenter ?

Oui, ça a l'air ok.
Tu n'es pas obligé de mettre des résistances de pullup pour les switchs car comme dans cette version tu es directement relié sur les entrées, tu peux activer les pullups internes.

Pour les leds, ça dépend combien tu veux en mettre car il y a une limite à l'intensité totale que peux fournir le boitier (je me me souvient plus à combien est cette limite pour l'atmega2560)

Tu dois en avoir marre de moi ... Lol

Pour les leds c'est vraiment facultatif, ça serai juste un petit truc en plus, au total il y en aurai 24 brancher sur 12 sorties comme sur le schéma. (Je n'en ai mis que 6 sur le schéma mais c'est pour montré le branchement).

Il faut des résistances sur tes leds sinon elles vont exploser (et la sortie avec).

Oui j'ai fais ça vraiment vite fait juste pour savoir si l'Arduino peut contrôlé 2 leds sur 1 seule sortie par exemple : état 1 = led bleu et état 0 = led verte.

Pour les résistance (en mettant les valeurs adéquate), une sur l'anode de la led verte et une sur la cathode de la led bleu ?

J'avais penser sinon à une seule résistance en sortie d'Arduino mais les leds bleu et verte on peut être besoin de valeur de résistance différente ?