Ejercicio 3: servos

Vamos a empezar a hacer ejercicios con un nivel de dificultad algo mayor y vamos a empezar a utilizar la protoboard para ir pinchando en ella algunos componentes y cables para hacer conexiones. Todos los materiales necesarios para este ejercicio están contenidos en el Kit WorkShop.

Primero haremos un mando para un servo de radio control.
Utilizaremos un potenciómetro para controlar el movimiento de giro del eje de un servomotor.
Circuito:

servo arduino ardumania ardutienda

Imagen generada con Fritzing.

Los servomotores tienes tres cables: alimentación (rojo), GND (que puede ser negro o marrón) y señal (que puede ser blanco o naranja). El cable de alimentación debe ser conectado al pin 5V de la placa Arduino. El cable GND debe ser conectado al pin GND de la placa Arduino. El pin de señal se conecta al pin 9 de la placa Arduino UNO para este ejercicio.

AVISO: En este ejercicio vamos a utilizar un micro servo de 9g cuyo consumo es tolerado por la placa, para otros montajes en los que el servo utilizado sea mayor NO se pueden conectar la tierra y la alimentación del servo a la placa Arduino si no directamente a la fuente de alimentación o a una batería.

El potenciómetro debe ser conectado de manera que los dos pines exteriores estén conectado a alimentación (+5V) y a GND, el pin central lo conectaremos a la entrada analógica 0 en el Arduino UNO.

En este ejercicio vamos a ver como se incluye una librería para hacernos más fácil el interactuar con un dispositivo, en este caso el servo.

Código:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
// Controlando la posición de un servo usando un potenciómetro (resistencia variable)
// Por Michal Rinott

#include <Servo.h> // Carga la librería Servo.h que contiene métodos para trabajar con servos

Servo myservo;  // Crea un objeto servo para controlar el servomotor
int potpin = 0; // Pin analógico usado para conectar el potenciómetro
int val;        // variable para leer el valor del pin analógico

void setup()
{
myservo.attach(9); // asocia el servo al pin 9
}

void loop()
{
val = analogRead(potpin);  // lee el valor del potenciómetro (valor
                           //entre 0 y 1023)
val = map(val, 0, 1023, 0, 179);  // escala el valor para usarlo con el
                           //servo (valor entre 0 y 180)
myservo.write(val);        // fija la posición del servo de acuerdo
                           //al valor escalado
delay(15);                 // espera a que el servo se posicione
}

Con un código tan sencillo haremos que el servo se mueva según movamos el potenciómetro de modo que al estar el potenciómetro en el límite inferior de su recorrido el servo estará en la posición de 0º, si centramos el potenciómetro el servo estará en la posición de 90º y si llevamos el potenciómetro a su límite superior el servo alcanzará la posición de 180º.

Vamos a aprovechar este ejercicio para introducir un método que puede ser utilizado tanto para el de depurado de código como el calibrado de un actuador o un sensor.

Imaginemos que tenemos hecho nuestro Sketch, lo subimos a la placa y, a pesar de estar correctamente escrito (no da errores el compilador), no hace lo que nosotros queremos. El error puede estar en la forma en que trabajamos con los valores de forma interna y eso no lo podemos ver a menos que los mostremos por el monitor serie.

Otro caso puede ser que, una vez realizado nuestro montaje, queramos que el servo comience su recorrido desde una posición determinada y no sabemos cual es. Entonces podemos utilizar el monitor serie para calibrar nuestro servo y su recorrido.

Para ello activaremos el puerto serie incluyendo en el setup() la línea:

1
Serial.begin(9600);

Esta instrucción inicializará la comunicación con el ordenador a través del puerto serie.

Luego iremos al final del Sketch, justo a la última línea, donde está el comando delay(15) y antes de ella insertaremos el comando que dará salida a los datos que veremos en el monitor serie:

1
Serial.println(val);

Por último, y para darle tiempo al monitor serie a mostrar los datos sin que estos bailen a toda velocidad cambiaremos el valor del comando delay() a 500ms. De esta forma nuestro Sketch moverá el servo y nos mostrará la posición en la que se encuentra cada medio segundo, así podemos dejar el servo en la posición exacta que queramos viendo el número contenido dentro de la variable val.

Subiremos el Sketch a la placa y activaremos el monitor serie. No pongo el ejercicio resuelto para que os esforcéis un poquito.

El tipo de señal que se le envía al servo desde la placa Arduino UNO es la señal de control que se utiliza en todos los mecanismos de radio control (servos, receptores, variadores, etc). Es tipo de señal muy concreto que aunque se pueda etiquetar con unas siglas que aquí no voy a utilizar tiene unas características que me impiden etiquetarla como tal, en breve publicaré el apéndice de este ejercicio en el que explicaré y definiré con todo lujo de detalles y ejemplos como son las señales de control de RC.

 

Este ejercicio está basado en los ejemplos de la página oficial:
http://arduino.cc/en/Tutorial/Knob
http://arduino.cc/es/Tutorial/Knob
y en mi experiencia trabajando con servos e impartiendo WorkShops.


Si este tutorial te ha sido de utilidad puedes considerar hacerme un donativo, por pequeño que sea estarás contribuyendo a que siga con esta labor.


8 Comentarios

  1. Pingback: Nueva entrega del curso de iniciación, la 3ª | Ardumanía

  2. como puedo conectar varios potenciometros para controlar distintos servos??

    • Para controlar varios servos con varios potenciómetros debes conectar los potenciómetros a las entradas analógicas y luego, por software, vinculas la lectura de cada potenciómetro al comando para activar cada servo.

      Partiendo del programa de ejemplo de este ejercicio es sencillo.

  3. Pingback: Arduino + Potenciometro + Servo | Aprenduino

  4. ¿Es posible que con un potenciómetro mueva dos servos pero en dirección contraria?

  5. hola esta muy bueno el tutorial , gracias por ayudarnos amigo.

    tengo una consulta he intentado poner ese servo de 9g alimentado a una fuente de 5voltios y 1amperio distinta al del arduino y cuando conecto el pin del servo el de color amarillo este comienza a girar sin parar hasta el otro extremoo .

    pero cuando conecto los cables del servo al 5v y a tierra del arduino alli si funciona bien , me ejecuta perfecto……….que puede estar faltando amigo porque sucede que cuando lo conecto el rojo (5v) y el marrón a tierra de otra fuente ya no me hace caso se corre defrente aun teniendo conectado el pin amarillo del servo al arduino , espero me puedas ayudar en esta duda , gracias

    • Debes conmutar las masas, es decir, un pin GND de Arduino debe estar en contacto con el negativo o tierra de la otra fuente de alimentación.

Deja un comentario

Campos requeridos marcados con *.


Una estúpida ley me obliga a molestarte con algo obvio: este sitio utiliza cookies. Aquí tienes el ladrillo en cuestión por si quieres leerlo