- Diferencia entre comunicación UART y RS485
- Componentes requeridos
- Diagrama de circuito para comunicación por cable de larga distancia
- Módulo convertidor MAX485 UART-RS485
- Cable Ethernet CAT-6E
- Explicación del código Arduino
- Conclusión
Hemos estado utilizando placas de desarrollo de microcontroladores como Arduino, Raspberry Pi, NodeMCU, ESP8266, MSP430, etc. durante mucho tiempo en nuestros proyectos pequeños donde la mayoría de las veces la distancia entre los sensores y la placa no es más que unos pocos centímetros al máximo y A estas distancias, la comunicación entre los diferentes módulos de sensores, relés, actuadores y controladores se puede realizar fácilmente a través de simples cables de puente sin que nos preocupemos por la distorsión de la señal en el medio y los ruidos eléctricos que se infiltran en él. Pero si está construyendo un sistema de control con estas placas de desarrollo a una distancia de más de 10 a 15 metros, entonces debe tener en cuenta el ruido y la potencia de la señal porque si desea que su sistema funcione de manera confiable, entonces no puede permitirse perder el datos durante la transferencia.
Hay muchos tipos diferentes de protocolos de comunicación en serie como I2C y SPI que se pueden implementar fácilmente con Arduino y hoy veremos otro protocolo más comúnmente utilizado llamado RS485 que se usa muy comúnmente en entornos industriales de alto ruido para transferir los datos una larga distancia. En este tutorial, vamos a aprender sobre el protocolo de comunicación RS485 y cómo implementarlo con los dos Arduino Nano que tenemos con nosotros y cómo usar el Módulo de conversión MAX485 RS485 a UART. Anteriormente también hemos realizado la comunicación MAX485 con Arduino y también la comunicación MAX485 con Raspberry pi, también puede consultarlos si está interesado.
Diferencia entre comunicación UART y RS485
La mayoría de los sensores de bajo costo y otros módulos como GPS, Bluetooth, RFID, ESP8266, etc. que se usan comúnmente con Arduino, Raspberry Pi en el mercado usan comunicación basada en UART TTL porque solo requiere 2 cables TX (Transmisor) y RX (Receptor). No es un protocolo de comunicación estándar, pero es un circuito físico con el que puede transmitir y recibir datos en serie con otros periféricos. Solo puede transmitir / recibir datos en serie, por lo que primero convierte los datos en paralelo en datos en serie y luego transmite los datos.
UART es un dispositivo de transmisión asincrónica, por lo tanto, no hay señal de reloj para sincronizar los datos entre los dos dispositivos, sino que utiliza bits de inicio y parada al inicio y al final de cada paquete de datos, respectivamente, para marcar los extremos de los datos que se transfieren. Los datos transmitidos por UART se organizan en paquetes. Cada paquete contiene 1 bit de inicio, de 5 a 9 bits de datos (según el UART), un bit de paridad opcional y 1 o 2 bits de parada. Está muy bien documentado y es ampliamente utilizado y también tiene un bit de paridad para permitir la verificación de errores. Pero hay algunas limitaciones, ya que no puede admitir múltiples esclavos y múltiples maestros. y la trama de datos máxima está limitada a 9 bits. Para la transferencia de datos, las velocidades en baudios tanto del maestro como del esclavo deben estar entre el 10% entre sí. A continuación se muestra el ejemplo de cómo un personaje es un transmisor sobre una línea de datos UART. Las señales altas y bajas se miden contra el nivel de GND, por lo que cambiar el nivel de GND tendrá un efecto desastroso en la transferencia de datos.
Por otro lado, RS485 es una comunicación más basada en la industria que se desarrolla para una red de múltiples dispositivos que se pueden usar a largas distancias y también a mayores velocidades. Opera con un método de medición de señalización diferencial en lugar de medición de voltaje con el pin GND. Las señales RS485 son flotantes y cada señal se transmite a través de una línea Sig + y una línea Sig-.
El receptor RS485 compara la diferencia de voltaje entre ambas líneas, en lugar del nivel de voltaje absoluto en una línea de señal. Esto funciona bien y evita la existencia de bucles de tierra, una fuente común de problemas de comunicación. Los mejores resultados se obtienen si las líneas Sig + y Sig- se retuercen, ya que la torsión anula el efecto del ruido electromagnético inducido en un cable y proporciona una inmunidad mucho mejor contra el ruido, lo que permite que el RS485 transmita los datos hasta 1200 m de alcance.. El par trenzado también permite que las velocidades de transmisión sean mucho más altas de lo que es posible con cables rectos. A distancias de transmisión pequeñas, se pueden lograr velocidades de hasta 35 Mbps con RS485, aunque la velocidad de transmisión disminuirá con la distancia. A 1200 m de velocidad de transmisión, puede usar solo 100 kbps de velocidad de transmisión. Necesita un cable Ethernet especial para realizar este protocolo de comunicación. Hay muchas categorías de cables Ethernet que podemos usar como CAT-4, CAT-5, CAT-5E, CAT-6, CAT-6A, etc. En nuestro tutorial, usaremos un cable CAT-6E que tiene 4 pares trenzados de cables 24AWG y puede soportar hasta 600MHz. Está terminado en ambos extremos por un conector RJ45. Los niveles de voltaje de línea típicos de los controladores de línea son de un mínimo de ± 1,5 V a un máximo de aproximadamente ± 6 V. La sensibilidad de entrada del receptor es de ± 200 mV. El ruido en el rango de ± 200 mV se bloquea esencialmente debido a la cancelación de ruido en modo común. Un ejemplo de cómo se transfiere un byte (0x3E) a través de las dos líneas de comunicación RS485.
Componentes requeridos
- Módulo convertidor 2 × MAX485
- 2 × Arduino Nano
- LCD alfanumérico de 2 × 16 * 2
- Potenciómetros de limpiaparabrisas de 2 × 10k
- Cable Ethernet Cat-6E
- Tableros de pruebas
- Cables de puente
Diagrama de circuito para comunicación por cable de larga distancia
La siguiente imagen muestra el diagrama del circuito del transmisor y receptor para la comunicación por cable de larga distancia de Arduino. Tenga en cuenta que los circuitos del transmisor y del receptor se ven idénticos, lo único que difiere es el código escrito en ellos. También para la demostración, estamos usando una placa como transmisor y una placa como receptor, pero podemos programar fácilmente las placas para que funcionen como transmisor y receptor con la misma configuración.
El diagrama de conexión para el circuito anterior también se muestra a continuación.
Como puede ver arriba, hay dos pares de circuitos casi idénticos, cada uno con un Arduino nano, LCD alfanumérico de 16 * 2 y un IC convertidor MAX485 UART a RS485 conectado a cada extremo de un cable Ethernet Cat-6E a través de un conector RJ45. El cable que he utilizado en el tutorial tiene una longitud de 25 m. Enviaremos algunos datos desde el lado del transmisor a través del cable del Nano que se convierte en señales RS485 a través del módulo MAX RS485 que funciona en modo maestro.
En el extremo receptor, el módulo convertidor MAX485 funciona como esclavo y, al escuchar la transmisión del maestro, vuelve a convertir los datos RS485 que recibió en las señales estándar de 5V TTL UART para ser leídas por el Nano receptor y mostradas en 16 * 2 LCD alfanumérico conectado a él.
Módulo convertidor MAX485 UART-RS485
Este módulo convertidor UART-RS485 tiene un chip MAX485 integrado que es un transceptor de baja potencia y velocidad de respuesta limitada que se utiliza para la comunicación RS-485. Funciona con una sola fuente de alimentación de + 5V y la corriente nominal es de 300 μA. Funciona en comunicación semidúplex para implementar la función de convertir el nivel TTL en nivel RS-485, lo que significa que puede transmitir o recibir en cualquier momento, no ambos, puede alcanzar una velocidad de transmisión máxima de 2,5 Mbps. El transceptor MAX485 consume una corriente de suministro de entre 120 μA y 500 μA en condiciones de descarga o carga completa cuando el controlador está desactivado. El controlador está limitado a la corriente de cortocircuito y las salidas del controlador se pueden colocar en un estado de alta impedancia a través del circuito de apagado térmico. La entrada del receptor tiene una función a prueba de fallas que garantiza una salida alta lógica si la entrada es un circuito abierto.Además, tiene un fuerte rendimiento antiinterferente. También tiene LED integrados para mostrar el estado actual del chip, es decir, si el chip está encendido o si está transmitiendo o recibiendo datos, lo que facilita la depuración y el uso.
El diagrama de circuito proporcionado anteriormente explica cómo el IC MAX485 integrado está conectado a varios componentes y proporciona encabezados de espaciado estándar de 0.1 pulgadas para usar con la placa de prueba si lo desea.
Cable Ethernet CAT-6E
Cuando pensamos en la transferencia de datos a larga distancia, pensamos instantáneamente en conectarnos a Internet mediante cables Ethernet. Hoy en día, usamos principalmente Wi-Fi para la conectividad a Internet, pero antes solíamos usar cables Ethernet que iban a cada computadora personal para conectarla a Internet. La razón principal detrás del uso de estos cables Ethernet sobre cables normales es que brindan una protección mucho mejor contra el ruido que ingresa y la distorsión de la señal a grandes distancias. Tienen una chaqueta protectora sobre la capa de aislamiento para proteger contra la interferencia electromagnética y también cada par de cables está trenzado para evitar la formación de bucles de corriente y, por lo tanto, una protección mucho mejor contra el ruido. A menudo terminan con conectores RJ45 de 8 pines en cada extremo. Hay muchas categorías de cables Ethernet que podemos usar como CAT-4, CAT-5,CAT-5E, CAT-6, CAT-6A, etc. En nuestro tutorial, usaremos un cable CAT-6E que tiene 4 pares trenzados de cables 24AWG y puede soportar hasta 600MHz.
Imagen que muestra cómo se tuercen un par de cables dentro de la capa de aislamiento del cable CAT-6E
Conector RJ-45 para cable Ethernet CAT-6E
Explicación del código Arduino
En este proyecto, estamos usando dos Arduino Nano, uno como transmisor y otro como receptor, cada uno con una pantalla LCD alfanumérica de 16 * 2 para mostrar los resultados. Entonces, en el código Arduino, nos enfocaremos en enviar los datos y mostrar los datos enviados o recibidos en la pantalla LCD.
Para el lado del transmisor:
Comenzamos incluyendo la biblioteca estándar para manejar la pantalla LCD y declaramos el pin D8 del Arduino Nano como pin de salida que luego usaremos para declarar el Módulo MAX485 como transmisor o Receptor.
int enablePin = 8; int potval = 0; #incluir
Ahora vamos a la parte de configuración. Tiraremos del pin de habilitación hacia arriba para poner el módulo MAX485 en modo transmisor. Como es un IC semidúplex, no puede transmitir y recibir al mismo tiempo. También inicializaremos la pantalla LCD aquí e imprimiremos un mensaje de bienvenida.
Serial.begin (9600); // inicializar el serial a la velocidad de transmisión 9600: pinMode (enablePin, OUTPUT); lcd.begin (16,2); lcd.print ("RESUMEN DEL CIRCUITO"); lcd.setCursor (0,1); lcd.print ("Transmisor Nano"); retraso (3000); lcd.clear ();
Ahora, en el ciclo, escribimos un valor entero que aumenta continuamente en las líneas seriales que luego se transmite al otro nano. Este valor también se imprime en la pantalla LCD para su visualización y depuración.
Serial.print ("Valor enviado ="); Serial.println (potval); // POTval de escritura en serie al bus RS-485 lcd.setCursor (0,0); lcd.print ("Valor enviado"); lcd.setCursor (0,1); lcd.print (potval); retraso (1000); lcd.clear (); potval + = 1;
Lado del receptor:
Aquí nuevamente, comenzamos con la inclusión de la biblioteca estándar para manejar el LCD y declaramos el pin D8 del Arduino Nano como un pin de salida que luego usaremos para declarar el Módulo MAX485 como transmisor o Receptor.
int enablePin = 8; #incluir
Ahora vamos a la parte de configuración. Tiraremos del pin de habilitación hacia arriba para poner el módulo MAX485 en modo receptor. Como es un IC semidúplex, no puede transmitir y recibir al mismo tiempo. También inicializaremos la pantalla LCD aquí e imprimiremos un mensaje de bienvenida.
Serial.begin (9600); // inicializar el serial a la velocidad de transmisión 9600: pinMode (enablePin, OUTPUT); lcd.begin (16,2); lcd.print ("RESUMEN DEL CIRCUITO"); lcd.setCursor (0,1); lcd.print ("Receptor Nano"); retraso (3000); digitalWrite (enablePin, LOW); // (Pin 8 siempre BAJO para recibir valor del Maestro)
Ahora en el ciclo, verificamos si hay algo disponible en el puerto serie y luego leemos los datos y, dado que los datos entrantes son un número entero, los analizamos y mostramos en la pantalla LCD conectada.
int pwmval = Serial.parseInt (); // Recibe el valor INTEGER del maestro a través de RS-485 Serial.print ("I got value"); Serial.println (pwmval); lcd.setCursor (0,0); lcd.print ("Valor recibido"); lcd.setCursor (0,1); lcd.print (pwmval); retraso (1000); lcd.clear ();
Conclusión
La configuración de prueba que usamos para este proyecto se puede encontrar a continuación.
El funcionamiento completo de este proyecto se puede encontrar en el video vinculado a continuación. Este método es uno de los métodos simples y fáciles de implementar para transferir los datos a largas distancias. En este proyecto, solo hemos utilizado una velocidad en baudios de 9600 que está muy por debajo de la velocidad de transferencia máxima que podemos lograr con el módulo MAX-485, pero esta velocidad es adecuada para la mayoría de los módulos de sensores que existen y realmente no la necesitamos. todas las velocidades máximas mientras trabaja con Arduino y otras placas de desarrollo, a menos que esté utilizando el cable como una conexión Ethernet y requiera todo el ancho de banda y la velocidad de transferencia que pueda obtener. Juegue con la velocidad de transferencia por su cuenta y pruebe otros tipos de cable Ethernet también. Si tiene alguna pregunta, déjela en la sección de comentarios a continuación o use nuestros foros y haré todo lo posible para responderla. ¡Hasta entonces, adiós!