Un módulo MAX485 convierte el puerto serie TTL (UART) de un controlador en una señal RS-485 half duplex sobre dos hilos, A y B. Para conectarlo a un PLC M-Duino: alimenta VCC desde el pin 5Vdc del PLC, conecta RO a RX1 (pin 19) y DI a TX1 (pin 18), y controla RE y DE con Pin 2 y Pin 3. Pon DE y RE en HIGH para transmitir y en LOW para recibir.
Todos los M-Duino ya tienen un puerto RS-485 en sus bornes. Un módulo MAX485 es útil cuando el proyecto necesita un segundo bus RS-485 independiente: por ejemplo, analizadores de energía en un bus y variadores de frecuencia en otro, o un puerto Modbus RTU esclavo junto a un puerto Modbus RTU maestro. Esta guía explica el chip, el pinout, la conexión al PLC, el control de dirección en el código y las reglas del bus. Las reglas del bus sirven para cualquier controlador con UART, también si no programas en Arduino.
¿Qué hace un módulo MAX485?
El MAX485 es un transceptor RS-485 half duplex. En un lado tiene pines de lógica TTL para la UART del controlador. En el otro lado tiene el par diferencial A y B. En cada momento el chip o bien transmite al bus o bien lo escucha, nunca las dos cosas en el mismo par. El módulo es una placa pequeña con el chip, los bornes de tornillo para A y B, y unas pocas resistencias.
- 1 · PLCUART del M-DuinoSerial1, niveles TTL a 5 V
- 2 · TransceptorMódulo MAX485De TTL a RS-485, dirección fijada por DE y RE
- 3 · CablePar trenzado A y BEn cadena, 120 Ω en los dos extremos, referencia común
- 4 · CampoEquipos RS-485Esclavos Modbus RTU, contadores, variadores, sensores
Los datos principales del chip, según el datasheet del MAX485 (Analog Devices, antes Maxim):
| Parámetro | MAX485 |
|---|---|
| Tensión de alimentación | Alimentación única de 5 V |
| Comunicación | Half duplex (un par, una dirección cada vez) |
| Velocidad máxima | 2,5 Mbps (slew rate del driver no limitado) |
| Equipos en un bus | Hasta 32 transceptores |
| Consumo | 300 µA típicos, 500 µA como máximo (sin carga, driver desactivado) |
| Fail-safe del receptor | Salida en HIGH si las entradas están en circuito abierto |
| Protección del driver | Limitación de corriente en cortocircuito y apagado térmico |
El MAX485 no tiene el slew rate limitado. En la misma familia, el MAX483, MAX487, MAX488 y MAX489 limitan el slew rate para reducir EMI y reflexiones, y se quedan en 250 kbps. Si tu bus es largo o no está bien terminado y 250 kbps te basta, un transceptor con slew rate limitado es la opción más segura.
Pinout del MAX485: RO, RE, DE, DI, A y B

En la placa habitual del módulo, RO, RE, DE y DI están en un conector, y VCC, GND, A y B en el otro lado, con A y B también en un borne de tornillo.
| Pin | Función | Conectar a (M-Duino) |
|---|---|---|
| RO | Salida del receptor: datos leídos del bus | RX1 (pin 19) |
| RE (activo en LOW) | Habilitación del receptor: LOW activa la salida del receptor | Pin 2 |
| DE (activo en HIGH) | Habilitación del driver: HIGH permite al chip transmitir al bus | Pin 3 |
| DI | Entrada del driver: datos a enviar al bus | TX1 (pin 18) |
| VCC | Alimentación, 5 V | 5Vdc de la zona de comunicaciones |
| GND | Masa | GND de la zona de comunicaciones |
| A | Línea no inversora del bus | A (o A+, D+) de los demás equipos |
| B | Línea inversora del bus | B (o B-, D-) de los demás equipos |
RE y DE deciden lo que hace el chip:
| DE | RE | Resultado |
|---|---|---|
| HIGH | HIGH | Transmitir: el driver está activo, RO está desactivado |
| LOW | LOW | Recibir: el driver está desactivado, RO sigue al bus |
| HIGH | LOW | Transmitir y escuchar: RO devuelve tus propios bytes (eco). Útil para probar el cableado |
| LOW | HIGH | Driver y salida del receptor desactivados |
Como RE es activo en LOW y DE es activo en HIGH, puedes unir los dos a un solo GPIO: HIGH transmite y LOW recibe. Esta guía los deja en dos pines, como en los esquemas de abajo, para que también puedas hacer la prueba de eco.
Conexión de un módulo MAX485 a un PLC M-Duino
El M-Duino está basado en un Arduino Mega 2560 (ATmega2560, lógica de 5 V), así que los pines TTL del MAX485 se conectan directamente, sin adaptador de niveles. Todos los pines que necesitas están en la zona de comunicaciones del PLC: RX1, TX1, Pin 2, Pin 3, 5Vdc y GND (consulta el datasheet de la familia M-Duino y las características técnicas del M-Duino).
Qué puerto serie usar:
- Serial1 (RX1, TX1): el puerto recomendado para el módulo. Es el que usa esta guía.
- Serial0 (RX0, TX0): compartido con el puerto USB. Las cargas de programa y el monitor serie chocarían con el tráfico RS-485.
- Serial2: ya lo usa el puerto RS-232 del PLC (TX pin 16, RX pin 17).
- El puerto RS-485 integrado tiene su propia UART y su propio transceptor. Déjalo para el primer bus.
Revisa los interruptores de comunicaciones. En el M-Duino, los mismos pines del microcontrolador pueden ir a los bornes TTL o a entradas digitales. RX1 y TX1 comparten pin con I1.6 e I1.5, y Pin 3 y Pin 2 comparten pin con I0.6 e I0.5. Pon esos interruptores en OFF para usar los pines TTL. Entonces las entradas I0.5 e I0.6 (e I1.5, I1.6 en los modelos con esa zona) no están disponibles. En los modelos con placa de expansión Wi-Fi, GPRS, LoRa o DALI, la placa usa algunos pines serie y directos: revisa antes la tabla de expansiones del datasheet.

Conecta A con A (o A+) y B con B (o B-) en todos los equipos. Si el bus no responde, primero intercambia A y B en un equipo: los fabricantes no siempre usan la misma letra para la misma línea.
Control de dirección en el código: cambia DE solo después del último byte
El puerto RS-485 integrado del M-Duino lo gestiona la librería RS485 del paquete de placas de Industrial Shields. Con un módulo MAX485 externo, el programa tiene que cambiar DE y RE por su cuenta. La regla es sencilla: activa el driver, envía la trama, espera a que el último bit salga de la UART, y luego desactiva el driver y escucha.
Serial1.write() solo pone los bytes en un buffer y vuelve enseguida. Serial1.flush() espera a que termine la transmisión. Si pones DE en LOW antes de que flush() vuelva, el último byte (normalmente el CRC de una trama Modbus) se corta y el esclavo no responde. Si dejas DE en HIGH demasiado tiempo, bloqueas la respuesta del esclavo.
El ejemplo lee dos holding registers del esclavo Modbus RTU 1 (código de función 03) a 9600 baudios, 8N1. Construye la trama, añade el CRC-16, gestiona los pines de dirección y comprueba la respuesta.
// MAX485 module on an M-Duino PLC: Modbus RTU "read holding registers" (function 03)
// Wiring: RO -> RX1 (pin 19), DI -> TX1 (pin 18), RE -> Pin 2, DE -> Pin 3,
// VCC -> 5Vdc, GND -> GND. Communication switches for RX1/TX1, Pin 2 and Pin 3 to OFF.
const uint8_t RE_PIN = 2; // receiver enable, active LOW
const uint8_t DE_PIN = 3; // driver enable, active HIGH
const uint32_t BAUD = 9600;
const uint16_t TIMEOUT_MS = 200; // wait for the first byte of the answer
const uint8_t GAP_MS = 5; // silence that ends the frame (3.5 characters, about 4 ms at 9600 baud)
void busTransmit() { // driver on, receiver off
digitalWrite(RE_PIN, HIGH);
digitalWrite(DE_PIN, HIGH);
}
void busReceive() { // driver off, receiver on
digitalWrite(DE_PIN, LOW);
digitalWrite(RE_PIN, LOW);
}
uint16_t crc16(const uint8_t *buf, uint8_t len) { // CRC-16/MODBUS
uint16_t crc = 0xFFFF;
for (uint8_t i = 0; i < len; i++) {
crc ^= buf[i];
for (uint8_t b = 0; b < 8; b++) {
crc = (crc & 1) ? (crc >> 1) ^ 0xA001 : crc >> 1;
}
}
return crc;
}
// Returns the number of registers read, or -1 on timeout or bad answer.
int readHolding(uint8_t slave, uint16_t first, uint8_t count, uint16_t *out) {
if (count == 0 || count > 32) return -1; // answer buffer holds 32 registers
uint8_t req[8] = { slave, 0x03, (uint8_t)(first >> 8), (uint8_t)first, 0, count };
uint16_t crc = crc16(req, 6);
req[6] = crc & 0xFF; // CRC low byte first
req[7] = crc >> 8;
while (Serial1.available()) Serial1.read(); // drop old bytes
busTransmit();
Serial1.write(req, sizeof(req));
Serial1.flush(); // wait until the last stop bit has left the UART
busReceive(); // only now release the bus
uint8_t ans[5 + 2 * 32];
uint8_t n = 0;
uint32_t t = millis();
while (millis() - t < TIMEOUT_MS && n == 0) {
if (Serial1.available()) ans[n++] = Serial1.read();
}
if (n == 0) return -1; // no answer
t = millis();
while (millis() - t < GAP_MS) { // read until the line is silent
if (Serial1.available()) {
if (n < sizeof(ans)) ans[n++] = Serial1.read(); else Serial1.read();
t = millis();
}
}
if (n < 5 || ans[0] != slave || ans[1] != 0x03 || ans[2] != 2 * count) return -1;
if (n != 5 + 2 * count) return -1;
uint16_t rxCrc = ans[n - 2] | (ans[n - 1] << 8);
if (rxCrc != crc16(ans, n - 2)) return -1;
for (uint8_t i = 0; i < count; i++) {
out[i] = (ans[3 + 2 * i] << 8) | ans[4 + 2 * i];
}
return count;
}
void setup() {
pinMode(RE_PIN, OUTPUT);
pinMode(DE_PIN, OUTPUT);
busReceive(); // never leave the driver on at start-up
Serial.begin(115200); // USB, for the serial monitor
Serial1.begin(BAUD); // SERIAL_8N1 by default
}
void loop() {
uint16_t regs[2];
int r = readHolding(1, 0, 2, regs); // slave 1, registers 0 and 1
if (r < 0) {
Serial.println(F("No valid answer"));
} else {
Serial.print(F("Reg 0: ")); Serial.print(regs[0]);
Serial.print(F(" Reg 1: ")); Serial.println(regs[1]);
}
delay(1000);
}
Puntos probados: el sketch compila sin avisos para el ATmega2560 con el core Arduino AVR 1.8.6 (6.118 bytes de flash, 682 bytes de RAM). La función CRC da 84 0A para la trama 01 03 00 00 00 01 y C4 0B para 01 03 00 00 00 02, los valores de referencia de Modbus RTU. En una simulación del puerto serie, la petición sale con DE en HIGH, el bus vuelve a modo recepción después de flush(), una respuesta válida se decodifica, y un CRC erróneo o un esclavo que no responde devuelven -1.
Para un maestro Modbus RTU completo con más códigos de función, consulta Modbus RTU con PLC basados en Arduino y ESP32 y la librería Modbus RTU master. Esos ejemplos usan el puerto RS-485 integrado.
Prueba de eco sin un segundo equipo. Pon DE en HIGH y RE en LOW, envía unos bytes y lee RO. Si vuelven los mismos bytes, la UART, los pines y el módulo funcionan. Si no vuelve nada, revisa los interruptores, la alimentación de 5 V del módulo y la conexión de RO a RX1.
El full duplex con dos módulos MAX485 necesita cuatro hilos
Un MAX485 no puede enviar y recibir a la vez. Dos módulos dan full duplex solo en un enlace de 4 hilos: un par para cada dirección. Un módulo queda fijo como transmisor (DE y RE en HIGH) y transmite por el par que va al receptor del otro equipo. El segundo módulo queda fijo como receptor (DE y RE en LOW) y escucha el par que viene del transmisor del otro equipo. Dos módulos en el mismo par de 2 hilos siguen siendo half duplex.

Antes de añadir dos módulos, revisa el puerto integrado. El puerto RS-485 del M-Duino tiene bornes A+, B-, Y+ y Z- y admite full duplex: pon el interruptor FD/HD en FD y conecta A+ a Y+, B- a Z-, Y+ a A+ y Z- a B- del otro equipo. Consulta RS-485 con PLC basados en Arduino y ESP32. Para un transceptor full duplex en un solo chip, el mismo datasheet incluye del MAX488 al MAX491.
Reglas del bus RS-485 que también valen para un módulo MAX485
La mayoría de problemas con un módulo MAX485 son problemas del bus, no del chip. Estas reglas vienen del estándar RS-485 (TIA/EIA-485) y valen para cualquier transceptor:
- Topología: una línea de equipo en equipo (en cadena). Evita estrellas y derivaciones largas.
- Cable: par trenzado para A y B. A velocidades bajas, RS-485 llega a unos 1200 m. A velocidades altas la distancia es mucho menor.
- Terminación: una resistencia de 120 Ω entre A y B en cada extremo de la línea, y en ningún otro punto. Muchos módulos económicos llevan una resistencia entre A y B en la placa. Mide entre A y B con el módulo sin alimentar: unos 120 Ω indican que está montada. Quítala en los módulos que están en medio del bus.
- Reposo: el fail-safe del MAX485 solo funciona con las entradas abiertas. En un bus terminado con todos los drivers desactivados, la tensión entre A y B es casi cero y los receptores pueden leer ruido como datos. Unas resistencias de polarización (pull-up en A, pull-down en B) en un punto del bus mantienen la línea en reposo en un estado definido.
- Referencia: RS-485 es diferencial, pero los transceptores necesitan una referencia común. Lleva un hilo de referencia (GND o común de señal) junto al par.
- Carga: el MAX485 cuenta como una carga unidad. Con entradas MAX485, no pases de 32 equipos por segmento de bus.
- Aislamiento: el módulo MAX485 no tiene aislamiento galvánico. Dentro de un mismo armario no suele ser un problema. Entre armarios o edificios con potenciales de tierra distintos, usa un transceptor aislado o un repetidor aislado.
Cuando el bus no funciona, sigue las comprobaciones paso a paso de Problemas de RS485: diagnóstico de fallos del bus paso a paso. Para lo básico del puerto RS-485 del PLC, consulta Conceptos básicos del RS-485 de un PLC industrial.
Puerto RS-485 integrado o módulo MAX485: cuándo usar cada uno
| Puerto RS-485 integrado | Módulo MAX485 en Serial1 | |
|---|---|---|
| Función | Primer bus RS-485 | Segundo bus RS-485 independiente |
| Duplex | Half o full duplex (interruptor FD/HD) | Half duplex (full duplex con dos módulos y cuatro hilos) |
| Control de dirección | Librería RS485 del paquete de placas | Tu código, con DE y RE |
| Conexión | Bornes A+, B-, Y+, Z- en el PLC | Módulo cableado a RX1, TX1, Pin 2, Pin 3, 5Vdc y GND |
| Pines usados | Ninguna de las E/S generales | I0.5 e I0.6 (e I1.5, I1.6 si existen) pasan a ser pines TTL |
| Montaje | Dentro de la caja del PLC | Placa adicional que hay que fijar en el armario |
Un caso habitual con dos buses es una pasarela. El M-Duino usa Ethernet para el SCADA (Modbus TCP) y RS-485 para los equipos de campo (Modbus RTU). Consulta la pasarela Modbus TCP a RTU en un PLC M-Duino y el control de rpm de un variador por Modbus RTU en la PLC Solution Library.
Más sobre RS-485 en PLC
- Cómo comunicar una Raspberry Pi 4 B con un módulo MAX485
- Cómo conectar dos PLC industriales por RS-485
- Cómo usar TTL en un PLC industrial basado en Arduino
- Caso de estudio: control de velocidad de una cinta transportadora con un M-Duino 42+ y un variador de frecuencia (consigna de velocidad analógica, con RS-485 y Modbus RTU como opción de bus de campo)
¿Necesitas un segundo bus serie en el PLC? La familia M-Duino (Arduino PLC) tiene Ethernet, RS-485, RS-232, TTL, I2C y SPI en todos los modelos, del M-Duino 19R+ al M-Duino 58+.
Ver la familia Arduino PLC (M-Duino)Abrir la PLC Solution Library
Preguntas frecuentes sobre el módulo MAX485 y los PLC
¿Puede funcionar un módulo MAX485 a 3,3 V?
El MAX485 está especificado para una alimentación única de 5 V. En un controlador de 3,3 V, como un ESP32, usa un transceptor hecho para 3,3 V en lugar de alimentar un MAX485 fuera de su rango. El M-Duino usa lógica de 5 V, así que el MAX485 encaja.
¿Por qué el esclavo no responde, o solo responde a veces?
La causa más habitual es que DE pasa a LOW antes de que el último byte salga de la UART. Llama a Serial1.flush() antes de pasar a recepción. Después revisa la velocidad y la paridad, la polaridad de A y B, la dirección del esclavo y la terminación.
¿Necesito la resistencia de 120 Ω del módulo?
Solo si el módulo está en un extremo del bus. Un cable corto de banco a 9600 baudios suele funcionar sin ella. Una línea larga necesita una resistencia en cada extremo y ninguna más.
¿Puedo conectar el módulo MAX485 al puerto RS-485 integrado del mismo PLC?
Sí. Conecta A del módulo a A+ y B a B- del PLC, con el puerto en half duplex. Es una prueba rápida: envía desde Serial1 y lee con la librería RS485, a la misma velocidad en los dos lados.
¿Cuántos equipos pueden compartir un bus con MAX485?
Hasta 32 equipos de una carga unidad cada uno, como el MAX485. Los equipos con una fracción de carga unidad permiten más. El tiempo de ciclo del maestro también limita cuántos esclavos puedes consultar en la práctica.
¿El módulo MAX485 está aislado?
No. Entre armarios o edificios con potenciales de tierra distintos, usa un transceptor RS-485 aislado o un repetidor aislado.