Accueil > GNU/LINUX & RASPBERRY PI > Raspberry et carte PCA9685 16 sorties PWM
dimanche 16 octobre 2016, par
Le chip PCA9685 permet de commander 16 sorties PWM qui peuvent servir aussi bien à commander des led (luminosité variable), des moteur à courant continu (vitesse variable) ou des servomoteurs.
La communication entre la carte PCA9685 et le Raspberry PI se fait via le bus I2C.
On trouve des cartes au format HAT ou carte séparée.
sudo raspi-config
Aller dans "9 Advanced Options" puis "A6 I2C " puis "back" et "Finish"pour activer le support au niveau du noyau.
sudo apt-get install python-smbus
sudo apt-get install i2c-tools
sudo i2cdetect -y 1
La carte apparait bien à l’adresse 40 (et accessoirement à l’adresse 70).
Si on soude l’un des jumpers d’adresse (A0...A5), l’adresse sera différente.
sudo apt-get install git build-essential python-dev
git clone https://github.com/adafruit/Adafruit_Python_PCA9685
cd Adafruit_Python_PCA9685/
sudo python setup.py install
python examples/simpletest
Commande de servomoteurs.
Les servomoteurs de modélisme sont des systèmes asservis dont la position angulaire de l’axe de sortie est commandé par une impulsion dont on va faire varier la durée. En général, la durée de l’impulsion va varier de 1 ms à 2ms pour une position de 0° à 90°. Cependant, d’un modèle à l’autre ces valeurs peuvent varier de façon importante.
Pour une présentation détaillée : Servomoteur (wikipedia) ou http://eskimon.fr/287-arduino-602-un-moteur-qui-de-la-tete-le-servo-moteur
Alors qu’un signal PWM a un rapport cyclique qui varie de 0 à 1 ( c’est à dire une largeur d’impulsion de 0 à 20 ms, soit la totalité de la période -pour une fréquence de 50hz -), la commande d’un servomoteur doit être limitée à des impulsions de 1 ms à 2 ms ("théorique").
Du fait des disparotés entre constructeurs, Il faut vérifier l’angle en fonction de la durée de l’impulsion pour chaque servomoteur
Commande | Fonction | |
---|---|---|
import Adafruit_PCA9685 | Appel de la bibliothèque | |
servo=Adafruit_PCA9685.PCA9685() | crée une instance servo et initialise le PCA9685 à l’adresse par défaut 0x40 | |
servo.set_pwm_freq(50) | fréquence du signal de sortie réglée à 50hz pour des servomoteurs | |
servo.set_pwm(n,Ton,Toff) | commande du rapport cyclique sur le canal n (n entre 0 et 15), avec Ton et Toff codés sur 12 bits (entre 0 et 4096) (voir schémas ci-dessous) |
Les codes Ton et Toff sont définis de la manière suivante :
Ainsi, le rapport cyclique est défini par : (Toff-Ton)/4096
Lorsque l’on utilise des servomoteurs, on va définir Ton=0. Ainsi on obtient le chronogramme suivant :
Le rapport cyclique est défini par : Toff/4096
Dans le programme suivant :
Calcul des codes Toff pour les 3 positions :
Le fréquence est de 50Hz, par conséquent, T=1/f=20ms.
durée impulsion | rapport cyclique | code Toff |
---|---|---|
1 ms | a=1/20=0,05=5% | Toff=a x 4096 = 204.8 soit Toff=205 |
1,5 ms | a=1.5/20=0,075=7.5% | Toff=a x 4096 = 307.2 soit Toff=307 |
2 ms | a=2/20=0.1=10% | Toff=a x 4096 = 409.6 soit Toff=410 |
Le programme python avec changement de position toutes les secondes.
import Adafruit_PCA9685 import time servo=Adafruit_PCA9685.PCA9685() servo.set_pwm_freq(50) while True : servo.set_pwm(0,0,205) time.sleep(1) servo.set_pwm(0,0,307) time.sleep(1) servo.set_pwm(0,0,410) time.sleep(1) servo.set_pwm(0,0,307) time.sleep(1)