Comunicación Serie Arduino

por | 13 junio, 2016

La comunicación serie es muy importante porque gran parte de los protocolos utilizados actualmente son serie y además muchos dispositivos de comunicación inalámbrica usan la comunicación serie para hablar con Arduino como los módulos bluetooth y los módulos Xbee. También la comunicación serie es la que se usa generalmente para comunicar el Arduino con el Ordenador.

Para manejar el puerto serie en Arduino, debemos leer a fondo la referencia de Arduino:  http://arduino.cc/en/Reference/Serial

Todas las placas Arduino tienen al menos un puerto serie disponible en los pines digitales 0 (RX) y 1 (TX) compartido con el USB. Por lo tanto no es posible usar estos pines como entradas/salidas digitales.

El Arduino mega dispone de tres puertos adicionales Serial1 on pins 19 (RX) and 18 (TX), Serial2 on pins 17 (RX) and 16 (TX), Serial3 on pins 15 (RX) and 14 (TX). Estos pines no están conectados al interfaz USB del Arduino.

El Arduino Due tiene tres puertos adicionales con niveles de 3.3V TTL.

Comunicación serie:

La funciones más importantes que debemos conocer para manejar el puerto serie son: begin(), read(), write(), print() y available())

El código de la librería Serial se encuentra en el core del IDE de Arduino: https://github.com/arduino/Arduino/tree/master/hardware/arduino/avr/cores/arduino. Ver en el  código el tamaño del buffer de entrada y salida.

Otra técnica en lugar de usar estas funciones es almacenar en una variable String lo recibido como si fuera un buffer y luego analizarlo con las funciones de String.

Resto de funciones disponible para usar con el puerto serie y ejemplos de uso pueden verse en: https://www.arduino.cc/en/Reference/Serial

En el playground de Arduino tenemos más explicaciones y ejemplos de como funcional el puerto serie en Arduino: http://playground.arduino.cc/ArduinoNotebookTraduccion/Serial

Buffer Serial: los puertos serie de los microcontroladores tienen un buffer que se va llenando hasta que nosotros lo vamos leyendo con la función read() que lo vamos vaciando, es una pila LIFO. El tamaño del buffer serie en el Arduino Uno es de 64 bytes, cuando se llena ese buffer el resto de elementos recibidos se pierden.

Toda la información del puerto seríe del microcontrolador del arduino UNO la tenemos en la página 170 de http://www.atmel.com/images/Atmel-8271-8-bit-AVR-Microcontroller-ATmega48A-48PA-88A-88PA-168A-168PA-328-328P_datasheet_Complete.pdf

Por ejemplo la función begin() de Serial, podemos ver  como se hace en C o en ensamblador en la página 175-176.

La función write() podemos verla en la página 176-177 y la función read() en la página 179-180.

Una descripción de los registros usados por el microcontrolador en la comunicación serie se pueden ver en la página 191.

NOTA: las funciones de serial que usamos valen para cualquier arduino soportado por el IDE que estamos usando, pero luego cada microcontrolador internamente usa unos registros y operaciones diferentes, por lo que si usamos las funciones a bajo nivel vistas, sólo funcionarán con Arduino UNO.

Entrar en temas más complejos como los vistos tiene dos objetivos, saber que tenemos toda la documentación disponible para entrar a fondo en el conocimiento del microcontrolador y sobre todo que todas esas funciones que usamos de una forma sencilla, detrás de ellas hay mucha más complejidad de la que pueda parecer. Arduino nos facilita un lenguaje de programación y unas funciones sencillas para manejar unas serie de microcontroladores diferentes.

Interesante artículo de la diferencia entre usar y no usar flush: https://www.baldengineer.com/when-do-you-use-the-arduinos-to-use-serial-flush.html

Software Serial

¿Y si necesitas más puertos serie que los disponibles en un Arduino? Cada microcontrolador tiene un número de puertos serie hardware (UART), pero se ha desarrollado la librería SoftwareSerial para permitir la comunicación serie sobre otros pines digitales de Arduino, usando software para replicar las funcionalidades de la comunicación serie. Es posible tener varios puertos software serial con velocidades de hasta 11520 bps.

Ver funciones, limitaciones y ejemplos de la librería software serial en: http://arduino.cc/en/Reference/SoftwareSerial

Ejemplo de comunicación serie para comunicar con un shield GSM y mandar SMSs, usando el hw serial sin usar librerías o el sw serial usando librerías: http://arduinoguruji.blogspot.com.es/p/blog-page.html

Terminal Serie

Una vez visto cómo manejar el puerto serie en Arduino, si queremos comunicarnos con Arduino a través del puerto serie desde un ordenador debemos usar un emulador de terminal, el propio IDE de Arduino trae uno, pero existen otros más completos.

Terminales serie:

Usar RS232 y RS485 en Arduino

Para usar RS232 con Arduino necesito un driver receptor para poder usarlo: http://arduino.cc/en/pmwiki.php?n=Tutorial/ArduinoSoftwareRS232. Lo mismo pasa con el RS485.

Para comunicar RS232 con Arduino:

Y tambienhay disponible un Shield para RS232: https://www.sparkfun.com/products/13029

Presentación RS232 y RS485: http://docencia.ac.upc.es/EPSC/SED/Apuntes/RS-232%20Y%20RS-485.ppt

RS-485 Es un estándar de comunicaciones en bus de la capa física del Modelo OSI. Está definido como un sistema de bus diferencial multipunto, es ideal para transmitir a altas velocidades sobre largas distancias (35 Mbit/s hasta 10 metros y 100 kbit/s en 1200 metros) y a través de canales ruidosos, ya que el par trenzado reduce los ruidos que se inducen en la línea de transmisión. El medio físico de transmisión es un par trenzado que admite 32, 128 o 254 estaciones en 1 solo par, con una longitud máxima de 1200 metros operando entre 300 y 19 200 bit/s y la comunicación half-duplex (semiduplex) dependiendo del consumo de cada driver. La transmisión diferencial permite alcanzar mayor distancia con una notable inmunidad al ruido, siempre que el bus de comunicación conserve las características de bus balanceado dando la posibilidad de una configuración multipunto.

Para usar RS485 sobre Arduino es necesario un transceiver que adapte los niveles de señal del RS485 como:

Modbus suele ir sobre RS485. Modbus un protocolo de comunicaciones situado en el nivel 7 del Modelo OSI, basado en la arquitectura maestro/esclavo (RTU) o cliente/servidor (TCP/IP), diseñado en 1979 por Modicon para su gama de controladores lógicos programables (PLCs). Convertido en un protocolo de comunicaciones estándar de facto en la industria, es el que goza de mayor disponibilidad para la conexión de dispositivos electrónicos industriales.

Deja un comentario