PCA9685

Portrait de krockdur

Bonjour à tous,

J'utilise une carte ADAFRUIT pour contrôler plusieurs servomoteurs. Elle est construite autour d'un PCA9685.

La carte : https://www.adafruit.com/product/815

Jusqu'à maintenant je l'utilisais de la manière suivante (sans vraiment comprendre...) :

  1. Détermination du pulse mini pour chaque servo qui correspond au 0°
  2. Détermination du pulse maxi pour chaque servo qui correspond à 180°

Ensuite,j'utilise la fonction map() pour directement donner l'angle à l'instruction setPWM()

Exemple :

map_pwm.setPWM(2, 0, map(angle_degre, 0, 180, pulse_min, pulse_max))

Mais apparemment, ce n'est pas la mailleur solution pour piloter des servomoteurs avec le PCA9685.

Ce que je pense comprendre : le pulse pris en paramètre de setPWM est une durée d'impulsion.

Sur le github, il propose d'utiliser cette fonction qui permet de donner les pulse en seconde :

// you can use this function if you'd like to set the pulse length in seconds
// e.g. setServoPulse(0, 0.001) is a ~1 millisecond pulse width. its not precise!
void setServoPulse(uint8_t n, double pulse) {
  double pulselength;
  
  pulselength = 1000000;   // 1,000,000 us per second
  pulselength /= 60;   // 60 Hz
  Serial.print(pulselength); Serial.println(" us per period"); 
  pulselength /= 4096;  // 12 bits of resolution
  Serial.print(pulselength); Serial.println(" us per bit"); 
  pulse *= 1000;
  pulse /= pulselength;
  Serial.println(pulse);
  pwm.setPWM(n, 0, pulse);
}

Je ne comprend pas l'interêt, est ce la bonne manière de faire ?

2nde question, comment connaître la fréquence de la PWM à indiquer ? (je met 60Hz par défaut....)

Merci à tous, bonne journée.

Portrait de brossden

Bonjour krockdur

Tu devrais regarder la vidéo d'Alex qui est très bien faite !

Video

pourta carte en gros tu peux piloter 12 servos et cela en utilisant que deux voir trois sorties d'un arduino, il est même possible de piloter plusieurs de ces cartes avec ces mêmes sorties.

Le principe est de dialoger avec la ou les cartes contrôleur par un bus I2C par lequel on envoie des ordres à cette carte pour qu'elle pilote à son tour les servos qui lui sont raccordés. Et comme ces cartes comportent un adressage tu peux raccorder plusieurs cartes sur le même bus.

En simplifiant la chose, l'arduino via le bus donne des ordres par exemple du type "Carte n° 1 positionne le servo N°1 à 25° le N°2 à 45° etc Ces servos resteront dans cette position jusqu'à  ce qu'un ordre différent arrive à cette carte pour modifier la ou les postions du ou de ces servos.

La position de chaque servo est déterninée par une valeur sur 12 bits donc de 0 à 4095 (soit 4096 valeurs) donc en théorie 180° / 4096 = soit en gros 2.6 minutes d'angle (je demande à voir quand même la précision réelle). ( soit une tension analogique équivalente de 0 à 5 Volt tous les 1.22 millivolts !)

J"en reste là pour ne pas trop compliquer la chose !

Si tu as toujours des soucis demande de l'aide !

Bonne journée

Portrait de krockdur

Bonjour Brossden,

Oui j'avais vu cette vidéo. Mais elle n'aborde pas la question de la fréquence PWM à mettre en place dans mon cas (utilisation d'une PCA9685).

Mon architecture me fait utiliser 16 servos, c'est pour ça que je passe par la carte d'afadruit.

A+

Portrait de krockdur

Oups pardon, dans le datasheet du servo c'est bien précisé 50Hz :)

Portrait de brossden

J'ai complété ma réponse !

Mais pour avoir un exemple tu peux aller voir ICI

Portrait de krockdur

Merci,donc c'est bon j'en fais une bonne utilisation. Pour infos, ca me sert pour ce projet (la V2 à gauche).

img_0141.jpg