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
- Pantalla
- HDMI cable
- Teclado
- Raspberry PI 3 ( con sistema operativo en micro SD )
- Ratón
- Fuente de alimentación micro USB B
- servomotor
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