Se connecter
Se connecter

ou
Créer un compte

ou

Un contrôleur midi 100 basé sur Arduino

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

26
En effet ce n'est pas sur le schéma mais il faut connecter 6, 7 et 8 a la masse. Je corrige histoire de ne pas mettre les éventuelles intéressés dans l'erreur.

[ Dernière édition du message le 18/09/2013 à 19:04:29 ]

27
image.php

Voici donc la maquette qui va servir pour la mise au point du code.
28
29
Voici le code pour tester la maquette.

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 ]

30
Ca prend forme, très bien !

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