miércoles, 18 de mayo de 2016

Comunicación RS-485 simplex entre dos Arduinos con módulos MAX485


Hoy os voy a mostrar cómo trabajar con uno de los estándares de comunicación en bus de la capa física del Modelo OSI denominado RS-485, muy utilizado en las comunicaciones industriales debido a su robustez, fácil implementación y buenas prestaciones. 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, admitiendo 32, 128 o 254 estaciones en un solo par.  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. La norma RS-485 indica que cada uno de sus nodos se conecta a la línea de transmisión formando una cadena conocida como topología en Bus. Cada elemento o nodo de la red (transmisor o driver y receptor) se conecta a la línea de transmisión mediante unos cables de enlace cortos. Por sus características físicas, este tipo de topología es el más sencillo que se puede implementar. La interface con la topología tipo Bus puede ser diseñada para una comunicación unidireccional (simplex), dual simultanea (full-duplex) o dual no simultánea (half-duplex).

Ejemplo de comunicación industrial con protocolo RS-485

El módulo MAX485 RS485-TTL tiene acceso a todos los pines del MAX485 que incorpora y contiene todos los componentes adicionales, tales como resistencias o condensadores, necesarios para su correcto funcionamiento y control. Los pines A y B se pueden conectar también desde la bornera. Este módulo nos permite establecer una interfaz RS-485 a Serie TTL para trabajar con los pines RX y TX de Arduino como si de una simple comunicación serie se tratara pero respetando el protocolo de comunicación RS-485. Las salidas A y B son por donde se envían los datos, B es la negación de A, es decir, se envían los mismos datos pero en la línea B están negados, de esta forma se pueden restar ambas señales y eliminar el ruido y quedarnos solo con la señal de datos. El encargado de esta transmisión diferencial es el  integrado MAX485.

Módulo MAX485 RS485-TTL

En este POST vamos a comunicar dos Arduinos de manera unidireccional (simplex) a través de módulos MAX485 RS485-TTL, por lo que en este caso un Arduino se comporta solo como transmisor y el otro solo como receptor, a nivel de programación es como si estuviéramos trabajando con una comunicación serial, pero en un solo sentido (uno envía y el otro solo recibe datos). El modulo conectado al Arduino transmisor solo va a trabajar como transmisor, es decir,  se tienen que conectar a +5V los pines RE y DE para que el modulo sepa que las salida A y B se van a comportar como salida de datos.  Desde el Arduino transmisor se envía el valor mapeado del potenciómetro (de 0 a 254), dependiendo de la posición en la que se encuentre su mando de control, desde el pin TX de Arduino hacia el pin DI (Data Input) del módulo y este  transmitirá los datos por los pines A y B hacia el módulo del Arduino Receptor. El módulo conectado al Arduino receptor solamente va a trabajar como receptor y para ello debemos de conectar los pines RE y DE del módulo a GND, y los datos recibidos por A y B estarán presentes en el pin RO (Receiver Output) del módulo, por lo que conectando el pin RO del módulo al RX de nuestro Arduino receptor podemos leer el dato recibido y en función de su valor (entre 0 y 254) brillará un LED, que tenemos conectado a una salida digital PWM de Arduino, con una intensidad concreta, desde permanecer apagado hasta conseguir un brillo máximo del LED cuando movemos el mando del potenciómetro del Arduino transmisor de un límite mecánico al otro. Solo dos cables (salidas A y B de los módulos MAX485 RS485-TTL) unirán a los Arduinos, pero teniendo en cuenta que si la distancia es larga se recomienda usar cable trenzado para eliminar interferencias como el ruido. Se han habilitado a través de la librería   nuevas conexiones serie TX (pin 3) y RX (pin 2) dentro de los programas que cargaremos a los dos Arduinos para poder dejar libres las conexiones TX (pin 1) y RX (pin 0) que trae configuradas el Arduino por defecto para comunicarse a través del puerto serie, puesto que son utilizadas a la hora de cargar los programas y de comunicarse con el monitor serie del IDE de Arduino, produciendo ciertas incompatibilidades al comunicarse con el módulo MAX485 RS485-TTL. Para una mayor información os recomiendo revisar los comentarios realizados dentro de cada uno de los programas.



Lista de Materiales:


·         2 Arduinos UNO Rev.3.

·         Cable USB tipo A-B.

·         2 Módulos MAX485 RS485-TTL.

·         Potenciómetro lineal de 10KΩ.

·         Resistencia de 220Ω.

·         LED de 3mm de cualquier color (válido de 5mm también).

·         Batería de 12VDC (DC 12300).

·         Batería de 9VDC con clip para Jack de 3,5mm macho.

·         2 Protoboards.

·         Cables de conexión.



Código del programa:

·         Transmisor_simplex_RS485:





·         Receptor_simplex_RS485:



Video:

5 comentarios:

  1. buenas tardes, donde encuentro el diagrama de conexiones

    ResponderEliminar
    Respuestas
    1. Lo tienes dentro del programa en los comentarios del código.

      Eliminar
  2. buenas tardes, muy bueno tu blog, el sistema me funciono de forma perfecta, pero me nace una duda como enviar mas de un dato, es decir leer el potenciometro y un sensor de luz, localizados en el mismo arduino, hacia el otro para que prenda un led y controlar la luminosidad de otro.

    ResponderEliminar
  3. Mil gracias por tu aporte. Me funcionó perfectamente con arduinos UNO. El problema que tengo es que necesito varias entradas con interrupciones, por lo que necesito colocar como maestro un arduino DUE Y ÉSTE NO RECONOCE LA LIBRERÍA softwareserial.h. Qué hago?

    ResponderEliminar
  4. muchas pero muchas gracias por tu aporte. hace días que vengo luchando con la comunicación, ahora me queda ver si puedo poner un ldr en ves del potenciómetro

    ResponderEliminar