Ir al contenido principal

Servo Driver PCA9685

PCA9685 Servo Driver 16 Canales Adafruit con Raspberry PI

    Los servomotores se controlan utilizando las salidas PWM disponibles en la mayoría de las MCU incorporadas. Pero como lamentablemente nuestra Raspi no tiene soporte nativo para PWM... simplemente se nos complica un poco la cosa.
 Afortunadamente nuestra Raspi tiene, HW I2C disponible, que podemos usar para comunicarnos con un PWM ¡como el Servo Driver PCA9685,   de 12 canales de Adafruit! (u otras marcas)
De esta manera, podemos manejar fácilmente hasta 16 servomotores con nuestra Raspberry Pi utilizando la biblioteca Python de Adafruit y este tutorial.

Comprobar si la RaspBerry Pi tiene configurado I2C

 Si tiene la Raspberry Pi Original (vendida antes de octubre de 2012), el puerto I2C es 0:
sudo i2cdetect -y 0
Si Ud tiene la la segunda revisión de RaspBerry Pi, el Puerto I2C es 1:
sudo i2cdetect -y 1
Dependiendo de que tenga una versión u otra esto es lo que debería salir en pantalla:
Si no sale nada es que no esta instalado el i2c en la raspberry, esto es tema para otro tutorial, aunque ahora mismo en las ultimas versiones ya viene instalado y configurado por defecto.
Diagrama de Conexiones:
Este es el diagrama correspondiente de conexiones del Driver PCA9685 de Adafruit, con la RaspBerry Pi y un Servo motor:

El PCA9685 (el chip real que impulsa los servos), es alimentado por un suministro de 3.3V de la misma Raspberri. Debido a que los servos tienen diferentes requisitos de energía, generalmente un suministro de 5V y 200 mA por servo, se alimentan desde una fuente de alimentación separada, etiquetada como V+.
En la imagen anterior, con un único servomotor, lo estamos alimentando desde una fuente de alimentación externa de 5V, conectada al bloque de terminales en la placa de arranque a través de un adaptador de corriente de CC. Asegúrate de conectar los cables correctamente, con + / + y GND / GND.
¿Por qué no utilizar el suministro + 5V en la Raspberry Pi?
Cambiar de giro en el servo, puede causar mucho ruido en el suministro, y el (los) servo (s) provocarán que el voltaje fluctúe significativamente, lo cual es una mala situación para la RasPi. Se recomienda encarecidamente utilizar un suministro externo de 5V con servomotores para evitar problemas causados por caídas de voltaje en la línea de 5V de la RasPi.
Cuándo agregar un condensador opcional a la placa?
Hay un lugar en la PCB para soldar un condensador electrolítico. Según su uso, puede o no necesitar un condensador. Si está manejando muchos servos desde una fuente de alimentación que se sumerge mucho cuando los servos se mueven; deberiamos instalar uno con las siguientes caracteristicas:
 n * 100uF donde n es el número de servos, por ejemplo 470uF o más para 5 servos.
Como es tan dependiente del consumo de corriente el servo, el par de torsión de cada motor y de la fuente de alimentación, no hay 'un único valor de capacitor mágico' , yo instale uno de 470uF, y asi nos curamos de espanto :-)

El PCA9685 Adafruit, nos permite controlar individualmente 16 salidas PWM con 12 bits de resolucion y con una frecuencia máxima de 1600Hz.
La salida PWM que envia el PCA9685 es de la siguiente forma:
 Básicamente se tiene que establecer la frecuencia de la señal PWM, frecuencia que sera la misa para las 16 salidas. Para establecer el ciclo de trabajo (Duty), tenemos que manipular el flanco de subida (Up) y el flanco de bajada (Down), esto se configura individualmente para cada salida PWM. La resolución del PWM es de 12 bits (de 0 a 4095).
Usando la librería de Adafruit
El código Python  está disponible en Github en
Este código debería ser un buen punto de partida para comprender cómo puede acceder a los dispositivos SMBus / I2C con su RaspBerry, y hacer que las cosas funcionen.

Descargando el codigo de Github
La forma más fácil de obtener el código en su Raspberry es conectar un cable Ethernet y clonarlo directamente usando 'git', que es instalado por defecto en la mayoría de las distribuciones. Simplemente ejecute los siguientes comandos desde una ubicación adecuada (por ejemplo, '/ home / pi'):
sudo apt-get install git build-essential python-dev
cd ~
git clone https://github.com/adafruit/Adafruit_Python_PCA9685.git
cd Adafruit_Python_PCA9685
sudo python setup.py install
# if you have python3 installed:
sudo python3 setup.py install


Libreria Referencia
El controlador consta de las siguientes funciones, que puede utilizar para controlar el hardware subyacente al escribir su propia aplicación en Python.

set_pqm_freq(freq)
Descripción:
Esta función se puede usar para ajustar la frecuencia PWM, que determina cuántos pulsos completos por segundo son generados por el IC. Dicho de otra manera, la frecuencia determina la duración de cada pulso desde el inicio hasta terminar, teniendo en cuenta los segmentos alto y bajo del pulso.
La frecuencia es importante en PWM, ya que establecer una frecuencia demasiado alta con un ciclo de trabajo muy pequeño puede causar problemas, dado que el 'tiempo de subida' de la señal (el tiempo que tarda en pasar de 0V a VCC) puede ser más largo que el tiempo que la señal esta activa, y la salida de PWM aparecerá suavizada y puede que ni siquiera llegue a VCC, lo que podría causar problemas.
Argumentos:
freq: Un número que representa la frecuencia en Hz, entre 40 y 1000

Ejemplo:
El siguiente código configurará la frecuencia PWM al valor máximo de 1000Hz:
pwm.set_pwm_freq(1000)

set_pwm(channel, on, off)
Descripción:
Esta función establece el inicio (encendido on) y el final (apagado off) del segmento alto del pulso PWM en un canal específico. 
Tu específicas el valor entre 0..4095 cuando la señal se encenderá, y cuando se apagará. El canal indica cuál de los 16 salidas PWM deben actualizarse con los nuevos valores.
Argumentos:
channel: El canal que debe actualizarse con los nuevos valores (0..15)
on: La marca (entre 0..4095) cuando la señal debe pasar de low a high
off: La marca (entre 0..4095) cuando la señal debe pasar de high a low
Ejemplo:
El siguiente ejemplo hará que el canal 15 comience Low, y pase a High alrededor del 25% en el pulso (marca 1024 de 4096), transición de vuelta a un 75% Low en el pulso (marca 3072) y permanezca bajo durante el último 25% del pulso:
pwm.set_pwm(15, 1024, 3072)
Si necesita calcular el ancho de pulso en microsegundos, puede hacerlo calculando primero cuánto dura cada ciclo. 
Eso sería  asi 1/freq donde freq es la frecuencia PWM que configuraste arriba. Para 1000 Hz, eso sería 1 milisegundo. Luego divide por 4096 para obtener el tiempo por “marca”, por ejemplo:
1 milisegundo / 4096 = ~ 0.25 microsegundos. 
Si quieres un pulso que sea 10 microsegundos de largo, divida el tiempo por tiempo-por-marca (10us / 0.25 us = 40) luego enciéndase en la marca 0 y apague la marca 40.

Bueno espero a ver sido lo suficientemente claro, pero la verdad es que es bastante sencillo, cualquier duda, no duden en consultar.

Hasta la Próxima!!
Saludos!!!

Comentarios

Entradas populares de este blog

Servomotores con Raspberry Pi

Cómo funcionan los servomotores: Los servomotores son ampliamente utilizados en juguetes controlados por radio (automóviles, aviones, etc.), pero también en aplicaciones industriales donde se necesita una posición de rotación precisa (por ejemplo, en robótica). Una alternativa (y una solución a menudo mejor) para lograr el control de la dirección es el motor paso a paso, pero hoy hablaremos de los Servos Normalmente, un servomotor se construye a partir de un motor estándar de CC con un control interno de re-alimentación (un potenciómetro conectado a un engranaje reductor y algunos componentes electrónicos). Su uso principal es girar el eje del engranaje a una dirección predefinida. El motor tiene 3 terminales de entrada, GND, POWER y SIGNAL. Figura 1 El funcionamiento es el siguiente, aplicamos una señal modulada por ancho de pulso (PWM) a la entrada SIGNAL, y la dirección del eje se determina por la duración del pulso. Tenga en cuenta que la dirección no está de...

Controlar motores de CC con RaspBerry PI (1ra Parte)

Figura 1 Voy a intentar de explicar como controlar un motor de CC “digital-mente”, para poder usarlo con un micro-controlador, una placa Arduino u una RaspBerry Pi. Todo de la manera mas llana posible, para esto intentare asumir que el lector tiene unos conocimientos mínimos de electrónica, principalmente que sabe o tiene noción de como funciona un transistor. Vamos a ello, un Motor de CC, funciona de la siguiente manera, como podemos ver en la figura 1. Dependiendo de la polaridad que le apliquemos éste girara en un sentido o en otro, esto creo que no es ninguna novedad verdad?, si a este circuito añadimos un interruptor pues ya podemos controlar el arranque y la parada del mismo. Pero eso seria "analógico" y dependeríamos de un humano para arrancar y parar el motor. Veamos el siguiente circuito: Figura 2  Ahora si, de esta manera podremos controlar el arranque y la parada de forma digital, en en la entrada PIN, ponemos un 1 lógico el transi...