En esta practica vamos a realizar una serie de ejercicios para entender el funcionamiento del servomotor con Arduino UNO.

Desplazamiento automático.

El siguiente ejercicio muestra como se realiza un desplazamiento del eje desde la posición 0 hasta la posición 180 y viceversa. A modo de información nos envia por el puerto serial0 los valores en cada momento para que podamos verlos desde la consola serial.

Todo buena práctica empieza por saber mover de manera automática un servo. Para ello nos vamos servir de una estructura de control variable; es decir un bucle El código lo tienes a continuación.

Desplazamiento del servomotor de 0 a 180º y viceversa.

#include <Servo.h>
Servo servomotor;
int posicion=0;

void setup()
{
servomotor.attach(9);
Serial.begin(9600);
}

void loop()
{
//desplazamiento de 0 a 180º
  for(posicion=0;posicion<180;posicion++){
  servomotor.write(posicion);
  Serial.println(posicion);
    delay(200);
  }
//desplazamiento de 180 a 0º
  for(posicion=180;posicion>=1;posicion--){
   servomotor.write(posicion);
    Serial.println(posicion);
    delay(200);
  }
}
						

Veamos el código en detalle.

Primero es importante recalcar la importación de la librería del servo para que nos facilite las cosas. Después tenemos que crear el objeto Servo que llamaré servomotor. Y para terminar creo una variable posición y le asigno a cero como valor. En esta variable se almacenarán las posiciones que cogerá el servomotor a lo largo del programa.

Estas primeras instrucciones se declaran de manera global antes del bloque setup() y del loop(), ya que es necesario englobar las variables de clase antes de la funcionalidad para que el interprete de Arduino UNO pueda ejecutar correctamente la librería.

En el setup, usamos el método attach() y como parámetros le pasamos el puerto que va a conectarse al Arduino. Este método permite la comunicación entre el servo y la placa Arduino para que no existan problemas de conectividad sin que tengamos que hacer nada más que asignar el puerto digital al que se conectará el servo motor. También en el setup(), inicializamos el monitor serial a una comunicación de 960 baudios.

En el loop() es donde se programará la acción para mover el servo de 0 a 180º. Para ello tenemos que hacer un bucle ascendiente utilizando el bucle for. Si no sabes que es un bucle, repasa el tema de la programación AQUÍ.

Entonces dentro del bucle creamos asignamos al objeto servomotor el método write y como parámetros le pasamos la variable posicion. Esto hará que la variable varie su valor para cada iteracción del bucle. Y además, como queremos mostrarlo, al monitor Serial enviaremos el valor actual de la posición del servo con un tiempo de 200 mili segundos.

El bucle anterior mueve el eje del servo de 0º a 180º, pero como lo que quiero es que se vuelva a su posición inicial, realizo otro bucle decremental que irá de 180º a 0º, usando las mismas variables y métodos para tal fin.

Desplazamientos controlados.

El anterior programa realizaba el movimiento automático del eje del servo de 0 a 180º y de 180º a 0º, tras lo cual empezaba otra vez el movimiento del loop(). Pero si queremos que se mueva la cantidad de grados que deseemos sin tener que escribirlo en el código, podríamos hacerlo de manera que desde una aplicación de escritorio seleccionaramos el ángulo de movimiento y la duración del mismo.

En este ejercicio vamos a hacer que mediante un programa de VB.NET introduzcamos un valor para que se mueva el servomotor. Existe la complicidad que desde la aplicación VB.NET (o Serial0), solo se puede enviar carácteres ASCII, por lo que necesitaremos almacenar en una variable del tipo int dicho valor.

Pero eso no es problema ya que asignaremos posiciones específicas para cada valor de la variable de la forma que cada iteracción de la variable tendrá los siguiente valores:

0-20-40-60-80-100-120-140-160-180

Que ya te estás dando cuenta que el ángulo de giro será de 180 grados con una iteracción de 20º en cada giro.

El código siguiente te muestra el sketch de Arduino UNO:

#import ≶Servo.h>
Servo servomotor;
int posicion = 0;
void setup()
{
servomotor.attach(9);
Serial.begin(9600);
}

void loop()
{
  //comprobar buffer de entrada
  if (Serial.available()>0){
    posicion = Serial.read();
    posicion = (posicion-48)*20;
    servomotor.write(posicion);
    Serial.println(posicion);
    delay(1500);
  }
}
							

Cuando ejecutas dicho código podrás ver que si abres el monitor Serie e introduces números de 0 a 9, el eje del servomotor se desplazará entre 0 y 180º según el número introducido en el teclado.

Control de servo con monitor serial de IDE de ARDUINO

Pero ya que en esta web también está el curso de VB.NET podemos hacer una aplicación para controlar el movimiento del servo. Así que vamos a ello.

Controlador externo de VB.NET.

Para el proyecto solo necesitas crear un nuevo proyecto de Windows form con el lenguaje de Visual Basic.NET. Yo le he puesto el nombre al proyecto de moverServo. Tu le puedes poner otro nombre si deseas.

Nuevo proyecto de Windows Form en VB.NET

Para tu proyecto simple necesitarás cuatro controles principales: un TextBox, un Button, un SerialPort y un ComboBox. En el TextBox irá el puerto de conexión de la placa Arduino al ordenador. Eso nos servirá de conexión puente para poder comunicarnos con nuestra placa Arduino UNO desde la aplicación. El Button servirá para crear la conexión. La conexión se tiene que abrir entre diferentes dispositivos y debe de mantenerse abierta para poder manipular al servo desde VB.NET. Por último el ComboBox nos servirá para establecer el condicional CASE para en caso de escoger un valor u otro, el eje del servo se mueve ciertos grados. De tal forma estableceremos a cada condición case de su atributo selectedItem del Select Case, un valor para enviar a la placa Arduino UNO que moverá el eje respectivamente y de acuerdo a la programación del sketch.

Programa básico

La programación del programa moverServo tampoco es muy difícil. Yo he programado en las propiedades del TextBox la propiedad Text con el nombre del puerto del Arduino UNO directamente de mi PC (en mi caso COM4). Pero perfectamente la puedo escribir cuando ejecuto el programa. También en el Button que sirve para conectar, he creado una estructura de control Try para en caso de que se produzca un fallo en la ejecución de la conexión, me lo indique.

Control de conexión a la placa Arduino desde VB.NET

Fijate que dentro del Try realizo la conexión del puerto que está llamando al nombre del TextBox y que gracias al control SerialPort abrirá la conexión con el método Open().

Si se produce un fallo con la conexión como que por ejemplo estés conectado desde el Monitor Serial de Arduino, aparecerá una ventana de error.

Para escoger el valor de las posiciones del servo, me he decantado por un ComboBox que realizará lo mismo que el sketch. Dentro del mismo hay que hacer una estructura condicional para que, cada elemento del Combobox, represente un valor de la variable posición del sketch de Arduino UNO.

Con ello se puede hacer un condicional Select Case y asignarlo a los elementos seleccionados del mismo, de manera que por cada elemento del mismo se represente un número de la variable posición.

Esto anterior implica que dentro de las propiedades del ComboBox, en la propiedad Colección, introduzcas elementos del 0 al 9 ambos incluidos. El código es el siguiente:

Selección de elementos en VB.NET

El resultado lo puedes ver en la pantalla siguiente:

proyecto final para controlar el servo desde VB.NET

Una vez que compruebes que funcione el proyecto, podrás adaptar el proyecto de VB.NET y hacerlo bonito, personalizandolo o agregando funcionalidad o librerías externas como he hecho yo.

ajusto el proyecto y lo dejo bonito y práctico

En la zona de vídeo de esta clase podrás ver el proceso de creación de la aplicación sketch y aplicación VB.NET y en la zona de descargas podrás bajarte tanto los archivos, como las librerías. El proyecto de VB.NET es completo y está en formato .zip que puedes descomprimir metiendo la contraseña "mirpas.com".