O módulo PCA9685 é um controlador de 16 canais que permite conduzir 16 saídas PWM por meio de comunicação I2C. Ele libera entradas e saídas do seu microcontrolador e pode controlar até 16 LEDs ou servomotores (ou qualquer outro módulo que tome um sinal PWM como entrada), usando dois pinos (SCL e SDA) e mantendo os pinos do seu microcontrolador livres para outros módulos, como sensores. O Raspberry Pi é um microcontrolador com módulos Bluetooth e Wifi integrados. Muito fácil de usar, é leve e tem memória e capacidade computacional superiores às do Arduino. Veremos neste tutorial como controlar vários servomotores com um Raspberry Pi e um módulo PCA9685.
Pré-requisito: configuração de Raspberry Pi I2C

Material
- Computador
- Rapsberry Pi3 B+
- Módulo PCA9685
Princípio de funcionamento
O módulo é baseado no controlador PCA9685, que permite controlar saídas PWM por meio de comunicação I2C e de um relógio integrado. Este módulo tem 6 pontes que permitem selecionar o endereço da placa e colocar até 62 controladores no mesmo barramento, para um total de 992 servomotores (endereços disponíveis de 0x40 a 0x7F).
Com ele, é possível acionar saídas PWM com frequência ajustável e resolução de 12 bits. O módulo é compatível com microcontroladores de 5V e 3,3V.

Esquema
O Raspberry Pi contém pinos reservados para a comunicação I2C (GPIO2/GPIO3). O módulo tem um barramento I2C e uma entrada de potência. O barramento I2C está ligado da seguinte forma:
- GPIO3 ou pino SCL com pino SCL do módulo
- GPIO2 ou pino SDA com pino SDA do módulo
- Pino 5V com pino Vcc do módulo
- Pino GND com pino GND do módulo
Neste tutorial, utilizamos a placa Raspberry Pi Zero, mas ele pode ser adaptado a outros microcontroladores. Basta adaptar os pinos I2C disponíveis no microcontrolador em questão, e possivelmente o código.

Código
Instalação da biblioteca
Para utilizar o módulo PCA9685, usamos a biblioteca adafruit_servokit. Ela não está presente como padrão na instalação Python. Para instalá-la, basta abrir um terminal e introduzir a seguinte linha de comando:
sudo pip3 install adafruit-circuitpython-servokit
Script Python
As larguras de pulso são normalmente dadas em microssegundos por períodos de 20ms (50Hz), mas estes valores podem variar em função do servomotor e do fornecedor. É preciso modificar os valores do código para adaptá-los ao seu servomotor.
No nosso caso, utilizamos o servomotor MG90S, cuja largura de pulso se situa entre 500 e 2500µs por 20ms.
#!/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/servokit/en/latest/
#Constants
nbPCAServo=16
#Parameters
MIN_IMP =[500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500]
MAX_IMP =[2500, 2500, 2500, 2500, 2500, 2500, 2500, 2500, 2500, 2500, 2500, 2500, 2500, 2500, 2500, 2500]
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, 180]
#Objects
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()
Aplicações
- Controlar o robô Quadrina6
Fontes
- http://adafruit.github.io/Adafruit-PWM-Servo-Driver-Library/html/class_adafruit___p_w_m_servo_driver.html#aa892432ed08e4b3892c8eb0478168dd8
- https://robojax.com/learn/arduino/robojax-PCA6985.pdf
- https://www.nxp.com/products/power-management/lighting-driver-and-controller-ics/ic-led-controllers/16-channel-12-bit-pwm-fm-plus-ic-bus-led-controller:PCA9685
- https://docs.python.org/fr/3/library/time.html
- https://circuitpython.readthedocs.io/projects/servokit/en/latest/
Retrouvez nos tutoriels et d’autres exemples dans notre générateur automatique de code
La Programmerie