Working example of PCA9685 board detection in i2c, with radxa zero 3w

With a lot of patience and thanks to copilot I got it to work, how to install everything step by step. in my case use i2c-4, on Python.

Para que la radxa muestre las placas en i2c

i2cdetect -y 4
pip install adafruit-circuitpython-pca9685
pip install adafruit-circuitpython-servokit
pip install adafruit-blinka
sudo apt-get update
sudo apt-get install -y libgpiod2 python3-libgpiod python3-dev
pip install gpiod

Listar los atributos de board

import board

Lista todos los atributos del módulo ‘board’

atributos_board = dir(board)

Imprime los atributos

for atributo in atributos_board:
print(atributo)

Ejemplo para conectar con la pca9685

import busio
import board
from adafruit_pca9685 import PCA9685

Utiliza los pines específicos para el bus I2C-4

i2c_bus = busio.I2C(board.D4_B3, board.D4_B2)

Dirección del PCA9685

I2C_ADDRESS = 0x40

try:
# Intentar inicializar el dispositivo PCA9685
pca = PCA9685(i2c_bus, address=I2C_ADDRESS)
print(f"Dispositivo PCA9685 detectado en la dirección 0x{I2C_ADDRESS:X}.")
except ValueError:
print(f"No se encontró dispositivo PCA9685 en la dirección 0x{I2C_ADDRESS:X}.")
except Exception as e:
print(f"Ocurrió un error: {e}")

Ejemplo de funcionamiento

import time
from adafruit_servokit import ServoKit
import busio
from adafruit_pca9685 import PCA9685
import board

Utiliza los pines específicos para el bus I2C-4

i2c_bus = busio.I2C(board.D4_B3, board.D4_B2)

Dirección del PCA9685

I2C_ADDRESS = 0x40

Inicializa el dispositivo PCA9685

pca = PCA9685(i2c_bus, address=I2C_ADDRESS)
pca.frequency = 60 # Configura la frecuencia de actualización para servos

Inicializa el kit de servos

kit = ServoKit(channels=16, i2c=i2c_bus, address=I2C_ADDRESS)

Función para controlar un servo

def mover_servo(canal, angulo):
kit.servo[canal].angle = angulo

Función para controlar un mini puente H

def controlar_puente_h(canal_a, canal_b, canal_pwm, valor_a, valor_b, pwm):
pca.channels[canal_a].duty_cycle = valor_a # Control de dirección
pca.channels[canal_b].duty_cycle = valor_b # Control de dirección
pca.channels[canal_pwm].duty_cycle = pwm # Control de velocidad (PWM)

Función para encender/apagar un LED

def controlar_led(canal, estado):
pca.channels[canal].duty_cycle = 0xFFFF if estado else 0x0000

Controlar los servos

mover_servo(0, 90) # Mueve el primer servo a 90 grados
mover_servo(1, 45) # Mueve el segundo servo a 45 grados
mover_servo(2, 135) # Mueve el tercer servo a 135 grados

Controlar el primer mini puente H

controlar_puente_h(3, 4, 5, 0xFFFF, 0x0000, 0x7FFF) # Movimiento adelante
controlar_puente_h(3, 4, 5, 0x0000, 0xFFFF, 0x3FFF) # Movimiento atrás

Controlar el segundo mini puente H

controlar_puente_h(7, 8, 9, 0xFFFF, 0x0000, 0x7FFF) # Movimiento adelante
controlar_puente_h(7, 8, 9, 0x0000, 0xFFFF, 0x3FFF) # Movimiento atrás

Encender los LEDs

controlar_led(11, True) # Enciende el primer LED
controlar_led(12, True) # Enciende el segundo LED

Mantener el estado por un tiempo

time.sleep(5)

Apagar los LEDs

controlar_led(11, False) # Apaga el primer LED
controlar_led(12, False) # Apaga el segundo LED

print(“Control de servos, puentes H y LEDs completado con éxito.”)