Você está na página 1de 4

Raspberry Pi LESSON 28: Controlling a Servo on Raspberry Pi with Python

En esta lección, le mostraremos cómo controlar con precisión un Servo usando la


Raspberry Pi. Primero, para el pequeño servo que estoy usando, he verificado que es
seguro conducir desde el pin de 5 voltios (pin físico 2) en la Raspberry Pi. Es posible dañar
su Raspberry Pi extrayendo demasiada corriente de un pin. Por lo tanto, si no está seguro
acerca de los requisitos actuales de su Servo, es mejor alimentarlo desde una fuente de 5
voltios que no sea un pin Raspberry Pi. Aún puede controlarlo desde la Raspberry Pi si usa
una conexión a tierra común, pero solo obtiene la alimentación (cable rojo) de una fuente
externa. Para mi pequeño servo, puedo alimentarlo con seguridad desde el pin físico 2 de
Raspberry Pi.

El segundo punto es que para controlar el servo, debe usar la modulación de ancho de
pulso. Entonces, te recomiendo que pases por la LECCIÓN 27 si aún no lo has hecho. La
Lección 27 le muestra cómo usar PWM en los pines GPIO en la Raspberry Pi. Si está al día
con PWM, esta lección será mucho más fácil.

Entonces, con eso fuera del camino, estamos listos para conectar nuestro servo. Para mi
servo, el cable de tierra es negro, el cable rojo es de 5 voltios y el cable amarillo es la línea
de control. Si está utilizando un servo diferente, necesitará leer las instrucciones para ver
cuál es el código de color para sus tres cables, pero es probable que sea similar al mío. El
siguiente boceto muestra cómo debe conectar el servo. Observe que tengo el 5V
conectado al pin físico Pi 2, la conexión a tierra del servo conectado al pin físico Pi 9 y la
línea de control del servo conectado al pin físico Pi 11.

Ahora con el Servo conectado, estamos listos para intentar controlarlo. Para este
ejemplo, trabajaremos en el shell de Python. Para ingresar al shell de Python, abra una
ventana de Terminal y, en el símbolo del sistema, escriba:
$ sudo python

Es importante incluir sudo, ya que Raspberry Pi solo permite el acceso a los pines GPIO al
superusuario. Por lo tanto, debe ingresar al shell de Python como superusuario. Cuando
escriba el comando anterior, debería ser trasladado al shell de Python, y debería ver el
indicador del shell de Python de >>>.

Ahora estamos listos para controlar el servo. Primero debemos importar la biblioteca RPi.
Estos primeros pasos deberían ser familiares si hiciste la LECCIÓN 27.

>>> importar RPi.GPIO como GPIO

Ahora tenemos que decirle al Pi qué esquema de numeración de pin queremos usar. Me
gusta usar los números de pin físicos (Ver LECCIÓN 25 para un diagrama). Entonces,
necesitamos emitir el comando:

>>> GPIO.setmode (GPIO.BOARD)

Ahora tenemos que decirle al Pi que el pin físico 11 será un pin de salida:

>>> GPIO.setup (11, GPIO.OUT)

La posición de los servos está controlada por el ancho de pulso de una señal PWM de 50
Hz. Por lo tanto, necesitamos activar la secuencia PWM a 50 Hz. Tenga en cuenta que
para una señal de 50 Hz, el período de la señal es 1/50 = .02 segundos, o 20 milisegundos.
Tenga en cuenta este Período, ya que volveremos más adelante. Comenzamos creando
un objeto PWM en el Pin 11 con una señal de 50 Hz con el comando:

>>> pwm = GPIO.PWM (11,50)

Ahora podemos comenzar la secuencia pwm dando un comando para especificar el


DutyCycle de la señal. Antes de hacer esto, necesitamos hablar un poco sobre cómo
funcionan los servos. Un servo típico quiere ver una frecuencia de 50 Hz en la línea de
control. La posición a la que se mueve depende del ancho de pulso de la señal. La mayoría
de los servos se comportan más o menos como tales, pero deberá ajustar estos números
para su servo en particular. Por lo general, el servo irá a la posición izquierda completa
cuando vea un ancho de pulso de 1 milisegundo, irá a la posición media cuando vea un
ancho de pulso de 1,5 milisegundos, e irá a la posición derecha completa cuando vea un
ancho de pulso de 2 milisegundos. Sin embargo, tenga en cuenta que en Raspberry Pi no
especificamos un ancho de pulso, pero sí un DutyCycle. Entonces, podemos usar la
siguiente relación:
DutyCycle = PulseWidth / Period

Recuerde que Periodo = 1 / frecuencia, entonces:

DutyCycle = PulseWidth / (1 / frecuencia) = PulseWidth * frecuencia

El PulseWidth que nos dará una posición completa a la izquierda es 1 milisegundo. Ahora
calculamos el DutyCycle aplicado para darnos la posición deseada:
DutyCycle = PulseWidth * frecuencia = .001 * 50 = .05 = 5%

Entonces, para una señal de 50 Hz, si establecemos el DutyCycle en 5, entonces


deberíamos ver el servo moverse a la posición completamente izquierda. Del mismo
modo, si establecemos DutyCycle en 7.5, deberíamos obtener la posición intermedia, y si
la establecemos en 10 deberíamos estar en la posición correcta. Puede obtener todas las
posiciones intermedias escalando linealmente entre 5 y 10. Tenga en cuenta que estos
valores variarán entre marcas y entre servos individuales, así que juegue con su servo
para calibrarlo. Ahora estamos listos para aplicar un comando para posicionar el servo. Si
queremos que el servo esté en la posición totalmente a la izquierda, deberíamos
establecer el DutyCycle al 5%. Hacemos eso con el comando:

>>> pwm.start (5)

Esto iniciará la señal PWM y la establecerá en 5%. Recuerde, ya especificamos la señal de


50 Hz cuando creamos el objeto pwm en nuestros comandos anteriores. Ahora, si
queremos cambiar la posición, podemos cambiar el DutyCycle. Por ejemplo, si queremos
ir a la posición media, queremos un DutyCycle de 7.5, que podemos obtener con el
comando:

>>> pwm.ChangeDutyCycle (7.5)

Ahora, si queremos la posición correcta completa, queremos un ciclo de trabajo de 10,


que obtendríamos con el comando:

>>> pwm.ChangeDutyCycle (10)

Recuerde, no es DutyCycle lo que realmente controla la posición del servo, es PulseWidth.


Estamos creando DutyCycles para darnos el ancho de pulso deseado.

Ahora, juegue con su servo particular y luego encuentre los DutyCycles específicos que
conducen a las posiciones completamente izquierda y derecha. Para mi servo, encuentro
que la izquierda completa está en DutyCycle = 2, y la derecha completa está en DutyCycle
= 12. Con estos valores, puedo crear una ecuación lineal que me dará cualquier ángulo
que desee entre 0 y 180. Esto hará que el Raspberry Pi se comporte mucho más como la
operación simple e intuitiva del Arduino.

Para hacer la ecuación lineal necesito dos puntos. Bueno, sé que para un ángulo deseado
de 0, debería aplicar un DutyCycle de 2. Este sería el punto (0,2). Ahora también sé que
para un ángulo deseado de 180, debería aplicar un DutyCycle de 12. Este sería el punto
(180,12). Ahora tenemos dos puntos y podemos calcular la ecuación de la línea.
(Recuerde, juegue con su servo... Sus números pueden ser ligeramente diferentes a los
míos, pero la siguiente metodología funcionará si usa sus dos puntos)

Recuerde que la pendiente de una línea será:

m = (y2-y1) / (x2-x1) = (12-2) / 180-0) = 10/180 = 1/18

Ahora podemos obtener la ecuación de la línea usando la fórmula de la pendiente del


punto.

y-y1 = m (x-x1)

y-2 = 1/18 * (x-0)

y = 1/18 * x + 2

Al poner nuestras variables reales, obtenemos

DutyCycle = 1/18 * (ángulo deseado) + 2

Ahora para cambiar a esa posición, simplemente usamos el comando:

pwm.ChangeDutyCycle (DutyCycle)

Espero que esto tenga sentido. Mire el video mientras lo paso cuidadosamente. Si el
comentario anterior no tiene sentido, es de esperar que el video aclare las cosas.

Você também pode gostar