[Proteus versión 8.1]
Hemos visto en las lecciones anteriores como nuestro Arduino puede interactuar con el mundo exterior recibiendo información por sus entradas digitales y generando órdenes con sus salidas digitales. A estas alturas del curso todavía las "capacidades sociales" de nuestro Arduino son muy limitadas, pero en esta lección vamos a intentar aumentar su círculo social. Las comunicaciones serie son una forma sencilla y flexible de comunicar nuestro Arduino con otros equipos. Por ejemplo con otro arduino, con nuestro ordenador personal o con cualuqier otro dispositivo que sea capaz de comunicarse por un puerto serie.
Habilitar las comunicaciones serie entre dos equipos involucra tareas referntes al hardware y al software. El hardwre posibilita el intercambio de señales eléctricas entre los dos equipos con unos valores normalizados que entienden ambos interlocutores. El software se apoya en el hardware para intercambiar información entre los equipos. Las librerías de comunicaciones serie suministradas con Arduino nos liberan de prácticamente todo el trabajo y sólo tenemos que preocuparnos de dos cosas: conectar los dos equipos en los pines correctos y utilizar las funciones disponibles para mandar las cadenas de caracteres deseadas. Sin embargo hay unas nociones básicas que nos resultarán útiles para poder solucionar problemas cuando nuestras comunicaciones fallen. Si el lector está familiarizado con las comunicaciones serie entre microprocesadores puede saltar esta introducción.
[Introducción a las comunicaciones serie]
La comunicación entre dos dispositivos se establece intercambiando cadenas de caracteres. Por ejemplo podemos querer enviar la cadena de caracteres "Saludos". Cada caracter de nuestra cadena se codifica utilizando un byte según un código que se conoce con el nombre de ASCII. Cada byte se compone de un conjunto de ocho bits distintos. El bit es la unidad mínima de información y sólo toma valores digitales (verdadero o falso). Es decir que para enviar nuestra cadena de ejemplo entre los dos microprocesadores, lo que tenemos que enviar es una "serie" de bits concreta.
Por ejemplo, para enviar nuestra cadena "Saludos" tendríamos que enviar una serie de 56 bits (7 bytes).
Las comunicaciones serie a nivel de hardware se establecen enviando cadenas de pulsos eléctricos unos a continuación de otros (en serie), cada uno de los cuales representa un bit de información. Si el nivel eléctrico del pulso es bajo, es decir su tensión es de 0V, significa que el valor de ese bit es 0. Si el nivel del pulso es alto, es decir su tensión es 5V, significa que el valor de ese bit es 1. Por lo tanto nuestra cadena de 56 bits se tiene que convertir en un tren de pulsos de niveles alto o bajo.
Muchas de las tarjetas Arduino tiene incluido un chip que se encarga de traducir los valores de tensión TTL a los niveles estándar utilizados por las comunicaciones serie que cumplen el estándar USB. De la misma forma podríamos utilizar un chip para convertir nuestro puerto serie en otro de un estandar diferente (por ejemplo RS232, CANBUS, etc). En cualquier caso el funcionamiento del software sería el mismo.
Por último, con objeto de realizar labores de sincronizacióin y de verificación de errores entre el emisor y el receptor, la cadena de bits se enmarca entre códigos de control estandarizados por el protocolo de comunicaciones (bits de arranque, bits de parada y bits de control).
[Fin de la introducción de las comunicaciones serie]
Como todo este curso lo estamos realizando utilizando Proteus como simulador, necesitamos simular de alguna manera nuestro ordenador PC realizando funciones de terminal para comunicarse con nuestro equipo Arduino. En la barra de herramientas de la izquierda seleccionamos el botón instrumentos virtuales y en la lista que aparece escogemos "virtual terminal".
Colocamos el terminal virtual en nuestro esquema y lo unimos a los terminales TXD y RXD.
El terminal TXD está unido por una resistencia al pin IO1 y el terminal RXD al pin IO2 del Arduino (los pines del puerto serie). Observar que hemos unido el terminal TXD del Arduino con el RXD del terminal y el RXD del Arduino con el TXD del terminal. De esta manera cruzada el emisor de uno se une al receptor del otro. De esta forma tan sencilla ya tenemos enlazado nuestro equipo Arduino con nuestro ordenador PC.
A continuación tenemos que escribir nuestro programa que se encargará de enviar una cadena de caracteres hacia el terminal virtual utilizando el protocolo serie.
Nuestro programa es muy sencillo. En la zona de configuración inicializamos el puerto serie para que se comunique a una velocidad de 9600 baudios. El baudio es la unidad de medida de la velocidad de las comunicaciones serie. Un baudio equivale a un bit por segundo. Y en la zona del lazo de ejecución enviamos la cadena Saludos por el puerto serie, esperamos un 1 segundo y volvemos a iniciar el ciclo. El resultado, si ejecutamos nuestro programa, tiene que ser ver en el terminal virtual una cadena de saludo cada segundo.
Si no puede ver el terminal virtual, compruebe que lo tiene activo en el menú Depuración en la opción 5. Virtual terminal.
El siguiente programa combina varios de los conceptos vistos en lecciones anteriores y utiliza variables, salidas digitales, comunicaciones serie para enviar un mensaje cada segundo, cambiar el estado de un led cada nuevo mensaje. Utilizamos un variable llamada número para hacer las funciones de contador y distinguir cada mensaje enviado.
Observe que hemos utilizado dos funciones diferentes para enviar cadenas por nuestro puerto serie. La función Serial.print(), ya vista antes, envía una cadena de caracteres o un número por el puerto serie. Sin embargo, la función Serial.println(), después de enviar la cadena de caracteres o el número por el puerto serie, envía también un código de control que genera un salto de línea. De esta forma, en este nuevo programa resulta más sencilla la lectura en el terminal virtual de la información recibida porque cada nuevo mensaje, y el contador que los numera, se muestra en una línea diferente.
La función Serial.println() nos permite enviar números con formatos diferentes (decimal, octal, hexadecimal, binario, etc). El siguiente programa muestra un ejemplo de utilización de estas posibilidades.