Servomotores en Arduino

En esta sesión comenzamos a trabajar con actuadores en Arduino. En este caso, con servomotores

Los actuadores son componentes que a partir de un valor digital pueden variar nuestro entorno, por ejemplo, a través de movimientos. Veremos también cómo producir sonidos, medir temperaturas o la intensidad de la luz.

Un servomotor es un dispositivo similar a un motor que tiene la capacidad de ubicarse en cualquier posición dentro de su rango de operación y mantenerse en dicha posición. A través de su programación, podremos alterar tanto su velocidad como su posición. Un ejemplo sencillo podría ser una barrera de un paso nivel, acoplando un pequeño palo de madera al servo, modificando su valor desde 0 a 90 grados y de esta forma levantar la barrera.

A veces necesitamos librerías (programas ya hechos por terceros) que nos aporten funcionalidades o nos simplifiquen la programación. Arduino cuenta con un buen número de ellas, pero en ocasiones es necesario descargarlas o crear las nuestras propias. Cuando se da este caso es necesario instalarlas para poder usarlas. Para ampliar la información podéis visitar el siguiente enlace:  http://openlanuza.com/librerias-en-arduino/

En esta sesión vamos a utilizar una librería que viene por defecto en el IDE de Arduino, la denominada librería «Servo«.

Nuestro servomotor tiene 3 cables: tensión, masa y señal. Aparte de los ya conocidos cables rojo y negro (marrón oscuro), tendremos un cable amarillo, que es el que conectaremos a nuestra salida digital. Esta salida digital recibirá los grados que girará la biela de nuestro servo.

El esquema del montaje es como se puede ver a continuación:

Para comprobar su correcto montaje podemos cargar el ejemplo situado en EJEMPLOS-SERVO-SWEEP y comprobar como nuestro servo gira en 180 grados su viela.

Especial atención a la función myservo.write(pos) de la librería “Servo” que va a ser la encargada de hacer que se mueva nuestra biela en un rango de posibilidad de 0 a 180 grados, en la posición que determine la variable “pos”.

Una vez comprobado que funciona bien, podemos añadir nuevas instrucciones para que nuestra biela vaya directamente a las posiciones 0, 90 y 180 y entonces produzca un movimiento continuo en esas 3 posiciones. Bastaría con duplicar la instrucción myservo.write(pos) y variar los valores de la variable “pos”. 

El código a cargar sería el siguiente:

#include <Servo.h>
Servo myservo; // create servo object to control a servo
// twelve servo objects can be created on most boards
int pausa=500;
void setup()
{
myservo.attach(9); // attaches the servo on pin 9 to the servo object
}
void loop()
{
myservo.write(0);
delay(pausa);
myservo.write(90);
delay(pausa);
myservo.write(180);
delay(pausa);
myservo.write(90);
delay(pausa);
myservo.write(0);
delay(pausa);
}

Jugando con los diferentes valores podemos hacer que nuestro servo se mueva en la dirección que deseemos.

Y como siempre, nuestro reto final. Os proponemos montar un potenciómetro para que la biela de nuestro servo gire en función de cómo giremos nuestro potenciómetro. El esquema de montaje sería el siguiente:

servo-1

A la hora de programar, hay que tener en cuenta que mientras que el servo trabaja con valores de 0 a 180, el potenciómetro trabaja con valores de 0 a 1023, por lo que tenemos que utilizar la función map(sensorValue, 0, 1023, 0, 180); para hacer una regla de tres y de esta forma el servo se pueda mover con los valores que es capaz de trabajar.

Para más información, decidimos visualizar a través de monitor serie ambos valores.

Y el código a programar sería el siguiente:

#include <Servo.h>
Servo myservo; // create servo object to control a servo
// twelve servo objects can be created on most boards
int pausa=100;
int sensorValue = 0; // variable to store the value coming from the sensor
int outputValue = 0; // value output to the PWM (analog out)
void setup()
{
myservo.attach(9); // attaches the servo on pin 9 to the servo object
Serial.begin(9600);
}
void loop()
{
sensorValue = analogRead(A0);
Serial.print(«sensor = » );
Serial.print(sensorValue);
outputValue = map(sensorValue, 0, 1023, 0, 180);
Serial.print(«\t output = «);
Serial.println(outputValue);
myservo.write(outputValue);
delay(pausa);
}

Para finalizar, esta semana será nuestro alumno Jesús Verano, de 1º de Bachillerato, quien participó el año pasado en diferentes proyectos de robótica que presentamos en el Desafío STEM, quien nos explique toda la sesión de una manera más visual.

 

 

Deja una respuesta

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