====== 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|}}