Para los que estamos acostumbrados a utilizar Arduino, el protocolo RS-232 nos es muy familiar. En el mundo existen múltiples dispositivos que utilizan este método para comunicarse con otras plataformas. La decodificación de dispositivos RS-232 es una técnica que nos permite comprender cómo funcionan estos dispositivos y establecer comunicación con ellos desde plataformas como Arduino.
Con Arduino podemos comunicarnos directamente con cualquier plataforma que utilice RS-232, siempre y cuando tengamos claro cómo establecer dicha comunicación. Es decir, no basta con conectarnos al dispositivo con el que nos queremos comunicar, sino que es necesario conocer los comandos que hacen que éste entregue información.
El procedimiento que utilizaremos para la decodificación de dispositivos RS-232 podrá ser utilizado prácticamente con cualquier plataforma con este protocolo de comunicación. Necesitaremos utilizar un software llamado Device Monitoring Studio, el cual es software propietario. Por lo tanto, es necesaria una licencia para su utilización. Sin embargo, existe una versión de prueba que nos permite utilizar el software, con ciertas limitaciones.
El dispositivos que se usará como ejemplo para este artículo será un sensor de agua de efecto capacitivo. Este posee un datalogger y un puerto RS-232, con el cual se comunica con la computadora. A continuación, el procedimiento.
Conociendo el dispositivo RS-232
El transductor
Para la decodificación de dispositivos RS-232 necesitaremos que nuestro dispositivo tenga la capacidad de comunicarse con un software instalado en la computadora. En nuestro caso, contamos con un sensor de la marca Odyssey: el Odyssey Capacitance Water Level Logger.
Este sensor utiliza el efecto de capacitancia para medir niveles de agua. El cable blanco de la imagen funciona como dieléctrico; en el interior del cable tenemos una «placa», mientras que el agua pasa a ser la segunda «placa». Cuando tenemos dos placas separadas por un dieléctrico y éstas se someten a una diferencia de potencial, tendremos un capacitor.
Debido a que este efecto depende de las dimensiones de las placas, a medida que aumente el nivel de agua podremos registrar una capacitancia mayor. La siguiente imagen representa la composición interna del cable de éste sensor.
El cable del sensor cuenta con dos cables internos, uno desnudo y el otro aislado. El cable aislado será la placa interna del capacitor, mientras que el desnudo funciona como apantallamiento. Este último hace contacto con el contrapeso del extremo del cable.
El agua hace contacto con la placa interna B a través del contrapeso. De esta forma, el apantallamiento, el contrapeso y el agua se encuentran en contacto directo y forman una placa del capacitor. El recubrimiento del cable aísla las placas y hace la función de dieléctrico. La capacitancia registrada estará en función de la cantidad de cable que esté sumergido en agua siempre y cuando el contrapeso esté en contacto con el líquido.
Circuito de captura de datos e interfaz de comunicación
El cable se conecta a un datalogger que se encuentra protegido por un tubo de color azul. Dentro de encuentra un circuito con un par de baterías (7.2 voltios), una memoria de almacenamiento de datos y un puerto RS-232.
Finalmente, Para conectar el sensor a la computadora se utiliza un cable especial con un Jack de 3 etapas y un puerto DB9 (RS-232).
Probablemente la computadora que estemos utilizando no tenga un puerto DB9 con el cual podamos conectar este cable. En ese caso podemos utilizar un convertidor de RS232 a USB, como el que se muestra en la siguiente imagen:
Esta interfaz parece ser un poco rudimentaria, pero era muy común hace algunos años. Lo importante para nosotros es que este sensor utiliza el protocolo RS-232, el cual podemos decodificar y lograr cosas interesantes. Por ejemplo, podremos leer los datos de este sensor directamente desde Arduino.
Software de calibración y extracción de datos
El sensor utiliza para su funcionamiento un software llamado Odyssey Data Logging Sofwtare (ODLS), el cual puede ser descargado gratuitamente desde la página de la empresa.
Una vez conectamos el sensor a la computadora a través del convertidor de RS-232 a USB, vamos al menú Communications/Auto Detect Port. Si todo está en orden, el software debe detectar nuestro sensor a través del puerto COM asignado. En mi caso, es el puerto COM3.
Ahora, con el sensor conectado, vamos a Logger/Probe Trace Mode. Aparecerá una ventana en la cual podemos leer datos directamente desde el sensor. Escogemos el Capacitance Water Level Sensor y seleccionamos la longitud del cable del modelo que tengamos.
Ahora le damos clic en Start Trace Mode y como resultado veremos los muestreos de capacitancia enviados por el sensor al software.
Debido a que tenemos este software que nos permite leer datos en tiempo real desde el sensor, es posible para nosotros decodificar el flujo de bytes entre el software y el sensor. Esto es especialmente relevante para lo que nos proponemos hacer en este artículo.
Procedimiento para la decodificación serial
Los dispositivos seriales normalmente reciben bytes desde el software en la computadora y empiezan a responder. Ahora veremos cómo hacer para reconocer los bytes que dan inicio a la transmisión de información.
Herramienta de software: un Serial Sniffer
Un Serial Sniffer es un software que permite «observar» el flujo de datos entre un dispositivo serial y una computadora. A mi me gusta utilizar uno llamado HDD Software Free Serial Port Monitor. Este programa lo podemos descargar de forma gratuita desde su sitio web oficial.
Esta aplicación es muy sencilla y eficiente. En la parte de la izquierda tendremos un panel con los «Devices» o dispositivos conectados a la computadora. La imagen superior muestra el dispositivo USB-SERIAL CH340 (COM3) que en nuestro caso representa nuestro sensor.
Al hacer doble clic sobre el sensor, veremos una serie de opciones disponibles. Para lograr lo que nos proponemos necesitaremos utilizar el Data View. No tendremos todas las opciones disponibles porque esta versión de software es gratuita.
Ahora tendremos una ventana con dos paneles: Reads y Writes. En Reads tendremos los datos enviados por el sensor a la computadora, mientras que en Writes se mostrarán los bytes que envía el software al sensor. Como resultado, tenemos una ventana en la cual se observa el flujo de bytes de un extremo a otro.
Para comprobar el funcionamiento de este software, con el sensor conectado iniciamos el Trace Mode en el Odyssey Datalogging Software. La siguiente imagen muestra la secuencia de Bytes y los datos obtenidos en la computadora.
Los bytes en azul representan aquellos que han sido enviados por el software al sensor. Los bytes rojos son los que el sensor ha enviado a la computadora en respuesta a los bytes recibidos.
Decodificación de Bytes
Estamos listos para proceder con la decodificación. Primero que todo, vamos a ordenar los Writes y Reads registrados en el software de monitoreo. Esto es importante, porque así sabremos que bytes se envían primero de un punto a otro.
A simple vista podemos reconocer que los bytes captados por el Device Monitoring Studio están en formato hexadecimal. Para nosotros es especialmente relevante conocer el formato de los bytes porque a partir de esta información es que haremos la decodificación.
Con esto nos damos cuenta que el primer evento es el envío de del Byte 01 desde el software al sensor. Luego el sensor responde 48 69 21. Si tomamos en cuenta la tabla ASCII, los bytes 48 69 21 representan Hi! (hola). Al recibir esta respuesta, el software envía los bites 54 0A y el sensor empezará a enviar bytes con las mediciones de capacitancia.
Lo primero que nos llama la atención de los bytes recibidos y los registros de capacitancia del ODLS. Recibimos los datos agrupados de dos en dos, donde cada dos pares de datos representan una medida de capacitancia. A estos pares de bytes los llamaremos AB CD. En la siguiente imagen hemos ordenado los bytes recibidos y los datos mostrados en el ODLS en orden ascendente.
Observando los bytes recibidos podemos reconocer que los bytes CD muestran una variación mucho menor que los bytes AB. Mientras se registraban los datos en el Trace Mode del ODLS, estuve envolviendo el cable de diferentes formas. Esto causó que se registraran fluctuaciones en los datos muestreados. En los tres primeros renglones de la imagen superior hubo pequeñas variaciones en la capacitancia. Los bytes CD se mantuvieron fijos, mientras que los bytes AB fueron los que registraron variaciones.
Traduciendo bytes a datos de capacitancia
Utilizando un convertidor de hexadecimal a decimal transformamos los bytes AB a formato decimal. Tenemos:
Las variaciones de un renglón a otro en el formato decimal coinciden con las variaciones de los resultados del ODTS. Esto nos da una pista: los bytes AB representan variaciones pequeñas y los bytes CD representan variaciones grandes. Si restamos los valores en decimal a los valores registrados en el ODTS tenemos:
El valor 1792 parece ser la base fija. Veamos como se comporta esta base para el resto de los valores de la tabla.
Parece que tenemos un patrón y por lo tanto podemos encontrar una expresión matemática que nos permita traducir los bytes a capacitancia. Probablemente si graficamos estos datos encontraremos lo que buscamos. Veamos:
Tenemos una perfecta línea recta que nos permite encontrar una ecuación que relaciona las bases con los bytes CD. De esta forma, para transformar AB CD en capacitancia utilizamos la siguiente expresión:
Si se comprueba esta ecuación con los datos ya obtenidos vemos como coinciden los resultados. Ahora estamos listos para leer la información de este sensor directamente desde Arduino.
Leyendo datos seriales desde Arduino
Convertidor serial a TTL
El Arduino no lo podemos conectar directamente al sensor serial porque no utilizan los mismos niveles de voltaje. Necesitamos un convertidor de serial a TTL, los cuales normalmente están basados en el circuito integrado MAX232. Con este convertidor de niveles lógicos, el Arduino puede enviar bytes directamente a cualquier dispositivo.
Para poder utilizar esto con el sensor tuve que crear un cable especial porque el que trajo el sensor tenía una interfaz DB9 macho. Por lo tanto, fue necesario «empatar» un cable hembra a un adaptador capaz de conectarse al datalogger.
Ahora será necesario configurar un puerto serie en el Arduino, sin que este interfiera con el que utiliza el Arduino para comunicarse con la computadora.
Emulando un puerto serie en Arduino
Para emular un puerto serie en Arduino tenemos múltiples opciones. Por ejemplo tenemos la librería SoftwareSerial y la AltSoftSerial. En lo personal prefiero esta última porque en la práctica me ha dado mejores resultados. Al implementar esta librería tendremos los puertos RX y TX en los pines 8 y 9, respectivamente.
Para darle funcionalidad al Arduino utilizaremos el código que hemos colocado en nuestro repositorio de Github. Este nos permite recibir datos directamente desde el sensor, justo cuando enviamos el comando «start» a través del monitor serie.
Básicamente con el Arduino «emulamos» el comportamiento del ODLS e interrogamos al sensor de nivel de agua. Esto puede ser especialmente útil para aplicaciones en las cuales tengamos que leer este sensor de forma remota. Los datos de capacitancia pueden ser transformados en datos de nivel de agua. En mi caso estoy utilizando un módulo basado en Arduino para la transmisión inalámbrica de datos de niveles de agua en la cuenca de un río.
Conclusiones
A través del procedimiento de decodificación de dispositivos RS-232 podemos identificar los métodos para comunicarnos con estos dispositivos y extraer información de ellos. En el caso del sensor que hemos utilizado para este ejemplo, la decodificación ha sido muy sencilla. Se requieren de pocos bytes para sacerle información al sensor.
En otros dispositivos más complejos es probable que sea más difícil la decodificación. Sin embargo, con las herramientas que hemos descrito en este documento y un poco de pericia, podremos «hackear» casi cualquier plataforma.
Para monitorear y rastrear puertos COM, https://com-port-monitoring.com funcionará mucho mejor, el software es gratuito y está certificado.
Gracias por el dato
Buenas tardes Antony
Estoy realizando un proyecto donde conecto una antena Rfid a un Arduino Uno. La antena trae como salida un conector DB9 hembra.
Para conectar mi Arduino tengo el convertido Rs232 a TTL que muestras en tu trabajo.
Creo que no conecto bien los cables pues no visualizo las lecturas de la antena en la pantalla.
Puedes darme esquema de conexión antena rs232 hembra con convertidor rs232_ttl y del convertidor al Arduino?
Tienes un adaptador como el que muestro en la imagen o estás usando algo más?