Se connecter
Se connecter

ou
Créer un compte

ou

Un contrôleur midi 100 basé sur Arduino

  • 90 réponses
  • 20 participants
  • 22 158 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 ]

Afficher le sujet de la discussion
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