Accueil > GNU/LINUX & RASPBERRY PI > Raspberry et carte PCA9685 16 sorties PWM

Raspberry et carte PCA9685 16 sorties PWM

dimanche 16 octobre 2016, par thebault

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.

Lien du HAT chez ADAFRUIT

Caractéristiques du PCA9685

  • alimentation 5V
  • communication par bus i2c
  • 6 broches d’adresses (permet d’utiliser jusqu’à 62 PCA9685)
  • fréquence des signaux de sortie de 24Hz à 1526Hz
  • rapport cyclique codé sur 12bits (de 0% à 100%) allant de 0 à 4095

Branchements

On trouve des cartes au format HAT ou carte séparée.

JPEG - 120 ko
JPEG - 112 ko

Installation sur Raspbian Jessie

  • activer le support i2c via raspi-config sur le raspberry Pi dans un terminal :
sudo raspi-config

Aller dans "9 Advanced Options" puis "A6 I2C " puis "back" et "Finish"pour activer le support au niveau du noyau.

PNG - 49.9 ko
PNG - 38.4 ko
  • installer les outils i2c pour la ligne de commande I2ctools n’est pas indispensable mais il permet de vérifier la présence de la carte en ligne de commande
sudo apt-get install python-smbus
sudo apt-get install i2c-tools
  • tester la présence de la carte

sudo i2cdetect -y 1

PNG - 13.9 ko

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.

  • installer la bibliothèque python développée par Adafruit
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
  • tester : il faut brancher un servo-moteur sur le canal 0 de la carte PCA9685 ainsi qu’une alimentation 5V.

python examples/simpletest

Programmation en python

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

PNG - 10.3 ko
Source : Wikipedia
CommandeFonction
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 :

JPEG - 29.6 ko

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 :

JPEG - 16.5 ko

Le rapport cyclique est défini par : Toff/4096

Dans le programme suivant :

  • placer le servomoteur en position initiale (durée impulsion = 1 ms)
  • le placer en position milieu de course (durée impulsion = 1,5 ms)
  • le placer en position milieu de course (durée impulsion = 2 ms)

Calcul des codes Toff pour les 3 positions :
Le fréquence est de 50Hz, par conséquent, T=1/f=20ms.

durée impulsionrapport cycliquecode 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.

  1. import Adafruit_PCA9685
  2. import time
  3.  
  4. servo=Adafruit_PCA9685.PCA9685()
  5. servo.set_pwm_freq(50)
  6.  
  7. while True :
  8. servo.set_pwm(0,0,205)
  9. time.sleep(1)
  10. servo.set_pwm(0,0,307)
  11. time.sleep(1)
  12. servo.set_pwm(0,0,410)
  13. time.sleep(1)
  14. servo.set_pwm(0,0,307)
  15. time.sleep(1)

Télécharger

SPIP | | Plan du site | Suivre la vie du site RSS 2.0
Habillage visuel © digitalnature sous Licence GPL