Arduino: Moviendo un Micro Servo SG90 9g

servo1El Kit de Arduino que obra en mi poder viene acompañado con los sensores básicos, mi objetivo es conocerlos todos y probarlos antes de seguir con otros proyectos.

Hoy le ha tocado a uno de los componentes más interesantes de la caja, un servomotor.

En concreto el modelo del kit es el siguiente: Tower Pro Micro Servo 9g SG90 (sg90servo).

servo2

Los servo normalmente no están ideados para un giro continuo como los motores convencionales (por ejemplo para hacer girar un rueda que mueva nuestro Arduino), los servos están diseñados para que se muevan un determinado angulo y se mantengan en una posición en respuesta a una señal. Nuestro modelo puede rotar 180 grados, 90º en cada sentido.

El servo se conecta usando 3 hilos:

  • 5V (rojo)
  • GND (negro/marrón)
  • Control (amarillo/blanco) conectado al PIN nº7 en este ejemplo.

servo5

El control de un servo se facilita en forma de librería con funciones especiales, en el IDE de desarrollo debemos asegurarnos de que esta instalada (menú Programa > Incluir librería).

servo4

Para usar la librería sólo debemos añadir el fichero de cabecera:

#include <Servo.h>

Para probar abriremos un proyecto de ejemplo para servos llamado Sweep (tutorial oficial en arduino.cc). Es muy sencillo, va enviando la orden de mover el motor del servo grado a grado desde 0 hasta 180 (con una pequeña espera o delay), luego realiza la misma operación de forma inversa.

Referencias al lenguaje usado para el código:

Primero declaramos un objeto de tipo Servo.  En el bloque de código Setup() usamos el método attach() pasando como parámetro de entrada el pin al que tenemos conectado el hilo amarillo con la señal de control.

El método write() escribe un valor al servo con el angulo de rotación.

#include <Servo.h>

#define SERVO_PIN 7
#define SERVO_MX_ANGLE 180
#define SERVO_DELAY_MS 100

Servo myservo; 

int pos = 0; 

void setup() {
 myservo.attach(SERVO_PIN); 
}

void loop() {
 
 myservo.write(45);
 delay(1000);
 myservo.write(90);
 delay(1000); 
 myservo.write(180);
 delay(1000); 
 myservo.write(0);
 
 for (pos = 0; pos <= SERVO_MX_ANGLE; pos++) { 
 myservo.write(pos); 
 delay(SERVO_DELAY_MS); 
 }
 for (pos =SERVO_MX_ANGLE; pos >= 0; pos--) { 
 myservo.write(pos); 
 delay(SERVO_DELAY_MS); 
 }
}