Controlar un servo con Rasperry Pi (usando RPIO.PWM y DMA)

En el tutorial de hoy vamos a ver los conceptos básicos para controlar un pequeño servo con nuestra Raspberry Pi. El modelo que utilizaremos será la B+, pero podrás emplear cualquier otro modelo para trabajar con el motor. ¿No sabes qué es un servo? Mira nuestro artículo sobre motores servo para tener una idea de qué son estos motores  y cómo funcionan, pues serán muy útiles en futuros proyectos en los que pensemos mover cosas.

¿Qué necesitamos?

Utilizaremos una Raspberry Pi (con sus accesorios básicos como el teclado y el ratón, el cable HDMI y la alimentación por USB) con Python y la librería RPIO.PWM instalada, una placa de prototipado, una fuente de alimentación externa, un motor servo y unos cuantos cables. La fuente de alimentación externa la emplearemos para alimentar el motor. Si bien podemos alimentar un pequeño dispositivo/sensor con la Pi, no es recomendable emplearla para darle corriente directamente a los servos y los motores en general, pues consumen mucha corriente y pueden hacer que nuestro sistema sea inestable (e incluso cargarse alguno de los pines de nuestra pi). Por ello, el único cable que conectaremos desde la Raspberry al servo será el cable que llevará la señal de control.

¿Qué es RPIO.PWM? ¿Y DMA?

Durante mucho tiempo (aún ahora), para controlar los pines de la Pi se ha empleado una librería llamada RPi.GPIO, que nos da acceso a las entradas y salidas GPIO (General Purpose Input Output). El problema viene cuando nos damos cuenta de que esta librería utiliza algunos recursos de la CPU y no es tan rápida como queríamos. Para solventar el problema se creó RPIO.PWM, que nos permite escribir los valores usando los canales DMA (Direct Memory Access) y no consume casi ningún ciclo de CPU, por lo que será la librería que emplearemos en nuestros proyectos.

 

Otro detalle de la librería es que no necesitamos un canal DMA para cada servo (podemos controlar varios servos con distintos pines de salida de la GPIO), sino que asignamos un canal a la librería y luego podemos trabajar con varios servos en simultáneo.

Comenzamos con las conexiones

Ya vale de teoría, ¿cuándo empezamos? Vamos a mostraros las conexiones del circuito. Lo mejor será ilustrarlo con una fotografía.

Rpi servo connection En la imagen adjunta, puedes ver las conexiones a la Raspberry Pi y al servo motor. Hemos conectado el pin 3 (GPIO2) de la Pi a la señal de control del servo, mientras que utlizaremos una fuente de alimentación externa para alimentar el servo. En la imagen puedes observar también que hemos utilizado el pin 9 (GND) y lo hemos conectado al negativo (GND) de nuestra fuente de alimentación. Este último paso es importante, de lo contrario el servo no interpretará correctamente la señal que le enviamos.

 

 

Código para mover el servo motor

Nota: este código utiliza librerías que acceden internamente al hardware. Por lo tanto, tendrás que ejecutarlo en modo root (sudo python testservo.py).

El siguiente código escrito en Python sirve para realizar unos sencillos movimiento con el servo. Primero que nada una pequeña dosis de realidad: las especificaciones de los motores servo no son perfectas, especialmente si son tan económicos como el que empleamos en estas pruebas. Si bien en el datasheet se indicaba uqe con una señal de 2ms se alanzarían los 90 grados, en la práctica esa señal sólo mueve el servo hasta los 45º, haciendo necesario enviar una señal de 2.5ms para colocarlo en 90º. Tras varias pruebas, la señal que necesitamos para mover el servo a -90º es de 0.6ms, frente al 1 ms que indica el datasheet.

(nota: habrás notado que la señal de 2.5ms excede el ciclo de control de 2ms, y nos resulta muy curioso, pero en este momento no disponemos de otro modelo de servo para comprobar si el problema radica en la librería PWM o en el servo, así que lo dejaremos para otro momento.)

El código importa la librería PWM y time (sólo para hacer delays), y hace una llamada de inicialización de la librería. A partir de ahí, le mandamos una señal de 1.5ms para colocarlo en 0 grados, y entramos en un bucle que se repetirá 10 veces en el que movemos alternativamente el servo entre 90º y -90º. Este código, bastante sencillo, es todo lo que se necesita para trabajar con un servo. Nótese que podríamos mandar una señal a cualquier otra GPIO y mover varios servos simultáneamente. La librería para el servo al finalizar el programa, pero si tenemos un programa largo y queremos dejar de mandarle una señal, podemos hacer servo.stop_servo(2), donde el número indica la salida GPIO a parar.

 

Información adicional

Cómo instalar la librería si aún no lo hemos hecho.

Ejecutamos los siguientes sencillos comandos:

$ sudo apt-get install python-setuptools
$ sudo easy_install -U RPIO

Sobre canales DMA.

Los canales DMA permiten al hardware de control de los GPIO acceder directamente a la memoria sin necesidad de la intervención de la CPU. Existen 15 canales DMA en nuestra RPi que podemos utilizar con nuestra librería. Hay que tener en cuenta, sin embargo, qué canales pueden estar ocupados, porque de lo contrario no conseguiremos trabajar con ellos. El canal 0 está ocupado con el frame buffer, los canales 1,3,6 y 7 por la GPU, el 2 está reservado para la tarjeta SD, y el 15 lo pusieron en otro lado (la explicación es algo complicada y la dejamos para otro día). Por lo tanto, hay que tener cuidado en nuestro código para emplear otro canal de los que acabamos de mencionar.

fuente: foro de raspberry pi

¿Tienes alguna duda sobre este mini proyecto? ¿Has aplicado lo que has aprendido en un proyecto interesante? ¡Te esperamos en los comentarios!

(Visto 1.497 vecess, 1 visitas hoy)

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *