Problème contrôle MG996R avec PCA9685 sur raspberry

Bonjour à tous et à toute,

Pour un projet personnel je souhaite piloter les servo moteurs de mon bras robotisé à l’aide de mon raspberry pi et je souhaiterais ensuite le coupler avec une caméra pour faire du traitement d’image, mais là n’est pas le problème.

Lorsque j’ai reçu mes 6 servo moteurs ainsi que les pièces de mon bras robot, je les ai testés un par un à l’aide du code suivant :
il faut avant d’exécuter le code exécuter la commande « sudo pigpiod » dans le terminal.

#!/usr/bin/python3
import RPi.GPIO as GPIO
import pigpio
import time

pwm = pigpio.pi()
pwm.set_mode(servo, pigpio.OUTPUT)

pwm.set_PWM_frequency(servo, 50)

print( "0 deg" )
pwm.set_servo_pulsewidth( servo, 500 ) ;
time.sleep( 3 )
print( "90 deg" )
pwm.set_servo_pulsewidth( servo, 1500 ) ;
time.sleep( 3 )
print( "180 deg" )
pwm.set_servo_pulsewidth( servo, 2500 ) ;
time.sleep( 3 )
# turning off servo
pwm.set_PWM_dutycycle(servo, 0)
pwm.set_PWM_frequency( servo, 0 )

Avec ce code ja branche directement le servo sur ma rapsberry et le fonctionnement est fluide, et correspond au niveau de la vitesse et du couple à ce que je recherche.

Mon bras robot utilise 6 servos, je ne peux donc pas les piloter directement depuis le raspberry pi, j’ai donc acheté en même une carte PCA9685 qui permet de piloter jusqu’à 16 servos simultanément. Et c’est ici que je rencontre un problème.

La carte PCA9685 est relié au raspberry en liaison I2C, je branche le pin SDA au SDA de la carte, de même pour le SCL, et je relie le VCC et GNG du raspberry à la carte. J’ai essayé des exemple de code pour tester si cela marchait. Quand je branche mon servos MG996R à la carte PCA9685 et que j’essaie les programme de test, la rotation est vraiment lente et saccadée.
Pour alimenter les servos, j’utiliser une alimentation externe (j’ai essayé 5V, 6.5V, 7.2V mais rien n’y fait)

Voici le code de test :

!/usr/bin/env python
# -*- coding: utf-8 -*-

#Libraries
import time    #https://docs.python.org/fr/3/library/time.html
from adafruit_servokit import ServoKit    #https://circuitpython.readthedocs.io/projects>

#Constants
nbPCAServo=16 

#Parameters
MIN_IMP  =[600, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 50>
MAX_IMP  =[2370, 2370,2370,2370,2370,2370,2370,2370,2370,2370,2370,2370,2370,2370,2370,2>
MIN_ANG  =[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
MAX_ANG  =[180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 18>

#Objects pca=ServoKit(channels=16, address=40)
pca = ServoKit(channels=16)

# function init 
def init():

    for i in range(nbPCAServo):
        pca.servo[i].set_pulse_width_range(MIN_IMP[i] , MAX_IMP[i])

# function main 
def main():

    pcaScenario();

# function pcaScenario 
def pcaScenario():
    """Scenario to test servo"""
    for i in range(nbPCAServo):
        for j in range(MIN_ANG[i],MAX_ANG[i],1):
            print("Send angle {} to Servo {}".format(j,i))
            pca.servo[i].angle = j
            time.sleep(0.01)
        for j in range(MAX_ANG[i],MIN_ANG[i],-1):
            print("Send angle {} to Servo {}".format(j,i))
            pca.servo[i].angle = j
            time.sleep(0.01)
        pca.servo[i].angle=None #disable channel
        time.sleep(0.5)

if __name__ == '__main__':
    init()
    main()

J’ai essayé de modifier le rapport cyclique mais rien n’y fait, impossible de piloter le moteur correctement.
Pour essayer de comprendre d’où le problème venait, j’ai branché mon analyser logique au port de sortie PWM en lançant le premier programme de test utilisant la bibliothèque pigpio.
J’obtiens un signal de 50Hz, donc une période de 20ms avec des impulsions allant de 500µs à 2500µm. J’ai essayé faire varier le rapport cyclique à la « main », par exemple passer d’une impulsion de 500µs à 2500µm sans faire de rampe, et le moteur tourne rapidement de 180°.

Ensuite j’ai branché mon analyseur logique sur un port PWM de la carte PCA9685 et j’obtiens les mêmes signaux PWM. Cependant le moteur tourne au ralenti (10s pour faire 180°) avec des grosses saccades. En pilotant à la main manuellement rien ne change alors que j’ai éxactement les mêmes signaux qu’en branchant le servos directement sur le raspberry. Quand je veux faire aller le servo de 0 à 180° il faut que je le lance à la main pour qu’il fonctionne correctement.

J’utilise un rapsberry pi 4.

J’espère que j’ai été assez clair, si jamais vous souhaitez des informations supplémentaires n’hésitez pas à demander je ferai mon possible pour donner un maximum d’info.
Je n’arrive pas à voir d’où cela peut venir, ça fait une semaine que je suis dessus j’ai essayé plein de truc et rien de marche ^^

Je vous remercie en avant pour votre aide

Kantw00

bonjour, a tu remarqué que dans la boite du module il y a une petite puce? (j’ai un micro servo 99 sg90 c’est pour ça que j’ai vu la puce) si non je ne sais pas trop comment t’aider a réussir ton projet car je sais très peut de choses la dessus (je veut aussi faire un truc donc peut-être que quand je le ferais je pourrais t’aider…
Si non bonne change