Un contrôleur midi 100 basé sur Arduino
- 90 réponses
- 20 participants
- 22 157 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
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.
[ Dernière édition du message le 24/09/2013 à 13:36:50 ]
redpill
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/
secmast
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.
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.
secmast
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.
Rémy M. (chimimic)
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).
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
adrienf
secmast
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.
secmast
secmast
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;
}
- < Liste des sujets
- Charte