Un contrôleur midi 100 basé sur Arduino
- 90 réponses
- 20 participants
- 22 158 vues
- 26 followers
secmast
Suite a la discussion sur ce contrôleur:https://fr.audiofanzine.com/surface-de-controle-midi/cme/BitStream-3X/forums/t.541700,mais-ou-le-trouver.html
Je viens jeter ici les bases pour la construction d'un contrôleur midi basé sur Arduino.
Certains pensaient que vu le nombre d'entrée analogique limitée sur une carte Arduino elle ne permettait pas l'utilisation de cette plateforme pour ce genre d'application. Ce n'est évidement pas le cas, il suffit de connaître un peu l'électronique et la programmation pour arriver a un résultat ma fois pas trop mal et peu coûteux.
Comme le montre l'image ci-dessous en utilisant des multiplexer il est possible de multiplier le nombre d'entrée/sortie avec en théorie un maximum de 1024 E/S sur une Arduino Mega.
Donc l'idée de ce fil est de jeter sur le papier le minimum requis pour une interface Midi
Sachant que l'arduino est limité en terme de mémoire (SRAM 2Kb au max) ce qui limite les variables (on en discute ?)
Sachant que l'Arduino est limité en terme de puissance "électrique", 40ma par PIN (on en discute ?)
Liste "A faire"
- Gestion EEPROM
- Alimentation externe
- Calcul d'un boucle sur 80 contrôle
[ Dernière édition du message le 13/09/2013 à 13:00:28 ]
secmast
Là je bosse sur le code, le petit montage ci-dessous m'aide a la mise au point du code pour les boutons.
Dès que j'ai les potentiomètres je prépare une autre maquette de test avec le tout.
Potentiomètre, bouton et multiplexeur (multiple).
[ Dernière édition du message le 14/09/2013 à 19:07:25 ]
Danguit
secmast
Elle permet de valider la solution hardware et software.
Et ici le code.
Dans un premier temps on sélectionne le port a ouvrir sur le 4051.
Ensuite on test pour voir si un bouton est pousser et on change le valeur de 0 à 127 ou inversement.
Il y a bien entendu des conditions de test pour ne pas avoir de phénomène de bascule intempestive.
Le passage de 0 à 127 à 0 ne peux se faire qu'en relâchant le bouton avant.
Ensuite, et seulement si il y a un changement, j'envois au port série (ouvert en 28800 pour l'instant) un semblant de commande CC.
Le formatage en MIDI des sorties vers le port série viendra plus tard lorsque le code et la platine auront les potentiomètres.
int selection0MuxB = 3;
int selection1MuxB = 4;
int selection2MuxB = 5;
int sel0;
int sel1;
int sel2;
int boutonEntre = 9;
int boucleB;
int bouton[4];
int boutonEtat[4]={0, 0, 0, 0};
int boutonCC[4]={10, 20, 30, 40};
void setup(){
Serial.begin(28800); // Ouverture du port proche de la vitesse du Midi(31250)
pinMode(selection0MuxB, OUTPUT);
pinMode(selection1MuxB, OUTPUT);
pinMode(selection2MuxB, OUTPUT);
pinMode(boutonEntre, INPUT);
}
void loop(){
for (boucleB = 0; boucleB < 4; boucleB++){
// Transformation en binaire de la variable BoucleB
sel0 =bitRead(boucleB, 0) ;
sel1 =bitRead(boucleB, 1) ;
sel2 =bitRead(boucleB, 2) ;
// Selection du port sur le 4051
digitalWrite(selection0MuxB, sel0);
digitalWrite(selection1MuxB, sel1);
digitalWrite(selection2MuxB, sel2);
// Delay d'attente avant capture du port Data
delay(1);
// Echange entre 0 ou 127
if (boutonEtat[boucleb] == 0 && digitalRead(boutonEntre) == HIGH) {
boutonEtat[boucleb]= 1;
bouton[boucleb]= !bouton[boucleb];
// Envois vers le port Serie pour debug
Serial.print ("Pression sur le bouton ");
Serial.print (boucleB+1);
Serial.print (" > ");
Serial.print("176 ");
Serial.print(boutonCC[boucleb]);
Serial.print(" ");
Serial.println(bouton[boucleb]*127);
}
// Si bouton relacher, pret a capturer une nouvelle valeur
if (boutonEtat[boucleb] == 1 && digitalRead(boutonEntre) == LOW){
boutonEtat[boucleb]=0;}
}
}
Ci dessous un aperçu des sorties sur le port série.
Pression sur le bouton 4 > 176 40 127
Pression sur le bouton 3 > 176 30 127
Pression sur le bouton 4 > 176 40 0
Pression sur le bouton 3 > 176 30 0
Pression sur le bouton 2 > 176 20 127
Pression sur le bouton 1 > 176 10 127
Pression sur le bouton 2 > 176 20 0
Pression sur le bouton 1 > 176 10 0
Pression sur le bouton 4 > 176 40 127
Pression sur le bouton 3 > 176 30 127
Pression sur le bouton 2 > 176 20 127
Pression sur le bouton 1 > 176 10 127
Pression sur le bouton 4 > 176 40 0
Pression sur le bouton 3 > 176 30 0
Pression sur le bouton 2 > 176 20 0
Pression sur le bouton 1 > 176 10 0
Rémy M. (chimimic)
Deux choses sont à prévoir en effet :
- pour les lectures analogiques, un petit tableau de valeur qui permet de mémoriser les dernières valeurs acquises pour en faire une moyenne, et traiter uniquement la valeur moyennée. Il faut prévoir une quantité de mémoire conséquente pour 64 voies d'acquisition (entre 5 et 10 octets conseillés pour chaque voie analogique).
- pour les lectures logiques, une fonction anti-rebonds. Si fait en logiciel, ça peut consommer quelques ms supplémentaires. L'avantage d'utiliser un multiplexeur externe (CD4051, DC4067 ou CD4097 par exemple) ou un expandeur de port, est que l'anti-rebond peut être plus facilement matériel, mais évidement ça fait des composants en plus. Choix à faire selon ses propres préférences.
Formateur en techniques sonores ; électronicien ; auteur @ sonelec-musique.com
[ Dernière édition du message le 15/09/2013 à 11:36:53 ]
secmast
Pour la logique il en faut même deux, car c'est une opération "flip-flop", mais j'ai l'intention d'utiliser deux tableaux binaire, qui consomme moins de mémoire.
En ce qui concerne la gestion du rebond je vais mettre un temps de pause de 150us et faire des tests.
Il faut tenir a l'esprit que 64 potentiomètres et 16 boutons c'est une boucle de 80 ça fait un peu plus de 10ms pour un scan complet.
Il est possible de réduire ce temps mais seulement d'un peu. 16 boutons en 8 en utilisant des résistances et en passant par des ports analogique et non logiques. Mais c'est avec un temps de processus plus long car du code en plus pour vérifier quels boutons est en fonction.
Pour l'analogique un tableau suffit et pas vraiment besoins d'utiliser une fonction de moyenne. Les valeurs MIDI allant de 0 à 127 et les potentiomètre me donnant une valeur de 0 à 1023 je fais déjà un MAP. Par contre ce tableau prend beaucoup de place, et il faut ajouter un tableau qui reprend les destination CC. C'est là ou je vais devoir passer par l'EEPROM pour économiser de la SRAM ce n'est plus une variable mais une constante.
Mon programme de test comprendra une fonction de test mémoire pour voir où j'en suis.
Canem
Nouveau clip CANIS CANEM - March of Ghosts
secmast
je ne comprends absolument rien, je crois que je vais attendre pour mon contrôleur.
En fait et c'est l'avantage de l'open source, quand j'aurais fini le miens tu n'auras qu'a copier.
Rémy M. (chimimic)
Un tableau est nécessaire et pour l'analogique et le logique. Pour la logique il en faut même deux, car c'est une opération "flip-flop", mais j'ai l'intention d'utiliser deux tableaux binaire, qui consomme moins de mémoire.
Pour 16 entrées logiques, quatre octets (ou deux mots) suffisent : deux octets pour l'état en cours et deux autres pour l'état précédent.
En ce qui concerne la gestion du rebond je vais mettre un temps de pause de 150us et faire des tests.
Des tests que j'ai pu faire, 150 us est insuffisant. Sauf pour des boutons de haute qualité qui coûtent la peu des fesses.
16 boutons en 8 en utilisant des résistances et en passant par des ports analogique et non logiques. Mais c'est avec un temps de processus plus long car du code en plus pour vérifier quels boutons est en fonction.
Je n'ai pas compris ce que tu voulais dire exactement. Mais dans tous les cas, le temps de conversion lié à l'utilisation du CAN (pour lecture analogique) est plus long qu'une lecture logique. On cherche à économiser du temps, non ?
Pour l'analogique un tableau suffit et pas vraiment besoins d'utiliser une fonction de moyenne.
A voir lors des tests
Les valeurs MIDI allant de 0 à 127 et les potentiomètre me donnant une valeur de 0 à 1023 je fais déjà un MAP. Par contre ce tableau prend beaucoup de place
Pour passer de la résolution 10 bits à 7 bits, un simple "SHR 3" suffit au moment de l'acquisition. Avantage : stockage des données en 8 bits et non en 16. Plus rapide et plus efficace !
il faut ajouter un tableau qui reprend les destination CC.
Ca oui, on n'y coupe pas.
C'est là ou je vais devoir passer par l'EEPROM pour économiser de la SRAM ce n'est plus une variable mais une constante.
Si le temps pris par les divers accès à l'EEPROM ne te posent pas de problème, alors oui, tu peux.
Mon programme de test comprendra une fonction de test mémoire pour voir où j'en suis.
Tu peux (simple suggestion) mesurer de façon individuelle le temps demandé pour chaque fonction, de façon individuelle.
Formateur en techniques sonores ; électronicien ; auteur @ sonelec-musique.com
Canem
En fait et c'est l'avantage de l'open source, quand j'aurais fini le miens tu n'auras qu'a copier.
là je suis carrément d'accord c'est cool de ta part !
Nouveau clip CANIS CANEM - March of Ghosts
elektrosamplist
Pour la gestion des rebonds, tu as la librairie Bounce: https://playground.arduino.cc/code/bounce
Pour les pots, je confirme que le 4051 peut switcher hyper rapidement, le point faible ici est plus la vitesse de l'adc de l'arduino, qui de mémoire est configurée à une vitesse assez faible (déjà c'est pas un foudre de guerre le truc...).
Tu peux l'augmenter, au détriment de la fiabilité de la mesure bien sûr, y'a des tutos sur le site Arduino.
Bon courage!
audiothingies.com - Facebook - Youtube
Pas de support par MP, email uniquement, si vous avez ouvert un sujet sur AF, envoyez un lien, ma réponse profitera à tout le monde
- < Liste des sujets
- Charte