Las comunicaciones serie UART (Universal Asynchronous Receiver-Transmitter) permiten enviar datos entre diferentes circuitos a velocidades relativamente altas y de forma muy sencilla. Es frecuente, por eso, encontrar, por una parte, entornos de trabajo (el de Arduino, por ejemplo) que incluyen estas comunicaciones como método de depuración de programas; y por otra, componentes o módulos que, ya sea por longitud de cable, ya sea por velocidad, lo eligen como sistema de comunicación con el dispositivo principal.
Finalmente será el microcontrolador del dispositivo que se está diseñando el que se encargue de gestionar las comunicaciones, pero la para la larga fase de pruebas seguramente resultará útil conectar directamente a un ordenador el módulo que se va a utilizar en el montaje (o que se está diseñando) y completar de forma más sencilla el proceso de elaboración del proyecto, quitando del programa que se está desarrollando partes que corresponderían a la depuración del dispositivo serie y que, de otra forma, podrían generar nuevos problemas y/o distorsionar la visión del verdadero objetivo de la aplicación.
Para este trabajo previo o auxiliar de clarificación del funcionamiento de un dispositivo controlado por serie UART, será necesario disponer de una aplicación de tipo terminal en el ordenador y del cable de conexión adecuado. Seguramente tu sistema operativo disponga de un programa de comunicaciones serie; para poder explicarlo aquí de la forma más genérica posible voy a utilizar PuTTY, una aplicación excelente, que te recomiendo para tu caja de herramientas no sólo para este tipo de comunicaciones, multiplataforma y de código libre. Su instalación es trivial: en Linux (y cosas parecidas) lo encontrarás en los repositorios y para Windows puedes descargarlo gratis e instalarlo pulsando unas cuantas veces sobre «siguiente», seguro que ya sabes cómo va eso.
Con respecto al cable, hay que tener en cuenta algunas consideraciones. Si tu ordenador tiene puertos serie (va siendo cada vez más difícil encontrarlos) debes asegurarte de que las tensiones son las correctas para comunicar con el módulo que estás probando. Lo normal es que no lo sean. El puerto serie de un ordenador suele ser (solía ser) RS232 en cuyas especificaciones la «marca», que podríamos decir que corresponde con el nivel bajo se establece entre -5 y -15 V y la «señal», digamos el nivel alto, corresponde con tensiones entre +5 y +15 V (que resultan en un margen entre -12 V y 12 V en la mayoría de los casos prácticos) Como es más que probable que los niveles lógicos del módulo y del ordenador no correspondan, como mínimo, tendrás que convertirlos para no tostar los componentes del módulo, que luego tarda mucho en llegar otro de China.
Afortunadamente, lo más probable es que no necesites (ni puedas) usar el puerto serie sino que utilices un puerto USB, para el que existen multitud de conversores que se encargan, entre otras cosas, de adaptar el nivel de la señal. Lo más frecuente es usar un cable USB-serie de 5 V, tan básico que es casi obligado tener en la caja de herramientas. Si necesitas comunicaciones más genéricas (y niveles de tensión más variados) puedes hacerte con una placa de comunicaciones como la de la foto de abajo, que es capaz de conectar por I2C o SPI además de por serie UART.
Una vez realizada la conexión física será necesario localizar el puerto por el que comunicarse con el dispositivo. Si tu sistema operativo es Linux (o algo parecido) una forma fácil puede ser fijarse en la salida de dmesg después de conectar el adaptador. En mi caso resulta ser /dev/ttyUSB0 como puede verse en la imagen de abajo. Como es esperable que el puerto serie para la conexión USB se identifique con un nombre como ttyUSB + algo, puede usarse grep para encontrarlo más rápidamente sin tener que revisar toda la salida de grep.
Para localizar el puerto serie que se ha asignado en Windows al adaptador, que puede que recuerdes del aviso que te dio al instalar el driver, se puede utilizar el administrador de dispositivos al que puedes llegar, por ejemplo, pulsando con el botón del menú contextual del ratón (el derecho, si no eres zurdo) sobre el equipo y eligiendo la entrada «Administrar»
En la captura de pantalla anterior se ha seleccionado el puerto COM4 que Windows ha asignado a la conexión USB del Arduino Leornardo con el que se están haciendo estas pruebas. Recuerda que el dispositivo que estás buscando no es el módulo que vas a controlar sino el adaptador serie USB, así que, más que un nombre como «Bluetooth module HC-06» (el módulo) debes buscar algo como «PL2303 USB Serial Port» (el adaptador)
Ahora que la parte del ordenador está conectada e identificada queda hacer lo propio con el módulo. Recuerda que el nivel de tensión de la señal del USB (5 V) y la del módulo no tienen que ser iguales, en cuyo caso antes de conectar debes convertir la tensión. Puedes usar un divisor de tensión hecho con unas resistencias o un regulador. En este caso, la placa de comunicaciones que se está utilizando tiene integrado un regulador que permite elegir entre 5 V y 3.3 V que servirá para la mayoría de los módulos.
En el adaptador serie USB, la conexión etiquetada como RX, que corresponde con la recepción, debe conectarse al pin etiquetado como TX del módulo, que corresponde con la transmisión y al contrario. Si te encuentras un fabricante lo bastante alternativo como para etiquetar no la finalidad del terminal sino donde debe conectarse (yo lo he encontrado) habrá que hacerlo al contrario (alguien debería decir al fabricante que siga las normas) No te preocupes, es muy raro que destruyas el módulo por conectarlo al revés; simplemente no funcionará y tendrás que cambiar los cables de sitio.
Por último queda configurar las comunicaciones. Aunque puedes configurarlas por defecto en el sistema operativo para que se realicen operaciones desde el mismo (enviar un documento, por ejemplo) lo más habitual es hacerlo desde la propia aplicación de comunicaciones, PuTTY en nuestro caso.
El tipo de conexión en PuTTY se elige en «Connection type» de la ventana que aparece al arrancarlo (y que corresponde con la categoría «Session») En nuestro caso, estamos hablando de comunicaciones serie, siempre será «Serial». Como mínimo habrá que especificar la línea serie (el puerto, que aparece en PuTTY como «Serial line» y que será algo como COM3 en Windows o /dev/ttyUSB2 en Linux y similares) y la velocidad en la casilla «Speed» que se activa al elegir la conexión de tipo serie. Para iniciar la conexión se pulsa sobre «Open».
Para determinar la configuración de las comunicaciones serie en PuTTY se utiliza la entrada «Serial» del grupo de categorías «Connection» que se encuentran en el marco izquierdo de la ventana de inicio como puedes ver en la siguiente captura de pantalla.
-
Serial line to connect to. Como ya se ha explicado, se trata del puerto serie (emulado por el controlador del adaptador USB) al que se conecta el módulo que se va a controlar desde el ordenador. Será un nombre del tipo COM5 en Windows y del tipo /dev/ttyUSB2 en Linux.
-
Speed (baud). Es la velocidad expresada en baudios (bits por segundo) Dependerá de la que tenga configurada el módulo. Por desgracia es algunas veces ocurre que no se especifica en la hoja de datos o hasta que no es la misma entre módulos supuestamente iguales, así que no queda otra que probar: mientras la velocidad sea incorrecta se recibirá información incoherente, o no se recibirá nada en absoluto. Tendrás que ir probando configuraciones con diferentes velocidades hasta encontrar la que el malvado fabricante omitió documentar.
-
Data bits. Los bits de datos determinan la longitud de un paquete de información que se envía cada vez. Lo más habitual es que sea un byte, es decir, 8 bits.
-
Parity. Después de los bits de datos se puede enviar un bit de paridad que servirá para verificar que lo recibido es correcto comprobando si el numero de bits transmitidos es par o impar. Si la configuración es de paridad par, el bit estará a nivel alto si la paridad es tal o a nivel bajo en caso contrario.
-
Stop bits. Después del control de paridad (si existe) se envían los bits de parada (que pueden ser 1, 2 o 1 y medio) con los que marcar el final de la información.
-
Flow control (Control del flujo) A grandes rasgos el control de flujo (cuándo recibir/transmitir) se puede realizar por hardware, por software o no realizarse en absoluto (como en nuestro caso) El control por hardware, también llamado RTS/CTS (del inglés Request To Send / Clear To Send) dedica un par de cables para informar a emisor y receptor de cuándo uno u otro está listo para enviar o recibir información. En el caso del control por software, llamado XON/XOFF, se envía un código para informar del inicio o fin de la comunicación. Cuando la comunicación es full duplex (se envía y recibe de manera simultánea) no tiene sentido usarlo.
Se supone que las pruebas que se van a realizar son de tipo texto, incluyendo los comandos que pueden ser, por ejemplo, del tipo AT. En cualquier caso, seguramente va a ser importante ir viendo en la ventana del terminal (en la ventana de texto de PuTTY) lo que se va escribiendo. En un terminal convencional, el extremo con el que realizas la conexión puede encargarse de ir devolviendo el «eco» de lo escrito (lo que, además, permite verificar que ha llegado al otro lado) pero la mayoría de los módulos, especialmente los más básicos, no se van a comportar así, de forma que es bastante práctico establecer el eco local, esto es, que sea el propio PuTTY el que vaya mostrando lo que escribes.
Para activar el comportamiento de «eco local» se utiliza la categoría «Terminal» y en ella se fuerza el activado del eco (Local echo: Force on) en el cuadro «Line discipline options»
Para no tener que realizar la configuración cada vez que vayas a conectar al mismo dispositivo se puede almacenar en la categoría «Session» escribiendo un nombre en el cuadro «Saved Sessions» y pulsando el botón «Save» En los siguientes usos bastará con abrir PuTTY y hacer doble click sobre el nombre de la configuración (la sesión) o seleccionarla, cargarla con «Load» y pulsar «Open»
Lógicamente, no es imprescindible que la sesión esté almacenada para realizar la conexión. Para conectar sobre la marcha bastará con elegir el modo, en nuestro caso «Serial» en la categoría «Session», elegir el puerto (/dev/ttyUSB0 en el ejemplo o algo COM4 si usas Windows), la velocidad en baudios (9600 en nuestro caso) y pulsar «Open» para conectar.
Dependiendo del dispositivo con el que se comunica puede que muestre un saludo al iniciar la transmisión. Lo más probable es que un módulo sencillo no diga ni pío y veas una pantalla vacía en la que escribir algún tipo de comandos, de tipo AT, por ejemplo. En la siguiente captura de pantalla puede verse un ejemplo de sesión de control de un módulo WiFi por comandos AT.
Lógicamente, la forma en la que se controla el dispositivo dependerá del tipo de comandos que atienda (si es que reconoce algunos) y de los que tenga el módulo en concreto implementados. Sí, te toca mirar datasheet.
SergioRF
Excelente trabajo, me gusta la forma tan eficiente en que redactas. Eres un gran maestro.
Víctor Ventura
Muchas gracias 🙂
oscar
Gracias por el aporte…Puedo conectar un lector de código de barras, que tiene salida usb, y adaptarlo con un cable UART a un microcontrolador?
Víctor Ventura
Hola, Óscar.
Sí que se puede. Otra cuestión es cómo interpretar la información que llegue al microcontrolador. Una pista que puedes seguir es que la mayoría de los lectores de código de barras funcionan como emuladores de teclado en los que se pulsaran los números que corresponden al código leído más la tecla de fin de línea (Enter)
¡Suerte con tu proyecto!
Vicente
Muy claros los conceptos. Gracias por tu trabajo.
alejandro
existira un soft que me permita cambiar la polaridad electrica de un puerto serie, es decir que no tenga que fabricar un cable para conectar dos dispositivos DTE o dos DCE, como ocurre ya hoy con los puertos ethernet que ya no hace falata hace un cable crossover utp para conectar dos laptop por ejemplo
saludos
alejandro
CarlosAndres
Buenas tardes Víctor, yo uso en entorno windows, para instalar versiones de un sistema de gestión sencillo en terminales pos por medio de cable serial con usb, empleo una aplicación llamada SerDownload. ¿Podria usar esta aplicación para lo mismo en linux?
Víctor Ventura
Hola, Carlos Andrés.
Me temo que no conozco la aplicación a la que te refieres (ni en Linux ni en Windows) pero, si te decides por usar Linux, no vas a tener problemas en encontrar un programa para conectar con un puerto serie (también USB) con un terminal.
Si quieres optar por algo que esté en la mayoría de plataformas (Linux, Windows y OS X) te recomiendo PuTTY y si te interesa solamente Linux, en la mayoría de repositorios, además de PuTTY, puedes encontrar CuteCom, MiniCom, GTKTerm, PicoCom…
¡Gracias por participar en el blog! ¡Hasta pronto!
Adrián Castro Álamo
Hola buenas, lo primero muchas gracias por la explicación. Tengo un sensor que solo imprime el dato de preción (un barómetro) me gustaría saber si hay algún programa que cuando el sensor imprima el dato lo guarde con fecha y hora. Ya he usado el putty y el siow y ninguno me imprime el dato con fecha y hora ya que solo se limitan a guardar el dato.
Marius Proicea
Gracias, me ha funcionado a la primera. Muy bien explicado. Saludos.
Víctor Ventura
Gracias a ti, Marius, por visitar polaridad.es
Javier
Excelente aporte, me sirvio de mucha ayuda, yo lo use para configurar un modulo hc05 lo unico que me pasa es que cuando envio por ejemplo el comando «AT», me recive muchos «OK», y no para de recivirlos hasta que pulso la tecla escape y entonces puedo volver a introducir otro comando, alguien save lo que sucede aqui?
Melissa
Hola, tengo una pregunta, lo que pasa es que tengo un hc 05 el cuel debe transmitir a un hc 06 las pulsaciones cardíacas, el hc 06 se conecta a un arduino uno, pero no sé como hacer para obtener los datos recibidos por el hc 06 en el pc y poderlos remitir a un software para graficarlos
Víctor Ventura
Hola, Melissa.
Necesitas un conversor de UART, al que conectar el HC-06, a USB, que se conecta al PC, en el que aparece como un puerto serie.
Saludos y suerte con tu proyecto.
Richard David Lopez Marquez
hola mira estoy tratando de ingresar el comando alt+156 del codigo ascii que da referencia la signo de la libra pero no me sale me bota un numeral alguna sugerencia o el porque me sale esto? agradecería su ayuda.