fbpixel
Etiquetas:, ,
0
(0)

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

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

How useful was this post?

Click on a star to rate it!

Average rating 0 / 5. Vote count: 0

No votes so far! Be the first to rate this post.

As you found this post useful...

Follow us on social media!

We are sorry that this post was not useful for you!

Let us improve this post!

Tell us how we can improve this post?