Wiki

Reso-nance numérique | Arts et cultures libres

Outils du site


Panneau latéral

projets:malinette:hardware:accueil

Ceci est une ancienne révision du document !


Malinette Hardware

Malinette v1 - pédagogique

Boîtier

É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

Boîtier

Export d'inkscape vers DFX : décocher POLYLINE

Réglages RdWorks pour la découpe laser

Électronique

==== Code ==== * Fichiers (Arduino et Pure Data) : malinette_midi.zip Pour installer le firmware Midi, suivre les instructions de la page Arduino et MIDI. ++ 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
 */
 
#include <Servo.h>
#include <MIDI.h>
 
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 ana
 
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 - 2); 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
 */
 
#include <Servo.h>
 
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 - 2); 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 ==== * Teensy4Malinette Recherches et images ==== Code ==== * Ancienne version : teensy-midi-pd

/home/resonancg/www/wiki/data/attic/projets/malinette/hardware/accueil.1468601528.txt.gz · Dernière modification: 2016/07/15 18:52 de resonance