lunes, 1 de junio de 2020

Norba ships: construyendo un vehículo acuático bluetooth

Durante los dos últimos cursos hemos creado vehículos terrestres, aéreos, estaciones, brazos robots,... pero nos ha quedado en el tintero la construcción de vehículos que puedan desplazarse por el agua. Así que es el momento de ponerse manos a la obra para añadir un nuevo miembro a la familia, siguiendo con la línea de construcción basada en materiales reciclados y circuitería basada en Arduino.

Aprendiendo a programar

Para la construcción de este tipo de vehículos ha sido necesario adquirir previamente una serie de conocimientos de programación de controladores Arduino. Esto nos ha llevado cierto tiempo, ya que partíamos de prácticamente ningún tipo de experiencia en programación. Nos ha llevado más de un mes en asimilar lo más básico, usando para ello el simulador online TinkerCad, en el que los alumnos han realizado creaciones de pequeños programas de control de leds e interruptores. Hemos usado como referencia algunas entradas de este blog como la de iniciación a arduino en la que podemos encontrar numerosos ejemplos prácticos.

Diseños preliminares

La idea básica del diseño consistía en crear una estructura lo más hidrodinámica posible y que flotara, sobre la que instalar la circuitería de control del timón y de propulsión. El timón se movería con un servo controlado por Arduino. La propulsión consistiría en un ventilador de un PC cuya velocidad de rotación pudiera también ser controlada a voluntad. Finalmente, para optimizar el rendimiento, habíamos pensado en la posibilidad de que el ventilador pudiera oscilar a la derecha o a la izquierda junto al timón.

Creando del fuselaje

Una vez realizados varios diseños sobre papel, los alumnos comenzaron a plasmar de forma física sus ideas, usando para ello materiales reciclados. Algunos se centraron en utilizar bandejas de poliesman, muy ligeras, sobre las que montar todos los circuitos, modificándolas adecuadamente para que tuvieran una forma lo mas hidrodinámica posible. Otros utilizaron pequeñas botellas de plástico de medio litro a modo de flotadores, sobre las cuales montaron una plataforma de madera contrachapada de 3mm obtenida de retales de otros proyectos que sirviera de soporte para toda la circuitería.

Construyendo fuselaje con botellas de plástico y contrachapado de 3mm

Construyendo fuselaje con bandejas de poliespan modificadas

Control del timón mediante pulsadores

Una vez construido el fuselaje, se comenzó la construcción del timón junto a su circuitería de control. En primer lugar se optó por un diseño sencillo, aunque poco funcional, que permiritía comprobar si el funcionamiento del timón era correcto y estable. La idea era conectar la superficie del timón a un servo, y mover este mediante dos pulsadores en un "mando a distancia" conectado al barco mediante un cable de tres hilos. El principal problema de esta solución es que solamente nos podemos alejar del barco a la distancia determinada por la longitud del cable, algo poco práctico en un sistema real. Pero tiene la ventaja de que la implementación es muy sencilla y barata.

Circuito de control de timón basado en servo motor y pulsadores
Integración de la circuitería y mecánica en el fuselaje del barco

Tras realizar varios diseños, y realizar varias implementaciones del código de control, finalmente se obtuvieron los resultados deseados. Las pruebas que se realizaron con este tipo de control fueron un éxito. El código de control finalmente utilizado en esta versión fue la siguiente:
#include <Servo.h> //Patillas control del Servo1 #define PinSERVO1 6 //Interruptores de control del Servo1 #define BotonSube1 13 #define BotonBaja1 7 //Angulos máximos y minimos del Servo1 #define MAX1 135 #define MIN1 45 Servo Servo1; int angulo1=(MAX1+MIN1)/2; //Inicia angulo1 al valor medio de MAX1 y MIN1
void
setup() { Servo1.attach(PinSERVO1); // Asocia patilla PinSERVO1 a motor Servo1 pinMode(BotonSube1,INPUT); pinMode(BotonBaja1,INPUT); } void loop() { if (digitalRead(BotonSube1)&&(angulo1<MAX1)){ angulo1++; Servo1.write(angulo1); delay(100); } if (digitalRead(BotonBaja1)&&(angulo1>MIN1)){ angulo1--; Servo1.write(angulo1); delay(100); } }

Control del timón mediante puerto serie y bluetooth

Debido a que el control del barco mediante una conexión cableada a un mando no es algo práctico, era necesario modificar el diseño para poder realizar un control de forma inalámbrica. Una de las opciones que barajamos fue la de utilizar sensores de infrarrojos y un mando a distancia cualquiera. Era una opción barata, sencilla y disponíamos de los materiales. Además, en el proyecto NorbaSky ya teníamos ejemplos de este tipo de implementaciones que habíamos estudiado mientras aprendíamos a programar. Una alternativa era la de utilizar un control por bluetooth, del cual no sabíamos nada hasta el momento. 

La implementación de control por bluetooth en su versión más sencilla es idéntica a la implementación de control utilizando el puerto serie de Arduino (posteriormente se conecta un módulo bluetooth a las patillas TX y RX y el sistema pasa de funcionar por puerto serie a funcionar por bluetooth). Así que lo primero que hicimos fue sustituir los el control de pulsadores por un control basado en el envío de caracteres a través del cable serie USB. Mientras operáramos por USB seguiríamos teniendo una conexión del barco por cable, esta vez al PC de control, y tendríamos que utilizar el terminal serie del IDE Arduino para realizar los movimientos del timón.

Circuitería de control del servo motor usando el terminal serie USB del PC

En nuestro caso utilizamos los caracteres "a" y "s" para mover a un lado y al otro el timón. Si queríamos mover 10 grados a la izquierda, escribiríamos "aaaaaaaaaa" en el terminal serie del PC y enviaríamos la secuencia. Si queríamos mover 20 grados a la derecha, escribiríamos "ssssssssssssssssssss" en el terminal y enviaríamos. En todo momento Arduino nos devolvería una respuesta indicando la posición del timón en grados. Las pruebas fueron un éxito. El código utilizado fue el siguiente:

#include <Servo.h> //Patillas control del Servo1 #define PinTimon 6 //Angulos máximos y minimos del Servo1 #define MAX1 135 #define MIN1 45 Servo Timon; //Define una variable Timon para controlar un Servo int angulo1=(MAX1+MIN1)/2; //Inicia angulo1 al valor medio de MAX1 y MIN1 void setup() { Serial.begin(9600); Timon.attach(PinTimon); // Asocia patilla PinTimon a motor Timon } void loop() { char opcion; if (Serial.available()>0){ opcion=Serial.read(); if ((opcion=='a')&&(angulo1<MAX1)) { angulo1++; } if ((opcion=='s')&&(angulo1>MIN1)) { angulo1--; } Timon.write(angulo1); Serial.print("Ángulo: "); Serial.println(angulo1);
delay(100);
}
}

Una vez probado el funcionamiento correcto del control del timón a partir del puerto serie, simplemente había que añadir un módulo HC-06 de 4 pines y conectarlo a los pines RX y TX de forma adecuada (recuerda que la conexión es cruzada, es decir, la patilla RX del módulo HC-06 al pin TX de Arduino y la patilla TX del módulo a la RX de Arduino) y los pines de alimentación y tierra a las patillas correspondientes. Con esto, el control por serie se transforma en control por bluetooth. A partir de este momento, no podremos enviar ni recibir nada desde el terminal serie del IDE Arduino y solo podremos usar una conexión bluetooth para realizar envío y recepción de datos.
Hay que recordar que primero debemos cargar el código en la placa Arduino y posteriormente conectar el módulo HC-06, ya que si tenemos conectado el módulo, el IDE no podrá comunicarse con la placa al quedar deshabilitada la comunicación por puerto serie.

Conversión del sistema de comunicación basado en puerto serie a comunicación basada en bluetooth mediante módulo HC-06 de cuatro pines

Integración de la circuitería y mecánica basada en bluetooth en el fuselaje del barco

Podemos enviar información a través de bluetooth utilizando un smartphone con cualquier programa diseñado para tal fin (existen cientos de ellos). Nosotros hemos utilizado "Arduino Bluetooth Controller" que permite entre otras cosas trabajar como si se tratase de un terminal serie o bien como un gamepad configurable.

Una vez instalada la aplicación de control en el smartphone y puesto en marcha el controlador Arduino, deberemos ejecutar la aplicación y conceder los permisos que se nos pidan. Acto seguido seleccionar "Connect to a device" y seleccionar "HC-06". Puede que se nos pida una clave, en cuyo caso lo normal es que esta sea "0000" o bien "1234". Si fuera otra, habría que buscar en las especificaciones del módulo HC-06. Finalmente podemos indicar al programa cómo queremos operar. Las opciones que nos resultaron más útiles fueron las de "Controller mode" que simula un gamepad, en donde asignamos un código a cada tecla, o bien "Terminal mode" que simula el terminal serie del PC.

Interface de configuración de la aplicación "Arduino Bluetooth Controller"

Interface de uso en modo "Gamepad" de la aplicación "Arduino Bluetooth Controller"

Sistema de propulsión

Una vez finalizado el sistema de guiado mediante timón, solamente quedaría implementar físicamente y mediante software el sistema de propulsión. Como ya comentamos, la idea era la de utilizar un ventilador de un PC. Sin embargo, cuando nos disponíamos a realizar esta tarea surgió el estado de alarma y el consecuente confinamiento, con lo que tuvimos que detener las clases presenciales y nuestro trabajo en el taller de tecnología, y por tanto no pudimos realizar estas últimas mejoras.
También nos fue complicado recopilar fotografías y material para documentar este artículo. Lo hemos redactado con el poco material que teníamos en la nube (un par de fotografías de alumnos, y los diseños y código de Tinkercad que se almacenan de esta forma).

Implementación sencilla para conectar y controlar la velocidad de giro de un ventilador del PC a una placa Arduino

Distintos ventiladores de PC. Podemos encontrarlos con conexiones de 2, 3 y 4 hilos.

Intentaremos finalizar el NorbaShip durante el próximo curso.
Parte de los recursos materiales y humanos necesarios para realizar estas actividades han sido cofinanciados por el programa Proyect@ de la Junta de Extremadura.

No hay comentarios: