Archivo de la etiqueta: RS232

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

Anuncios

USB to Serial

Arduino se conecta a nuestro ordenador a través del puerto USB, pero el puerto USB se debe conectar al microcontrolador a través del puerto serie, por ello debemos entender como están relacionados el puerto USB y el puerto serie.

En un Arduino usamos el puerto USB para dos funciones: cargar nuestro programa ya compilado en la memoria flash y conectarnos al puerto Serie (UART) predefinido en cada Arduino para comunicarnos durante la ejecución del programa. Ambas cosas se puede hacer sin la necesidad del puerto USB, pero dada la facilidad de uso y que todos los ordenadores disponen de un puerto USB, nos facilita mucho hacer estas dos operaciones.

El puerto serie conectado al USB lo usamos como puerto de consola o puerto de debug.

UART: http://es.wikipedia.org/wiki/Universal_Asynchronous_Receiver-Transmitter

Las funciones principales de chip UART son de manejar las interrupciones de los dispositivos conectados al puerto serie y de convertir los datos en formato paralelo, transmitidos al bus de sistema, a datos en formato serie, para que puedan ser transmitidos a través de los puertos y viceversa.

El UART normalmente no genera directamente o recibe las señales externas entre los diferentes módulos del equipo. Usualmente se usan dispositivos de interfaz separados para convertir las señales de nivel lógico del UART hacia y desde los niveles de señalización externos.

RS232 – http://en.wikipedia.org/wiki/RS-232

Tecnología TTL: http://es.wikipedia.org/wiki/Tecnolog%C3%ADa_TTL

Cable FTDI: es la forma más fácil de conectar el microcontrolador a un ordenador por USB. Consiste en un chip de conversión USB a Serie. Como ocurre con Arduino cuando lo conectamos, necesitamos los drivers de windows, cuando conectamos un cable FTDI también necesita sus drivers. Los driver FTDI vienen integrados en el IDE de Arduino.

Drivers:https://web.archive.org/web/20141005060035/http://www.ftdichip.com/Drivers/VCP.htm

Productos de FTDI:

Explicación de la diferencia entre comunicación RS232 y TTL: RS-232 vs. TTL Serial Communication y http://www.atmel.com/Images/doc4322.pdf

Como usar RS232 con Arduino: necesito un driver receptor para poder usarlo: http://arduino.cc/en/pmwiki.php?n=Tutorial/ArduinoSoftwareRS232

Y si vamos a lo fácil: https://www.sparkfun.com/products/13029