El ServoHat es un shield para Raspberry Pi que se basa en el controlador PCA9685. El módulo PCA9685 es un controlador de 16 canales que permite accionar 16 salidas PWM mediante comunicación I2C. Permite, entre otras cosas, liberar entradas y salidas de tu microcontrolador y accionar hasta 16 LEDs o servomotores (o cualquier otro módulo que tome una señal PWM como entrada) utilizando dos pines (SCL y SDA) mientras mantienes los pines de tu microcontrolador para otros módulos como sensores.
Material
- Ordenador
- Rapsberry Pi 3B+
- ServoHAT
Principio de funcionamiento
El módulo se basa en el controlador PCA9685, que permite controlar las salidas PWM mediante comunicación I2C y un reloj incorporado. Este módulo dispone de 6 puentes que permiten seleccionar la dirección de la placa y colocar en el mismo bus hasta 62 controladores para un total de 992 servomotores (direcciones disponibles 0x40 a 0x7F). Permite controlar las salidas PWM con una frecuencia ajustable y con una resolución de 12 bits.
Esquema
El ServoHAT se coloca directamente en el conector de la Raspberry Pi. Es preferible utilizar separadores para fijar la pantalla al microcontrolador y no dañar los pines del conector. El ServoHAT utiliza el bus I2C de la RaspberryPi en los pines GPIO2 y 3 (SDA y SCL, respectivamente).
Código
El ServoHAT se utiliza de la misma manera que el módulo PCA9685 con la biblioteca adafruit_servokit.
#!/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/ #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()
Aplicaciones
- Control 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/