====== Malinette Hardware ====== ===== Malinette v1 - pédagogique ===== ==== Boîtier ==== * Voir la page [[projets:malinette-laserbox:accueil|Malinette - boîte]] {{:projets:boite-malinette-laser:boitemalinette.jpg?800|}} ==== Électronique ==== Arduino Roméo v2, plaque à essai et capteurs/actionneurs DfRobot ==== Code ==== Installer Arduino et téléverser l'exemple > Firmata > StandardFirmata ===== Malinette v2 - USB/MIDI - Arduino ===== Une interface physique et électronique qui communique en MIDI et permet la connection de capteurs et d'actionneurs avec des connecteurs USB, pour être compatible avec le projet [[projets:brutbox:accueil|BrutBox]]. {{:projets:malinette:hardware:img_0340.jpg?800|}} ==== Boîtier ==== * Fichiers de fabrication (découpe laser avec du contreplaqué de 3mm) :{{:projets:malinette:hardware:malinetteusbbox.zip|}} (07/16) {{:projets:malinette:hardware:dsc_6006.jpg?300 |}} {{:projets:malinette:hardware:malinetteusbshield-box.jpg?300 |}} {{:projets:malinette:hardware:img_0348.jpg?300|}} // // Export d'**Inkscape** vers DFX : décocher POLYLINE {{:projets:malinette:hardware:malinette-usb-box-v1-export-inkscape.png?300|}} Réglages **RdWorks** pour la découpe laser {{:projets:malinette:hardware:malinette-usb-box-v1-rdworks.png?600|}} ==== Électronique ==== * Fichiers **KiCad**, **Cambam**, **Svg** et **GCode** : {{:projets:malinette:hardware:malinetteusbshield.zip|}} 07/2016 Carte double face avec connecteurs USB. Par défaut 4 capteurs analogiques et 12 sorties sont possibles. En plaçant les jumpers vers le bas, il est possible d'utiliser les 2 autres capteurs à la place de certaines sorties. {{:projets:malinette:hardware:img_20160213_054204.jpg?300 |}} {{:projets:malinette:hardware:img_20160213_061711.jpg?300 |}} {{:projets:malinette:hardware:img_20160213_062851.jpg?300|}} // // ==== Code ==== * Fichiers (Arduino et Pure Data) : {{:projets:malinette:hardware:malinette_midi.zip|}} L'Arduino communique en Midi. Pour installer le firmware Midi, suivre les instructions de la page [[logiciels:arduino-midi:accueil|Arduino et MIDI]]. Avec Pure Data, on contrôle l'ouverture des entrées et le mode des sorties (digital, pwm, servo). Si vous voulez utiliser plusieurs, il faudra peut-être changer le canal Midi dans le code, au début du fichier. {{:projets:malinette:hardware:malinette-midi-puredata.png|}} ++++ Code Arduino Uno : malinette_midi_uno.ino | /* * Malinette Midi for Arduino Uno * * Open/Close Analog Sensors * Outputs (Digital, PWM, Servo) except 0 and 1 (rx/tx) * * http://malinette.info * Reso-nance Numérique * 24/06/16 * * modif : 13/12/2016 */ #include #include MIDI_CREATE_DEFAULT_INSTANCE(); const int channel = 4; // midi channel const int anaNb = 4; // number of inputs const int outNb = 13; // number of outputs (note that we have 11 outputs, we don't use rx/tx) const int offsetAna = 20; // > ctlout 20 to control ana const int offsetOut = 30; // > ctlout 30 to control out const long interval = 30; // sampling rate // SENSORS int anaState[anaNb]; // analog on/off (O or 1); int anaValues[anaNb]; // current analog values int anaLastValues[anaNb]; // previous analog values //OUT int outState[outNb]; //modes (0,1,2,3) (none, digital, pwm, servo) Servo servos[6]; // SAMPLING RATE unsigned long currentMillis; unsigned long previousMillis = 0; // --------------- SETUP --------------- // void setup() { // Setup output pins (start from 2) for (int i = 2; i < outNb; i++) { pinMode(i, OUTPUT); } // Set Callback function MIDI.setHandleControlChange(handleControlChange); // Initiate MIDI communications, listen to all channels MIDI.begin(channel); } // --------------- LOOP --------------- // void loop() { MIDI.read(); // Sampling rate currentMillis = millis(); if(currentMillis - previousMillis >= interval) { previousMillis = currentMillis; // Analog sensors loop for (int i = 0; i < anaNb; i++) { if (anaState[i] > 0) { // Test on/off anaValues[i] = (int) analogRead(i) / 8; // 10 bits > 7 bits if (anaValues[i] != anaLastValues[i]) { MIDI.sendControlChange(i, anaValues[i], channel); anaLastValues[i] = anaValues[i]; } } } } } // --------------- Receive Control Change --------------- // void handleControlChange(byte channel, byte number, byte value) { // outputs if(number < offsetAna) { setOutValue(number, value); } // ana states else if (number >= offsetAna && number < offsetOut) { anaState[number-offsetAna] = value; } // outputs states else if (number >= offsetOut) { setOutState(number-offsetOut, value); } } // --------------- SET OUTPUT --------------- // void setOutValue(int number, int value) { int state = outState[number]; if( state == 1) { // digital mode if(value == 0) {digitalWrite(number, LOW);} if(value >= 1) {digitalWrite(number, HIGH);} } else if( state == 2){ // pwm mode analogWrite(number, map(value,0,127,0,255)); } else if( state == 3){ // servo mode if (servos[number].attached()) {servos[number].write(map(value,0,127,0,180));} } } void setOutState(int number, int value) { // Check last state to turn off if ( outState[number] == 1) {digitalWrite(number, LOW);} else if ( outState[number] == 2) {analogWrite(number, 0);} if (value == 3) { if (!servos[number].attached()) {servos[number].attach(number);} } else { if (servos[number].attached()) {servos[number].detach();} } outState[number] = value; } ++++ ++++ Code Arduino Leonardo : malinette_midi_leonardo.ino | /* * Malinette Midi with Teensy or Leonardo * * Open/Close Analog Sensors * Outputs (Digital, PWM, Servo) except 0 and 1 (rx/tx) * * http://malinette.info * Reso-nance Numérique * 24/06/16 * * modif : 13/12/16 */ #include const int channel = 4; // midi channel const int anaNb = 4; // number of inputs const int outNb = 13; // number of outputs (note that we have 11 outputs, we don't use rx/tx) const int offsetAna = 20; // > ctlout 20 to control ana const int offsetOut = 30; // > ctlout 30 to control ana int rate = 30; // sampling rate // SENSORS int anaState[anaNb]; // Analog on/off (O or 1); int anaValues[anaNb]; // current analog values int anaLastValues[anaNb]; // previous analog values //OUT int outState[outNb]; //modes (0,1,2,3) (none, digital, pwm, servo) Servo servos[6]; // SAMPLING RATE elapsedMillis msec = 0; // --------------- SETUP --------------- // void setup() { // Setup output pins (start from 2) for (int i = 2; i < outNb; i++) { pinMode(i, OUTPUT); } // Set Callback function usbMIDI.setHandleControlChange(handleControlChange); // Initiate MIDI communications, listen to all channels //usbMIDI.begin(channel); } // --------------- LOOP --------------- // void loop() { // Sampling rate if (msec >= rate) { msec = 0; // Analog sensors loop for (int i = 0; i < anaNb; i++) { if (anaState[i] > 0) { // Test on/off anaValues[i] = (int) analogRead(i) / 8; // 10 bits > 7 bits if (anaValues[i] != anaLastValues[i]) { usbMIDI.sendControlChange(i, anaValues[i], channel); anaLastValues[i] = anaValues[i]; } } } } // 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 } } // --------------- Receive Control Change --------------- // void handleControlChange(byte channel, byte number, byte value) { // outputs if(number < offsetAna) { setOutValue(number, value); } // ana states else if (number >= offsetAna && number < offsetOut) { anaState[number-offsetAna] = value; } // outputs states else if (number >= offsetOut) { setOutState(number-offsetOut, value); } } // --------------- SET OUTPUT --------------- // void setOutValue(int number, int value) { int state = outState[number]; if( state == 1) { // digital mode if(value == 0) {digitalWrite(number, LOW);} if(value >= 1) {digitalWrite(number, HIGH);} } else if( state == 2){ // pwm mode analogWrite(number, map(value,0,127,0,255)); } else if( state == 3){ // servo mode if (servos[number].attached()) {servos[number].write(map(value,0,127,0,180));} } } void setOutState(int number, int value) { // Check last state to turn off if ( outState[number] == 1) {digitalWrite(number, LOW);} else if ( outState[number] == 2) {analogWrite(number, 0);} if (value == 3) { if (!servos[number].attached()) {servos[number].attach(number);} } else { if (servos[number].attached()) {servos[number].detach();} } outState[number] = value; } ++++ ===== Malinette v3 - USB/MIDI - Teensy ===== ==== Boîtier ==== En cours ==== Électronique ==== * Ancienne version : [[projets:malinette:teensy4malinette:accueil|Teensy4Malinette]] ==== Code ==== * Ancienne version : [[.:teensy-midi-pd:|]] * Nouvelle version, prendre le code de la Malinette v2 avec la carte Leonardo, cela devrait marcher.