in

Un acelerómetro en tu pie (II)(Bluetooth-Android)

En la entrega anterior, pudimos apreciar el hardware de un sistema que nos permitiría observar con detenimiento nuestra actividad sobre una bicicleta fija. Hoy, desarrollaremos la aplicación que utilizaremos en nuestro dispositivo móvil con Android y la crearemos con App Inventor. Veremos como obtener un reloj en pantalla y a través de él acceder a crear un temporizador, a trabajar con operaciones matemáticas, a manejar números decimales y a construir un contador. Colocaremos el módulo Bluetooth a trabajar a 115,2Kbps y analizaremos el programa del 18F25K20 que apenas utiliza 12 líneas de código. ¿Te parece poco? ¡Despedimos 2011 a puro Android!

¿App Inventor deja de funcionar el 31 de diciembre de 2011? ¡Pues hagamos uso de él hasta el final! De todos modos, no te preocupes; la gente del MIT está trabajando duro por estos días para que el sistema no deje de funcionar sino que se “transforme”. Gracias a este trabajo podremos seguir disfrutando de esta excelente plataforma, que nos permite realizar trabajos para utilizar en nuestros dispositivos con Android. Y como no debemos perder el tiempo, vamos a comenzar este artículo definiendo “qué deseamos ver en la pantalla del dispositivo móvil” y en función de ello, saldremos a trabajar en App Inventor buscando los resultados que pretendemos obtener. Los elementos deseados en pantalla son pocos, pero muy importantes y los podemos encontrar en la siguiente lista:

  • Un reloj de tiempo real. Necesitamos saber que hora es en el mundo mientras hacemos nuestra rutina de entrenamiento.
  • Un contador de tiempo. No es cómodo estar mirando el reloj tradicional a cada momento y estar calculando el tiempo que llevamos ejercitando. La mente debe estar despejada y libre de cuentas. Demasiados compromisos afrontamos durante el día como para cargar con uno más. Que un contador aparte haga ese trabajo por nosotros.
  • Un contador que registre las veces que giran los pedales de la bicicleta. Dato fundamental para calcular la distancia recorrida con una sola acción de pedalear.
  • Un contador de distancia recorrida. Esta información es clave para elaborar futuros valores útiles a conocer: velocidad media y calorías quemadas. Por simple lógica, a mayor distancia en menos tiempo tendremos mayor velocidad media y más calorías quemadas. Todos estos datos pueden ser agregados al programa en cualquier momento. Serán más etiquetas (Label) y algunos cálculos matemáticos adicionales, pero la calidad de la información será superior y tu aplicación será tan buena como las de pago.

Con estos cuatro elementos podemos iniciar el trabajo para llevar a cabo nuestra aplicación y lo primero que haremos es lo más sencillo: repetir las rutinas comunes a los trabajos anteriores para ahorrar tiempo de desarrollo. Por ejemplo, la conexión y desconexión del módulo Bluetooth HC-06 que utilizaremos en este trabajo. Pero claro, antes de realizar cualquier tipo de trabajo, lo primero es el inicio y en consecuencia debemos trabajar en él.

Debemos comenzar por el papel tapiz, o pantalla de inicio de la aplicación, a la que le agregaremos los botones de “Conectar/Desconectar Bluetooth” y el botón de “Salir” para cerrar la aplicación tal como lo hicimos en los trabajos anteriores. Es importante dar un repaso de los artículos anteriores para refrescar conceptos y recordar mejor las cosas que debemos armar y cómo debemos hacerlo. Por ejemplo, debemos recordar que al insertar el “Cliente Bluetooth” o cualquiera de los “Clock’s” (timers, temporizadores, relojes) estos NO quedarán sobre el lienzo y se ubicarán en la zona inferior del mismo para ser visibles. De todos modos, recuerda que tienes una opción (casillero en la parte superior del lienzo) para hacerlas visibles. De igual manera, arrastramos Etiquetas (Label’s), Botones (Button’s) y todos los elementos que se nos ocurran introducir dentro de lo que será la pantalla que veremos al ejecutar nuestra aplicación Android. Así, incluiremos elementos hasta lograr un diseño agradable, funcional; que contenga los elementos necesarios, con el tamaño adecuado y que resulte en un trabajo armónico y eficiente. Intenta destacar los datos importantes, no te detengas en utilizar letras raras o ultra-personalizadas, selecciona texto claro y legible a varios metros donde lo destacado sea el dato importante a transmitir, por ejemplo, la hora, el contador de tiempo, la distancia recorrida y la cantidad de pedaleos.

Por supuesto, no construiremos la pantalla en una sola sesión de pocos minutos (ni siquiera horas) sino que trabajaremos en conjunto con el Editor de Bloques para, de a poco, por pasos y en un “ida y vuelta”, ir poniendo en funciones a todos los elementos que formarán la pantalla. El primer peldaño dentro del editor de bloques será organizar “Screen1” o lo que será el tapiz inicial de la aplicación. Allí daremos colores y texto a los botones, destacaremos los colores de las partes que no serán fijas durante toda la aplicación, por ejemplo, el texto del contador de tiempo de pedaleo, que sólo se hará visible al momento de establecer el enlace Bluetooth con la unidad móvil de este trabajo (la que montaremos en la pierna). Comenzaremos con la definición de la dirección MAC que posea el módulo Bluetooth a usar y, de a poco, haremos lo mismo con las diferentes variables que utilizaremos dentro del programa. No olvides que App Inventor es un lenguaje de programación y como tal, utiliza variables para trabajar y desarrollar sus procesos. Como te mencionamos antes, no todas las necesarias vendrán a tu mente en el momento inicial sino que surgirán a medida que avances en el programa. Nosotros que tenemos el trabajo ya hecho, te mostramos todas las que hicieron falta colocar.

¿Cómo se crea una variable? Igual que una constante, como la denominada “Dirección MAC” que no cambia durante toda la aplicación y que, al momento de necesitarla, la encontraremos dentro de “Mis Definiciones” (My Definitions) en el margen izquierdo de la pantalla. Pero como te mencionamos, antes hay que crearla. El procedimiento es el siguiente: haces clic sobre la pantalla con el botón izquierdo del ratón y se despliegan una serie de pequeños bloques de color. Elige el celeste (turquesa o cyan) y se te abrirá un menú de opciones entre las cuales hay una que, no por casualidad, se llama “variable”. Haces clic en ese texto y de ese modo, crearás una variable. Luego le colocas el nombre (pulsando en su interior) que quieras o te convenga y listo.

Recuerda que cada variable creada debe llevar un elemento que defina su función; puede ser un texto, un número o hasta una expresión matemática, lo importante es que no puedes dejarla “huérfana”. Debes asignarle un sentido a su vida, a su existencia dentro del programa. Observa en la imagen superior que nosotros creamos una constante para la dirección MAC del módulo Bluetooth (al que llamaremos desde la aplicación cuando pulsemos el botón “Conectar Bluetooth), una variable para el contador de “pedaleos” (“Contador”) y tres grupos de tres variables cada uno, que cuentan las horas, los minutos y los segundos. ¿Por qué tres? Un grupo se utiliza para almacenar “los datos de la hora en tiempo presente del reloj” del teléfono, otro grupo (letra i mayúscula, de “Inicial”) almacena “el instante en que se inició la actividad del “Contador””, es decir, el mismo momento en que se inició la conexión Bluetooth y el último grupo (letra A, de “Acumulado”) que se encargará de “almacenar y mostrar (el anterior no se muestra, se utiliza sólo para hacer cálculos ocultos) el tiempo transcurrido desde que decidimos iniciar la actividad”.

¿Recuerdas que ya habíamos visto un Temporizador para Android que era independiente del reloj del dispositivo móvil? En este caso te mostramos la variante donde se utiliza el reloj interno para que tengas más herramientas útiles al momento de crear tus propias aplicaciones. Observa además que, tanto “Screen1.Initialize”, como “Salir.Click” son bloques que albergan instrucciones, que abrazan “partes de código”. Esto es, cuando llamas a esos bloques, se cumplirán en forma ordenada, una a una, todas las instrucciones que se encuentren dentro de él. En los ejemplos que ves allí el más sencillo de explicar es el de “Salir.Click” que es el encargado de cerrar la aplicación, ya que posee esa única instrucción en su interior (“Close Application”).

Una vez que tenemos los datos de las horas, minutos y segundos, pasamos a detectar si los valores son menores a 10 y le agregamos el cero en adelanto con la instrucción “join”. App Inventor no sabe si queremos uno, dos o tres ceros en adelanto para una variable, por eso no coloca ninguno y debemos agregarlo nosotros según la necesidad. Luego restamos la hora actual con la inicial y obtenemos el tiempo acumulado para mostrarlo en forma ordenada en la etiqueta número 20 (a la hora “normal” la mostramos en la etiqueta número 17) y como última acción de este bloque, que es un temporizador que actúa cada 700 mili-segundos, leemos los bytes que puedan llegar vía Bluetooth indicando los pedaleos. Los acumulamos dentro de su contador y los multiplicamos por una constante que no es seleccionada al azar. ¿De donde sale 0,0045? Muy sencillo, en una bicicleta de calle, una vuelta completa de pedal provoca un desplazamiento de la bicicleta de 4,5 metros y eso equivale a 0,0045 kilómetros, unidad que mostraremos en pantalla (Etiqueta 24). Observa que App Inventor nos permite mediante la instrucción “format as decimal” seleccionar la cantidad de decimales a mostrar después de la coma y tampoco olvides que debes colocar un punto como separador decimal y no una coma dentro del boque en el que cargues la distancia recorrida por tu bicicleta con una vuelta completa de pedal.

El resto es repetir los anteriores métodos. Es seguir utilizando lo que ya vimos y organizándolo de modo tal que funcione sin problemas. Es como todo lenguaje de programación: práctica, mucha práctica y los resultados llegan. Esperamos que hayas comprendido la organización presentada en el editor de bloques y que te resulte sencillo transformar este programa para adaptarlo a tu aplicación concreta. No olvides, como mencionamos antes, que puedes agregar más resultados con los datos que ya posees, por ejemplo, velocidad promedio y calorías consumidas durante el ejercicio. Recuerda que debes descargar el archivo comprimido que te dejamos al pié de este artículo, cargarlo en tu página de App Inventor (así, comprimido como te los dejamos), abrirlo allí, observarlo, estudiarlo, cambiarle la dirección MAC para que esté acorde con tu módulo Bluetooth, cambiarle (o no) la distancia recorrida por la rueda y todo lo que necesites para personalizar, para hacer “tuyoeste trabajo.

Una de las partes más llamativas del artículo es la complejidad que significa crear el código para el 18F25K20 que manejará toda esta aplicación enviando los datos de cada pedaleo. Aunque te cueste creerlo, son las pocas líneas que observas en el gráfico superior. Un pequeño programa que a cada acción del acelerómetro la interpreta como un interruptor que se cierra y envía, por comunicación serie, un Byte, que en este caso es la letra B. Cuando la aplicación Android se encuentra con una B entiende que se ha producido una vuelta de pedal y suma una unidad a la variable “Contador”. ¿Eso es todo Mario? Sí amigos, eso es todo el código. ¿Y porqué utilizas semejante PIC para apenas 12 líneas de código? Porque es el que uso siempre para hacer todos estos experimentos con Amicus. Tú puedes hacerlo con Arduino, con un 12F675 o con lo que quieras. Es tan sencillo y corto el programa que podría caber en cualquier microcontrolador (y son 12 líneas porque enciendo un LED, de lo contrario serían menos aún). Finalmente, podemos decirte que App Inventor cierra el 31 de diciembre de 2011 y aunque seguirá vivo gracias a voluntarios de todo el mundo (quizás algunos de ellos sea NeoTeo) sería bueno que aproveches estos 20 días que quedan “de normalidad” en el servicio. A partir del primer día de 2012 la gente del MIT se hace cargo de App Inventor y esperamos que nada termine para que podamos seguir creando y disfrutando de esto que tanto nos apasiona, la electrónica en Android. ¡Disfrútalo!

Reportar

¿Qué te pareció?

Escrito por Mario

9 Comments

Leave a Reply
  1. Señor una vez mas es usted un genio de la electronica una inspiracion para los demas. gracias desde ahora empesare a estudiar como programar
    PIC´s

  2. Lo que dice Heri es muy cierto Mario, tu trabajo es fuente de inspiración para muchisima gente, inclyendome.
    (Te repondo el comentario del articulo tuyo anterior) Estoy alejado del foro por cuestiones laborales, pero tus articulos no me los pierdo por nada, son mi biblia.

    Felicitaciones, cerraste este año 2011 como lo prometiste.

    Un abrazo

  3. Muy buena segunda entrega del proyecto para cerrar este año.
    Gracias por compartir este y muchos mas proyectos con la comunidad.

    ¡Felicidades!.

  4. Muy buena segunda entrega del proyecto para cerrar este año.
    Gracias por compartir este y muchos mas proyectos con la comunidad.

    ¡Felicidades!.

  5. Excelente articulo Mario! muchas gracias, me inspiran a meter mano en la electronica, un gran articulo para el cierre del año.
    Una consulta, seria posible adaptarlo para usar en la cinta al estilo de un nike+ ??

    Un gran saludo y felicidades!

    • #5
      Hola cazador!

      Paciencia … eso es Parte III :))
      Todo desarrollado y listo para armar y usar.
      La explicación "gruesa" estuvo en estos dos artículos, ahora vienen las aplicaciones especiales.

      Saludos!
      Mario

  6. Como siempre Mario tus artículos son estupendos, gracias por compartirlos con nosotros y enseñarnos tantas cosas.
    Ahora, en el hardware utilizas el amplificador operacional como no inversor. ¿Lo anterior porque el acelerometro produce pulsos cada vez que mueves verticalmente el dispositivo (articulo anterior)entonces es necesario amplificarlos?

    saludos!

    • #7
      Hola Hermes!
      Gracias por tus palabras!

      Es así como lo dices. El acelerómetro posee una salida que en reposo es Vcc/2, luego moviéndolo hacia abajo entrega un pulso y hacia arriba entrega otro en sentido inverso. Al necesitar uno solo y con el movimeiento hacia abajo, tenía que amplificar e invertir. Podría haber invertido la posición del acelerómetro, pero colocar los dos circuitos (inversor y no inversor) me pareció más didáctico para que cada cual adapte la configuración que necesite al momento de armar su hardware.

      Lo de optimizar y buescar eficiencia que se persigue en una universidad, no siempre es lo mejor cuando se trata de "ayudar a pensar". Hay oportunidades en que hacer todo el trabajo es mejor para que ante los problemas, nadie aparezca diciendo …. "amí me salen los pulsos al revés … ¿qué hago?"

      Saludos!
      Mario

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.

Enlaces Recomendados de la Semana (Nº130)

Retroinformática: DEC Rainbow 100 (1982)