Protocollo MIDI con arduino

ciao a tutti.
sto utilizzando una scheda arduino per pilotare vari servomotori tramite protocollo midi.
la configurazione è questa:
scheda arduino; software hairless; software midiloop; software ableton ( o qualsiasi software per gestione midi).

tramite libreria midi di arduino, a un control change seleziono una uscita arduino per poter cosi utilizzare il contro change per far muovere il servo.
il software hairless fa riconoscere la scheda arduino come periferica midi.
tramite il midi looper ho creato una porta midi che si interfaccia tra l'hairless e ableton ( o altro software).
ho un unico problema: riesco a gestire senza problemi fino a 2 servo. dal terzo servo in contemporanea mi si sballa tutto. i servo impazziscono.
utilizzo un alimentatore esterno da 5v 2a. considerando che i servo assorbono 0,24a non è problema di assorbimento.
il gnd è in comune tra arduino,alimentatore e servo. quindi non è nemmeno problema di cablaggio.
ho provato a utilizzare sia arduino nano, che arduino r3 sia arduino mega cambiando anche numerazione di porte. ma nulla. ho provato anche a installare tutto su altro pc supponendo fosse problema del pc ma nulla nemmeno li.
i servo singolarmente funzionano perfettamente, in coppia idem perfetti....da 3 in su iniziano a sbarellare.

vi allego lo sketch

#include <MIDI.h>
#include <Servo.h>


Servo servo1;
Servo servo2;
Servo servo3;
Servo servo4;
Servo servo5;

MIDI_CREATE_DEFAULT_INSTANCE();

void setup() {
  pinMode(LED_BUILTIN, OUTPUT);

  MIDI.begin(16);                           //cosi riceve su tutti i canali, senno metti il numero del canale che vuoi usare

  MIDI.setHandleControlChange(MyCCFunction);

  servo1.attach(7);                                      //pin del servo 1
  servo2.attach(8);                                      //pin del servo 2
  servo3.attach(9);                                      //pin del servo 3
  servo4.attach(10);                                     //pin del servo 4
  servo5.attach(5);                                     //pin del servo 5

  Serial.begin(57600);
}

void loop() {
  MIDI.read();
}


void MyCCFunction(byte channel, byte number, byte value) {
  switch (number) {
    case 21:                                                 //numero del control change 1
      servo1.attach(7);
      servo1.write (map (value, 0, 255, 0, 360));
      // Delay for servo movement
      delay(15);
      break;
    case 22:                                                 //numero del control change 2
      servo2.attach(8);
      servo2.write (map (value, 0, 255, 0, 360));
      // Delay for servo movement
      delay(15);
      break;
    case 23:                                                //numero del control change 3
      servo3.attach(9);
      servo3.write (map (value, 0, 255, 0, 360));
      // Delay for servo movement
      delay(15);
      break;
    case 24:                                                    //numero del control change 4
      servo4.attach(10);
      servo4.write (map (value, 0, 255, 0, 360));
      // Delay for servo movement
      delay(15);
      break;
    case 20:                                                    //numero del control change 5
      servo5.attach(5);
      servo5.write (map (value, 0, 255, 0, 360));
      // Delay for servo movement
      delay(15);
      break;
  }
}

Riesci a postare uno schema dei collegamenti?

Mmmm ... non conosco nulla di MIDI né le librerie che lo usano, ma ... sicuro non ci siano conflitti con il timer usato dalla libreria Servo (normalmente Timer 1). QUALE scheda Arduino stai usando ?

Guglielmo

All'inizio ho usato la nano e poi la mega. Stesso problema


Gnd in comune tra alimentatore, scheda e servo.
5v dell' alimentatore alimenta i servo.
I vari pin a ogni servo

Hai provato SENZA la parte MIDI? Solo a far muovere i servo, senza includere la libreria <MIDI.h> e senza alcuna chiamata ad essa ... vedi intanto se così, con un programma di prova, se riesci a far muovere correttamente i servo ... :roll_eyes:

Guglielmo

si appena provato con uno sketch nuovo e con i 3 servo negli stessi pin che si muovono di continuo funzionano correttamente.
quindi penso non sia un problema ne di servo ne di scheda ne di corrente.
aiutatemi:P:P:P

... infatti, come ti dicevo, è probabilmente un conflitto tra le due librerie (Servo e MIDI) ... magari usano entrambe una stessa risorsa ... :roll_eyes:

Potresti provar a cambiare i pin usati da alcuni dei servo e vedere se la situazione migliora o ... studiarti i sorgenti della libreria MIDI e vedere se qualche cosa va in conflitto.

Guglielmo

Comunque se usi una scheda con supporto nativo per MIDI over USB come ad esempio l'ATmega32U4 del Leonardo, sei in grado di usare Arduino come device MIDI senza passare per software esterni perché viene visto come un device MIDI USB a tutti gli effetti (liberando altre risorse del micro).

Dal punto di vista delle librerie, dai uno sguardo anche a questa (completissima) Control-Surface: Arduino library for creating MIDI controllers and other MIDI devices