venerdì 15 luglio 2016

Servo Shield per Arduino

Avevo gia' provato ad usare i servo sia in modo diretto che tramite una scheda apposita. Questa volta devo realizzare un movimento PTZ per una webcam

Questa e' la volta dell'Adafruit Servo Shield (o meglio di un suo clone cinese)
La scheda, che funziona sul I2C, riesce a pilotare 16 canali da 0 a 15 a ciascuno dei quali corrisponde un servo



Arduino non eroga abbastanza tensione per cui e' necessario connettere una alimentazione esterna allo shield. Nel mio caso ho usato un modulo MB102 da breadboard collegato ad alimentatore da 2 A/12 V per pilotare due servo. Puo' essere anche necessario inserire un condensatore

Questa e' la pedinatura con il cavo giallo (dati) verso l'interno della scheda ed il cavo marrone (GND) sull'esterno)



Fatte le connessioni si deve scaricare la librerie apposita da Adafruit
Quiesto e' lo sketch che ho usato..si devono definire i valori minimi e massimi di rotazione (da riccercare per tentativi)


----------------------------------------------------
#include <Wire.h>
#include <Adafruit_PWMServoDriver.h>

Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver(0x40);

#define SERVOMIN  200
#define SERVOMAX  400

void setup() {
  pwm.begin();
  pwm.setPWMFreq(60);  // Analog servos run at ~60 Hz updates
  yield();
}


void loop() {
  for (uint16_t pulselen1 = SERVOMIN; pulselen1 < SERVOMAX; pulselen1++) {
         pwm.setPWM(1, 0, pulselen1);
         delay(20);



        for (uint16_t pulselen = SERVOMIN; pulselen < SERVOMAX; pulselen++) {
              pwm.setPWM(0, 0, pulselen);
              delay(20);
              }
        delay(500);
        for (uint16_t pulselen = SERVOMAX; pulselen > SERVOMIN; pulselen--) {
              pwm.setPWM(0, 0, pulselen);
              delay(20);
              }
         delay(500);
  }

  for (uint16_t pulselen1 = SERVOMAX; pulselen1 > SERVOMIN; pulselen1--) {
         pwm.setPWM(1, 0, pulselen1);
         delay(20);



        for (uint16_t pulselen = SERVOMIN; pulselen < SERVOMAX; pulselen++) {
              pwm.setPWM(0, 0, pulselen);
              delay(20);
              }
        delay(500);
        for (uint16_t pulselen = SERVOMAX; pulselen > SERVOMIN; pulselen--) {
              pwm.setPWM(0, 0, pulselen);
              delay(20);
              }
         delay(500);
  }

}
----------------------------------------------------