domingo, 15 de enero de 2012

Comunicación con Arduino usando un cliente de mensajería

Abstract

(go to English Version)

En el artículo anterior vimos la teoría básica de como comunicarnos con el microcontrolador a través del puerto serial de nuestro PC. ref: Comunicación con microcontroladores tipo Arduino

En este artículo veremos lo básico para hacer que el micro responda a órdenes enviadas a través de un cliente de mensajería, correo electrónico, pachube o twitter.

Downloads: serialLed.pdeled1log.pyled-1.kshexternal
VIDEO: Paso a Paso

Sesión Interactiva: 
Agregar contacto vía messenger (msn) ydirganbot@hotmail.com y Verificar el broadcast del circuito montado para ver los leds AQUI.

Intrucción

Ya hemos visto como enviar o recibir información hacia y desde el micro utilizando el puerto serial. El paso a seguir es utilizar el micro para hacerlo reaccionar a órdenes enviadas a través de nuestro PC o analizar y reaccionar a información recibida del micro.

En una primera instancia estudiaremos la forma de hacer reaccionar al micro de acuerdo a las órdenes que le podamos enviar por el puerto serial. Inicialmente hicimos enviar directamente las órdenes a través del puerto utilizando la modalidad directa, pero la idea de fondo es poder utilizar alguna interfaz que nos haga el trabajo más sencillo.

Por ejemplo, trabajar con algún tipo de interfaz de comunicación, como un cliente de chat, correo electrónico, pachube o twitter, por nombrar los cuatro que vamos a explorar en este y los próximos 3 artículos.

Comunicación con el micro a través de messenger

Buscando extensamente en la Web por software gratuito para utilizar algún cliente de chat me encontré con centerIM. Esta aplicación es un cliente muy ligero de chat, el cual puede configurarse con una variedad de cuentas públicas como messenger, yahoo, etc.

REF1: CenterIM home
REF2: centerIM Installation

En la referencia anterior puede accederse la página del producto así como un muy buen artículo de como instalarlo en ubuntu.

La documentación que encuentran en la referencia 1 es muy amplia y con ella pueden configurar inicialmente el paquete. En mi caso yo lo configure con una cuenta que cree especialmente para este experimento.

Siendo un cliente de chat funciona como cualquier otro cliente de mensajería, pero con un adicional que encaja muy bien para nuestro objetivo. El centerIM permite programar scripts para ejecutar tareas de acuerdo al contenido de los mensajes entrantes. Con esta capacidad se pueden programar diferentes comportamientos de forma de enviar vía serial comandos al microcontrolador. Esto permite comunicarnos desde el messenger con el computador de la casa para por ejemplo ejecutar alguna tarea de activación de alarma, encender luces o apagarlas, etc.

Esta configuración se debe hacer a través de un script que debe copiarse en $HOME/.centerim y cuyo nombre debe ser external.

El formato del script external es muy simple.


%action         Acción a tomar de acuerdo a las siguientes condiciones

event           msg
# Reacciona solo a mensajes
proto           msn
# Solamente  para el protocolo messenger
status          online
# responde solo si el status de la cuenta es online
options         stdin stdout
# .. los comandos externos (abajo) leen de
# stdin, luego su salida stdout es enviada como una respuesta 
# a un usuario remoto
%exec
msg=`cat`
echo $(/home/ydirgan/.centerim/commTest.ksh "$msg")

%exec redirecciona el mensaje a un simple script que solo devuelve el mensaje por la misma vía.

#commTest.ksh
#!/usr/bin/ksh
msg=`echo $1 | tr a-z A-Z`;
printf "arduino-1 orden rebibida: $msg";


Al momento de recibir el mensaje, centerIM redirecciona la salida al script commTest.ksh, este recibe el mismo como un parámetro el cual lo convertimos en mayúsculas y lo devolvemos a centerIM por el stdout.

A partir de este simple ejemplo podemos modelar un pequeño script para encender/apagar 4 leds conectados a los pines digitales 0..3 de nuestro teensy.

A continuación los pasos que deberemos seguir:
  1. Crear un script ara el micro que responda a las órdenes enviadas vía serial
  2. Crear un script de logging del puerto serial
  3. Crear el script que es llamado desde "external", el cual contiene la lógica de ejecución
  4. Crear el script "external" para centerIM
(1) Script para el Microcontrolador

Este script responde a los comandos recibidos por el puerto serial del teensy (micro como el arduino).

El script enciende o apaga un led en el pin n (1<=n<=4). Espera por un caracter que esté disponible en el puerto serial. 

entrada serial = 1: enciende el led 1
entrada serial = 2: apaga el led 1
entrada serial = 3: enciende el led 2
entrada serial = 4: apaga el led 2
entrada serial = 5: enciende el led 3
entrada serial = 6: apaga el led 3
entrada serial = 7: enciende el led 4
entrada serial = 8: apaga el led 4

Una vez que descarguemos el programa debemos cargarlo en el micro. Una vez cargado podemos probar su comportamiento interactuando directamente conb el puerto, como se puede apreciar en el video al final del artículo.

Download:
 serialLed.pde
(2) Script de logging

Este script tiene como objetivo copiar cada línea de salida de /dev/ttyACM0 a un archivo.log y deberemos ejecutarlo en background para que se mantenga recopilando la salida del puerto.

ydirgan@pragma-systems:~/SCRIPTS/centerIM$ led1log.py /dev/ttyACM0 &
Download: led1log.py
(3) Script con la lógica de ejecución


El tercer script permite ejecutar las secuencias de los comandos que requerimos enviarle al micro. Con las reducidas instrucciones que definimos en el micro podemos desde este script aumentar las funcionalidades.

En este programa podemos encender o apagar leds individuales, pero también podemos encenderlos todos, apagarlos todos, hacer que titilen o que ejecuten una secuencia. Todo esto utilizando las primitivas que hemos programado en el micro.

Además de las instrucciones propias de ejecución, se ha programado una ayuda que puede obtenerse al tipear HELP desde la ventana de chat, y su resultado será:

arduino-1: este es una maquina de estado finita que permite interactuar con un microcontrolador tipo Arduino. Su uso esta destinado solo como ejemplo. El microcontrolador repondera cuando reconozca la orden a ejecutar. Se tienen 4 led, para encender y apagar cada uno de ellos. Los comandos que puedes utilizar son: ledNon, en donde n es el numero del led (1<=N<=4). ledNoff, en donde n es el numero del led (1<=N<=4). ledon, todos los leds se encenderan. ledoff, todos los led se apagaran. tilitar, todos los led titilaran 20 veces. secuencia1, todos los led encienden en secuencia (tipo led chaser) de izquierda a derecha. secuencia2, todos los led encienden en secuencia (tipo led chaser) de derecha a izquierda. help, muestra esta ayuda.

Download: led-1.ksh
(4) Script external para centerIM
Por último el script que ejecuta centerIM cuando le enviamos un mensaje. Este será el que dispare la ejecución del script led-1.ksh, que enviará nuestros comandos vía serial. El micro los procesará y responderá de acuerdo a la secuencia de comandos.


Download: external

Finalmente ejecutamos centerim desde nuestro terminal para activar el robot.

El video para mostrar la secuencia de pasos es el siguiente:


Para probarlo solo habría que agregar a ydirganbot@hotmail.com al messenger. Este responderá cuando esté online.

3 comentarios:

  1. hola alejandro. no se como pero llegue a este post. es lo que estaba buscando.
    estoy intentando controlar arduino remotamente mediante algun mensajero.
    ya lo logre mediante skype, utilizando una aplicacion en windows creada por la gente de magabot.cc
    pero skype es pesado.
    voy a probar esto

    ResponderEliminar
  2. aejandro disculpa tengo unas dudas
    primero donde esta el script commtest.ksh?
    otra. donde esta la carpeta scripts en ubuntu? no la encuentro. o hay que crearla?

    ResponderEliminar
    Respuestas
    1. otra duda.
      veo en el video que hay mas archivos en la carpeta script de los que estan aqui colgados y descriptos.
      como el controltest
      init
      serialbitacora
      temp
      esos los crea el programa o hay que hacerlos?

      Eliminar