fbpixel
Etiquetas: , ,

El módulo PCA9685 es un controlador de 16 canales que puede controlar 16 salidas PWM a través de la comunicación I2C. Permite, entre otras cosas, liberar las entradas y salidas de su microcontrolador y manejar hasta 16 LEDs o servomotores (o cualquier otro módulo que tome una señal PWM como entrada) usando dos pines (SCL y SDA) mientras mantiene los pines de su microcontrolador para otros módulos como los sensores. El Pi de Frambuesa es un microcontrolador con módulos Bluetooth y Wifi integrados. Es muy fácil de usar, es ligero y tiene una capacidad de memoria y de cálculo mayor que el Arduino. Veremos en este tutorial cómo manejar varios servomotores con un Raspberry Pi y un módulo PCA9685.

Prerrequisito : Configurando Raspberry Pi en I2C

16-channel-pwm-controller-pca9685-module Usando un módulo PCA9685 con Raspberry Pi

Hardware

  • Computadora
  • Rapsberry Pi 3B+
  • PCA9685 Module
  • Fuente de alimentación externa

Principio de funcionamiento

El módulo se basa en el controlador PCA9685, que permite controlar las salidas PWM mediante la comunicación I2C y un reloj integrado. Este módulo tiene 6 puentes para seleccionar la dirección de la placa y así colocar en el mismo bus hasta 62 controladores para un total de 992 actuadores (direcciones disponibles 0x40 a 0x7F).
Puede manejar salidas PWM con frecuencia ajustable y resolución de 12 bits. El módulo es compatible con microcontroladores de 5V y 3.3V.

16-channel-pwm-controller-pca9685-module-overview Usando un módulo PCA9685 con Raspberry Pi

Esquema

El Raspberry Pi tiene pines dedicados para la comunicación I2C (GPIO2/GPIO3).
El módulo está equipado con un bus I2C y una entrada de energía. El bus I2C está conectado de la siguiente manera:

  • GPIO3 o el pin SCL al pin SCL del módulo
  • GPIO2 o SDA a la clavija SDA del módulo
  • Clavija de 5V a clavija de Vcc del módulo
  • De clavija GND a clavija GND del módulo
    En este tutorial usamos la tarjeta Raspberry Pi Zero pero puede ser adaptada a otros microcontroladores. Para ello, sólo tenemos que adaptar los pines de I2C disponibles en el microcontrolador en cuestión y posiblemente el código.
16-channel-pwm-controller-pca9685-raspberry-pi_bb Usando un módulo PCA9685 con Raspberry Pi
raspberrypi-gpio-wiringpi-pinout Usando un módulo PCA9685 con Raspberry Pi

Code

Instalación de la biblioteca

Para usar el módulo PCA9685 utilizamos la biblioteca adafruit_servokit.h. Esta biblioteca no está presente por defecto en la instalación de Python. Para instalarlo, basta con abrir un terminal e introducir la siguiente línea de comandos.

sudo pip3 install adafruit-circuitpython-servokit

Script Python

Los anchos de los PWM suelen darse en microsegundos durante un período de 20ms (50Hz), pero estos valores pueden cambiar de un actuador a otro y entre proveedores. Tendrá que modificar los valores del código para que se adapten a su actuador.
En nuestro caso, usamos el actuador MG90S con anchos de pulso entre 500 y 2500µs en 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()

Solicitudes

  • Pilotaje del robot Quadrina6

Fuentes