Come utilizzare la libreria di Adafruit Servo Controller

Ciao a tutti, il mio problema è che nn reisco a capire come funziona la libreria della shield di adafruit per il controllo dei servo motori, in particolare non riesco a capire il funzionamento della funzione: pwm.setPWM(n,x,y), la "n" ho capito che identifica il servo invece "x" e "y" non capisco a cosa si riferiscono, nella libreria vengono identificate come on e off... Ho pensato che magari serve per fare girare il servo tipo da x=10° a y=80° ma quando faccio le prove il servo si incricca e mi sembra che va oltre il suo limite, il servo in teoria gira da 0° a 180° anche se dopo ho visto che non è proprio così... Se utilizzo la servo-shield "cinese" utilizzando le istruzioni della libreria servo.h, il servo gira bene senza incriccarsi o altro.. =(
I servi che utilizzo sono Tower Pro 9g SG90.

Questa è la libreria:

/*************************************************** 
  This is a library for our Adafruit 16-channel PWM & Servo driver

  Pick one up today in the adafruit shop!
  ------> http://www.adafruit.com/products/815

  These displays use I2C to communicate, 2 pins are required to  
  interface. For Arduino UNOs, thats SCL -> Analog 5, SDA -> Analog 4

  Adafruit invests time and resources providing this open source code, 
  please support Adafruit and open-source hardware by purchasing 
  products from Adafruit!

  Written by Limor Fried/Ladyada for Adafruit Industries.  
  BSD license, all text above must be included in any redistribution
 ****************************************************/

#ifndef _ADAFRUIT_PWMServoDriver_H
#define _ADAFRUIT_PWMServoDriver_H

#if ARDUINO >= 100
 #include "Arduino.h"
#else
 #include "WProgram.h"
#endif


#define PCA9685_SUBADR1 0x2
#define PCA9685_SUBADR2 0x3
#define PCA9685_SUBADR3 0x4

#define PCA9685_MODE1 0x0
#define PCA9685_PRESCALE 0xFE

#define LED0_ON_L 0x6
#define LED0_ON_H 0x7
#define LED0_OFF_L 0x8
#define LED0_OFF_H 0x9

#define ALLLED_ON_L 0xFA
#define ALLLED_ON_H 0xFB
#define ALLLED_OFF_L 0xFC
#define ALLLED_OFF_H 0xFD


class Adafruit_PWMServoDriver {
 public:
  Adafruit_PWMServoDriver(uint8_t addr = 0x40);
  void begin(void);
  void reset(void);
  void setPWMFreq(float freq);
  void setPWM(uint8_t num, uint16_t on, uint16_t off);

 private:
  uint8_t _i2caddr;

  uint8_t read8(uint8_t addr);
  void write8(uint8_t addr, uint8_t d);
};

#endif

Hai letto QUESTO tutorial ?

Ed il reference della libreria ?

Guglielmo

gpb01:
Hai letto QUESTO tutorial ?

Ed il reference della libreria ?

Guglielmo

Salve, si ho letto entrambi e ho guardato anche su altri siti, ho capito che su on e off bisogna mettere il valore per far passare dal livello basso a quello alto e viceversa(ho capito così io) ma non capisco come ciò mi serva per far muovere il servo... Per esempio se devo girare il servo a 180° con la libreria servo.h dovevo scrivere myservo.write(180°) qui invece non capisco come fare la stessa cosa... sto guardando altri sketch in rete che utilizzano adafruit come questo (le farà scaricare un file) ma non riesco a capire...

Ho provato a fare un programmino di prova utilizzando una piccola parte di uno sketch trovato in rete, il risultato è questo:

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

Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver();

#define SERVOMIN  150
#define SERVOMAX  600 
#define CENTRE    375 

int offset[18] = {20,30,0, 10,20,0, 15,-20,0, 15,30,0, 0,0,10, 15,0,30}; 

void setup() 
{
  pwm.begin();
  pwm.setPWMFreq(60);      
}

void loop() 
{  
  for (int i = 0; i < 9; i++)
  {
    pwm.setPWM(i, 0, CENTRE + offset[i]);
  }
}

Non posso dire di aver capito cosa fa, perchè non riesco a capire bene il funzionamento di setPWM, ho intuito che deve far girare ogni servo a una determinata posizione a partire dal centro...

Smanettando un po' mi sembra di aver capito come funziona.. :slight_smile: Ma mi è sorto un'altro problema.. quando "dico" ai servo-motori di girare al massimo, ogni volta un servo inizia a vibrare, ho subito pensato che succede perchè il valore massimo è troppo elevato ma se cambio il valore massimo diminuendolo di 5, il servo che vibrava prima non vibra più, al suo posto ne vibra un'altro... Inizialmente il valore massimo era 600 ora l'ho diminuito fino a 540 e sembra che non vibra nessun servo anche se qualche volta ma molto raramente un servo fa i capricci... Volevo chiedere se ciò dipende dal fatto che il valore massimo superava la capacità del servo, in questo caso però non capisco perchè vibra uno soltanto, oppure dipende dalla batteria? Uso 6 pile AA da 1,5V ciascuna e mi sembra buono.. può essere che si sono rovinate perchè una volta accidentalmente i fili "-" e "+" sono entrati in contatto creando un cortocircuito e le batterie si sono riscaldate parecchio, addirittura il box ha iniziato a fondersi li dove toccava il ferro, però le batterie dall'esterno sembrano intatte.. poi il cortocircuito è durato 1 minuto o forse di meno perchè me ne sono accorto subito per fortuna... :~