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