En esta nueva entrada del vamos a ver cómo controlar un PrintBot mediante gestos en App Inventor.
Conexiones eléctricas
Para esta entrada solo se utilizarán los servos de rotación continua, aunque si tienes tu PrintBot montado al completo puedes utilizarlo igualmente. En nuestro caso, utilizaremos el pin 9 para conectar el servo izquierdo y el pin 8 para el derecho.
Programación Arduino
El código Arduino de esta entrada se ha explicado en detalle aquí. El código es una modificación del enlazado y lee a través del Bluetooth las palabras que se envían desde App Inventor al terminal.
Para saber qué palabra se ha leído se utiliza la función readFromAndroid y para realizar la acción en función de la palabra se utiliza la función writeData. Si se modifica el programa de App Inventor es esta función la que hay que cambiar para adecuarlo a los cambios.
Diseño de la UI
En la interfaz de usuario se van a utilizar un ListPicker, botones, canvas y labels, además de layouts para organizar los elementos.
Para comenzar, incluimos un layout horizontal para organizar los elementos que permitirán conectar y desconectar a un dispositivo Bluetooth. Dentro de éste, movemos un listPicker y un botón, a los que cambiamos su texto y llamamos ConnectBT y DisconnectBT respectivamente. Para finalizar, cambiamos el ancho de los tres elementos a fill parent.
A continuación, incluimos un canvas con sus propiedades ancho y alto en fill parent. Utilizaremos el canvas para detectar los gestos
Debajo del canvas, arrastramos un layout horizontal que contendrá un botón para hacer que el PrintBot gire 180º y un layout vertical en el que incluiremos dos etiquetas, que mostrarán el ángulo hacia el que se realiza el gesto y la dirección correspondiente al gesto detectado. Modificaremos el tamaño de todos los elementos a fill parent para que ocupen el mismo espacio en pantalla.
Cambiamos el nombre y el texto del botón anterior por turn180, el nombre y texto de las etiquetas por heading y orientation.
Para finalizar añadimos los elementos BluetoothClient y Notifier.
Programación
Para detectar los gestos, utilizaremos un canvas, el bloque Flung que detecta gestos y su propiedad heading que indica el ángulo hacia el que se realiza el gesto.
En primer lugar, programaremos la conexión y desconexión Bluetooth. Esta programación se ha explicado más detalladamente aquí.
A continuación, programamos el botón turn180 para que envíe la palabra 180 cuando sea pulsado.
Para hacer que el PrintBot se pare, utilizaremos el bloque Touched del canvas, que se activa cuando pulsamos en cualquier punto de éste. Cuando se pulse, enviaremos por Bluetooth STOP y cambiaremos el texto de la etiqueta orientation a STOP.
Para terminar la programación tenemos que detectar los gestos que se realizan en la pantalla del terminal. Para detectar gestos se utiliza el bloque Flung del canvas y, la variable heading, que nos da la dirección en grados a la que se realiza el gesto. Para determinar la dirección a la que se realiza el gesto, dividiremos la superficie en sectores como en la imagen siguiente, y utilizando condicionales if asignando a cada intervalo una dirección.
Por ejemplo, para determinar el gesto hacia arriba utilizamos los siguientes bloques:
En primer lugar, se comprueba mediante un if que el valor leído en heading esté entre 45 y 135 grados. Si es correcto, se envía a través del Bluetooth la palabra UP y se cambia el texto de la etiqueta orientation a UP.
Para el gesto hacia abajo comprobamos si heading está entre -45 y -135 grados y para el gesto hacia la derecha entre -45 y 45 grados. Si se cumple la condición enviamos y cambiamos el texto de heading por DOWN y RIGHT respectivamente.
En el caso del gesto hacia la izquierda, no funciona utilizando el bloque and dentro de la comparación del if. Para que funcione correctamente utilizamos el bloque or, comprobando si es mayor de 135 o menor de -135 grados. Si se cumple la condición, se envía y se cambia el texto de heading por LEFT.
La programación del conjunto con la detección de todos los gestos se puede ver en la siguiente imagen:
Finalmente, para mostrar el ángulo al que se ha realizado el gesto, utilizamos el bloque setText de la etiqueta heading para cambiar el texto. Utilizaremos el bloque join que se encuentra en Text para concatenar el texto “Heading = ” con el valor de la variable heading del bloque Flung.
¡Con esto ya estamos listos para controlar nuestro PrintBot mediante gestos en App Inventor!