Icono del sitio AranaCorp

Controla un servomotor con Raspberry Pi

Uno de los principales objetivos en robótica es hacer que las cosas se muevan. Una forma de hacerlo es usar servomotores. En este tutorial, veremos cómo programar su Raspberry Pi para controlar dicho dispositivo.

Prerrequisito : Programación con Raspberry Pi

Material

Servomotor

Los servomotores son pequeños dispositivos que contienen mecánica y electrónica integradas. Son ampliamente utilizados en modelismo, robótica y otras aplicaciones. Su nombre proviene del hecho de que controlan su posición (o velocidad) por su cuenta.

Básicamente, un servomotor está compuesto por un pequeño motor de corriente continua, una caja de cambios y componentes electrónicos integrados que pueden controlarse fácilmente mediante la Modulación de ancho de pulso (PWM) desde un microcontrolador.

Wiring

El servomotor se alimenta a través del cable negro / marrón (GND) y el cable rojo (+ 5V) y recibe la señal PWM en el cable amarillo / blanco (pin12). Dependiendo de la cantidad o potencia de los servomotores que desee utilizar, la Raspberry Pi puede alimentar el servomotor, pero se recomienda utilizar una fuente de alimentación externa.

Como recordatorio, aquí está el pinout de la Raspberry Pi 3.

Código básico para controlar un servomotor

Para controlar el servomotor en posición, solo necesitamos aplicar un comando PWM que se hace fácilmente usando la biblioteca RPi.GPIO. Para hacerlo, configuramos un pin como salida PWM.

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import RPi.GPIO as GPIO
import time

def AngleToDuty(ang):
  return float(pos)/10.+5.
  
#Setup servoPin as PWM output of frequancy 100Hz
servoPin=12
GPIO.setmode(GPIO.BOARD)
GPIO.setup(servoPin,GPIO.OUT)
pwm=GPIO.PWM(servoPin,100)

#setup sweep parameters
depart =0
arrivee=180
DELAY=0.1
incStep=5
pos=depart


if __name__ == '__main__' :

	pwm.start(AngleToDuty(pos)) #star pwm

	nbRun=3
	i=0
	while i<nbRun:
		print("--------------------------run {}".format(i)) 
		for pos in range(depart,arrivee,incStep):
			duty=AngleToDuty(pos)
			pwm.ChangeDutyCycle(duty)
			time.sleep(DELAY)
		print("position: {}° -> duty cycle : {}%".format(pos,duty))
		
		for pos in range(arrivee,depart,-incStep):
			duty=AngleToDuty(pos)
			pwm.ChangeDutyCycle(duty)
			time.sleep(DELAY)
		print("position: {}° -> duty cycle : {}%".format(pos,duty))
		
		i=i+1
	  
	pwm.stop() #stop sending value to output
	GPIO.cleanup() #release channel
	

Nota: al copiar el código de Python de Internet, puede encontrar problemas de indentación que conducen a un error de compilación.

Fuentes

Encuentre otros tutoriales y ejemplos en el generador de código automático
Arquitecto de Código

Salir de la versión móvil