Para convertir una señal de 4-20 mA a 0-10 V, conecta una resistencia de 500 Ω entre la entrada analógica y 0 V (GND) y deja que la corriente del lazo pase por ella. Por la ley de Ohm (V = I × R), 4 mA dan 2 V y 20 mA dan 10 V, así que una entrada 0-10 V de un PLC lee el sensor como una señal de 2-10 V.
Esta guía explica la conexión de un transmisor a 2 hilos, una tabla de mA a voltios y cuentas del ADC, la fórmula de escalado a unidades de ingeniería, cómo detectar un lazo roto y un código Arduino probado para un Arduino PLC. También explica los errores que añaden la resistencia y la impedancia de entrada, y cuándo necesitas un convertidor aislado en lugar de una resistencia.
¿Qué es una señal de 4-20 mA?
Una señal de 4-20 mA es una señal analógica de corriente. Un transmisor (de presión, nivel, caudal o temperatura) fija la corriente del lazo: 4 mA es el valor más bajo de su rango de medida y 20 mA el más alto. Por ejemplo, un transmisor de presión de 0-10 bar da 4 mA a 0 bar, 12 mA a 5 bar y 20 mA a 10 bar.
4-20 mA es la señal analógica estándar de los transmisores industriales porque la corriente es la misma en todos los puntos de un lazo en serie. La resistencia de un cable largo no cambia el valor, y el "cero vivo" de 4 mA permite al PLC distinguir un cero real de un hilo roto.
Dos propiedades hacen de 4-20 mA la opción por defecto para los sensores de campo:
- Cables largos. Una señal de tensión pierde parte de su valor en la resistencia del cable y capta ruido de motores, contactores y variadores. En un lazo de corriente, el transmisor mantiene la corriente constante mientras la fuente tenga tensión suficiente, así que la resistencia del cable no cambia la lectura.
- Cero vivo. La señal nunca baja de 4 mA en funcionamiento normal. Una corriente cercana a 0 mA solo puede significar un cable cortado, un borne suelto o un transmisor sin alimentación.
La mayoría de transmisores de 4-20 mA son de 2 hilos: los mismos dos hilos llevan la alimentación y la señal. El lazo necesita una fuente de continua, normalmente de 24 Vdc.
Una entrada analógica de PLC suele medir tensión. En el Arduino PLC (M-Duino y Ardbox), el ESP32 PLC y el Raspberry PLC las entradas analógicas miden de 0 a 10 Vdc (datasheets de cada familia). La excepción es el ESP32 PLC 14: sus entradas AI0.0 y AI0.1 también tienen un modo 4-20 mA. Para leer un transmisor de 4-20 mA en estas entradas, conviertes la corriente en tensión con una resistencia.
Resistencia de 500 Ω: la ley de Ohm convierte 4-20 mA en 2-10 V
La resistencia es un convertidor de corriente a tensión. La tensión en sus bornes es la corriente del lazo multiplicada por su resistencia.
500 Ω es el valor que pone 20 mA justo en el máximo de una entrada 0-10 V. Para una entrada 0-5 V, usa 250 Ω: 4-20 mA pasa a ser 1-5 V. Es el caso de una placa Arduino Uno, Mega o Leonardo, cuyos pines analógicos leen de 0 a 5 V.
La tabla muestra lo que lee una entrada de 10 bits y 0-10 V (de 0 a 1023 cuentas), como en el M-Duino y el Ardbox. La columna "ideal" usa solo los 500 Ω. Las dos últimas columnas incluyen la impedancia de entrada de 39 kΩ de la entrada analógica del M-Duino (ver la sección siguiente).
| Corriente del lazo | Tensión, 500 Ω ideal | Cuentas, ideal | Tensión con entrada de 39 kΩ | Cuentas con entrada de 39 kΩ | Significado |
|---|---|---|---|---|---|
| 0 mA | 0 V | 0 | 0 V | 0 | Hilo roto o sin alimentación |
| 3,6 mA | 1,80 V | 184 | 1,78 V | 182 | Límite de fallo (NAMUR NE 43) |
| 4 mA | 2,00 V | 205 | 1,98 V | 202 | 0 % del rango |
| 8 mA | 4,00 V | 409 | 3,95 V | 404 | 25 % |
| 12 mA | 6,00 V | 614 | 5,92 V | 606 | 50 % |
| 16 mA | 8,00 V | 818 | 7,90 V | 808 | 75 % |
| 20 mA | 10,00 V | 1023 | 9,87 V | 1010 | 100 % del rango |
| 21 mA | 10,50 V | 1023 (fondo de escala) | 10,37 V | 1023 (fondo de escala) | Fallo alto (NAMUR NE 43) |
Cuentas = V / 10 V × 1023, redondeado. 4 mA dan 204,6 cuentas, que el ADC lee como 204 o 205. La gráfica muestra la misma recta de 2 V a 10 V.

Dos puntos prácticos sobre la resistencia:
- Potencia. A 20 mA, una resistencia de 500 Ω disipa P = I² × R = 0,2 W. Usa una resistencia con una potencia nominal bastante mayor, por ejemplo 0,5 W.
- Tolerancia. El error de lectura sigue a la tolerancia de la resistencia uno a uno: una resistencia del 5 % da hasta un 5 % de error. Usa una resistencia de precisión (1 % o mejor) o calibra la entrada.
Conexión de un transmisor de 4-20 mA a 2 hilos a una entrada analógica de un Arduino PLC
La resistencia va en paralelo con la entrada analógica, entre el borne de entrada y el 0 V del PLC. El transmisor va en serie en el lazo, entre el +24 Vdc de la fuente y la entrada.
- Paso 1+24 Vdc al transmisorConecta el + de la fuente de 24 Vdc al borne + del transmisor.
- Paso 2Del transmisor a la entradaConecta el borne - del transmisor a una entrada analógica, por ejemplo la I0.7 de un M-Duino.
- Paso 3500 Ω a 0 VConecta la resistencia entre el mismo borne de entrada y el GND (0 V) del PLC.
- Paso 40 V comúnEl 0 V de la fuente de 24 Vdc y el GND del PLC deben ser la misma referencia.


En un transmisor a 3 o 4 hilos, el sensor tiene sus propios bornes de alimentación. Conecta su salida de corriente a la entrada analógica y su retorno de señal al 0 V del PLC. La resistencia sigue entre la entrada y 0 V.
Comprueba la tensión del lazo. A 20 mA la resistencia se queda 10 V de los 24 V de la fuente. El transmisor y el cable tienen los 14 V restantes. El datasheet del transmisor da la tensión mínima de alimentación en sus bornes: debe ser menor que 14 V menos la caída de tensión en el cable (resistencia del cable × 0,02 A). Si no lo es, la corriente deja de subir antes de 20 mA y la parte alta del rango se lee baja.
En el M-Duino y el Ardbox, las entradas analógicas son entradas "Analog/Digital" (datasheets): el mismo borne lee 0-10 V con analogRead() o un nivel digital con digitalRead(). Para un lazo de 4-20 mA, léela con analogRead(). Usa una resistencia para cada lazo: dos transmisores no deben compartir la misma resistencia ni la misma entrada.
La impedancia de entrada y la resolución del ADC cambian la lectura real
La entrada del PLC no es un circuito abierto. Su impedancia de entrada está en paralelo con la resistencia de 500 Ω, así que parte de la corriente del lazo entra en la entrada y la tensión es un poco menor.
- M-Duino y Ardbox: 0 a 10 Vdc, 10 bits, impedancia de entrada de 39 kΩ (datasheet de la familia M-Duino, datasheet de la familia Ardbox). 500 Ω en paralelo con 39 kΩ son 493,7 Ω. La lectura sale un 1,3 % baja: 20 mA dan 9,87 V (1010 cuentas), no 10 V.
- ESP32 PLC: 0 a 10 Vdc, 11 bits, de 0 a 2047 cuentas (datasheet de la familia ESP32 PLC).
- Raspberry PLC: 0 a 10 Vdc, 12 bits, de 0 a 4095 cuentas (datasheet de la familia Raspberry PLC). Consulta las entradas analógicas del Raspberry PLC.
Tienes dos formas de corregir el error. Usa la resistencia equivalente (493,7 Ω en un M-Duino) en la conversión, como hace el código de abajo. O haz una calibración a dos puntos: inyecta 4,00 mA y 20,00 mA con un calibrador de lazo, anota las cuentas y úsalas como extremos de la escala. La calibración también elimina la tolerancia de la resistencia, así que es la mejor opción cuando importa la precisión.
Resolución: en una entrada de 10 bits y 0-10 V una cuenta son 9,8 mV. Con 493,7 Ω son unos 0,02 mA, es decir, el 0,12 % del rango de 16 mA. El rango de 4-20 mA usa unas 808 de las 1024 cuentas, porque los 2 V inferiores son el cero vivo.
Fórmula de escalado de 4-20 mA a unidades de ingeniería
Un transmisor de 4-20 mA es lineal. Para obtener el valor de proceso, resta el offset de 4 mA y divide por el rango de 16 mA:
Calcúlalo para tu PLC: calculadora 4-20 mA
La misma fórmula sirve para una sonda de nivel (por ejemplo de 0-250 cm), un transmisor de temperatura (por ejemplo de -50 a 150 °C) o un caudalímetro. Solo cambian PVmin y PVmax. Déjalos como constantes en el programa: si cambias de transmisor, cambias dos números.
Si prefieres trabajar directamente con cuentas, usa las cuentas a 4 mA y a 20 mA de la tabla o de tu calibración: PV = PVmin + (cuentas - cuentas4mA) / (cuentas20mA - cuentas4mA) × (PVmax - PVmin).
Detección de fallo del lazo: un hilo roto lee menos de 3,6 mA
El cero vivo es el diagnóstico. La recomendación NAMUR NE 43 define cómo un transmisor informa de su estado con la corriente del lazo:
| Corriente del lazo | Significado según NAMUR NE 43 | Qué debe hacer el programa del PLC |
|---|---|---|
| 3,6 mA o menos | Fallo (bajo) | Alarma. No uses el valor. Un hilo roto o la falta de alimentación también se leen aquí (0 mA). |
| De 3,6 a 3,8 mA | Fuera del rango de medida | Muestra el mínimo del rango y avisa. |
| De 3,8 a 20,5 mA | Medida | Escala con la fórmula. |
| De 20,5 a 21 mA | Fuera del rango de medida | Muestra el máximo del rango y avisa. |
| 21 mA o más | Fallo (alto) | Alarma. No uses el valor. |
Límite de una resistencia de 500 Ω en una entrada 0-10 V: 20 mA ya dan los 10 V completos. Con la entrada de 39 kΩ del M-Duino, la entrada llega al fondo de escala a unos 20,3 mA. Por encima de ese valor la lectura se queda en 1023 cuentas, así que el PLC no puede distinguir 20,5 mA de un fallo alto de 21 mA. Dos soluciones:
- Configura el transmisor para que indique los fallos con la corriente baja (3,6 mA o menos), si tiene esta opción. Así el PLC detecta todos los fallos en la parte baja de la escala.
- Usa una resistencia menor, por ejemplo de 470 Ω. Con la entrada de 39 kΩ, 21 mA dan 9,75 V y se pueden leer. Pierdes un 6 % de resolución, aproximadamente, y debes usar 470 Ω en la conversión.
Nunca trates una lectura por debajo de 4 mA como "nivel cero" o "presión cero". Una bomba controlada por una sonda de nivel con el cable cortado trabajaría en seco. El programa debe ir a un estado seguro y mantener una protección cableada (un interruptor de flotador, un presostato) que no dependa de la señal analógica.
Código Arduino: leer 4-20 mA, escalar y detectar un lazo roto
Este sketch lee un transmisor de 0-10 bar en la entrada I0.7 de un M-Duino con una resistencia de 500 Ω. Promedia 16 muestras, convierte las cuentas a mA con la resistencia equivalente, comprueba el lazo y escala el valor. Compila para el ATmega2560 del M-Duino (7,3 KB de flash) y la conversión se ha probado en un PC con lecturas simuladas de 0 a 21 mA. Para compilarlo, instala las placas de Industrial Shields en el Arduino IDE: definen los nombres de los pines, como I0_7.
// 4-20 mA transmitter on an M-Duino analog input (0-10 Vdc, 10 bit)
// A 500 ohm resistor between the input and GND turns 4-20 mA into 2-10 V.
const uint8_t AI_PIN = I0_7; // analog input used for the loop
const float ADC_MAX = 1023.0; // 10 bit: M-Duino and Ardbox
const float AI_RANGE = 10.0; // input range in volts
const float R_SHUNT = 500.0; // resistor in ohm
const float R_INPUT = 39000.0; // input impedance from the datasheet
const float R_EQ = R_SHUNT * R_INPUT / (R_SHUNT + R_INPUT); // 493.7 ohm
const float PV_MIN = 0.0; // value at 4 mA (example: 0 bar)
const float PV_MAX = 10.0; // value at 20 mA (example: 10 bar)
const float MA_FAULT_LOW = 3.6; // NAMUR NE 43: 3.6 mA or less is a fault
const uint8_t N_SAMPLES = 16;
float readCounts() {
uint32_t sum = 0;
for (uint8_t i = 0; i < N_SAMPLES; i++) {
sum += analogRead(AI_PIN);
}
return (float)sum / N_SAMPLES;
}
float countsToMilliamps(float counts) {
float volts = counts * AI_RANGE / ADC_MAX;
return volts / R_EQ * 1000.0;
}
void setup() {
Serial.begin(115200);
pinMode(AI_PIN, INPUT);
}
void loop() {
float counts = readCounts();
float mA = countsToMilliamps(counts);
Serial.print(mA, 2);
Serial.print(" mA ");
if (mA <= MA_FAULT_LOW) {
// Broken wire, transmitter without power or a low fault signal
Serial.println("LOOP FAULT");
} else if (counts >= ADC_MAX - 1) {
// The input is at full scale: the real current can be higher
Serial.println("INPUT AT FULL SCALE");
} else {
float pv = PV_MIN + (mA - 4.0) * (PV_MAX - PV_MIN) / 16.0;
if (pv < PV_MIN) pv = PV_MIN; // 3.6 to 4 mA: under range
Serial.print(pv, 2);
Serial.println(" bar");
}
delay(500);
}
Para usarlo en otro PLC, cambia tres constantes: ADC_MAX (2047 en un ESP32 PLC, 4095 en un Raspberry PLC), R_INPUT (la impedancia de entrada de tu PLC, o quita la corrección en paralelo y calibra) y AI_PIN. Para conseguir una lectura más estable, consulta cómo mejorar la lectura analógica.
Salida esperada con un lazo sano a media escala: 12.00 mA 5.00 bar. Con el cable desconectado: 0.00 mA LOOP FAULT.
Resistencia o convertidor aislado de 4-20 mA a 0-10 V
Una resistencia es suficiente cuando el PLC, la fuente del transmisor y la resistencia comparten el mismo 0 V, dentro de un mismo armario. En los demás casos, la opción correcta es un convertidor de señal activo y aislado.
| Criterio | Resistencia de 500 Ω | Convertidor de señal aislado |
|---|---|---|
| Cómo funciona | Ley de Ohm, pasivo | Mide la corriente y genera una nueva salida de 0-10 V |
| Aislamiento galvánico | No: el lazo y el PLC comparten 0 V | Sí: entrada, salida y alimentación están separadas |
| Lazo ya usado por otro equipo | Solo si las referencias de 0 V son compatibles y la tensión del lazo es suficiente | Sí, es un uso típico |
| Bucles de masa, cables largos entre edificios | Riesgo de offset y ruido | Corta el bucle de masa |
| Alimentación | Ninguna | Necesita su propia alimentación |
| Precisión | Tolerancia de la resistencia más el error de la impedancia de entrada | La del datasheet del convertidor |
Para una instalación en carril DIN, Industrial Shields tiene el IS.ACANTO10-0.5k: una resistencia de 500 Ω con una tolerancia de ±1 % dentro de un borne de paso, así que la conversión queda en el carril, al lado del PLC.
Hardware y software para el ejemplo de 4-20 mA a 0-10 V

Arduino PLC
M-Duino (familia Ethernet) o Ardbox (familia de 20 E/S). Los dos tienen entradas analógicas/digitales de 0-10 V con 10 bits de resolución.

Resistencia de 500 Ω
Una por lazo. Un borne de carril DIN con una resistencia de ±1 %, o cualquier resistencia del 1 % de 0,5 W o más.

Arduino IDE
El Arduino IDE con las placas de Industrial Shields instaladas. El ejemplo "AnalogInput" del IDE sirve como primera prueba rápida.
Transmisores de 4-20 mA en proyectos con PLC
- Caldera de vapor con un ESP32 PLC. El PLC lee la presión de la caldera en una entrada analógica y la mantiene entre 1 y 2 bar. Para un transmisor de 4-20 mA, el caso recomienda una resistencia de precisión de 500 Ω en la entrada 0-10 V. Lee el caso de la caldera de vapor.
- Sonda de nivel en una estación de bombeo. Un ejemplo completo con un ESP32 PLC: media móvil, escalado a centímetros, alarma de lazo roto y control de la bomba con histéresis. Lectura de un sensor de nivel de 4-20 mA en la PLC Solution Library.
- Nivel de un depósito con una entrada analógica. Cómo medir el nivel de un depósito con la entrada analógica de un PLC industrial.
Para lo básico de las entradas analógicas (resolución, rangos, señales de tensión y de corriente), consulta los fundamentos de las entradas analógicas de un PLC industrial.
Próximos pasos con señales de 4-20 mA en un PLC
- Calcula el escalado, la resistencia y el código para tu PLC con la calculadora 4-20 mA.
- Compara las entradas analógicas de cada familia en Arduino PLC vs ESP32 PLC vs Raspberry PLC.
- Encuentra más ejemplos probados (sensores, bombas, alarmas) en la PLC Solution Library.
- Aprende el Arduino IDE sobre hardware industrial con el curso gratuito Programación de Arduino en entornos industriales.
Ver la familia Arduino PLCConsulta a un ingeniero sobre tus sensores
Llévalo a la práctica
Tres formas de pasar de una señal de 4-20 mA a una medida que funciona: el borne con resistencia para carril DIN, una simulación con transmisores de 4-20 mA y un caso con sensores analógicos.
Producto
Borne para carril DIN con resistencia de 500 Ω, de 4-20 mA a 0-10 V
Un borne de paso con una resistencia de 500 Ω al ±1 %. En una entrada de 0-10 V del PLC, la corriente del lazo da 2 V a 4 mA y 10 V a 20 mA.
Ver el producto
Simulador
Arranca una turbina o una bomba paso a paso, y párala de forma segura
Un Raspberry PLC 42 ejecuta el arranque como una máquina de estados y lee transmisores 4-20 mA de nivel, caudal, vibración y presión.
Abre el simulador
Caso de estudio
Mantén el pH y el cloro en rango con un ESP32 PLC 42.
Sensores de pH y cloro con salida de 4-20 mA (con un shunt de 500 Ω) o de 0-10 V, y una salida ON/OFF por válvula de dosificación, con los rangos fijados en un Panel PC.
Lee el caso de estudio
Preguntas frecuentes sobre la conversión de 4-20 mA a 0-10 V
¿Cómo convierto 4-20 mA a 0-10 V?
Conecta una resistencia de 500 Ω entre la entrada analógica y 0 V y pon la entrada en el lazo. La corriente que pasa por la resistencia da 2 V a 4 mA y 10 V a 20 mA. Si necesitas aislamiento galvánico, usa un convertidor de señal aislado.
¿Qué tensión dan 4 mA con una resistencia de 500 Ω?
2 V (0,004 A × 500 Ω). En una entrada de 10 bits y 0-10 V son unas 205 cuentas, o 202 cuentas en un M-Duino por su impedancia de entrada de 39 kΩ.
¿Qué resistencia convierte 4-20 mA a 0-5 V?
250 Ω. 4 mA dan 1 V y 20 mA dan 5 V. Úsala con entradas que leen de 0 a 5 V, como los pines analógicos de una placa Arduino Uno, Mega o Leonardo.
¿Puedo conectar un sensor de 4-20 mA directamente a un pin analógico de Arduino?
No. El pin analógico mide tensión, no corriente. Necesitas la resistencia de 250 Ω y una fuente de 24 Vdc para el lazo, y el pin nunca debe ver más de su tensión máxima. Un PLC industrial con entradas de 0-10 V y una resistencia de 500 Ω da más margen.
¿Por qué 4-20 mA empieza en 4 mA y no en 0 mA?
El cero vivo de 4 mA alimenta los transmisores a 2 hilos en la parte baja del rango y permite al PLC detectar fallos. Un lazo sano nunca lee menos de unos 3,8 mA, así que una lectura cercana a 0 mA indica un hilo roto o un transmisor sin alimentación.
¿Qué longitud puede tener un cable de 4-20 mA?
Depende de la tensión del lazo. La tensión de la fuente menos los 10 V de la resistencia y la tensión mínima del transmisor da la tensión que queda para el cable. Divídela por 0,02 A para obtener la resistencia máxima del cable (los dos hilos) y usa la resistencia por metro de tu cable. La calculadora 4-20 mA hace este cálculo con tu cable y tu fuente.