Se connecter
Se connecter

ou
Créer un compte

ou

Un contrôleur midi 100 basé sur Arduino

  • 90 réponses
  • 20 participants
  • 22 157 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
41
C'est en cours, en effet, j'attend une livraison pour l'instant.

C'est une interface qui me servira pour les réglages cachés du Moog Minitaur, ainsi plus besoins d'ordinateur.
J'y ai ajouté deux potentiomètres ainsi que 4 LED qui m'indique la position MIDI des boutons temporaire.

Voici la sérigraphie pour le face avant.

image.php

[ Dernière édition du message le 24/09/2013 à 13:36:50 ]

42
super interessant !

du coup le projet finale aura la carte arduino directement ou bien tu vas programmé un autre atmega pour un gain de place ?

j'ai un arduino également mais je trouve que ca fait vite cher si ont doit a chaque fois racheter une carte. Mais pourtant beaucoup le font , comprends pas...

rumorofsmoke.github.io/

43
Dans le proto que je monte, il y a aura une carte complète.
Ensuite je pense refaire le circuit et n'y mettre qu'un atmega328 pour un gain de place et d'argent. Le but étant ici de démontrer que pour par cher il est possible de faire une interface midi qui tient la route.
Je prépare d'ailleurs le code sur une configuration dynamique et non plus statique des CC en utilisant soit l'EEPROM soit une carte SD.
44

Salut Secmast,

 

Super projet, as tu vu ceux que proposer e-licktronic.

Ils ont aussi des libraires bien pratique pour utiliser des potentiomètres multiplexer comme sur ton projet.

Tu peux trouver des infos ici.

 

45
J'avais vu
Citation de Xarolium :
Salut Secmast, Super projet, as tu vu ceux que proposer e-licktronic. Ils ont aussi des libraires bien pratique pour utiliser des potentiomètres multiplexer comme sur ton projet. Tu peux trouver des infos ici.
Salut et merci, J'ai fais le tour et pour moi la solution la plus économique reste le 4051 qui coute 30 centimes pièces. La solution e-licktronick fait 12 euros pour 16 entrée, moi 60 centimes. Et je n'utilise aucune librairie. Le but étant de pouvoir gérer au maximum la SRAM et ne pas se laisser surprendre par des variables "inconnues" . Avec le 4051 et l'Arduino j'ai un temps de réponse de 1ms entre chaque scan avec 10 controleurs, je pourrais améliorer cette performance en utilisant du code hors IDE Arduino et même changer la résolution en passant de 10 bits a 7 bits ce qui accélère aussi le processus. Mais le code est plus complexe a comprendre. J'en suis pas encore là. Car pour mon utilisation 5 ms reste acceptable. Maintenant les solutions "clef en main" c'est parfais pour celui qui ne veux pas se prendre la tête, mais le cout en terme de flexibilité est énorme. Et c'est 5 fois plus cher.
46
Il est certain que les solutions toutes faites coûtent plus cher et ça se comprend puisqu'il n'y a pas que le prix des composants eux-mêmes à intégrer dans le total. L'approche de secmast est intéressante, il a déjà en tête des évolutions possibles et il sait où il met les doigts. L'intérêt de développer ses propres routines est de pouvoir tester plus loin les limites : puis-je réellement faire bosser mes commutateurs analogiques à 1 MHz sous 5 V ? A 1,2 MHz ? à à 1,5 MHz ? etc. Bon, dans le cas présent on n'a pas besoin de pousser les CI aux limites, mais ça ne fait pas de mal de les connaître.

Sans compter le fait qu'avec les modules d'extension tout faits, il faut toujours espérer qu'ils existent encore le jour (4 ans après ? ) où on décide d'étendre les fonctions de l'engin... Je pense qu'un 4051 se trouvera encore dans 10 ans (mais je sais, il ne faut jamais jurer de rien).

x
Hors sujet :
J'ai terminé hier soir un petit contrôleur midi 7 voies que j'avais commencé en 2009, un peu continué en 2011, et que j'avais laissé de côté pour X raisons. Je publierai le détail du truc le WE prochain sur mon site.

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

47
Pour 0.30€ le composant tu peux te faire un petit stock...
48

Citation de : adrienf

Pour 0.30€ le composant tu peux te faire un petit stock...

 Si tu en achète 100 chez Farnell ils sont a 0.125 euros pièce, ça fait la commande a 12,5 euros sans les frais de ports.  mrgreen

 

49
Voici le circuit terminé, il n'y manque que le jumper des boutons et bien entendu les boutons, potentiomètres, LED, connecteur DIN et connecteur alimentation qui vont venir sur le boitier. Boitier que j'attend toujours pour l'instant.

image.php
50
L'interface que je monte en ce moment est une interface dont les CC sont statique, le code que j'ai fournit peu néanmoins être modifié pour inclure une fonction de configuration des CC pour chaque controleur.

Je vous donne un code que j'ai testé et est relativement simple a mettre en oeuvre.
L'astuce ici est de détecter au moment de la mise en route si le bouton 1 est presser pour entrer en mode configuration.
Ensuite il suffit de tourner le potentiomètre 1 pour afficher la valeur du CC voulu pour le premier controleur de presser le bouton 2 pour passer au suivant et ainsi de suite jusqu'à la fin des contrôleurs.

Si le bouton un n'est pas presser au moment de la mise en route, l'Arduino lit l'EEPROM et prend les valeurs stockés.

Je vous donne le code brute fait pour 3 potentiomètres et deux boutons.

/* Bouton de config pin 2
Bouton de menu pin 3
Potentiometre de config A0*/
#include <EEPROM.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x20,16,2);

int controleur[5];
int boucle;
int potentiometre[3];

void setup() {
Serial.begin(9600);
lcd.init();
lcd.backlight();
pinMode(2, INPUT);
pinMode(3, INPUT);

// Si le bouton 2 est poussé entré en mode configuration
if (digitalRead(2) == HIGH) {
Serial.println("Mode Configuration");
lcd.setCursor(0,0);
lcd.print(" Configuration");
lcd.setCursor(0,1);
lcd.print("Controle");
{
for (boucle=0; boucle < 5; boucle++){
lcd.setCursor(10,1);
lcd.print(boucle+1);
lcd.print(" ");

Serial.println("--------------------------");
Serial.print("Entree donnee controleur ");
Serial.println(boucle+1);
Serial.println("--------------------------");
delay(250);

// Passage au controleur suivant
while (digitalRead(3) == LOW){
controleur[boucle] = EntreeControleur();

//Affichage sur le port série et l'écran LCD

Serial.print("Controleur : ");
Serial.print(boucle+1);
Serial.print(" > ");
Serial.println(controleur[boucle]);
lcd.setCursor(13,1);
lcd.print(controleur[boucle]);
lcd.print(" ");
}
}

//Fin de la boucle de configuration

Serial.println("Ecriture EEPROM");
lcd.clear();
lcd.print("Ecriture EEPROM");

//Ecriture dans l'EEPROM

for (boucle=0; boucle < 5; boucle++){
EEPROM.write(boucle, controleur[boucle]);


Serial.print("Ecrite controleur : ");
Serial.print(boucle+1);
Serial.print(" > ");
Serial.println(controleur[boucle]);
delay(250);
}
}
}

// Si le bouton 2 n'est pas pressé passage en mode normal

else {
Serial.println("Mode Normal...");
lcd.setCursor(0,0);
lcd.print("Mode Normal");

//Lecture dans l'EEPROM des valeurs CC pour les controleurs

for (boucle=0; boucle < 5; boucle++){
controleur[boucle]=EEPROM.read(boucle);
}

//Affichage des valeurs CC des controleur sur le port série et l'écran LCD

}
for (boucle=0; boucle < 5; boucle++){
Serial.print("Controleur : ");
Serial.print(boucle+1);
Serial.print(" > ");
Serial.println(controleur[boucle]);
lcd.clear();
lcd.print("Mode normal...");
lcd.setCursor(0,1);
lcd.print("..MIDI CRTL pret");

}
}

//Boucle principale de fonctionement où les controleurs sont lu et les données envoyées vers le port série si il y a un changement.

void loop() {
for(int boucle=0; boucle < 3; boucle++){
if (analogRead(boucle)/8 != potentiometre[boucle]){
potentiometre[boucle] = analogRead(boucle)/8;
Serial.print("1 ");
Serial.print(controleur[boucle]);
Serial.print(" ");
Serial.println(potentiometre[boucle]);
}
delay(1);
}
}

//Fonction de lecture du potentiometre 1 pour selection CC

int EntreeControleur()
{
int valeur = analogRead(0)/8;
return valeur;
}