O ServoHat é um shield para Raspberry Pi que se baseia no controlador PCA9685. O módulo PCA9685 é um controlador de 16 canais que permite controlar 16 saídas PWM através de comunicação I2C. Ele possibilita entre outras coisas liberar entradas saídas do seu microcontrolador e controlar até 16 LEDs ou servomotores (ou qualquer outro módulo que tome um sinal PWM como entrada) usando dois pinos (SCL e SDA), enquanto mantém os pinos do seu microcontrolador livre para outros módulos, como sensores.
Material
- Computador
- Rapsberry Pi 3B+
- ServoHAT
Princípio de funcionamento
O módulo é baseado no controlador PCA9685 que permite controlar saídas PWM usando comunicação I2C e um relógio embutido. Este módulo contém 6 pontes que permitem selecionar o endereço da placa e colocar, no mesmo barramento, até 62 controladores, para um total de 992 servomotores (endereços disponíveis de 0x40 a 0x7F). É possível controlar saídas PWM com uma frequência ajustável e uma resolução de 12 bits.
Esquema
O ServoHAT é colocado diretamente sobre o conector do Raspberry Pi. É preferível utilizar espaçadores para fixar o shield ao microcontrolador sem danificar os pinos de ligação. O ServoHAT utiliza o barramento I2C do RaspberryPi, nos pinos GPIO2 e 3 (SDA e SCL, respectivamente).
Código
O ServoHAT é utilizado da mesma forma que o módulo PCA9685 com a 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()
Aplicações
- Controlar o robô Quadrina6
Fontes
- 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/