Un contrôleur midi 100 basé sur Arduino
- 90 réponses
- 20 participants
- 22 174 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
Voici le design de l'interface qui comporte pour le moment, 4 boutons et 8 potentiomètres.
Dans l'état, elle peut aller jusqu'à 8 boutons et 64 potentiomètres.
J'imagine qu'il faudra utiliser des potentiomètres de 100kOhm car en parallèle ça nous donne une résistance globale de +/- 1,5kOhm (pour 64 potentiomètres) . J'ignore quelle sera la réaction de la carte avec une valeur si basse ?
En haut a gauche j'ai mis une régulateur 5 volts, il est ainsi possible d'alimenter l'interface avec un bloc alimentation externe allant de 7 à 18 volts ou même sur piles. De cette manière on utilise pas les moyens limités de la carte Arduino.
Je bosse sur le code en ce moment, j'ai pas trop les idées claires a cause d'un rhume qui me prend mon énergie.
Rémy M. (chimimic)
Et à mon avis, tu peux économiser un CD4051...
Formateur en techniques sonores ; électronicien ; auteur @ sonelec-musique.com
[ Dernière édition du message le 18/09/2013 à 13:32:56 ]
secmast
Citation de : chimimic
Erreur câblage au niveau des inters...
Et à mon avis, tu peux économiser un CD4051...
Ou ça ou ça l'erreur ? je vois pas
Ah mais c'est bien sur, et c'est n'importe quoi
Ben oui je pourrais faire l'économe d'un 4051 mais le but ici est de faire des tests avec des 4051 multiplexer du coup le MUX A s'impose.
J'ai même posé le mux B1 (entrée logique) au niveau des "secondaires" pour permettre une meilleur intégration d'un mux primaire (logique) en cas de besoins.
[ Dernière édition du message le 18/09/2013 à 15:36:26 ]
secmast
Rémy M. (chimimic)
Petit conseil : ne laisses pas en l'air la broche 6 de tes 4051..
Formateur en techniques sonores ; électronicien ; auteur @ sonelec-musique.com
secmast
[ Dernière édition du message le 18/09/2013 à 19:04:29 ]
secmast
Voici donc la maquette qui va servir pour la mise au point du code.
secmast
Ca fonctionne particulièrement bien.
J'ai remarqué que j'avais monté la polarité de mes potentiomètres a l'envers.
On peux facilement bouger deux, voir trois potentiomètres en même temps, sans aucun problème.
Je prépare le code définitif avec le code MIDI permettant l'utilisation en situation réelle.
int selection0MuxPrimaire = 3;
int selection1MuxPrimaire = 4;
int selection2MuxPrimaire = 5;
int selection0MuxSecondaire = 6;
int selection1MuxSecondaire = 7;
int selection2MuxSecondaire = 8;
int sel0;
int sel1;
int sel2;
int bouclePrimaire;
int boucleSecondaire;
int boutonEntre = 9;
int bouton[4];
int boutonEtat[4]={0, 0, 0, 0};
int boutonCC[4]={10, 20, 30, 40};
int potentiometreEntre = 0;
int potentiometre[8];
int potentiometreCC[8]={11, 21, 31, 41, 51, 61, 71, 81};
// Canal midi de 176 à 191
int midiChannel = 176;
void setup(){
// Ouverture du port serie proche de la vitesse du Midi(31250) pour debut seulement
Serial.begin(28800);
// Configuration des ports Arduino E/S
pinMode(selection0MuxPrimaire, OUTPUT);
pinMode(selection1MuxPrimaire, OUTPUT);
pinMode(selection2MuxPrimaire, OUTPUT);
pinMode(selection0MuxSecondaire, OUTPUT);
pinMode(selection1MuxSecondaire, OUTPUT);
pinMode(selection2MuxSecondaire, OUTPUT);
pinMode(boutonEntre, INPUT);
}
void loop(){
// Scan et lecture des boutons
//Boucle de selection du Mux B1 pour 4 boutons
for (boucleSecondaire = 0; boucleSecondaire < 4; boucleSecondaire++){
// Transformation en binaire de la variable boucleSecondaire
sel0 =bitRead(boucleSecondaire, 0) ;
sel1 =bitRead(boucleSecondaire, 1) ;
sel2 =bitRead(boucleSecondaire, 2) ;
// Selection du port sur le 4051 Mux B3
digitalWrite(selection0MuxSecondaire, sel0);
digitalWrite(selection1MuxSecondaire, sel1);
digitalWrite(selection2MuxSecondaire, sel2);
// Delay d'attente avant capture du port Data, valeur à mettre au plus bas possible.
delayMicroseconds(90);
// Echange entre 0 ou 127
if (boutonEtat[bouclesecondaire] == 0 && digitalRead(boutonEntre) == HIGH) {
boutonEtat[bouclesecondaire]= 1;
bouton[bouclesecondaire]= !bouton[bouclesecondaire];
// Envois vers le port Serie pour debug, sera remplacé par le code MIDI
Serial.print (" Pression sur le bouton ");
Serial.print (boucleSecondaire+1);
Serial.print (" > ");
Serial.print("176 ");
Serial.print(boutonCC[bouclesecondaire]);
Serial.print(" ");
Serial.println(bouton[bouclesecondaire]*127);
}
// Si bouton relacher, pret a capturer une nouvelle valeur
if (boutonEtat[bouclesecondaire] == 1 && digitalRead(boutonEntre) == LOW){
boutonEtat[bouclesecondaire]=0;
}
}
// Scan et lecture des potentiometres
// Boucle de selection du Mux B2 ou Mux B3
for (bouclePrimaire = 0; bouclePrimaire < 2; bouclePrimaire++){
// Transformation en binaire de la variable bouclePrimaire
sel0 =bitRead(bouclePrimaire, 0) ;
sel1 =bitRead(bouclePrimaire, 1) ;
sel2 =bitRead(bouclePrimaire, 2) ;
// Selection du port sur le 4051 Mux A
digitalWrite(selection0MuxPrimaire, sel0);
digitalWrite(selection1MuxPrimaire, sel1);
digitalWrite(selection2MuxPrimaire, sel2);
// Boucle de lecture Mux Bn pour 4 entrees
for (boucleSecondaire = 0; boucleSecondaire < 4; boucleSecondaire++){
// Transformation en binaire de la variable boucleSecondaire
sel0 =bitRead(boucleSecondaire, 0) ;
sel1 =bitRead(boucleSecondaire, 1) ;
sel2 =bitRead(boucleSecondaire, 2) ;
// Selection du port sur le 4051 Mux Bn
digitalWrite(selection0MuxSecondaire, sel0);
digitalWrite(selection1MuxSecondaire, sel1);
digitalWrite(selection2MuxSecondaire, sel2);
// Delay d'attente avant capture du port Data, valeur à mettre au plus bas possible.
delayMicroseconds(75);
// Lecture de la valeur du potentiometre(n)
// Verification de la valeur ancienne et valeur actuelle base sur 4 potentiometre par mux
if (analogRead(potentiometreEntre) != potentiometre[bouclesecondaire + (bouclePrimaire * 4)]){
potentiometre[bouclesecondaire + (bouclePrimaire * 4)] = analogRead(potentiometreEntre);
Serial.print("Potentiometre ");
Serial.print(boucleSecondaire +(bouclePrimaire * 4));
Serial.print(" > ");
Serial.print(midiChannel);
Serial.print(" ");
Serial.print(potentiometreCC[bouclesecondaire + (bouclePrimaire * 4)]);
Serial.print(" ");
Serial.println(potentiometre[bouclesecondaire + (bouclePrimaire * 4)]);
}
}
}
[ Dernière édition du message le 19/09/2013 à 08:50:31 ]
Rémy M. (chimimic)
Formateur en techniques sonores ; électronicien ; auteur @ sonelec-musique.com
- < Liste des sujets
- Charte