La comunicación RS-485 es un estándar ampliamente utilizado para la transmisión de datos en sistemas de comunicación serie. Aquí presento algunas de las características clave de la comunicación RS-485:
- Diferencial: RS-485 utiliza una señal diferencial, lo que significa que se transmiten dos señales: una señal «A» y una señal «B». La información se codifica en la diferencia de tensión entre estas dos señales, lo que lo hace altamente resistente al ruido y las interferencias electromagnéticas.
- Half-Duplex o Full-Duplex: RS-485 admite tanto comunicación half-duplex como full-duplex. En la comunicación half-duplex, los dispositivos pueden transmitir o recibir datos, pero no ambos simultáneamente. En la comunicación full-duplex, los dispositivos pueden transmitir y recibir datos al mismo tiempo.
- Topología en Bus: RS-485 es ideal para configuraciones de bus, donde varios dispositivos se conectan en serie en una única línea de comunicación. Esto permite la construcción de redes de dispositivos en cadena.
- Distancias largas: RS-485 es conocido por su capacidad de transmisión a largas distancias. Puede alcanzar fácilmente varios miles de metros sin degradación significativa de la señal.
- Velocidades de transmisión ajustables: RS-485 admite una amplia gama de velocidades de transmisión, desde velocidades bajas como 300 baudios hasta velocidades de varios megabaudios, lo que lo hace versátil para diferentes aplicaciones.
- Multipoint: RS-485 permite conectar múltiples dispositivos en el mismo bus de comunicación. Cada dispositivo tiene una dirección única para que los datos se puedan dirigir al dispositivo específico que lo necesita.
- Alta inmunidad al ruido: Dado que utiliza señales diferenciales, RS-485 es muy resistente al ruido y a las interferencias electromagnéticas. Esto lo hace adecuado para entornos industriales y ruidosos.
- Control de flujo: RS-485 admite control de flujo mediante señales de hardware, lo que garantiza una comunicación confiable entre dispositivos.
- Protocolos personalizados: Es común utilizar protocolos personalizados sobre RS-485 para comunicación en sistemas embebidos, lo que brinda flexibilidad para adaptar la comunicación a las necesidades específicas del sistema.
- Terminación: Se suelen utilizar resistencias de terminación al final del bus RS-485 para evitar reflexiones de señal y garantizar una transmisión estable.
- Baja corriente de reposo: Los dispositivos RS-485 suelen tener una baja corriente de reposo cuando no están transmitiendo datos, lo que es beneficioso para aplicaciones con restricciones de energía.
- Amplia gama de aplicaciones: RS-485 se utiliza en una amplia variedad de aplicaciones, como automatización industrial, control de procesos, sistemas de control de acceso, comunicación entre dispositivos embebidos y más.
La longitud del cable puede ser de 1200 metros, con una velocidad de 10 Mbps, aunque a partir de los 15 metros va reduciendose la velocidad progresivamente hasta los 100 Kbps.
Podemos conectar hasta 32 dispositivos interconectados con este protocolo, al ser una señal diferencial es muy resistente al ruido.
Resistencias:
Se conectan resistencias en los extremos del protocolo uniendo el cable a y b, con un valor resistivo de 120 ohmios, este valor es el estandarizado aunque lo correcto es calcular el valor de esa resistencia dependiendo de la distancia entre el emisor y el receptor.
Tambien es recomendable utilizar en los extremos del protocolo, en este caso en las bornas a y b, resistencias de pull-up y pull-down con un valor cada una de 1 Kohm. La resistencia pull-up se colocara en la señal positiva, la borna B, mientras que la pull-down estara en la señal negativa, la borna A.
Tensiones:
Si la diferencia entre A menos B es mayor que +200mV se interpreta como un 1 logico, si la diferencia entre A menos B es menor que -200mV se interpreta como un 0 logico, y si la diferencia entre A menos B esta dentro de +200mV y -200mV eso da como resultado una indeterminación. Podemos trabajar con voltajes entre -7 voltios a +12 voltios, si superamos algunos de esos voltajes tendremos errores de lectura de señal.
El consumo estandar puede ser de 250 mA, aunque dependera de la tension.
Codigo en C++ donde nos comunicamos con el ordenador y vemos la informacion en pantalla:
#include <Arduino.h>
#include <SoftwareSerial.h>
SoftwareSerial mySerial(1, 3);
void setup()
{
mySerial.begin(9600);
pinMode(25, OUTPUT);
pinMode(26, OUTPUT);
delay(100);
}
void loop() // run over and over
{
String receivedData = "";
bool wordReceived = false;
while (!wordReceived)
{
mySerial.flush();
digitalWrite(25, LOW);
digitalWrite(26, LOW);
delay(100);
if (mySerial.available())
{
String receivedString = mySerial.readString();
receivedData += receivedString;
receivedData.toLowerCase();
if (receivedData.length() > 0)
{
wordReceived = true;
}
}
}
digitalWrite(25, HIGH);
digitalWrite(26, HIGH);
delay(100);
mySerial.println(receivedData);
delay(1000);
}
Aclarando las lineas del codigo de programación de arriba:
- Incluye las bibliotecas necesarias:
- Arduino.h: Incluye la biblioteca principal de Arduino.
- SoftwareSerial.h: Se utiliza para crear una comunicación serial software en pines específicos. En este caso, se configura el objeto mySerial en los pines 1 (TX) y 3 (RX) del NodeMCU.
- Configuración inicial en setup():
- Se inicia la comunicación serial a una velocidad de 9600 baudios con mySerial.begin(9600).
- Se configuran los pines 25 y 26 como salidas con pinMode() para controlar la comunicación RS485.
- Se introduce un retardo de 100 milisegundos (delay(100)).
- Bucle principal loop():
- Se declara una cadena (String) llamada receivedData para almacenar los datos recibidos.
- Se declara una variable booleana wordReceived inicializada en false. El código entra en un bucle mientras wordReceived sea false:
- Se limpia el búfer serial con mySerial.flush() para asegurarse de que no haya datos residuales.
- Se establece en bajo los pines 25 y 26 para controlar la dirección de comunicación RS485 (esto puede estar relacionado con el control de dirección de datos).
- Se introduce un retardo de 100 milisegundos (delay(100)).
- Se verifica si hay datos disponibles en mySerial con mySerial.available().
- Si hay datos disponibles, se lee una cadena con mySerial.readString() y se agrega a receivedData.
- Se convierte el contenido de receivedData a minúsculas con receivedData.toLowerCase() (esto puede ser útil para normalizar los datos).
- Si la longitud de receivedData es mayor que cero, se establece wordReceived en true, lo que indica que se ha recibido al menos una palabra. Luego, se restablecen los pines 25 y 26 a alto para cambiar la dirección de comunicación RS485, y se introduce otro retardo de 100 milisegundos. Finalmente, se envía receivedData de vuelta al ordenador mediante mySerial.println(receivedData), lo que permite ver los datos en pantalla. Se introduce un retardo de 1000 milisegundos (delay(1000)) antes de repetir el proceso.
Tambien es importante añadir la libreria SoftwareSerial.h , lo podemos importar desde Github en la siguiente dirección:
https://github.com/plerup/espsoftwareserial.git
En el caso de que esteis utilizando el entorno Visual Studio PlatformIO podeis añadir la libreria en el archivo platformio.ini que quedaria de la siguiente manera:
[env:esp32doit-devkit-v1]
platform = espressif32
board = esp32doit-devkit-v1
framework = arduino
lib_deps = https://github.com/plerup/espsoftwareserial.git
El esquema electrico correspondiente a este codigo es el siguiente:
El video explicando el funcionamiento de este protocolo:
Deja una respuesta Cancelar la respuesta