Ir al contenido principal

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á determinada por el ciclo de trabajo (Duty Cicle) , sino por la longitud t del pulso de encendido (on-pulse).


Muchos servomotores usan una frecuencia de PWM de fPWM = 50 Hz correspondiente a un período de PWM de T = 20 ms. La relación entre la duración del impulso t y la dirección es lineal y depende del motor y del engranaje:

Ejemplo: (degs = degrees = grados)

Figura 2


Figura 3



Experimento 1: Motor directamente conectado a GPIO


    Objetivo: 
   Conecte un pequeño servomotor directamente al suministro de 5 V de la Raspberry Pi y controle mediante un puerto de salida digital GPIO utilizando el software PWM.


Precaución: 
Solo use micro servomotores (por ejemplo, TowerPro SG90) debido a la limitación actual del suministro de 5 V.
Figura 4

Es una buena idea alimentar el servomotor con una fuente de voltaje externa, ya que los servos pueden causar 'ruido eléctrico' que podría causar que la Raspberry Pi actúe erráticamente o incluso la rompa por completo. Use el siguiente cableado:
Figura 5
Practica:

Esta practica la haremos por supuesto con nuestra querida RaspBerry. Por desgracia nuestra Raspi no esta diseñada para PWM, pero hay tenemos la libreria GPIO.PWM de Python que podemos "Simular PWM" por software.
Conecte el cable marrón (o negro) a GND (pin 6), el cable rojo a 5 V (pin 2) y el cable amarillo a cualquier salida GPIO. El servomotor está alimentado por 5 V, pero controlado por 3.3 V.
Este ejemplo ara mover el servo primero a 0º, luego 90º y 180º.

Programa Python:

# Servo1.py

import RPi.GPIO as GPIO
import time

P_SERVO = 22 # adaptarse a su cableado
fPWM = 50  # Hz (no más alto con el software PWM)
a = 10
b = 2

def setup():
    global pwm
    GPIO.setmode(GPIO.BOARD)
    GPIO.setup(P_SERVO, GPIO.OUT)
    pwm = GPIO.PWM(P_SERVO, fPWM)
    pwm.start(0)

def setDirection(direction):
    duty = a / 180 * direction + b
    pwm.ChangeDutyCycle(duty)
    print ("Dirección =", direction, "-> Fuerza =", duty)
    time.sleep(1) # permitir que se establezcan
   
print ("Comenzando")
setup()
for direction in range(0, 181, 10):
    setDirection(direction)
direction = 0    
setDirection(0)    
GPIO.cleanup() 
print ("Terminado")

Observaciones: 
Debe esperar que el servomotor este en la nueva dirección antes de cambiar la dirección o finalizar el programa.
Otra cosa que voy a aclarar.... Yo la verdad, de esta manera, no logre que los servos funcionaran correctamente, he probados dos servos uno es el Power HD‑1160A y el conocido Tower Pro SG90, en los dos casos los resultados fueron nefactos 😥, el que mejor reacciono fue el Tower Pro SG90, pero fatal. He hecho varias pruebas probando frecuencias entre 50 y 60Hz y nada no vi mejoras, de la misma manera ponia valores manuales en el Duty y nada...

Por suerte tenemos varias placas PWM que podemos usar con nuestra Raspi y el Chipn PCA9685 es una de ellas con resultados profesionales 😁

Experimento 2: Servomotores impulsados por PCA9685 
Figura 6


Generar señales PWM estables por software es una pesada carga para un microprocesador que ejecuta Linux, porque hay otros procesos ejecutándose en el sistema que pueden interrumpir el código de generación de PWM. Es una mejor solución utilizar un chip externo de propósito especial que hace el trabajo, especialmente si necesita varias señales PWM.

La PCA9685 está diseñada para manejar hasta 16 señales PWM controladas por una interfaz I2C. Se llama 'controlador LED', pero también puede manejar los servomotores.

El chip solo está disponible en un paquete SMT de 28 pines, por lo que deberá soldarlo en un adaptador SMT o comprar un paquete pre-ensamblado como la Interfaz del servocontrolador de 16 canales Adafruit (consulte la imagen a la derecha).

Objetivo:

Conecte un servomotor al canal 0 del módulo basado en PCA9685 y realice la misma acción que en el ejemplo anterior.
Para simplificar su tarea de programación, use una pequeña biblioteca PCA9685.py inspirada en el Servodriver de Adafruit PWM.


Programa Python:


# Simple demo del PCA9685 PWM servo/LED controller library.
# Esto moverá el servo en el canal 0 de la posición mínima a la máxima repetidamente.
# Author: Tony DiCola
# License: Public Domain

import time

# Import the PCA9685 module.
import Adafruit_PCA9685

# Inicializa el PCA9685 usando la direcion por defecto (0x40).
pwm = Adafruit_PCA9685.PCA9685()

# Si tuvieramos otra direccion y/o bus haerlo asi:
#pwm = Adafruit_PCA9685.PCA9685(address=0x41, busnum=2)

# Configuro min y max ancho del pulso para el servo
servo_min = 130  # 0 Grados Min pulse length out of 4096
servo_max = 560  # 180 Grados Max pulse length out of 4096
servo_med = 345  # 90 Grados


# Seteamos la freuencia en 60hz, se reomiendo entre 50 y 60.
pwm.set_pwm_freq(60)

print('Moviendo el servo en el canal 0, press Ctrl-C to quit...')
# pwm.set_pwm(channel, on-Pulso, off-Pulso)

while True:
    # Move servo on channel O between extremes.
    print('Movemos a 0 Grados')
    pwm.set_pwm(0, 0, servo_min)
    time.sleep(1)
    print('Movemos a 90 Grados')
    pwm.set_pwm(0, 0, servo_med)
    time.sleep(1)
    print('Movemos a 180 Grados')
    pwm.set_pwm(0, 0, servo_max)
    time.sleep(1)

Observaciones:

Ahora si que va espectacular!!!! 😁😁

En el próximo articulo, explicare un poco mas profundamente el uso y/o funcionamiento de esta maravillosa placa..

Hasta la proxima

Comentarios

Entradas populares de este blog

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...

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...