PCA9685
segons chatGPT
segons chatGPT
El PCA9685 és un controlador PWM que es pot utilitzar per controlar diversos servos a través d'un bus I2C.
Servo de 360 graus: Aquest tipus de servo utilitza un senyal PWM per a la seva rotació contínua, on el sentit de rotació dependrà de la posició del senyal.
Valor de PWM bajo (aproximadamente 1000 a 1100) hará que el servo gire en una dirección.
Valor de PWM alto (aproximadamente 1900 a 2000) hará que el servo gire en la dirección opuesta.
Valor de PWM cercano a 1500 generalmente detendrá el servo.
Connexió
PCA9685 a ESP32:
VCC del PCA9685 a 3.3V (o 5V, depenent de la teva configuració, però és millor usar 3.3V per evitar possibles danys a l'ESP32).
GND del PCA9685 a GND de l'ESP32.
SCL del PCA9685 a GPIO22 (per exemple) de l'ESP32 (per a l'horari I2C).
SDA del PCA9685 a GPIO21 (per exemple) de l'ESP32 (per a les dades I2C).
OE (Output Enable) al terra (GND) per activar els sortides del PCA9685.
Servo:
Connecta el servo al canal PWM que vulguis controlar del PCA9685.
Control de un servo de RC
from machine import Pin, SoftI2C
import time
import pca9685
# Configura el I2C
i2c = SoftI2C(scl=Pin(22), sda=Pin(21), freq=400000) # Pines para ESP32 (SCL y SDA)
# Inicializa el PCA9685
pca = pca9685.PCA9685(i2c)
pca.freq(50) # Configura la frecuencia de PWM para el servo (típica es 50Hz)
# Canal donde está conectado el servo (usamos el canal 0)
channel = 0
# Función para hacer que el servo gire continuamente en una dirección
def rotate_servo(direction):
if direction == 'clockwise':
# Gira en sentido horario (con valor de PWM bajo)
pca.duty(channel, 1150) # Ajusta el valor de PWM (más bajo para sentido horario)
elif direction == 'counterclockwise':
# Gira en sentido antihorario (con valor de PWM alto)
pca.duty(channel, 1850) # Ajusta el valor de PWM (más alto para sentido antihorario)
# Gira el servo continuamente en sentido horario
rotate_servo('clockwise')
# Espera un rato girando en sentido horario
time.sleep(5)
# Detén el servo (esto puede hacer que se detenga o pase a un giro muy lento)
pca.duty(channel, 1500) # PWM cercano a 1500 detiene el servo
# Espera un momento antes de cambiar la dirección
time.sleep(2)
# Gira el servo en sentido antihorario
rotate_servo('counterclockwise')
# Espera un rato girando en sentido antihorario
time.sleep(5)
# Detén el servo al final
pca.duty(channel, 1500) # Detiene el servo
controlar múltiples servos con el PCA9685 (en tu caso 5 servos) y hacer que giren a la misma velocidad en sentido horario
Este código debería hacer que los 5 servos conectados al PCA9685 giren a la misma velocidad en sentido horario durante 10 segundos, y luego se detengan.
#llibreries
from machine import Pin, SoftI2C
import time
import pca9685
# Configuració de I2C
i2c = SoftI2C(scl=Pin(22), sda=Pin(21), freq=400000) # Pins SCL y SDA de ESP32
# Inicializació del PCA9685
pca = pca9685.PCA9685(i2c)
pca.freq(50) # 50 és la frecuencia PWM típica para servos
# Canales donde están conectados los 5 servos (canales 0 a 4)
channels = [0, 1, 2, 3, 4]
# Función para que todos los servos giren a la misma velocidad en sentido horario
def rotate_servos():
for channel in channels:
pca.duty(channel, 1150) # PWM bajo para giro horario (1000 a 1100 - 1500)
# Inicia el giro continuo de los servos
rotate_servos()
# Mantén los servos girando durante 10 segundos
time.sleep(10)
# Detiene los servos (PWM alrededor de 1500 para detener)
for channel in channels:
pca.duty(channel, 1500) # PWM 1500 detiene el servo
# Finaliza
print("Servos detenidos")