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