Archivo de la categoría: Comunicación Serie

Comunicación Serie Arduino

La comunicación serie es muy importante porque casi todos 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, disponemos de la librería Serial http://arduino.cc/en/Reference/Serial que hereda los métodos de la librería Stream https://www.arduino.cc/en/Reference/Stream

Todas las placas Arduino tienen al menos un puerto serie disponible en los pines digitales 0 (RX) y 1 (TX) compartido con el USB. 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 y todos los puestos serie tienen niveles de 3.3V TTL.

Métodos más importantes de la librería Serial:

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

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 FIFO. 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

Software Serial

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 115200 bps.

Reference de la librería Software Serial, limitaciones y ejemplos en: http://arduino.cc/en/Reference/SoftwareSerial

Práctica: Puerto Serie

Hacer esta práctica de un chat por el puerto serie entre dos ordenadores usando dos Arduinos: https://aprendiendoarduino.wordpress.com/2016/07/02/chat-serie/

Práctica: Menú interactivo con Arduino.

Para unir todo lo visto en una práctica, hacer un ejemplo de un menú interactivo donde se dan varias opciones y pulsando cada una de ellas se ejecuta una acción concreta. Si el valor pulsado no es ninguna de las opciones avisar y volver a mostrar el menú hasta que se pulse una opción correcta.

Solución: https://github.com/jecrespo/Aprendiendo-Arduino/tree/master/Ejercicio46-Estructuras_de_Control

Modificar el programa para que haga la pregunta de forma continua.

Anuncio publicitario

Chat Serie

Hacer un programa que comunique por puerto serie un arduino UNO (usar la librería software serial) con otro Arduino UNO y saque por pantalla (puerto serie HW del USB) lo recibido por el puerto serie SW y mande por el puerto serie SW todo aquello que mandes desde el terminal. Es decir, hacer un chat punto a punto entre dos Arduinos.

Funciones y librerías a usar:

Preguntas:

  • Leer el código de la librería Softwareserial ¿Que tamaño de buffer tiene?. La librería está en la ruta “C:\Program Files (x86)\Arduino\hardware\arduino\avr\libraries”

Solución básica: https://github.com/jecrespo/Aprendiendo-Arduino/tree/master/Ejercicio22-ChatSerie

Hacer una versión mejorada del anterior chat, de forma que al escribir en el monitor serie la cadena “repite”, Arduino pregunte cuantas veces y mandar por el chat serie la cadena “repite” tantas veces como se haya indicado. En este caso la estrategia es diferente, en lugar de leer un carácter del buffer en cada loop, en este caso hay que leer todo el buffer en el mismo loop para analizar lo que he recibido. Otra estrategia sería leer en cada loop línea por línea.

Comprobar las luces de Tx, Rx cada vez que se manda o recibe datos. Se podría hacer lo mismo con unos LEDs en los pines 10 y 11, encendiendo los leds cada vez que hagamos un write() o un read() en el puerto serie software y veríamos si se están mandando datos o no por la comunicación serie entre los dos Arduinos.

Solución: https://github.com/jecrespo/Aprendiendo-Arduino/tree/master/Ejercicio22-ChatSerieMejorado

Uso de puerto serie en Arduino

Práctica: Generar una tabla de caracteres y sus valores ASCII en decimal, hexadecimal, octal y binario.

Caracteres ASCII: http://es.wikipedia.org/wiki/ASCII y http://www.asciitable.com/

Ejercicio: http://arduino.cc/en/Tutorial/ASCIITable

Fijaros en el carácter ÿ y recordad cuál es su valor en binario.

Solución: https://github.com/jecrespo/Aprendiendo-Arduino/tree/master/Ejercicio06-ASCII

Otro ejemplo: http://diymakers.es/usando-el-puerto-serie-del-arduino/

Comunicación Serie Arduino

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 FIFO. 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

Para ampliar información:

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:

Otras alternativas al monitor serie: https://www.baldengineer.com/alternatives-to-arduinos-serial-monitor.html

Uso 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 también hay 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

Tutorial para comunicar por RS232 un arduino con un Ordenador: http://arduino.cc/en/Tutorial/ArduinoSoftwareRS232

RS485

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.

Más información sobre RS485:

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

Módulo RS485 para Arduino: https://arduino-info.wikispaces.com/RS485-Modules

Shields RS485 para Arduino:

Y puede usarse la librería: https://github.com/Protoneer/RS485-Arduino-Library

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. Las razones por las cuales el uso de Modbus es superior a otros protocolos de comunicaciones es:

  • Es público
  • Su implementación es fácil y requiere poco desarrollo
  • Maneja bloques de datos sin suponer restricciones

Por lo tanto al ser modbus con protocolo de capa 7, su implementación se deba hacer en el software de Arduino ya sea hecha por uno mismo o usando una librería como:

Tutorial de uso de módulo RS485 https://www.cooking-hacks.com/documentation/tutorials/rs-485-module-shield-tutorial-for-arduino-raspberry-pi-intel-galileo/   

Ejemplo de uso de comunicación serie RS485 con Arduino https://arduino-info.wikispaces.com/SoftwareSerialRS485Example

Ejemplo de uso de bus de campo sobre una red RS-485 (bus serie) para comunicar con una sonda HygroClip 2 (HC2) Probe with AirChip 3000: https://github.com/jecrespo/AirChip_3000

La sonda tiene un chip AirChip 3000:

  • Tipo de interface  (por defecto) : UART (Receptor-Transmisor Asíncrono Universal)
  • Organización : Diálogo, dúplex
  • Configuración por defecto: Baud rate : 19200  
  • Paridad: Ninguna
  • bits de datos: 8
  • bits de parada: 1
  • Flow Control: none
  • Tolerancia: 3 %
  • Configuración de Baud rate: No
  • Niveles lógicos Lógica 0: < = 0.3V * VDD
  • Lógica 1: > = 0.8V * VDD
  • Longitud máxima del cable: 5 m (Sin amplificador de señal)

Protocolo de HC2: ver pdf de HC2 y pdf de Hygroclyp en https://github.com/jecrespo/AirChip_3000/tree/master/Doc

Sondas on airchip 3000: http://www.rotronic.com/catalogsearch/result/?q=airchip+3000

Sonda utilizada: http://www.rotronic.com/hc2-ldp.html e información adicional: http://www.lesmaninst.com/unleashd/catalog/analytical/Rotronic-HygroClip2/Intro-to-Rotronic-HC2-Probes.pdf

Otro ejemplo de uso de RS485 con Arduino: http://electronics.stackexchange.com/questions/49097/arduino-as-modbus-master-with-max485-doesnt-get-any-response