PCA9685 per servomotori

Salve a tutti , sono Pietro. Mi domandavo se qualcuno di voi potesse aiutarmi su un progetto che ho in mente da molto tempo e che sono riuscito a fare o almeno per metà. il mio progetto riguarda la PCA9685,
scheda che serve per pilotare molti servo assieme via I2C.
All’inizio ho utilizzato questo codice:

#include <Wire.h>

#include <Adafruit_PWMServoDriver.h>

Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver();

#define SERVOMIN  125 
#define SERVOMAX 600 

int servonum =0; 


void setup() {

  Serial.begin(9600);

  Serial.println("8 channel Servo test!");

  pwm.begin();

  pwm.setPWMFreq(60);

  delay(10);

}

void loop() {

  pwm.setPWM(servonum,0, 600);

  delay(1000);

  pwm.setPWM(servonum,0, 150);

  delay(1000);

  pwm.setPWM(servonum,0, 300);

  delay(1000);

  pwm.setPWM(servonum,0, 150);

  delay(1000);
 
servonum++;
  
  if (servonum > 8) servonum = 0;

}

Il codice in se non ha nulla di sbagliato però vorrei che tutti i servo collegati alla PCA9685 svolgessero lo stesso lavoro nello stesso momento e non uno dopo l’altro. Se riuscite scrivetemi qualche codice che possa aiutarmi.
Grazie in anticipo.

... invece di usare un FOR, ripeti, per ogni singola posizione, la pwm.setPWM() per ogni singolo servo.

Guglielmo

Scusa l'ignoranza:
in che senso;
nel codice non c'è un ciclo FOR;
se puoi scrivimi un esempio.

Si, scusa, mi sono espresso male, il loop() nel tuo caso fa le veci di un ciclo FOR (si ripete in continuazione ogni volta incrementando il numero del servo), ma il concetto è esattamente lo stesso ... invece che ad ogni chiamata del loop() fare i movimenti di UN servo (quello selezionato da "servonum"), li devi fare per TUTTI i servo, uno in fila all'altro.

Guglielmo

Più o meno così:

#include <Wire.h>

#include <Adafruit_PWMServoDriver.h>

Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver();

#define SERVOMIN  125 
#define SERVOMAX 600 

int servonum =0; 


void setup() {

  Serial.begin(9600);

  Serial.println("8 channel Servo test!");

  pwm.begin(9600);

  pwm.setPWMFreq(60);

  delay(10);

}

void loop() {

 pwm.setPWM(0,0, 600);
 pwm.setPWM(1,0, 600);
delay(500);
 pwm.setPWM(0,0, 400);
 pwm.setPWM(1,0, 400);
delay(500);
 pwm.setPWM(0,0, 250);
 pwm.setPWM(1,0, 250);
delay(500);
 pwm.setPWM(0,0, 200);
 pwm.setPWM(1,0, 200);
delay(500);
 pwm.setPWM(0,0, 150);
 pwm.setPWM(1,0, 150);
delay(1000);

if (servonum > 8) servonum = 0;

 
 }

Si, e togli pure tutto quello in cui compare “servonum” visto che non lo usi più :wink:

Guglielmo

Utilizzo un'alimentatore esterno a 5volt e l'ampereometro segna 0,02 ampere e il circuito non funziona, è il codice o sono i collegamenti?

Ma prima funzionava ? ? ? ... perché il codice è lo stesso, solo che li richiami in sequenza invece ch uno per volta.

Guglielmo

Prima ha sempre funzionato

Allora non c'è motivo perché non vada ... riprova con il vecchio programma (per sicurezza) ed eventalmente ricontrolla tutti i collegamenti ... ::slight_smile:

Guglielmo

Misurando con il tester i 5volt ariano alla schedina però ora non funziona neanche con il codice vecchio