MIDI TOY

Révision de 21 janvier 2014 à 18:57 par ThomasB (discussion | contributions) (Partie hardware)

Révision de 21 janvier 2014 à 18:57 par ThomasB (discussion | contributions) (Partie hardware)


prototypage d'une interface MIDI pour contrôler tous types de jouets.

JoliAfficheur.jpg

Contributeur·ice·s

User:[[contributeur::Thomas
La propriété « Contributeur » (comme le type de page) avec la valeur d’entrée « User:[[contributeur::Thomas » contient des caractères non valides ou est incomplète, et donc peut provoquer des résultats inattendus lors d’une requête ou d’un processus d’annotation.
|Thomas]]

Statut du projet

experimental

Statut de la publication

License

GPL v3.0

Inspiration

Fichiers source

Machines

Matériaux

Lien





Sommaire

Contrôleur MIDI pour engins électroniques modifiés

Note d'intention :

Le but est de pouvoir contrôler n'importe quel machine électronique fonctionnant sur faible voltage (12V maximum) et que l'on peut trouver à bas coût dans les vides greniers, emmaus … Afin de pouvoir créer des instruments de musique électronique à partir de n'importe quel rebut électronique de préférence sonores.

Quels modes de synchronisation possibles ?

MIDI

Sync

CV/Gate

OSC

Plusieurs pistes existantes pour contrôler des machines 12V

Casper Electronics version :

méthode proposée par Casper Electronics

HighLy Liquid version :

Matériel et composants utilisés :

transistors NPN :

Relais :

multiplexer 4066 :

multiplexer 4051 :

Little Scale versions :

Version 4066

http://little-scale.blogspot.fr/search/label/circuit%20bending?updated-max=2013-05-22T17:45:00%2B09:30&max-results=20&start=6&by-date=false

Exploration du circuit bending en utilisant un microcontrolleur du type d'Arduino pour émuler la pression d'un bouton, le contrôle d'un oscillateur etc. Chaque bouton sur un jouet met en contact deux parties du circuit du jouet. Il s'agit dans un premier temps de trouver ces 2 parties et de trouver un endroit ou il est possible de les connecter.

Partie hardware


Connecter le point A au point 1 équivaux à presser le bouton correspondant.

Il s'agit maintenant de connecter ses points là de façon électrique en utilisant Arduino.

Arduino ne peut pas connecter à lui seul 2 boutons, il faut utiliser une puce 4066 (4066 Quad Bi-Lateral Switch CMOS IC).

Cette puce coûte à peu près 50 centimes. Le 4066 est une puce switch qui combine 4 interrupteurs électriques.

Par exemple le pin 13 contrôle le mécanisme pour fermer et ouvrir les pin 1 & 2 et ainsi contrôler l'ouverture et la fermeture du bouton de façon électrique.

Si on envoi 5V sur le pin13 le pin 1 & 2 sont connectés, sinon ils sont déconnectés. Ce signal de 5V peut être généré par Arduino.

NB : la résistance entre 1 & 2 se nomme RON, on trouve cette valeur dans le datasheet de la puce. Sa valeur est de 470 Ohm à 25°C pour la HCF4066. Cette valeur est peut être la raison pour laquelle le 4066 ne marche pas pour l'instant sur tous les jouets -> Après tests le problème ne vient pas de là.

Voici comment connecter le 4066 avec Arduino et le jouet :

méthode proposée par Casper Electronics

méthode proposée par Casper Electronics

Partie software

Voici un code simple pour tester le trigger dans Arduino :

void setup() { pinMode(0, OUTPUT);  }

void loop() { digitalWrite(0, HIGH);  delay(500);  digitalWrite(0, LOW);  delay(500); }

Le code utilisé pour MIDI TOY version 4066

int incomingByte = 0; // for incoming serial data

const int nb = 12; int toy [nb]; char input [nb] = {

 'A', 'Z', 'E', 'R', 'T', 'Y', 'U', 'I', 'O', 'P', 'Q', 'S'}; 


void setup() {

 Serial.begin(9600);
 for(int i=0; i<nb; i++){
   toy[i] = i;
   pinMode(toy[i]+2, OUTPUT);
 }

}

void loop(){

 if(Serial.available() > 0){
   incomingByte = Serial.read();
   for(int i=0; i<nb; i++){
     if(incomingByte == input[i])
       digitalWrite(toy[i]+2, HIGH);
   }
 }
 // cette partie est importante car elle permet de réguler la vitesse de commutation des touches du jouet
 // on peut la changer en fonction du jouet (10ms pour un jouet de bonne qualité permettra de créer des
 // rythmes rapides sans coupures de son)
 delay(70);  
 for(int i=0; i<nb; i++){
   digitalWrite(toy[i]+2, LOW);
 }

}

Version multiplexer 4051

Utilisation d'une puce 4051 analog multiplexer.

Partie hardware

Illustration du fonctionnement du multiplexer CD4051.

Maintenant que vous avez compris parfaitement le fonctionnement d'un multiplexer. Voyons voir comment ça se soude sur notre Arduino :

méthode proposée par Casper Electronics

Partie software

Le code utilisé pour MIDI TOY version 4051

Pour l'instant pas commenté, mais il faut noter qu'il est nécessaire d'utiliser le point inhibit de la puce pour éviter un effet boucle sur le déclenchement des sons.

méthode proposée par Casper Electronics

int incomingByte = 0; // for incoming serial data

const int nb = 12; int inhibit = 7; int out1 = 8; int out2 = 9; int out3 = 10; char input [nb] = {

 'A', 'Z', 'E', 'R', 'T', 'Y', 'U', 'I', 'O', 'P', 'Q', 'S'}; 


void setup() {

 Serial.begin(9600);
 pinMode(out1,OUTPUT);
 pinMode(out2,OUTPUT);
 pinMode(out3,OUTPUT);
 pinMode(inhibit, OUTPUT);

}

void loop() {

 if(Serial.available() > 0){
   incomingByte = Serial.read();
   for(int i=0; i<nb; i++){
     if(incomingByte == input[i]){
       switch(incomingByte){
       case 'A':
         /* Select Input 1 */
         digitalWrite(inhibit, LOW);
         digitalWrite(out1, LOW);
         digitalWrite(out2, LOW);
         digitalWrite(out3, LOW);
         delay(70);
         break;      
       case 'Z':
         /* Select Input 2 */
         digitalWrite(inhibit, LOW);
         digitalWrite(out1, LOW);
         digitalWrite(out2, LOW);
         digitalWrite(out3, HIGH);
         delay(70);
         break;
       case 'E':
         /* Select Input 3 */
         digitalWrite(inhibit, LOW);
         digitalWrite(out1, LOW);
         digitalWrite(out2, HIGH);
         digitalWrite(out3, LOW);
         delay(70);
         break;
       case 'R':
         /* Select Input 4 */
         digitalWrite(inhibit, LOW);
         digitalWrite(out1, LOW);
         digitalWrite(out2, HIGH);
         digitalWrite(out3, HIGH);
         delay(70);
         break;
       case 'T':
         /* Select Input 5 */
         digitalWrite(inhibit, LOW);
         digitalWrite(out1, HIGH);
         digitalWrite(out2, LOW);
         digitalWrite(out3, LOW);
         delay(70);
         break;
       case 'Y':
         /* Select Input 6 */
         digitalWrite(inhibit, LOW);
         digitalWrite(out1, HIGH);
         digitalWrite(out2, LOW);
         digitalWrite(out3, HIGH);
         delay(70);
         break;
       case 'U':
         /* Select Input 7 */
         digitalWrite(inhibit, LOW);
         digitalWrite(out1, HIGH);
         digitalWrite(out2, HIGH);
         digitalWrite(out3, LOW);
         delay(70);
         break;
       case 'I':
         /* Select Input 8 */
         digitalWrite(inhibit, LOW);
         digitalWrite(out1, HIGH);
         digitalWrite(out2, HIGH);
         digitalWrite(out3, HIGH);
         delay(70);
         break;
       default:
         digitalWrite(inhibit, HIGH);
         delay(70);
       }
     }
   }
 }
 else{
   digitalWrite(inhibit, HIGH);
   delay(70);
 }

}

Divers

Pour coder la puce Atmel Tiny ATTiny85

http://www.hacknowledge.org/drupal/?q=ispprogrammer