====== BrutBox V1 ====== La Brutbox v1.0 est un contrôleur MIDI/USB que l'on peut connecter à son ordinateur. Un micro-contrôleur Teensy 2.0 envoie les données de 8 capteurs simples (mono signal) : pression, bouton, lumière, distance, rotatif. Tous les fichiers de fabrication sur notre [[https://git.framasoft.org/resonance/brutbox|git.framasoft.org/resonance]]. {{:projets:brutbox:v1:bb-logo.jpg?400|}} ===== Électronique ===== Nous réalisons un circuit imprimé pour connecter la Teensy 2.0 à des prises USB mâles, faciles à trouver et résistantes aux manipulations. Les capteurs sont reliés par une prise USB femelle. ====Matériel==== * Carte [[https://www.pjrc.com/store/teensy.html|Teensy 2.0]] * Plaque de cuivre présensibilisée et matériel pour fabriquer un circuit imprimé * Capteurs : distance (x2), luminosité LDR (x2), potentiomètre (x2), pression (x1) et bouton d'arcade (x2) * Prise USB A (x8) et B (x8) * {{ :projets:brutbox:v1:liste_achat_brutbox_-_feuille_1.pdf |liste/liens indicatifs d'achats}} **Prises USB** : on utilise les broches +, - et D+. ====Réalisation==== Suivre cette page de ressources sur la fabrication de [[materiel:pcb-diy:accueil|circuits imprimés DIY]]. {{:projets:brutbox:v1:brutbox-v1-typons.jpg|}} \\ Impression du typon {{:projets:brutbox:v1:brutbox-v1-pcb.jpg|}} \\ Perçage des trous avec une fraiseuse numérique {{:projets:brutbox:v1:brutbox-v1-pcb-result.jpg|}} \\ Gravure chimique de la plaque ===== Boîtes ===== Découpe de trois plaques en bois de 3mm d'épaisseurs et de dimensions 50x30cm, avec une machine à découpe laser. Munissez-vous d'une colle à bois pour assembler les capteurs. Nous ne collons pas la face du dessus pour ouvrir et montrer comment sont connectés les capteurs. {{:projets:brutbox:v1:bb-boites-capteurs.png?400|}} \\ Planche capteurs à découper deux fois {{:projets:brutbox:v1:bb-boites-teensy.png?400|}} \\ Planche Teensy et capteurs à découper une fois {{:projets:brutbox:v1:dsc_7410.jpg?400|}} \\ Assemblage ===== Logiciel ===== ==== Teensy==== Code Teensy pour recevoir huit capteurs analogiques et envoyer les informations en MIDI. * Installer le logiciel Arduino * Installer l'extension [[https://www.pjrc.com/teensy/teensyduino.html|Teensyduino]] pour utiliser la Teensy avec Arduino * Téléverser le code sur votre Teensy ++++ teensy-8-in.ino | // the MIDI channel number to send messages const int channel = 1; // the MIDI continuous controller for each analog input const int controllerA0 = 1; // const int controllerA1 = 2; // const int controllerA2 = 3; // const int controllerA3 = 4; // const int controllerA4 = 5; // const int controllerA5 = 6; // const int controllerA6 = 7; // const int controllerA7 = 8; // void setup() { } // store previously sent values, to detect changes int previousA0 = -1; int previousA1 = -1; int previousA2 = -1; int previousA3 = -1; int previousA4 = -1; int previousA5 = -1; int previousA6 = -1; int previousA7 = -1; elapsedMillis msec = 0; void loop() { // only check the analog inputs 50 times per second, // to prevent a flood of MIDI messages if (msec >= 50) { msec = 0; int n0 = analogRead(A0) / 8; int n1 = analogRead(A1) / 8; int n2 = analogRead(A2) / 8; int n3 = analogRead(A3) / 8; int n4 = analogRead(A4) / 8; int n5 = analogRead(A5) / 8; int n6 = analogRead(A6) / 8; int n7 = analogRead(A7) / 8; // only transmit MIDI messages if analog input changed if (n0 != previousA0) { usbMIDI.sendControlChange(controllerA0, n0, channel); previousA0 = n0; } if (n1 != previousA1) { usbMIDI.sendControlChange(controllerA1, n1, channel); previousA1 = n1; } if (n2 != previousA2) { usbMIDI.sendControlChange(controllerA2, n2, channel); previousA2 = n2; } if (n3 != previousA3) { usbMIDI.sendControlChange(controllerA3, n3, channel); previousA3 = n3; } if (n4 != previousA4) { usbMIDI.sendControlChange(controllerA4, n4, channel); previousA4 = n4; } if (n5 != previousA5) { usbMIDI.sendControlChange(controllerA5, n5, channel); previousA5 = n5; } if (n6 != previousA6) { usbMIDI.sendControlChange(controllerA6, n6, channel); previousA6 = n6; } if (n7 != previousA7) { usbMIDI.sendControlChange(controllerA7, n7, channel); previousA7 = n7; } } // MIDI Controllers should discard incoming MIDI messages. // http://forum.pjrc.com/threads/24179-Teensy-3-Ableton-Analog-CC-causes-midi-crash while (usbMIDI.read()) { // ignore incoming messages } } ++++ === Utiliser deux CC par entrée analogique pour avoir 1023 valeur au lieu de 127 === ensuite dans puredata il faudra combiner les deux valeurs {{:projets:brutbox:v1:screen_shot_10-17-17_at_12.11_pm.png?nolink|}} ++++ teensy 8 control - 16 cc midi | // the MIDI channel number to send messages const int channel = 1; //Definir les sorties en fonction des canaux midi const int cc_A=8; const int cc_Abis=18; // A = pour l'entrée physique A0 const int cc_B=7; const int cc_Bbis=17; // B = pour l'entrée physique A1 ...etc const int cc_C=6; const int cc_Cbis=16; const int cc_D=5; const int cc_Dbis=15; const int cc_E=4; const int cc_Ebis=14; const int cc_F=3; const int cc_Fbis=13; const int cc_G=2; const int cc_Gbis=12; const int cc_H=1; const int cc_Hbis=11; void setup() {} int previous_n0a = -1; int previous_n0b = -1; int previous_n1a = -1; int previous_n1b = -1; int previous_n2a = -1; int previous_n2b = -1; int previous_n3a = -1; int previous_n3b = -1; int previous_n4a = -1; int previous_n4b = -1; int previous_n5a = -1; int previous_n5b = -1; int previous_n6a = -1; int previous_n6b = -1; int previous_n7a = -1; int previous_n7b = -1; elapsedMillis msec = 0; void loop() { // only check the analog cc_s 50 times per second (20ms), // to prevent a flood of MIDI messages if (msec >= 20) { msec = 0; int n0a = analogRead(A0) / 100; int n0b = analogRead(A0) - n0a*100; int n1a = analogRead(A1) / 100; int n1b = analogRead(A1) - n1a*100; int n2a = analogRead(A2) / 100; int n2b = analogRead(A2) - n2a*100; int n3a = analogRead(A3) / 100; int n3b = analogRead(A3) - n3a*100; int n4a = analogRead(A4) / 100; int n4b = analogRead(A4) - n4a*100; int n5a = analogRead(A5) / 100; int n5b = analogRead(A5) - n5a*100; int n6a = analogRead(A6) / 100; int n6b = analogRead(A6) - n6a*100; int n7a = analogRead(A7) / 100; int n7b = analogRead(A7) - n7a*100; // only transmit MIDI messages if analog cc_ changed // usbMIDI.sendControlChange(cc, value, channel); // control change if (n0a != previous_n0a) { usbMIDI.sendControlChange(cc_A, n0a, channel); previous_n0a = n0a; } if (n0b != previous_n0b) { usbMIDI.sendControlChange(cc_Abis, n0b, channel); previous_n0b = n0b; } // control change if (n1a != previous_n1a) { usbMIDI.sendControlChange(cc_B, n1a, channel); previous_n1a = n1a; } if (n1b != previous_n1b) { usbMIDI.sendControlChange(cc_Bbis, n1b, channel); previous_n1b = n1b; } // control change if (n2a != previous_n2a) { usbMIDI.sendControlChange(cc_C, n2a, channel); previous_n2a = n2a; } if (n2b != previous_n2b) { usbMIDI.sendControlChange(cc_Cbis, n2b, channel); previous_n2b = n2b; } // control change if (n3a != previous_n3a) { usbMIDI.sendControlChange(cc_D, n3a, channel); previous_n3a = n3a; } if (n3b != previous_n3b) { usbMIDI.sendControlChange(cc_Dbis, n3b, channel); previous_n3b = n3b; } // control change if (n4a != previous_n4a) { usbMIDI.sendControlChange(cc_E, n4a, channel); previous_n4a = n4a; } if (n4b != previous_n4b) { usbMIDI.sendControlChange(cc_Ebis, n4b, channel); previous_n4b = n4b; } // control change if (n5a != previous_n5a) { usbMIDI.sendControlChange(cc_F, n5a, channel); previous_n5a = n5a; } if (n5b != previous_n5b) { usbMIDI.sendControlChange(cc_Fbis, n5b, channel); previous_n5b = n5b; } // control change if (n6a != previous_n6a) { usbMIDI.sendControlChange(cc_G, n6a, channel); previous_n6a = n6a; } if (n6b != previous_n6b) { usbMIDI.sendControlChange(cc_Gbis, n6b, channel); previous_n6b = n6b; } // control change if (n7a != previous_n7a) { usbMIDI.sendControlChange(cc_H, n7a, channel); previous_n7a = n7a; } if (n7b != previous_n7b) { usbMIDI.sendControlChange(cc_Hbis, n7b, channel); previous_n7b = n7b; } } // MIDI Controllers should discard incoming MIDI messages. // http://forum.pjrc.com/threads/24179-Teensy-3-Ableton-Analog-CC-causes-midi-crash while (usbMIDI.read()) { // ignore incoming messages } } ++++ ==== Pure Data ==== Nous utilisons Pure Data pour générer les sons et les images. Nous nous basons sur notre //framework// [[http://malinette.info|Malinette]]. * Télécharger Pure Data Extended * Ouvrir le fichier "brutbox/software/puredata/brutbox/BRUTBOX-expert.pd" {{:projets:brutbox:v1:bb-puredata.png?800|}}