Projet controleur midi

Bonjour à tous,

je suis technicien son et lumière et depuis un petit moment me démange l'envie de créer mon propre contrôleur MIDI pour GrandMA 2 OnPC (une console lumière dont le soft tourne sur PC).
On peu y affecter chaque touche ou fader sur une note midi.

Voici la surface de contrôle à faire :

Donc, il y a exactement :

  • 18 faders motorisés
  • 5 encodeurs
  • 138 touches

Soit :

Touches ->

  • 10 PWM x 14 entrées digital (pour le mappage)

Faders ->

  • 18 sorties PWM (vitesse du moteur)
  • 36 sorties digital (sens moteur fader)
  • 18 entrées analog (valeur du fader)
  • "18 entrées digital (touch sens, est-ce vraiment nécessaire ?)"

Encodeurs ->

  • 10 entrées digital (2 par encodeur)

C'est à dire, au total :

  • 64 sorties digital (dont 28 PWM)
  • 24 entrées digital (+18 si touchsens)
  • 18 entrées analog

Enfin, il faudrait donc 2 Arduino Mega qui donnerait :

  • 108 I/O digtal (dont 28 PWM)
  • 32 entrées analog

Voici pour le câblage de tout ces composant, pour les résistances condensateur, pont H, etc... je m'en occuperais lors de la conception du PCB.

Il ne reste plus qu'a transmettre les données reçus des switch en faders en midi. Pour cela il existe des logiciels permettant de transformer un signal sérial en midi donc pas trop de soucis de ce coté là même si la prog risque d'être longue.

Ma question arrive, j'ai donc besoin de relier mes 2 cartes qui vont m'envoyer et recevoir des signaux serial.
Comment ça va se passer ? il faut que je demande à la carte esclave chaque cycle si quelquechose à bouger ? et la maitre va recevoir la réponse pour la distribuer en serial puis converti en midi par l'autre soft.

Est-ce que mon résonnement est bon ?
Avez-vous détecté des anomalies dans ce que je dit plus haut ?

J'aimerais que le projet sois assez propre sur papier avant d'acheter les pièces.

Merci.

Salut,

Si j'ai bien compris, tu réutilises le pupitre hard existant? Dans ce cas, mieux vaut regarder comment il est câblé. Je ne serais pas étonné que les touches (BP) soient en matrices, en 6x4 par exemple. ça diminue donc le nombre de 24 à 10 entrées logiques.

Ensuite, avec des multiplexeurs analogiques, tu peux diviser le nombre d'entrées analogiques.

Grouper les PWM des moteurs, et au final, une seuls méga sera suffisante.

Si tu veux rester sur 2 méga, je te conseilles de programmer l'esclave en trames continues : toutes les xx ms, elle envoie une série complète de l'état de ses entrées. La master reçoit ces trames et colle les données dans un tableau (via l'int du usart récepteur). C'est totalement transparent pour le reste de ton prog master et ça évite l'interrogation permanente de l'esclave. Il ne te restera plus qu'à lire ton tableau quand tu veux, il sera mis à jour automatiquement...

bien pensé :slight_smile:

Bonjour,

il sera peut-être judicieux d'utiliser l'i2c entre les 2 cartes, afin de réserver les usarts :

  • usart0 du maître pour l'usb
  • ports en entrée (midi, dmx)
  • ports en sortie (midi, dmx)

Super_Cinci:
Salut,

Si j'ai bien compris, tu réutilises le pupitre hard existant? Dans ce cas, mieux vaut regarder comment il est câblé. Je ne serais pas étonné que les touches (BP) soient en matrices, en 6x4 par exemple. ça diminue donc le nombre de 24 à 10 entrées logiques.

Ensuite, avec des multiplexeurs analogiques, tu peux diviser le nombre d'entrées analogiques.

Grouper les PWM des moteurs, et au final, une seuls méga sera suffisante.

Si tu veux rester sur 2 méga, je te conseilles de programmer l'esclave en trames continues : toutes les xx ms, elle envoie une série complète de l'état de ses entrées. La master reçoit ces trames et colle les données dans un tableau (via l'int du usart récepteur). C'est totalement transparent pour le reste de ton prog master et ça évite l'interrogation permanente de l'esclave. Il ne te restera plus qu'à lire ton tableau quand tu veux, il sera mis à jour automatiquement...

si on peu utiliser qu'une seule carte, tant mieux mais j'ai quelques petites question du coup :

  • Grouper les PWM en un seul -> les faders qui auront pas besoin de bouger ne devrait pas bouger si la commande du pont en H reste en LOW LOW ?

  • pour les touches, j'en ai 138, j'ai fait une matrice de 10x14 pour avoir 140 touches disponible, on peu refaire une matrice par dessus ? je comprend pas trop...

  • le multiplexeur, je connait pas trop, si j'ai bien compris ça envoi une série de 3 bit pour donner l'état de plusieurs entrées ?

en tout cas, merci pour vos réponses.

Salut routmout,

question numéro 1 : ton clavier/interface utilisateur est-il déjà conçu (en termes de schéma électrique), de récupération ou c'est juste un dessin?

Parce que tout va dépendre de ce point d'entrée.

Si c'est juste un dessin de concept de face avant, alors n'hésite pas, fais une face avant multiplexée, ça va t'économiser des tas de lignes d'E/S, et la programmation d'une matrice est loin d'être complexe. Tu peux aussi le faire pour commander les faders avec les sorties analogiques (c'est quelque chose de très, très courant dans les synthés analogiques). Un seul MEGA2560 devrait être largement suffisant pour ce projet.

Par contre, si le schéma de la face avant est déjà fait, et bien il faudra l'analyser pour en déduire comment il fonctionne et savoir combien d'E/S il te faudra

Et si c'est une face avant de récupération... pareil, mais en plus, il faudra d'abord retrouver le schéma

Benoit

il faudra faire le schéma, c'est juste un dessin, pas de carte à analyser.

Ok donc maintenant, il faut que j’apprenne le multiplexage pour comprendre comment ça marche...

Il me reste une question dont j'ai du mal a trouver les réponses :

  • pour les touches, j'en ai 138, j'ai fait une matrice de 10x14 pour avoir 140 touches disponible, on me dit, une matrice de 6x4 I/O logiques pour en utiliser moins mais je pige pas comment.

Le multiplexage n'est pas compliqué ni à comprendre, ni à programmer.
Je prends ton exemple de 10x14 : tu vas voir besoin de 10 sorties et de 14 entrées. Ton clavier sera organisé disons en 10 colonnes de 14 touches.

Tu relies chacune des 10 colonnes à une sortie, mais attention : tu dois mettre une diode genre 1N4148 en série entre la sortie et chaque colonne. Cette diode est nécessaire pour éviter les retours de courant qui vont fausser les lectures si tu appuies sur plusieurs touches (ces retours ne sont pas destructifs, mais ça rend la lecture impossible car ça renvoie n'importe quoi)

Ensuite, tu actives la sortie qui commande la colonne 1 et tu relis les 14 lignes en entrée, qui vont te dire quelles sont les touches appuyées sur cette colonne. Tu désactives la colonne 1, tu actives la colonne, tu lis les 14 entrées, et là tu va lire du coup les touches 15 à 28. Etc, pour chacune des 10 colonnes, et à la fin, tu as bien l'image des 140 boutons en mémoire.

Pour économiser des lignes de sortie, tu peux utiliser des DEMUX 3->8 genre 74HCT138. Avec 3 bits de sortie, tu vas pouvoir gérer 8 colonnes, ce qui économise 5 bits par rapport à la méthode "brute". Avec deux 74HCT138 et seulement 6 lignes de sortie, tu peux commander 16 colonnes. C'est probablement ça qu'on a voulu t'expliquer avec une matrice réduite

En jouant avec les lignes d'activation des 138, tu peux même encore sauver encore plus de lignes de sortie (je pense que ça doit être jouable avec 4 ou 5 lignes seulement pour avoir les 16 bits de commande)

Vala, vala... yapuka...

Benoit

Ah oui, je ne pensait plus qu'on testait les lignes et colonnes une par une, je comprend tout maintenant ^^

Merci Benoit.

Voici le schémas des matrices des touches en pj, est-ce que ça vous parait correct ?

Je ne suis pas sûr de moi au niveau du 74HCT157 et des diodes...

New Project.PDF (49.9 KB)

hello

pour le 154 en démultiplexeur ( 1 vers 16), si E0 et E1 sont à 0, la sortie sélectionnée par l'adressage A0,A1,A2,A3 est à 0 et les 15 autres sont à 1. tu mets donc tes colonnes à 0 chacune à leur tour.
l'adressage est bien raccordé sur des sorties arduino.
tu n'as donc bien besoin que de 4 sorties arduino pour les colonnes.

pour le 157 en multiplexeur (8 vers 1) pourquoi un 8 canaux alors qu'il y a 10 lignes à scruter

le 74HCT4067 est un multiplexeur 16 vers 1 ( 16 lignes vers 1 entrée arduino)

tes lignes étant raccordées aux 16 ( 10 utiles pour toi ) entrées du multiplexeur
et la sortie du multiplexeur est raccordée à une entrée arduino. c'est elle qu'il faudra lire pour connaitre l'état d'une touche.
bien sur l'adressage se fait par 4 sorties arduino

dans ton prg, par une boucle "FOR"de 0 à 14, tu sélectionnes en premier l'adresse 0 sur le 74HCT154, ta colonne 0 passe à "0".
puis par une boucle "FOR"0 à 9, tu sélectionnes tes lignes chacune à leur tour pour les scruter .

si aucune touche pressée, tu ne liras que des "1"

tu as donc utilisé au total 8 sorties arduino pour adresser les deux boitiers multiplexeur/démultiplexeurs
et une entrée pour lire tes 140 touches.
grace aux deux boucles "FOR" imbriquées

Bonjour,

c'est une question de philosophie :
avantage 1 arduino : un seul programme à écrire
avantage 2 arduinos : pas besoin de diode, ni de multiplexeur, ni de démultiplexeur, ni de pcb associé, câblage des boutons et des potentiomètres au plus simple, programmes plus simples, disponibilité des uart ...

les avis sont partagés selon les sensibilités

:slight_smile: hello trimarco232

je ne suis pas convaincu de l'utilité des diodes sur les entrées des multiplexeurs.

par mon post, je réagissais au schéma que notre ami soumettait et qui est faux pour la gestion des lignes. choix du composant et câblage.

en faisant comme suggèré, il utilisera 9 lignes arduino pour les touches, mais il reste les 5 encodeurs et les 18 faders motorisés
et quand je voie le nombre de lignes arduino annoncé par notre ami pour ces parties....

je ne me suis pas occupé de savoir s'il fallait 1 ou 2 ou 3 platine arduino... :slight_smile:

pour me rendre compte, j'ai fais le bout de prog qui gère la lecture des 140 touches.
avec un chronométrage du temps. il faut moins d'une milliseconde pour lire les 140 touches
et tester si la touche en cours de lecture est à "0"

et ce que je propose n'est peut être pas la meilleure solution. je ne suis effectivement pas le seul sur le forum :slight_smile: d'autres vont probablement proposer des solutions différentes

Bonne année tout le monde !

Voici le nouveau schémas des touches par rapport à ce que j'ai compris :

ça m'a l'air pas mal, c'est vous qui me dites...

Pour la latence, - de 1ms par touche ça m'a l'air pas mal du tout. combien de temps en moyenne on reste appuyer sur la touche lorsqu'on tape au clavier ? Le tout c'est de ne pas devoir rester appuyer sur la touche, évidement, et que lorsqu'on appui dessus rapidement, il ne faut pas passer entre deux rafraichissements.

Je suis pour l'utilisation d'un minimum de choses, plus c'est petit, mieux c'est mais pas trop car il faut que ça reste abordable dans la partie programmation.

Donc si ça c'est bon, on va passer aux faders et encodeurs. je vais commander un arduino mega afin de commencer la prog et vérifier en pratique.

Merci à tous.

hello

ce n'est pas encore ça, tu sembles faire une confusion.
j'ai l'impression que tu n'as pas la bonne empreinte pour le 74HCT4067
http://www.nxp.com/documents/data_sheet/74HC_HCT4067.pdf
au centre du schéma

pour ce que tu nommes entrées arduino 1,2,3,4,5
ces entrées sont des sorties, appelles les 5,6,7,8. elles sont au nombre de 4 (comme pour la partie gauche) et servent à sélectionner le canal ( la ligne clavier) que tu veux lire. avec le multiplexeur de droite (74 HCT4067).

en résumé, au centre du schéma tu as 8 sorties arduino et 1 seule entrée.

à droite du schéma:
donc ces 4 sorties arduino(5,6,7,8) sont raccordées aux pins A,B,C,D du 74HCT4067
si tu regardes la data sheet du 74HCT4067, tu verras une pin "Z" qui est la sortie du circuit intégré et qui doit etre raccordée à une entrée arduino.
en résumé, pour ce circuit avec les adresses A,B,C,D tu choisi une des lignes du clavier que tu peux lire sur la sortie "z" qui est raccordée à une entrée arduino
le 74hct4067 à 16 entrées raccordées aux lignes du clavier, une sortie "Z" raccordée à une entrée arduino et 4 lignes d'adressage raccordées à 4 sorties arduino qui permettent de choisir laquelle des lignes clavier sera orientée vers la sortie "Z" pour etre lue par l'arduino.

après réflexion, il te faudra peut etre une sortie supplémentaire pour le "Enable" du 74HCT4067 afin de mettre en haute inpédence la sortie pendant le changement d'adressage ( il faudrait faire des essais avec E fixée à GND et E commandée par arduino.
)
c'est pour scruter la totalité des 140 touches qu'il te faut 1ms
je te joins le prg de test.je ne voulais pas le joindre pour ne pas te frustrer de la satisfaction de faire ton prg toi meme, mais comme il y a confusion sur les temps ...
mets ton moniteur à 576 bauds
tel quel il t'affiche le comptage des lignes scrutées
si tu modifies la ligne "lecture= 0;" par "lecture = 1;" il ne t'affichera que le temps de scrutation des touches

//scrutation des 140 touches
//en 1milli secondes
int touche = 1;
int lecture = 1;
unsigned long start = 0;
unsigned long end = 0;
void setup()
{
  for (int bcle = 2; bcle < 10; bcle++)
  {
    pinMode(bcle, OUTPUT);
  }
  pinMode(lecture, INPUT);
  Serial.begin(57600);  
  start= micros();
  Serial.print("start  ");Serial.println(start);
}

void loop() 
{
 for (int A = 0;A<15;A++)
 {
   for (int B = 0;B<10;B++)
   {
    digitalRead(lecture);
    lecture = 0;//pour test car pas de clavier 140 touches
    if (lecture!=1){touche=((A*10)+B);Serial.println(touche);}
   }
  }
  end= micros();
  Serial.print("end  ");Serial.println(end);
  Serial.print(end-start);Serial.print("  micros");
  while(1){};//pour test
}

edit:
après reflexion, je vois que dans le code je n'ai pas positionné les sorties pour la sélection
cela va allonger un peu le temps de scrutation des touches
de plus je voie ci dessous qu'il y a une autre solution qui semble bien séduisante

Bonjour et bonne année à tous et bonjour chère collègue de la lumière !
As tu pensé à la solution simple et économique qui consiste à récupérer un ancien clavier (non usb) d'ordinateur ? Je parle bien sur de l'électronique du clavier, pas des touches. Il existe une library qui permet de lire simplement le signal reçut :Arduino Playground - PS2Keyboard
Ça te permet d'avoir une centaine de touche pour seulement 2 entrées digitales!
Pour les entées analog et les sorties PWM personnellement, pour ce genre d’application, je délègue le travail à des petits attinys, chaînés en I²C. J'ai même développé une carte spécialement pour ça :arpsensors
une arduino uno peut du coup suffire pour ton projet.
A ++

juste pour info puisque cette solution est compromise
avec la cde des sorties pour adresser les colonnes/lignes, on passe à 3 milli secondes pour les 140 touches

byte dec2bcd(byte dec) 
{
  return ((dec / 10 * 16) + (dec % 10));
}
void loop()
{
 for (int A = 3;A<18;A++)
 {PORTD = (dec2bcd(A)); 
   for (int B = 0;B<10;B++)
   {PORTB = (dec2bcd(B));
    digitalRead(lecture);
    lecture = 1;//pour test car pas de clavier 140 touches
    if (lecture!=1){touche=((A*10)+B);Serial.println(touche);}
   }
  }
  end= micros();
  Serial.print("end  ");Serial.println(end);
  Serial.print(end-start);Serial.print("  micros");
  while(1){};//pour test
}

bouault:
As tu pensé à la solution simple et économique qui consiste à récupérer un ancien clavier (non usb) d'ordinateur ? Je parle bien sur de l'électronique du clavier, pas des touches. Il existe une library qui permet de lire simplement le signal reçut :Arduino Playground - HomePage
Ça te permet d'avoir une centaine de touche pour seulement 2 entrées digitales!

bonsoir Jacques
C'est vrai que c'est une bonne idée
Je la retiens , j'avais en tete de realiser une matrice de contact X/Y (genre 5X5 ou 6X6, version luxe 8X8 :grin: ) avec illumination RVB sous chaque "cabochon".
avec une WS2812 par contact , ça ne nécessiterait que 3 I/O de MCU

bonne idée ça, je dois avoir un ou deux vieux clavier qui trainent, j'vai démonter et voir ça.

si un Arduino UNO suffit, c'est encore mieux mais ça se complexifie, je comprends vite mais il faut m'expliquer longtemps ^^.

J'vais voir ça, merci :slight_smile: