En este post controlaremos un servomotor con solo lo que se ha visto. En primer lugar necesitamos saber que es un servomotor y como se maneja.
En en mercado existen gran variedad de servomotores entre los mas comerciales de facil adquision y economicos se encuentran en la siguiente imagen.
Servomotores mas comunes que se pueden encontrar a bajo costo.
Estos servomotores no son mas que motores con la capacidad de posicionarse dentro de un rango segun se le ordene. Para ubicar un servomotor en una posicion dada se emplea la modulacion por ancho de pulso (PWM) donde dependiendo el ciclo util del PWM es donde el servomotor se va ubicar.
Para esto primero se debe saber que la frecuencia a la que va funcionar el servomotor por lo regular es de 50 Hz, es decir, la onda tiene un periodo de 20 ms y de este periodo depende el tiempo en que este en alto para ubicar la posicion del servomotor. En la siguiente imagen se ve que dependiendo el ciclo util es como se ubica el servomotor.

Se aprecia en la figura que para que el servo se ubique a una posicion de 0 grados este debe tener un valor de 1ms en alto y el resto en bajo, como el periodo es de 20 ms se tiene 19 ms en bajo.
Para ubicarlo en 90 grados se sigue el mismo procedimiento, 1.5 ms en alto y 18.5ms en bajo. Por para ubicarlo en 180 grados se tiene 2 ms en alto y 18 ms en alto.
Teniendo esos datos ya se puede hacer el programa que controle el servomotor en 3 posiciones diferentes: 0 grados, 90 grados y 180 grados.
Para programar el giro del servomotor para la siguiente secuencia 0 grados, 90 grados, 180 grados y de regreso a 0 grados se empleara el uso de una tabla. Esta tabla guarda el valor de las constantes para despues solo llamarlas dependiendo la ubicacion en que se encuentra la constante que vamos a emplear en realidad en este ejemplo vamos a emplear dos tablas, el uso de tablas es muy usado en la programacion de microcontroladores, estas tablas es en realidad un Array.
Vamos a definir nuestra salida que seria el pin 13 que es el que hemos ocupado hasta ahorita.
// Control de servomotor basico
int led = 13;
Definiremos nuestras tablas para el guardar nuestras constantes.
Para definir los valores que contienen las tablas vamos a razonar un poco. Primero sabemos que para controlar la posicion de un servomotor se hace con una onda cuadrada con duracion de 20ms.
Segundo, de la duracion de la onda cuadrada osea su periodo su ciclo util para 0 grados es de 1ms para 90 grados es de 1.5 ms y 180 grados es de 2ms teniendo en cuenta eso para completar los 20 ms en 0 grados tenemos que 1ms tendra la onda en alto y 19 ms en bajo (1 ms + 19 ms = 20 ms).
Siguiendo con la logica anterior, para 90 grados (1.5ms + 18.5ms = 20ms), para 180 grados (2ms + 18ms = 20ms) que son los valores que ocuparemos como constantes en nuestras tablas.
Y por ultimo estos valores constantes los vamos agrupar para que ocupen la misma posicion en las diferentes tablas.
float tabla1 [ ] = {1, 1.5, 2};
float tabla2 [ ] = {19, 18.5, 18};
Solo por si no se ve la posicion 0 de la tabla 1 y 2 la ocupan (1 y 19) la posicion 1 la ocupan (1.5 + 18.5) y la posicion 2 la ocupan (2 y 18) que si se suman cualquier par dan como resultado 20 que es el periodo de la onda cuadrada que emplea el servomotor para funcionar.
Proseguiremos con la configuracion del pin 13 como salida
void setup ( )
{
pinMode (led, OUTPUT);
}
Vamos a definir nuestro programa principal
void loop ( )
{
servo_posicion(0);
delay(500);
servo_posicion(1);
delay(500);
servo_posicion(2);
delay(500);
}
El programa principal primero inicia con la posicion 0 (0 grados) con la llamada a funcion servo_posicion, espera medio segundo (500ms), hace la siguiente llamada a funcion pero ahora con la posicion 1 (90 grados) espera medio segundo y manda a llamar la posicion 2 (180 grados) esperando otros 500 ms y vuelve a empezar el programa de nuevo haciendo la secuencia esperada (0 grados, 90 grados, 180 grados y de nuevo 0 grados).
La funcion servo_posicion se escribe enseguida.
void servo_posicion(int valor);
{
int i = 0;
if (valor == 0)
{
for( i = 0; i<10 ; i++){
digitalWrite ( led, HIGH);
delay ( tabla1 [0]);
digitalWrite (led, LOW);
delay( tabla2 [0]);
}
}
if (valor == 1)
{
for(i=0; i<10;i++){
digitalWrite ( led, HIGH);
delay ( tabla1 [1]);
digitalWrite (led, LOW);
delay( tabla2 [1]);
}
}
if (valor == 2)
{
for(i=0; i<10;i++){
digitalWrite ( led, HIGH);
delay ( tabla1 [2]);
digitalWrite (led, LOW);
delay( tabla2 [2]);
}
}
}
La funcion servo_posicion trabaja de la siguiente forma. Recibe como parametro la posicion del servomotor con el valor hace comparaciones con if y dependiendo la posicion se ejecuta el codigo dentro del if donde con digitalWrite(led, HIGH) se pone en alto el tiempo de la posicion de la tabla1 despues se paga con digitalWrite (led, LOW) el tiempo de la posicion de la tabla2 esto lo hace 10 veces para asegurar una onda repetitiva de un periodo de 20ms.
Por ejemplo para el primer valor la funcion servo_posicion recibe un 0 este valor se compara con if(valor == 0) como es verdadero se ejecuta el codigo dentro donde primero se pone en alto el pin 13 y con tabla1[0] que contiene el valor de 1 se mantiene en alto 1 ms ese pin cuando termina el retardo el pin pasa a bajo y con el contenido de tabla2 [0] que tiene 19 se mantendrá 19 ms en bajo esto 10 veces, reflejando en la salida 10 ondas cuadradas con duracion de 20ms con 1ms de ciclo util esto con la finalidad de asegurar que el servomotor tenga el tiempo necesario para llegar a su posicion.
Es claro que este ejemplo se puede simplificar mucho mas, pero la finalidad de este sketch es ver como se emplea lo que se ha visto. Sin duda alguna con el conocimiento que se tiene hasta ahorita se puede hacer un sin fin de cosas. Pero para facilitar las cosas se tienen otras funciones y bibliotecas disponibles que veremos en capitulos posteriores.
En en mercado existen gran variedad de servomotores entre los mas comerciales de facil adquision y economicos se encuentran en la siguiente imagen.
Estos servomotores no son mas que motores con la capacidad de posicionarse dentro de un rango segun se le ordene. Para ubicar un servomotor en una posicion dada se emplea la modulacion por ancho de pulso (PWM) donde dependiendo el ciclo util del PWM es donde el servomotor se va ubicar.
Para esto primero se debe saber que la frecuencia a la que va funcionar el servomotor por lo regular es de 50 Hz, es decir, la onda tiene un periodo de 20 ms y de este periodo depende el tiempo en que este en alto para ubicar la posicion del servomotor. En la siguiente imagen se ve que dependiendo el ciclo util es como se ubica el servomotor.
Se aprecia en la figura que para que el servo se ubique a una posicion de 0 grados este debe tener un valor de 1ms en alto y el resto en bajo, como el periodo es de 20 ms se tiene 19 ms en bajo.
Para ubicarlo en 90 grados se sigue el mismo procedimiento, 1.5 ms en alto y 18.5ms en bajo. Por para ubicarlo en 180 grados se tiene 2 ms en alto y 18 ms en alto.
Teniendo esos datos ya se puede hacer el programa que controle el servomotor en 3 posiciones diferentes: 0 grados, 90 grados y 180 grados.
Programando la aplicacion.
Para programar el giro del servomotor para la siguiente secuencia 0 grados, 90 grados, 180 grados y de regreso a 0 grados se empleara el uso de una tabla. Esta tabla guarda el valor de las constantes para despues solo llamarlas dependiendo la ubicacion en que se encuentra la constante que vamos a emplear en realidad en este ejemplo vamos a emplear dos tablas, el uso de tablas es muy usado en la programacion de microcontroladores, estas tablas es en realidad un Array.
Vamos a definir nuestra salida que seria el pin 13 que es el que hemos ocupado hasta ahorita.
// Control de servomotor basico
int led = 13;
Definiremos nuestras tablas para el guardar nuestras constantes.
Para definir los valores que contienen las tablas vamos a razonar un poco. Primero sabemos que para controlar la posicion de un servomotor se hace con una onda cuadrada con duracion de 20ms.
Segundo, de la duracion de la onda cuadrada osea su periodo su ciclo util para 0 grados es de 1ms para 90 grados es de 1.5 ms y 180 grados es de 2ms teniendo en cuenta eso para completar los 20 ms en 0 grados tenemos que 1ms tendra la onda en alto y 19 ms en bajo (1 ms + 19 ms = 20 ms).
Siguiendo con la logica anterior, para 90 grados (1.5ms + 18.5ms = 20ms), para 180 grados (2ms + 18ms = 20ms) que son los valores que ocuparemos como constantes en nuestras tablas.
Y por ultimo estos valores constantes los vamos agrupar para que ocupen la misma posicion en las diferentes tablas.
float tabla1 [ ] = {1, 1.5, 2};
float tabla2 [ ] = {19, 18.5, 18};
Solo por si no se ve la posicion 0 de la tabla 1 y 2 la ocupan (1 y 19) la posicion 1 la ocupan (1.5 + 18.5) y la posicion 2 la ocupan (2 y 18) que si se suman cualquier par dan como resultado 20 que es el periodo de la onda cuadrada que emplea el servomotor para funcionar.
Proseguiremos con la configuracion del pin 13 como salida
void setup ( )
{
pinMode (led, OUTPUT);
}
Vamos a definir nuestro programa principal
void loop ( )
{
servo_posicion(0);
delay(500);
servo_posicion(1);
delay(500);
servo_posicion(2);
delay(500);
}
El programa principal primero inicia con la posicion 0 (0 grados) con la llamada a funcion servo_posicion, espera medio segundo (500ms), hace la siguiente llamada a funcion pero ahora con la posicion 1 (90 grados) espera medio segundo y manda a llamar la posicion 2 (180 grados) esperando otros 500 ms y vuelve a empezar el programa de nuevo haciendo la secuencia esperada (0 grados, 90 grados, 180 grados y de nuevo 0 grados).
La funcion servo_posicion se escribe enseguida.
void servo_posicion(int valor);
{
int i = 0;
if (valor == 0)
{
for( i = 0; i<10 ; i++){
digitalWrite ( led, HIGH);
delay ( tabla1 [0]);
digitalWrite (led, LOW);
delay( tabla2 [0]);
}
}
if (valor == 1)
{
for(i=0; i<10;i++){
digitalWrite ( led, HIGH);
delay ( tabla1 [1]);
digitalWrite (led, LOW);
delay( tabla2 [1]);
}
}
if (valor == 2)
{
for(i=0; i<10;i++){
digitalWrite ( led, HIGH);
delay ( tabla1 [2]);
digitalWrite (led, LOW);
delay( tabla2 [2]);
}
}
}
La funcion servo_posicion trabaja de la siguiente forma. Recibe como parametro la posicion del servomotor con el valor hace comparaciones con if y dependiendo la posicion se ejecuta el codigo dentro del if donde con digitalWrite(led, HIGH) se pone en alto el tiempo de la posicion de la tabla1 despues se paga con digitalWrite (led, LOW) el tiempo de la posicion de la tabla2 esto lo hace 10 veces para asegurar una onda repetitiva de un periodo de 20ms.
Por ejemplo para el primer valor la funcion servo_posicion recibe un 0 este valor se compara con if(valor == 0) como es verdadero se ejecuta el codigo dentro donde primero se pone en alto el pin 13 y con tabla1[0] que contiene el valor de 1 se mantiene en alto 1 ms ese pin cuando termina el retardo el pin pasa a bajo y con el contenido de tabla2 [0] que tiene 19 se mantendrá 19 ms en bajo esto 10 veces, reflejando en la salida 10 ondas cuadradas con duracion de 20ms con 1ms de ciclo util esto con la finalidad de asegurar que el servomotor tenga el tiempo necesario para llegar a su posicion.
Es claro que este ejemplo se puede simplificar mucho mas, pero la finalidad de este sketch es ver como se emplea lo que se ha visto. Sin duda alguna con el conocimiento que se tiene hasta ahorita se puede hacer un sin fin de cosas. Pero para facilitar las cosas se tienen otras funciones y bibliotecas disponibles que veremos en capitulos posteriores.

0 comentarios:
Publicar un comentario