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

Big Data, Python y otras yerbas

  Trading?      No es un nuevo termino, pero si se ha puesto de moda últimamente...      No hablare de Trading. Llevo tiempo incursionando y haciendo mis pinitos en esto del Análisis de Datos, BigData, Ciencia de Datos, llamalo como quieras, y entre mis conocimientos y curiosidad sobre Estadísticas, la bolsa, las criptomonedas, IA, Python y otras yerbas, quería encontrar un relación entre estas cosas y pensar en hacer algo.      Últimamente el poderío computacional que tenemos a la mano es muy poderoso, y mas si intentamos compararlo con hace solo 10 años atrás, ahora mismo podemos tener una red neuronal en un portátil y hasta en un SmartPhone.       Con esta idea de encontrar una relación con todo esto, buscando por internet me encontré con esta maravillosa librería para Python pandas-datareader , es muy fácil de instalar y de usar, no voy hablar del uso de esta librería, pero si decir que podemos leer la informació...