Se connecter
Se connecter

ou
Créer un compte

ou
FR
EN

Un contrôleur midi 100 basé sur Arduino

  • 90 réponses
  • 20 participants
  • 23 010 vues
  • 26 followers
Sujet de la discussion Un contrôleur midi 100 basé sur Arduino

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"

  1. Gestion EEPROM
  2. Alimentation externe
  3. Calcul d'un boucle sur 80 contrôle

[ Dernière édition du message le 13/09/2013 à 13:00:28 ]

2
je veux bien en discuter anéfé :-D
premièrement j'ai lu quelque part que l'utilisation de multiplexers interdisait l'utilisation de deux potards simultanément...vrai ou pas?
du coup quelles sont les conséquences des limites de mémoire et de puissance?
mon projet serait de faire un contrôleur avec 64 potards et 16 (voir 32!) boutons...
3

Même sans les multiplexeur les potentiomètres ne sont lu qu'un a la fois.

Mais ce n'est pas pour autant que tu ne peux pas les bouger car même avec les multiplexeur la lecture d'un a l'autre va tellement vite que pour l'utilisateur c'est transparent. Maintenant avec 80 contrôles il faut tester la vitesse d’exécution de la boucle. Combien de temps entre la capture 1 et la capture 80.

Pour la mémoire c'est un faut problème, il suffit de savoir gérer l'eeprom, je sais pas faire, du moins pas encore a mettre sur la liste.

Le courant n'est pas non plus un problème je poste un exemple aujourd'hui.

 

4
Salut,
Je rentre dans le sujet, et je me permets d'inserer un lien sur un controlleur avec base arduino :
https://fr.audiofanzine.com/les-mains-dans-le-cambouis/forums/t.517122,arduino-diy-controleur-midi-e-licktronic.html
5

Pour l’alimentation il suffit d'utilise un régulateur de tension et de connecter la sortie d'un part vers l'Arduino et d'autre part vers les composants. L'Arduino ne fournissant plus d'énergie aux composants la limitation n'a plus d'être.

Ca ne veut pas dire qu'on peut faire n'importe quoi, en effet 64 potard branché a la brutus vont pomper du courant en permanence, le tout est de mettre dans le design des shift register et des transistors pour alimenter les potentiomètre au moment opportun. Enfin c'est une idée jeter comme ça pour l'instant.

 

 

[ Dernière édition du message le 13/09/2013 à 13:27:07 ]

6
Bonjour,
J'ai fait aussi quelques bricolos MIDI sur arduino (**), mais j'ai mis cela de côté pour l'instant (et le sujet n'attirant pas les foules ce n'était pas très motivant).
Pour la mémoire, il y a l'utilisation de l'EEPROM (que j'avais testée) et aussi la carte SD (testée dans une autre utilisation).
En ce qui concerne la consommation, sauf erreur les potars ne sont connectés qu'au moment du scan, donc 1 seul à la fois par port analogique. J'ai fait des essais avec des potars de valeur supérieure à 10k, mais ils sont plus sensibles au bruit.
Un point m'a gêné (en plus du manque de debugger), il semble que le SoftwareSerial (qui permet d'avoir des ports MIDI indépendants de l'USB) ne supporte pas un flot de données MIDI important (=> erreurs avec résultats imprévisibles).

Nota ** :
https://fr.audiofanzine.com/les-mains-dans-le-cambouis/forums/t.504761,diy-controle-des-parametres-des-micron-amp-miniak-par-carte-arduino.html
https://fr.audiofanzine.com/les-mains-dans-le-cambouis/forums/t.525583,diy-telecommande-midi-ir-arduino.html

Passer pour un idiot aux yeux d'un imbécile est une volupté de fin gourmet. (G. Courteline)

[ Dernière édition du message le 14/09/2013 à 11:10:28 ]

7

Dans un premier temps je n'ai pas l'intention de me servir de softwareSerial qui par ailleurs connait une nouvelle version si j'ai bien vu.

Il y a quelques jours j'ai fait quelques test Midi et je n'ai eu aucune erreur. Mais là j'attend la livraison de mes potentiomètres pour effectuer des tests plus pousser.

Pour l'EEPROM j'ai déjà lu l'un ou l'autre papier mais en diagonal et pas encore mis quoi que ce soit en pratique.

La carte SD c'est un coup non négligeable et du code en plus, il me semble qu'une librairie s'impose mais je peux me tromper.

Je dois aussi mesurer la consommation d'un potentiomètre "au repos", mais j'ai l'impression qu'il pompe toujours un peu et un peu fois 64 ça commence a compter.

 

 

8
Bonjour,

Citation :
Je dois aussi mesurer la consommation d'un potentiomètre "au repos", mais j'ai l'impression qu'il pompe toujours un peu et un peu fois 64 ça commence a compter.

I = U / R
Si alim 5 V et pot 10 kO -> I = 5 / 10000 = 0,5 mA (par pot)
Pour 64 pots 10 kO -> I = 0,5 mA * 64 = 32 mA

En ce qui concerne le multiplexage, il faut effectivement prendre en compte le temps de commande de positionnement des multiplexeurs et de lecture analogique (via le CAN). Grosso-modo 100 us par lecture (mux et CAN). Dans ce cas, temps total :
T = 0,1 ms * 64 = 6,4 ms.
A cela bien sûr s'ajoute le temps de traitement requis pour le reste de l'application.

Formateur en techniques sonores ; électronicien ; auteur @ sonelec-musique.com

[ Dernière édition du message le 14/09/2013 à 11:08:45 ]

9
donc en pratique c'est faisable techniquement un contrôleur 64 pots? est-ce que ce sera compliqué à réaliser pour quelqu'un qui n'y connait rien?
10
Merci Chimimic, je lisais justement la fiche technique du CD4051BE de chez Ti avec un temps de réponse typique pour 5 Volts:
Ouverture : 450 ns
Fermeture : 400 ns
Propagation :200 ns

Ou encore 1050 nanoseconde pour un cycle fermeture, ouverture, propagation. Donc le goulet n'est certainement pas le 4051 en lui même.
Je sais qu'il est possible d'accélérer la procédure de lecture sur un port ATMEL en utilisation la technique de la manipulation de port. Une ouverture fermeture d'un port en 660 ns ça laisse rêveur et beaucoup de temps pour traiter l'information.

Merci pour le rappel de la loi d'Ohm, tellement simple mais comme nous somme dans le domaine de l'analogique je vais mesurer quand même dix potentiomètre connecté et vérifier que la pratique colle a la théorie. Les prix pour ce genre de petite chose variant de 1 à 100.



11
En fait c'est possible de faire une interface 64 potentiomètres bien qu'encore une fois le problème reste un problème de mémoire pour les variable.
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).

image.php

[ Dernière édition du message le 14/09/2013 à 19:07:25 ]

12
x
Hors sujet :
Je viens de m'apercevoir que j'ai écrit une bêtise ! Effectivement les potars sont toujours alimentés et seul le curseur est commuté.

Passer pour un idiot aux yeux d'un imbécile est une volupté de fin gourmet. (G. Courteline)

13
Ci-dessous le schema pour la platine de test des boutons poussoir multiplexés.
Elle permet de valider la solution hardware et software.

image.php

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.

x
Hors sujet :
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
14
Merci pour ce retour.

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 ]

15
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.
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.

16
je ne comprends absolument rien, je crois que je vais attendre pour mon contrôleur. :-D
17
Citation de Canem :
je ne comprends absolument rien, je crois que je vais attendre pour mon contrôleur. :-D

En fait et c'est l'avantage de l'open source, quand j'aurais fini le miens tu n'auras qu'a copier.
18
Citation :
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.

Citation :
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.

Citation :
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 ?

Citation :
Pour l'analogique un tableau suffit et pas vraiment besoins d'utiliser une fonction de moyenne.

A voir lors des tests ;-)

Citation :
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 !

Citation :
il faut ajouter un tableau qui reprend les destination CC.

Ca oui, on n'y coupe pas.

Citation :
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.

Citation :
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

19
Citation de secmast :

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 !
20
Puisque tu utilises un arduino, utilise les biblio déjà codées.
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 - FacebookYoutube
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

21
image.php

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.
22
Erreur câblage au niveau des inters... ;-)
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 ]

23

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  eek

Ah mais c'est bien sur, et c'est n'importe quoi  icon_redface.gif

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 ]

24
Correction faite. Merci...
25
Cool.
Petit conseil : ne laisses pas en l'air la broche 6 de tes 4051..

Formateur en techniques sonores ; électronicien ; auteur @ sonelec-musique.com