Go Down

Topic: due o più PCA9685 (Read 143 times) previous topic - next topic

zorro101

ciao a tutti
sono nuovo del forum (mi scuso ma non ho trovato dove presentarmi)
sto cercando di usare 32 servo (con Arduino Nano V3 e 2 schede PCA9685) ed ho bisogno di accedervi direttamente chiamando il numero del servo.
ho trovato alcuni codici in rete che ho riassemblato alla meglio per la mia esigenza ma ho i seguenti problemi:
innanzi tutto la funzione void che assegna i PWM andava in errore (dicendo che era dichiarata void) e ho dovuto inserire INT davanti nServo. (soluzione trovata in rete)
adesso però non si muove il servo che invece funziona bene se uso la classica pwm2.setPWM che ho commentato nel codice
qualcuno potrebbe aiutarmi?
grazie in anticipo
ciao
Code: [Select]
#include <Wire.h>
#include <Adafruit_PWMServoDriver.h>

Adafruit_PWMServoDriver pwm1 = Adafruit_PWMServoDriver(0x40);
Adafruit_PWMServoDriver pwm2 = Adafruit_PWMServoDriver(0x41);


#define SERVOMIN  200 // This is the 'minimum' pulse length count (out of 4096)
#define SERVOMAX  800 // This is the 'maximum' pulse length count (out of 4096)

// our servo # counter
uint8_t servonum = 0;

void setup() {
  Serial.begin(9600);
 
  pwm1.begin();
  pwm1.setPWMFreq(60);  // Analog servos run at ~60 Hz updates
  pwm2.begin();
  pwm2.setPWMFreq(60);

  delay(1000);
}


void loop() {
  // Drive each servo one at a time using setPWM()
 Serial.println(servonum);
  for (uint16_t pulselen = SERVOMIN; pulselen < SERVOMAX; pulselen++) {
    moveServo(19, pulselen);
    //pwm2.setPWM(2,0,pulselen);
  }
  delay(200);

  for (uint16_t pulselen = SERVOMAX; pulselen > SERVOMIN; pulselen--) {
    moveServo(19, pulselen);
    // pwm2.setPWM(2,0,pulselen);
  }
  delay(1000);
}

// move servo to position
void moveServo(int nServo, unsigned int pos) {
 if(nServo<17) {
     int i = (nServo-1);
     pwm1.setPWM(i,0,pos);
  }
 
  else if (nServo>16 &&nServo<33) {
    int i = (nServo-1);
    pwm2.setPWM(i,0,pos);
 
  }
 }

fabpolli

#1
Feb 28, 2020, 12:35 pm Last Edit: Feb 28, 2020, 12:46 pm by fabpolli
Buongiorno,
essendo il tuo primo post nella sezione Italiana del forum, nel rispetto del nostro regolamento, ti chiedo cortesemente di presentarti QUI (spiegando bene quali conoscenze hai di elettronica e di programmazione ... possibilmente evitando di scrivere solo una riga di saluto) e di leggere con MOLTA attenzione il su citato REGOLAMENTO ... Grazie. :)

P.S.: Ti ricordo che, purtroppo, fino a quando non sarà fatta la presentazione nell'apposito thread, nessuno ti potrà rispondere, quindi ti consiglio di fare il tutto al più presto. ;)

zorro101

ciao e grazie
ho provveduto a fare la prensatazione,ma non ho capito dove devo correggere il codice inserito (mi sembra di aver fatto tutto correttamente! :( )
mi puoi spiegare meglio, cortesemente?
grazie ancora
ciao

fabpolli

Scusa errore mio di copia incolla ::) modifico

fabpolli

#4
Feb 28, 2020, 12:52 pm Last Edit: Feb 28, 2020, 12:53 pm by fabpolli
Suppongo che la parte servo numero uno funziona correttamente e sia solo la seconda scheda a non funzionare analizzando questa parte:

Code: [Select]

if (nServo>16 &&nServo<33) {
    int i = (nServo-1);
    pwm2.setPWM(i,0,pos);

se arriva 19 come indice da comandare tu cerchi di pilorae 19-1=18  ;) credo sia solo un problema di indice la seconda scheda ha comunque indici che vanno da zero a 15

zorro101

si, sono un deficiente!!! con -17 sul secondo IF funziona, ovviamente!!!
adesso devo aggiungere i settaggi Min e Max per singolo servo (mi sa che ci risentiamo)

grazie infinite

zorro101

eccomi con un dubbio:
ho definito l'array per il minimo e massimo della corsa dei servo, ma mettendo [31] mi va in errore: too many initializers for 'int [31]'
ho dovuto mettere 32 per farlo funzionare ma non capisco come sia possibile visto che mettendo 31 sono realmente 32 valori (da 0 a 31)
grazie ancora

Code: [Select]
int ServoMin[32] = {230, 210, 230, 230, 240, 260, 240, 240, 230, 230, 230, 270, 230, 220, 260, 250, 310, 230, 200, 250, 220, 230, 200, 250, 250, 240, 240, 240, 210, 220, 220, 240};
 int ServoMax[32] = {490, 470, 460, 490, 490, 510, 450, 420, 470, 480, 450, 500, 480, 430, 510, 490, 550, 450, 600, 470, 470, 480, 450, 500, 500, 480, 470, 450, 400, 420, 440, 470};

fabpolli

certo che si da 0 a 31 sono 32 posizioni, se tu metti 31 nell'inizializzazione definisci 31 posizioni quindi da zero a trenta, qui lo zero conta :)

zorro101

avevo capito che leggendo l'array da 0 a 31 andasse definito 31 ;-)
grazie mille

Go Up