Etiquetas: , ,

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

16-channel-pwm-controller-pca9685-module Usar um módulo PCA9685 com Raspberry Pi

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.

16-channel-pwm-controller-pca9685-module-overview Usar um módulo PCA9685 com Raspberry Pi

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.

16-channel-pwm-controller-pca9685-raspberry-pi_bb Usar um módulo PCA9685 com Raspberry Pi
raspberrypi-gpio-wiringpi-pinout Usar um módulo PCA9685 com Raspberry Pi

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

Retrouvez nos tutoriels et d’autres exemples dans notre générateur automatique de code
La Programmerie