En esta nueva entrada del Curso de introducción a MIT App Inventor vamos a crear una aplicación que permitirá controlar de forma remota un PrintBot.
Código Arduino
En este caso vamos a utilizar el código mostrado en la entrada Aprende a programar y controlar tu PrintBot Evolution desde tu terminal con Protocoder.
Este código espera recibir una cadena de caracteres del tipo =avanzar+, por lo que programaremos la aplicación de App Inventor para que envíe las ordenes de esta manera, pudiendo así reutilizar el código.
Se han programado diferentes modos de funcionamiento que incluyen órdenes de movimiento (avanzar, retroceder, izquierda, derecha, parar y 180º), modos de funcionamiento automáticos (obstaculos, siguelineas y sigueluz).
Puedes encontrar en las descargas al final de este post el código para Arduino.
App Inventor
Para comenzar, creamos un nuevo proyecto, que en nuestro caso se llama PrintBot_Botones.
Creando la interfaz de usuario
Para crear esta UI utilizaremos botones, “listPicker” y “layaouts”.
Dentro de las propiedades de la pantalla, modificamos las propiedades alingHorizontal a Center y Title a “PrintBot con Botones”.
Para conectar a un dispositivo Bluetooth utilizaremos un listPicker, es decir, un elemento que mostrará un listado, en este caso, de los dispositivos Bluetooth que se hayan sincronizado previamente a través de los ajustes de Android. Modificamos su nombre a ConnectBT, el texto que muestra a Connect Bluetooth y su ancho a fill parent.
A continuación, incluimos un botón que utilizaremos para desconectar del dispositivo Bluetooth. Modificamos su nombre a DisconnectBT, el texto que muestra a Disconnect Bluetooth y su ancho a fill parent.
A continuación, incluimos un layaout con altura de 10 píxeles, que funcionará como separador y un layaout vertical, donde incluiremos tres botones para los modos automáticos de funcionamiento.
Dentro del layaout vertical, incluimos tres botones y cambiamos su nombre y texto a Line Follower, Avoid obstacles y Light Follower, respectivamente. Modificamos también el tamaño de los botones a fill parent. Podemos cambiar el tamaño del layaout que contiene los botones a fill parent o darle un tamaño fijo. En este caso, utilizamos la ultima opción y daremos un ancho al layaout de 150 píxeles.
A continuación, incluimos un layaout con una altura de 30 píxeles para que funcione como separador y un layaout TableArrangement al que modificamos las propiedades Rows y Columns a 3.
Para continuar, incluimos 5 botones en forma de cruceta dentro del layaout TableArrangement y modificamos su tamaño a 50 píxeles.
Cambiaremos su texto y nombre, de arriba a abajo y de izquierda a derecha, para que sean:
- ^ upBtn
- < leftBtn
- o stopBtn
- > rightBtn
- v downBtn
Para finalizar, incluimos los elementos BluetoothClient, que utilizaremos para enviar y recibir datos, y Notifier, que utilizaremos para mostrar notificaciones en pantalla.
Programando la aplicación
En primer lugar, programaremos la conexión Bluetooth. El elemento ListPicker, que hemos llamado ConnectBT tiene dos funciones principales BeforePicking y AfterPicking, que nos permite realizar acciones diferentes antes y después, respectivamente, de haber seleccionado un elemento del listado.
Para la función BeforePicking, utilizamos la orden set ConnectBt.Elements to, que se encuentra dentro de los bloques de ConnectBT y cambiará los elementos del listado. Estos bloques los uniremos al bloque BluetoothClient1.AddressesAndNames, por lo que veremos al pulsar los dispositivos Bluetooth que se hayan sincronizado previamente a través de los ajustes de Android. Una vez que pulsemos sobre el botón Connect Bluetooth, aparecerá un menú contextual en el que podremos escoger el dispositivo al que conectarnos.
En el caso de la función AfterPicking, programaremos la ejecución de la conexión. Para lo cual incluiremos un condicional if-else. En la condición usaremos el bloque call BluetoothClient1.Connect address, y a este último uniremos el bloque ConnectBT.Selection, que almacena el elemento que se ha seleccionado del selector de lista. Si se realiza la conexión correctamente, la función de conexión devolverá el valor true, por lo que se ejecutará la parte then.
A continuación, en la parte then del condicional, incluimos el bloque call Notifier1.ShowAlert notice, que mostrará un toast (mensaje flotante en la pantalla) y un bloque de texto para imprimir la palabra Connected, mostrando que se ha realizado la conexión correctamente.
La programación del botón Disconnect Bluetooth utilizamos el bloque when DisconnectBT.Click do y el bloque call BluetoothClient1.Disconnect.
Para programar el comportamiento de los botones de movimiento manual y automático utilizaremos el bloque call BluetoothClient1.SendText text, textos y el modificador join, que concatena las cadenas de caracteres. En este caso, queremos enviar una cadena de caracteres que tenga el tipo =avanzar+.
En el caso del botón upBtn, la programación que utilizaremos es:
Para el resto de botones, copiaremos el conjunto de bloques anterior y modificaremos el botón al que accede y la cadena de caracteres que se envía según la siguiente lista:
- Line_Follower: siguelineas
- Avoid_Obstacles: obstaculos
- Light_Follower: sigueluz
- upBtn: avanzar
- leftBtn: izquierda
- stopBtn: parar
- rightBtn: derecha
- downBtn: retroceder
La programación final de los botones de movimiento manual es:
La programación final de los botones de movimiento automático es: