PCA9685 e libreria

Ciao a tutti ho recentemente acquistato il PCA9685 e scaricato la libreria ADAFRUIT.
Qualcuno sa indicarmi i comandi da utilizzare per pilotare il PCA o una guida che spiega bene i comandi?

Grazie a tutti quelli che mi aiuteranno

--> Overview | Adafruit PCA9685 16-Channel Servo Driver | Adafruit Learning System

1 Like

grazie paolop, questa guida l'avevo già vista, ma esistono solo i comandi

pwm.setPWM
pwm.setPWMFreq(1000)

... e se guardi i sorgenti della libreria ti accorgi che sono anche gli UNICI. Non ne sono implementati altri (salvo due funzioni interne per leggere e scrivere).

/*************************************************** 
  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
 ****************************************************/

#include <Adafruit_PWMServoDriver.h>
#include <WIRE.h>
#ifdef __AVR__
 #define WIRE Wire
#else // Arduino Due
 #define WIRE Wire1
#endif

Adafruit_PWMServoDriver::Adafruit_PWMServoDriver(uint8_t addr) {
  _i2caddr = addr;
}

void Adafruit_PWMServoDriver::begin(void) {
 WIRE.begin();
 reset();
}


void Adafruit_PWMServoDriver::reset(void) {
 write8(PCA9685_MODE1, 0x0);
}

void Adafruit_PWMServoDriver::setPWMFreq(float freq) {
  //Serial.print("Attempting to set freq ");
  //Serial.println(freq);
  
  float prescaleval = 25000000;
  prescaleval /= 4096;
  prescaleval /= freq;
  prescaleval -= 1;
  Serial.print("Estimated pre-scale: "); Serial.println(prescaleval);
  uint8_t prescale = floor(prescaleval + 0.5);
  Serial.print("Final pre-scale: "); Serial.println(prescale);  
  
  uint8_t oldmode = read8(PCA9685_MODE1);
  uint8_t newmode = (oldmode&0x7F) | 0x10; // sleep
  write8(PCA9685_MODE1, newmode); // go to sleep
  write8(PCA9685_PRESCALE, prescale); // set the prescaler
  write8(PCA9685_MODE1, oldmode);
  delay(5);
  write8(PCA9685_MODE1, oldmode | 0xa1);  //  This sets the MODE1 register to turn on auto increment.
                                          // This is why the beginTransmission below was not working.
  //  Serial.print("Mode now 0x"); Serial.println(read8(PCA9685_MODE1), HEX);
}

void Adafruit_PWMServoDriver::setPWM(uint8_t num, uint16_t on, uint16_t off) {
  //Serial.print("Setting PWM "); Serial.print(num); Serial.print(": "); Serial.print(on); Serial.print("->"); Serial.println(off);

  WIRE.beginTransmission(_i2caddr);
  WIRE.write(LED0_ON_L+4*num);
  WIRE.write(on);
  WIRE.write(on>>8);
  WIRE.write(off);
  WIRE.write(off>>8);
  WIRE.endTransmission();
}

uint8_t Adafruit_PWMServoDriver::read8(uint8_t addr) {
  WIRE.beginTransmission(_i2caddr);
  WIRE.write(addr);
  WIRE.endTransmission();

  WIRE.requestFrom((uint8_t)_i2caddr, (uint8_t)1);
  return WIRE.read();
}

void Adafruit_PWMServoDriver::write8(uint8_t addr, uint8_t d) {
  WIRE.beginTransmission(_i2caddr);
  WIRE.write(addr);
  WIRE.write(d);
  WIRE.endTransmission();
}

Guglielmo

Grazie gpb01,
comincerò a fare delle prove per capire come utilizzare queste funzioni e incrementarle nei miei programmi. Dovrò capire inoltre come utilizzare le uscite cone on/off senza l'uso del PWM.
Come al solito vi ringrazio per i consigli sempre molto utili e preziosi

Prova a vedere cosa succede se imposti il PWM a 0 e a 255.

adesso faccio qualche esperimento e vi tengo informati sulle novità

non c'è verso di farlo funzionare :cold_sweat: :cold_sweat:

É molto difficile aiutarti perché ci hai dato pochissime informazioni.
Ciao Uwe

eccomi qua effettivamente non vi ho dato molte informazioni, ma ero preso a capire il funzionamaneto di questo componente.
Allora vi racconto un pò cosa ho fatto:
in RS ho acquistato PCA9685 e il CS per montarlo

dopo di che ho scaricato la libreria al seguente link: Adafruit 16-Channel 12-bit PWM/Servo Driver - I2C interface [PCA9685] : ID 815 : $14.95 : Adafruit Industries, Unique & fun DIY electronics and kits.
E fin qui tutto ok.
Ho montato tutto su bread board e collegato arduino utilizzando due resistenza di pull up su SDA e SCL da 4,7k. ho caricato gli esempi e un servo su una sola uscita ma niente non si muove nulla.
O meglio l'unico servo va a scatti a volte oppure rimane fermo.
Leggendo la libreria ho notato che l'indirizzo è 0x40, ma come faccio a impostare questo indirizzo sul PCA? Devo settare gli ingressi da A0......A5 in qualche modo. Ho fatto qualche tentativo ma niente. Indem per il pin 23 (OE).
Qualcuno di voi esperti riesce a darmi una mano??? :slight_smile: :slight_smile: :slight_smile: :slight_smile: :slight_smile: :grin: :grin: :grin:

Grazie in anticipo a tutti

Marcduino:
...
Leggendo la libreria ho notato che l'indirizzo è 0x40, ma come faccio a impostare questo indirizzo sul PCA? Devo settare gli ingressi da A0......A5 in qualche modo. Ho fatto qualche tentativo ma niente. Indem per il pin 23 (OE).
Qualcuno di voi esperti riesce a darmi una mano??? :slight_smile: :slight_smile: :slight_smile: :slight_smile: :slight_smile: :grin: :grin: :grin:
...

Scusa, ma ti sei STUDIATO il datasheet di quel chip ? Perché mi sembra descritto tutto piuttosto chiaramente con tutte le tempistiche ed i valori dei registri ...

Guglielmo

Edit : e Adafruit ha anche un bel tutorial QUI !

PCA9685 (16-channel, 12-bit PWM).pdf (1.14 MB)

ciao Guglielmo, ti ringrazio per sottolineare sempre in maiuscolo parole come STUDIATO, o come nel post precedente UNICI.
Si prima di disturbarvi ho letto ma forse se domando è perché non ho capito sia il datasheet sia gli esempi.
Se disturbo o se non sono alla tua altezza dillo che vado su altri forum a a chiedere........... Mi sono sembrati un po sgarbati i tuoi interventi tutto qua...

Marcduino:
..... Mi sono sembrati un po sgarbati i tuoi interventi tutto qua...

No, sono solo mirati a far capire che NON si può pretendere, senza esperienza, di comprare un chip (... non proprio elementare), un adattatore e sperare che tutto vada bene !

Se non hai capito né il datasheet né gli esempi ... non pensi che forse ti sei imbarcato in qualche cosa che è oltre il tuo livello e che sarebbe bene prima farsi delle solide basi ???

Magari avresti fatto meglio a prendere la board già fatta di Adafruit, board che sicuramente funziona, ed a studiarne il funzionamento ! Poi potevi anche provare a realizzarti qualche cosa tu solo con il chip e l'adattatore, ma partendo da conoscenze già aquisite !

Tutto qui ...

Guglielmo