¿Por qué utilizar servos?

Los servos son componentes muy usados en brazos robóticos, maquetas, domótica, robots… porque nos permiten crear movimientos verdadermente útiles a un gran abánico de aplicaciones. ¿Te gustaría aprender a controlar servos con tu Arduino?

Objetivos

En este tutorial:

  1. Vamos a hacer un barrido del servo, controlando su posición con Arduino.
  2. Vamos a controlar el barrido del servo con un potenciómetro.

Barrido de un servo controlado con Arduino

Esquema de conexión

El servo que voy a usar es el Servo ES09D de Emax, también puedes usar otros, como el servo SG90, no te preocupes por el modelo, los más habituales se conectan y programan de la misma forma.

Nuestro servo tiene tres cables, en este caso marrón, rojo y amarillo, aunque estos colores pueden variar. Sabemos que el marrón es GND, el rojo es la alimentación (5-6V, depende del servo) y el amarillo es la señal de control. Los cables de los servos tienen una terminación hembra, si tienes un Arduino/Genuino UNO puedes convertir los cables a macho, con estos cables jumper macho-macho o con estos pines conversores macho-macho.

Por tanto, conectamos los cables rojo y marrón a 5V y GND, respectivamente, y el amarillo a un pin digital de Arduino, yo lo he conectado en el pin 9, tal que así:

Fácil, ¿no? Pues… ¡vamos a programarlo!

Programación para hacer un barrido con el servo: “sweep”

Abrimos Arduino IDE. Para controlar los servos disponemos de una librería en Arduino IDE, la incluimos.

Creamos un objeto para controlar el servo, al cual yo he llamado servo. ¿Para qué vamos a complicarnos?

Servo servo;

Creamos una variable de tipo int que va a almacenar la posición del servo, es decir, el ángulo.

int angulo = 0;

En la funcion void setup() vinculamos el objeto servo con el pin 9.

servo.attach(9);

En la función void loop() vamos a programar que el servo se mueva de 0 a 180 grados y vuelva de 180 a 0 grados. Para ello, vamos a usar el bucle for()

// De 0 a 180 grado
for(angulo = 0; angulo <= 180; angulo++){ 
  servo.write(angulo); // Le decimos al servo la posición
  delay(15); 
} 

// De 180 a 0 grados 
for(angulo = 180; angulo >= 0; angulo--){
  servo.write(angulo);   // Le decimos al servo la posición
  delay(15);
}

Finalmente, el código nos ha queda así:

/**
 * Ejemplo de barrido con un servo controlado con Arduino
 * Copyright 2016 - Fábrica Digital (fabricadigital.org)
 *
 * Publicado bajo licencia CC-BY-SA 4.0
 * Creative Commons: Reconocimiento - Compartir Igual 4.0 Internacional
 * http://creativecommons.org/licenses/by-sa/4.0/deed.es_ES
 *
 * Modificado el 18 de junio de 2016
 * por Eloísa Romero para Fábrica Digital
 */

#include <Servo.h>

Servo servo;   // Objeto servo para controlarlo

int angulo = 0;  // Variable que almacena la posición del servo

void setup() {
  servo.attach(9);  // Pin al que hemos conectado el servo
}

void loop() {
  // Barrido de 0 a 180 grados
  for(angulo = 0; angulo <= 180; angulo++){
    servo.write(angulo);  // Le decimos la posición
    delay(15);
    }

  // Barrido de 180 a 0 grados
  for(angulo = 180; angulo >= 0; angulo--){
    servo.write(angulo);   // Le decimos la posición
    delay(15);
    }
}

Barrido de un servo controlado con un potenciómetro

Esquema de conexión

Añadimos al circuito que hemos construído anteriormente un potenciómetro. Para ello, vamos a necesitar también una breadboard.

¿Has usado alguna vez un potenciómetro? Si no lo has hecho, te recomendamos echar un ojo a nuestro tutorial de Iniciación a Arduino, en concreto, a la lección Entradas analógicas y sensores.

Conectamos el servo a Arduino a través de la breadboard, así como el potenciómetro. En este tutorial hemos dejado el servo en el pin 9 del ejemplo anterior y hemos conectado el potenciómetro al pin A0. El esquema es el siguiente:

¿Listo? ¡Vamos con la programación!

Programación para controlar el barrido del servo con un potenciómetro: “knob”

Partiendo del código anterior, tenemos:

  1. Incluída la librería Servo.
  2. Creado el objeto servo.
  3. Variable int que almacena la posición del servo.

Queremos que la posición del servo dependa del potenciómetro, por tanto, debemos de conocer el valor del potenciómetro. En la función void loop() hacemos la lectura del potenciómetro, la cual, almacenamos en una varible.

int valorPotenciometro = analogRead(A0);

Como ya sabemos, el potenciómetro da una lectura en un rango de 0 a 1023 y este servo se mueve entre 0 y 180 grados, por lo que debemos establecer la relación entre la posición del potenciómetro y la posición del servo. En otras palabras, tenemos que escalar el rango del potenciómetro.

Para ello, podemos utilizar la función map. La función map toma dos 5 argumentos que son el valor de entrada (a escalar), los límites inferior y superior del rango original de dicho valor y los límites inferior y superior del rango al que escalar. Esta función devuelve un valor que es el proporcional al de entrada en el rango de destino.

angulo = map(valorPotenciometro, 0, 1023, 0, 180);

Ya lo que nos queda es darle al servo la instrucción de la posición con una pequeña pausa entre lectura y lectura:

servo.writte(angulo);
delay(15);

Definitivamente, el código para controlar el servo con el potenciómetro (knob) nos ha quedado:

/**
 * Ejemplo de barrido con un servo controlado con un potenciómetro
 * Copyright 2016 - Fábrica Digital (fabricadigital.org)
 *
 * Publicado bajo licencia CC-BY-SA 4.0
 * Creative Commons: Reconocimiento - Compartir Igual 4.0 Internacional
 * http://creativecommons.org/licenses/by-sa/4.0/deed.es_ES
 *
 * Modificado el 20 de junio de 2016
 * por Eloísa Romero para Fábrica Digital
 */

#include <Servo.h>

Servo servo;   // Objeto servo para controlarlo

int angulo = 0;  // Variable que almacena la posición del servo

void setup() {
  servo.attach(9);  // Vinculamos el objeto con el servo
}

void loop() {
  int valorPotenciometro = analogRead(A0);  // Leemos el potenciómetro
  angulo = map(valorPotenciometro, 0, 1023, 0, 180);  // Relacionamos el valor del potenciómetro con el ángulo del servo
  servo.write(angulo); // Enviamos la instrucción posición al servo
  delay(15);
}

Deja un comentario