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
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.
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.
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
- 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/