sábado, 3 de junio de 2017

Práctica 7

En esta practica moveremos un servo por medio de los GPIOs de Raspberry PI. 

Como siempre empezaremos analizando los componentes que vamos a utilizar. En este caso ya hemos visto como funciona la ras-pi, asi que nos centraremos en el servo. El primer punto es saber qué es un servo.

Los servos son motores de corriente continua, pero en lugar de diseñarse para obtener un giro continuo que podamos aprovechar, se diseñan para que se muevan un angulo fijo en respuesta a una señal de control, y se mantengan fijos en esa posición.

Habitualmente los servos tiene un margen de operación, es decir, pueden moverse entre 0º y ángulo dado, que suele ser de 180º, pero existen modelos de múltiples características, incluyendo servos de 360º.

Una vez tenemos esto claro, analizaremos nuestro servo, el sg 90.

Si bien es cierto que la hoja de características de este componente es bastantes escasa, nos da bastante información. Sabemos además, que su rango de trabajo es de 0º a 180º.


Una característica importante de los servos el el Dutty Cycle o ciclo de trabajo, que se define como la relación que existe entre el tiempo en que la señal de control de encuentra en estado activo y el periodo de la misma. 



Según la información del datasheet, nuestro servo estará en u posición más a la izquierda con un ancho de pulso de 1ms y en su posición máxima a la derecha con 2ms. Estos dos valores, suponen un 5% y un 10% del periodo respectivamente.

Esto quiere decir que en teoría tenemos:
  • dc_min(0º)= 2
  • dc_max(180º)=12

Con estos datos, p1=(0,2) y p2=(12,180), y utilizando la ecuación de la recta:




El esquema de montaje es el que sigue:



Con esta información, ya podemos comenzar con el programa. 

Lo primero en cualquier programa de python es declarar el intérprete, y en nuestro caso, habilitar los caracteres especiales del castellano:

#! usr/bin/python
# - config: utf-8- -*- #permite escribir caracteres en castellano

Después configuraremos los puertos GPIO para y activaremos el PWM:


En el resto del programa, definiremos las variables y aplicaremos los cambios del ciclo de trabajo:


Después del cambio, dejamos un pequeño intervalo de tiempo para que le de tiempo al servo a moverse. 

En teoría esto sería suficiente para controlar el servo, pero sin embargo en la práctica no lo es. El rango del servo no es lineal, si no más bien lineal a tramos, generando un error acumulativo que la realidad no se corresponda con los cálculos. 

La solución es aplicar la misma fórmula pero esta vez en tramos, comprobando experimentalmente los valores de DC en varios puntos (grados conocidos).

En mi caso he realizado una división cada 10º, con lo que resultan 18 tramos:



La adaptación a la formula será la que sigue:


De este modo, calculamos una recta en cada tramo, donde nos aseguramos que su comportamiento es lineal. 


Otra dificultad que vamos a encontrar, es que el servo "vibra". Esto es debido a que tenemos entre manos un ordenador que se ocupa de muchos más procesos que de nuestro servo. 

Para solucionar esto, habría que darle prioridad el proceso de control de los GPIOs, lo cual es un tema mucho más complejo. 




No hay comentarios:

Publicar un comentario