Fundamentos · 23 min de lectura

¿Qué es un amplificador operacional? Ganancia, LM358 y Arduino

¿Qué es un amplificador operacional? Fórmulas del inversor y no inversor, seguidor, comparador, pines del LM358 y LM741, fuente simple y ADC de Arduino.

Un amplificador operacional (op-amp) es un pequeño circuito integrado, normalmente de ocho patillas, que multiplica por cientos de miles la diminuta diferencia de tensión entre sus dos entradas. Esa es la respuesta corta a qué es un amplificador operacional, pero una ganancia tan enorme por sí sola no sirve de mucho. La magia aparece cuando unas pocas resistencias devuelven parte de la salida a la entrada: entonces el op-amp se convierte en un amplificador preciso cuya ganancia fija una relación de resistencias, en un buffer, en un comparador o en un filtro. Desde los preamplificadores de micrófono hasta los sensores de pulso, desde los módulos de báscula hasta las tarjetas de sonido, hay un op-amp en casi cada rincón de la electrónica analógica.

Cuando trabajas con Arduino, la razón principal para necesitar un op-amp es esta: muchos sensores dan señales de milivoltios, mientras que el ADC del Arduino Uno solo distingue pasos de 4,88 mV. Un termopar tipo K produce apenas 4,1 mV a 100 °C; si lo conectas directamente, el Arduino casi no nota esa temperatura. En esta guía aprenderás las reglas del op-amp ideal, las fórmulas del amplificador inversor y no inversor, el seguidor de tensión, el comparador, los pines del LM358 y del LM741, el funcionamiento con alimentación simple y cómo adaptar las señales de un micrófono y de un termopar al ADC de Arduino, ESP32 y Raspberry Pi Pico, todo con valores reales.

¿Qué es un amplificador operacional y cómo funciona?

Un op-amp tiene cinco terminales básicos: la entrada no inversora (+), la entrada inversora (−), la salida y dos pines de alimentación (V+ y V−). Solo mira la diferencia entre sus dos entradas y la multiplica por su ganancia en lazo abierto (A): Vsal = A × (V+ − V−). En el LM358, A vale típicamente 100 000 (100 dB). Eso significa que una diferencia de solo 0,1 mV entre las entradas pide 10 V a la salida; pero la salida no puede salir de la alimentación, así que la salida de un op-amp sin realimentación casi siempre se queda pegada a uno de los raíles, es decir, se satura. Ese comportamiento es útil en los circuitos comparadores. Para hacer un amplificador, parte de la salida vuelve a la entrada inversora a través de resistencias; esto se llama realimentación negativa, y a partir de ahí la ganancia la fijan las resistencias, no el op-amp.

CaracterísticaOp-amp idealLM358 (típico)LM741 (típico)
Ganancia en lazo abiertoInfinita100 000 (100 dB)200 000 (106 dB)
Corriente de entrada (bias)020 nA80 nA
Tensión de offset de entrada03 mV (máx. 7 mV)1 mV (máx. 5 mV)
Producto ganancia-ancho de banda (GBW)Infinito0,7 MHzUnos 1 MHz
Slew rateInfinito0,3 V/µs0,5 V/µs
Excursión de salidaHasta los raílesCerca de 0 V, arriba V+ − 1,5 V1–3 V dentro de cada raíl
AlimentaciónSin límite3–30 V simple o ±1,5–±15 V±10–±18 V recomendada (LM741C)

Reglas del op-amp ideal: cortocircuito virtual y corriente de entrada nula

  • Regla 1 – Las entradas no consumen corriente: un op-amp ideal tiene resistencia de entrada infinita, así que no entra corriente por los pines + y −. En la práctica el LM358 consume unos 20 nA, lo que provoca un error de solo 2 mV incluso en una resistencia de 100 kΩ.
  • Regla 2 – Cortocircuito virtual: con realimentación negativa, la salida hace lo que haga falta para llevar las dos entradas a la misma tensión; al final V+ = V−. Las entradas no están unidas entre sí, pero quedan a la misma tensión.
  • Regla práctica – La salida no puede superar la alimentación: aunque la fórmula pida 12 V, un op-amp alimentado a 5 V solo llega como mucho a la alimentación, y un LM358 solo hasta unos 3,5 V. Una salida pegada a ese límite se dice que está recortada (clipping) o saturada.

Con estas reglas puedes resolver casi cualquier circuito con op-amp en unas pocas líneas de papel: primero halla la tensión de la entrada +, supón que la entrada − está a la misma tensión y luego escribe las corrientes por las resistencias con la ley de Ohm. Como la corriente no puede entrar en la entrada, tiene que pasar por la resistencia de realimentación, y de ahí sale la tensión de salida. Recuerda: la segunda regla solo vale cuando hay realimentación negativa. En circuitos sin realimentación, como el comparador, las entradas están a tensiones distintas y la salida está en uno de los raíles. Si quieres repasar los cálculos de corriente y tensión, echa un vistazo a la guía de la ley de Ohm.

Amplificador no inversor: fórmula de ganancia y ejemplo

En el amplificador no inversor la señal entra directamente por la entrada +. Una resistencia de realimentación (Rf) va de la salida a la entrada −, y una resistencia a masa (Rg) de la entrada − a GND. Estas dos resistencias forman un divisor de tensión: en la entrada − hay Vsal × Rg / (Rf + Rg). Por la regla del cortocircuito virtual esto es igual a la entrada, de donde sale la fórmula Vsal = Vent × (1 + Rf / Rg). Con Rf = 10 kΩ y Rg = 1 kΩ la ganancia es 11, así que una señal de 100 mV pasa a 1,1 V. La salida se mueve en el mismo sentido que la entrada, la ganancia nunca baja de 1 y la resistencia de entrada del circuito es muy alta, de modo que no carga al sensor.

RfRg (Rent en el inversor)Ganancia no inversoraGanancia inversora
10 kΩ10 kΩ2 (6,0 dB)−1 (0 dB)
47 kΩ10 kΩ5,7 (15,1 dB)−4,7 (13,4 dB)
10 kΩ1 kΩ11 (20,8 dB)−10 (20 dB)
100 kΩ4,7 kΩ22,3 (27,0 dB)−21,3 (26,6 dB)
100 kΩ1 kΩ101 (40,1 dB)−100 (40 dB)
Puedes calcular la ganancia, su valor en dB y la tensión de salida con tus propias resistencias en la herramienta Ganancia de op-amp; además te avisa de antemano cuando la salida va a chocar con el límite de la alimentación y recortarse. Para encontrar la resistencia real más cercana al valor calculado, usa la herramienta Valor estándar.

Amplificador inversor y tierra virtual

En el amplificador inversor la entrada + va a GND y la señal llega a la entrada − a través de una resistencia Rent; Rf vuelve a estar entre la salida y la entrada −. Por la regla del cortocircuito virtual, la entrada − también está a 0 V, pero no está conectada a GND; esto se llama tierra virtual. La corriente Vent / Rent que pasa por Rent no puede entrar en la entrada, así que tiene que pasar por Rf, y la salida queda Vsal = −(Rf / Rent) × Vent. Con Rent = 10 kΩ y Rf = 47 kΩ la ganancia es −4,7: una entrada de 0,5 V da una salida de −2,35 V. El signo menos indica que la señal se invierte. La resistencia de entrada del circuito es aproximadamente Rent, así que puede cargar a un sensor con resistencia interna alta.

Un buen uso del montaje inversor es el amplificador sumador (mezclador): si conectas varias señales a la entrada −, cada una con su propia resistencia, la salida es la suma ponderada e invertida de esas señales. Sin embargo, en un circuito Arduino con alimentación simple tienes que llevar la entrada + del inversor a una referencia, por ejemplo la mitad de la alimentación, en lugar de a GND; si no, las entradas positivas piden una salida negativa y la salida se queda pegada a 0 V. En ese caso la fórmula pasa a ser Vsal = Vref − (Rf / Rent) × (Vent − Vref).

Seguidor de tensión (buffer): el circuito más útil con ganancia 1

Si conectas la salida directamente a la entrada − y llevas la señal a la entrada +, obtienes un seguidor de tensión (buffer). Como Rf es cero y Rg infinita, la ganancia es exactamente 1 y Vsal = Vent. ¿Para qué sirve un circuito que no amplifica? Porque casi no toma corriente de su entrada y en cambio puede entregar miliamperios por la salida; convierte una fuente de alta impedancia en una de baja impedancia. La hoja de datos del ATmega328P indica que su ADC funciona mejor con una impedancia de fuente de 10 kΩ o menos. Un divisor de tensión de 100 kΩ + 100 kΩ se comporta como una fuente de 50 kΩ, y cuando el Arduino cambia de canal la lectura puede desviarse unos pasos. Pon un seguidor detrás del divisor y el problema desaparece.

Otros usos clásicos del seguidor: suavizar una señal PWM con un filtro RC y pasarla por un buffer para hacer un DAC sencillo, repartir una tensión de referencia tomada de un potenciómetro entre varios circuitos y alimentar un cable largo desde la salida de un op-amp en lugar de desde la salida débil de un sensor. Con alimentación simple el LM358 puede seguir hasta 0 V, pero con 5 V no pasa de unos 3,5 V; si quieres hacer de buffer de todo el rango de 0–5 V, elige un op-amp rail-to-rail.

El op-amp como comparador

Sin realimentación, un op-amp se convierte en un interruptor que compara dos tensiones: si la entrada + está aunque sea unos milivoltios por encima de la entrada −, la salida sube al límite superior, y si está por debajo, baja a 0 V. Una luz nocturna sin microcontrolador es un buen ejemplo. Conecta el punto medio de un divisor montado en el orden 5V, 10 kΩ, LDR, GND a la entrada +, y el cursor de un potenciómetro a la entrada −. En la oscuridad la resistencia de la LDR aumenta, la tensión del punto medio supera el umbral que fijaste con el potenciómetro y se enciende un LED conectado a la salida con 330 Ω. El LM358 basta para esto, pero es lento: con un slew rate de 0,3 V/µs, la salida tarda más de 10 µs en subir de 0 a 3,5 V.

Para tareas que necesitan transiciones rápidas y limpias se usa un comparador de verdad como el LM393. El LM393 tiene el mismo patillaje que el LM358, pero su salida es de colector abierto: solo puede llevar la salida a GND y, para que suba, necesita una resistencia pull-up, por ejemplo de 10 kΩ, entre la salida y la alimentación. Así puedes conectar la pull-up a 3,3 V y llevar sin peligro la salida de un comparador alimentado a 5 V a un ESP32 o una Pico. El pequeño chip junto al trimmer azul del sensor de sonido KY-038 y de los módulos de humedad del suelo, lluvia, llama y gas es casi siempre un LM393.

Módulo sensor de sonido KY-038 con comparador LM393
Sensor de sonido KY-038: la señal del micrófono se compara en el comparador LM393 de la placa con un umbral ajustado mediante el trimmer y se convierte en una salida digital.

Con señales lentas o ruidosas cerca del umbral, la salida de un comparador puede oscilar cientos de veces por segundo; la luz nocturna parpadea al anochecer. La solución es la histéresis, es decir, un disparador Schmitt. Lleva la señal a la entrada + a través de una resistencia R1 de 10 kΩ y conecta una resistencia R2 de 1 MΩ de la salida a la entrada +. Cada vez que la salida cambia, esta realimentación positiva desplaza un poco el umbral; la separación entre los umbrales de subida y de bajada es de aproximadamente excursión de salida × R1 / R2. Con una salida que va de 0 a 5 V, 5 × 10k / 1M da 50 mV de histéresis, que suele bastar para absorber el ruido. Puedes aplicar la misma idea por software con dos umbrales distintos; el ejemplo de ESP32 de más abajo hace justo eso.

El LM393 no es un op-amp: no tiene compensación de frecuencia interna, así que oscila en un circuito amplificador con realimentación negativa, y sin resistencia pull-up su salida nunca sube. Al revés, puedes usar un op-amp como comparador, pero se queda lento con señales rápidas. En resumen: para amplificar, un op-amp; para detectar umbrales, un comparador.

Pines del LM358 y del LM741

Los dos op-amps que más te encontrarás en electrónica de aficionado son el LM358 de dos canales y el clásico LM741 de un canal. Ambos vienen en encapsulado DIP de 8 patillas. Si sostienes el chip de forma que puedas leer su rotulación y con la muesca hacia la izquierda, la patilla 1 queda abajo a la izquierda y la numeración aumenta en sentido antihorario. Los patillajes son distintos, así que no puedes poner uno en lugar del otro sin más:

PinLM358 (op-amp doble)LM741 (op-amp simple)
11OUT – salida AOffset null (ajuste de offset)
21IN− – entrada inversora AEntrada inversora (−)
31IN+ – entrada no inversora AEntrada no inversora (+)
4GND (V−)V− (alimentación negativa)
52IN+ – entrada no inversora BOffset null (ajuste de offset)
62IN− – entrada inversora BSalida
72OUT – salida BV+ (alimentación positiva)
8VCC (V+)NC (sin conexión)
CaracterísticaLM358LM741MCP6002
Canales212
Alimentación3–30 V simple±10–±18 V simétrica recomendada1,8–6 V simple
Con 5 V simpleFuncionaEn la práctica no funcionaFunciona
Con 3,3 VPobre (salida máx. ~1,8 V)No funcionaMuy bien
Rango de entradaDe 0 V a V+ − 1,5 V~3 V dentro de los raílesHasta 0,3 V más allá de los raíles
Rango de salida (a 5 V)~0,02–3,5 VInutilizable0,025–4,975 V (rail-to-rail)
GBW / slew rate0,7 MHz / 0,3 V/µs~1 MHz / 0,5 V/µs1 MHz / 0,6 V/µs
Consumo0,35 mA / canal1,7 mA0,1 mA / canal

El LM741 es la estrella de los libros de texto desde 1968, pero se diseñó para una alimentación simétrica como ±15 V: sus entradas deben quedar unos 3 V y su salida 1–3 V dentro de los raíles. Con 5 V simples, al restar esos márgenes no queda ningún rango útil; si un circuito con LM741 no funciona alimentado desde el pin 5V del Arduino, este es el motivo. El LM358, en cambio, se diseñó para alimentación simple: sus entradas incluyen 0 V, su salida puede acercarse a 0 V a pocos milivoltios y su único defecto es que arriba se queda en V+ − 1,5 V. En placas de 3,3 V como el ESP32 y la Pico, usa un op-amp rail-to-rail como el MCP6002; tiene el mismo patillaje que el LM358, así que se coloca directamente en su lugar. Si necesitas cuatro canales, el LM324 de 14 patillas es el hermano cuádruple del LM358.

Colocar el chip al revés o confundir los pines de alimentación calienta el op-amp y lo destruye en segundos. Antes de insertarlo comprueba la muesca y recuerda que en el LM358 8 = VCC, 4 = GND, mientras que en el LM741 7 = V+, 4 = V−. Pon un condensador cerámico de 100 nF entre los pines de alimentación de cada op-amp, lo más cerca posible del chip.

Funcionamiento con alimentación simple: tierra virtual y rail-to-rail

La mayoría de los circuitos con op-amp de los libros usan una alimentación simétrica como ±15 V, y la señal oscila a ambos lados de 0 V. En el mundo Arduino normalmente solo tienes 5 V o 3,3 V. Eso no es problema para las señales de continua que siempre son positivas, como las de un termopar, una resistencia shunt o un LM35; se amplifican directamente con un op-amp cuyo rango de entrada incluya 0 V. Pero las señales de alterna que van hacia positivo y negativo, como la de un micrófono, primero hay que subirlas a la mitad de la alimentación. Para ello creas una tensión de punto medio con dos resistencias y añades al lado un condensador de 10 µF para reducir el ruido. Ese punto se llama tierra virtual o referencia; la señal se superpone a él mediante un condensador de acoplo.

  • Elige el op-amp adecuado: los modelos cuyo rango de entrada no incluye 0 V, como el LM741 o el TL072, recortan de forma inesperada con alimentación simple; usa un LM358, LM324 o MCP6002.
  • Ten en cuenta los límites de salida: la salida del LM358 a 5 V va aproximadamente de 0,02 a 3,5 V, así que para señales de alterna un punto medio en torno a 1,8 V está más equilibrado que 2,5 V. El MCP6002 se acerca a unos 25 mV de ambos raíles, de modo que su punto medio puede ser exactamente VCC/2.
  • Alimenta el op-amp con la misma tensión que la placa: un op-amp alimentado a 12 V puede meter más de 10 V en un pin del ESP32 o de la Pico con una ganancia equivocada.
  • Usa una masa común: las GND del sensor, del op-amp y de la placa deben estar unidas; descubrirás por qué en la guía de la masa común.
  • No dejes al aire el canal que no uses: conecta la mitad libre del LM358 como seguidor (salida a la entrada −) y lleva su entrada + a GND o al punto medio; las entradas al aire pueden provocar oscilaciones y consumo innecesario.

Amplificar la señal de un micrófono: preamplificador para micrófono electret

Los micrófonos electret tienen una sensibilidad típica de unos −44 dBV/Pa; es decir, incluso con una presión sonora alta de 94 dB dan solo unos 6 mV. Una conversación normal a un metro se queda en torno a 0,1 mV, mientras que una palmada justo al lado del micrófono puede llegar a unas decenas de milivoltios. Con el paso de 4,88 mV del Arduino, esta señal o no aparece o solo mueve unos pocos pasos; eso explica también por qué la salida analógica de módulos como el sensor de sonido KY-038 es tan débil. La solución es un amplificador de alterna no inversor con una ganancia de unos 100. El circuito siguiente usa el canal A del LM358:

ComponenteValorConexión
Resistencia de polarización del micrófono2,2 kΩEntre 5V y el terminal + del micrófono (terminal − a GND)
Condensador de acoplo C11 µFDel terminal + del micrófono al pin 3 del LM358 (1IN+)
Resistencias del punto medio100 kΩ y 56 kΩ100 kΩ del pin 3 a 5V, 56 kΩ del pin 3 a GND (unos 1,8 V)
Realimentación Rf100 kΩEntre el pin 1 (1OUT) y el pin 2 (1IN−)
Rg y C21 kΩ + 10 µFEn serie del pin 2 a GND (terminal − de C2 a GND)
AlimentaciónPin 8 y pin 4Pin 8 a 5V, pin 4 a GND, 100 nF entre ambos
SalidaPin 1Arduino Uno A0 (ESP32 GPIO 34, Pico GP26: con MCP6002 y 3,3 V)

Gracias al condensador C2, en continua el circuito es un seguidor con ganancia 1; en silencio la salida reposa en el punto medio, unos 1,8 V. En cambio, a frecuencias de audio C2 se comporta como un cortocircuito y la ganancia pasa a 1 + 100k / 1k = 101 (40 dB). La frecuencia de corte inferior la fijan Rg y C2: 1 / (2π × 1 kΩ × 10 µF) ≈ 16 Hz. El límite superior lo marca el producto ganancia-ancho de banda del op-amp: en el LM358, 0,7 MHz / 101 ≈ 7 kHz, suficiente para la voz. Si quieres más ganancia, recuerda que el ancho de banda se reduce en la misma proporción; si necesitas una ganancia de 1000, es mejor repartirla en dos etapas de unos 32 cada una.

C++ (Arduino IDE)
1// LM358 mikrofon ön yükselteci ile ses seviyesi / Sound level with an LM358 mic preamp
2const int MIC_PIN = A0;                // LM358 pin 1 (1OUT)
3const float GAIN = 101.0;              // 1 + 100k / 1k
4const unsigned long WINDOW_MS = 50;    // ölçüm penceresi / sampling window
5
6void setup() {
7  Serial.begin(115200);
8}
9
10void loop() {
11  int minV = 1023, maxV = 0;
12  unsigned long start = millis();
13  while (millis() - start < WINDOW_MS) {   // 50 ms boyunca örnekle / sample for 50 ms
14    int v = analogRead(MIC_PIN);
15    if (v < minV) minV = v;
16    if (v > maxV) maxV = v;
17  }
18  float ppVolt = (maxV - minV) * 5.0 / 1023.0;   // tepe-tepe çıkış / peak-to-peak output
19  float micMv = ppVolt * 1000.0 / GAIN;          // mikrofonun kendi sinyali / the mic's own signal
20
21  Serial.print("Çıkış / output: ");
22  Serial.print(ppVolt, 3);
23  Serial.print(" V p-p   Mikrofon / mic: ");
24  Serial.print(micMv, 2);
25  Serial.println(" mV p-p");
26}

El código toma tantas muestras como puede durante 50 ms, busca el valor mínimo y el máximo y convierte la diferencia a voltios; esa es la amplitud pico a pico del sonido. Dividir el resultado entre 101 da la tensión que produce el propio micrófono. En una habitación silenciosa la salida solo se mueve unos pocos pasos del ADC (0,01–0,02 V), mientras que una palmada cercana supera fácilmente 1 V. Si la señal se recorta, es decir, si la salida toca 0 V o 3,5 V, baja Rf a 47 kΩ. En la guía de filtrado de datos de sensores encontrarás formas de estabilizar la medida.

Amplificar un termopar: termopar tipo K y LM358

Un termopar tipo K genera una pequeña tensión proporcional a la diferencia de temperatura en la unión donde se juntan dos metales distintos: unos 41 µV/°C. Se miden 4,1 mV a 100 °C, 20,6 mV a 500 °C y 41,3 mV a 1000 °C. Conectado directamente al Arduino, un paso del ADC (4,88 mV) corresponde a unos 119 °C; eso no es una medida. Un amplificador no inversor con ganancia 101 montado en el canal B del LM358 eleva la señal a 4,14 mV/°C: ahora un paso equivale a unos 1,2 °C, y el límite de salida de 3,5 V del LM358 permite medir hasta unos 700–800 °C, según el offset. El conexionado: terminal + del termopar al pin 5 (2IN+), terminal − a GND; Rf = 100 kΩ entre el pin 7 y el pin 6, Rg = 1 kΩ entre el pin 6 y GND; el pin 7 va al A1 del Arduino. En el tipo K, el hilo de alumel, que es el terminal −, es ligeramente magnético, una forma práctica de distinguir los terminales.

En realidad, un termopar mide la diferencia entre la unión caliente y la unión fría, donde sus hilos se unen a la conexión de cobre. Para conocer la temperatura real tienes que medir aparte la temperatura de la unión fría y sumarla; esto se llama compensación de unión fría. El código de abajo usa para ello un LM35 colocado justo al lado de las bornas de conexión (salida a A2). Además, el offset de entrada del LM358, de 3–7 mV, también se multiplica por 101 y crea en la salida un error de 0,3–0,7 V, es decir, de 70–170 °C. El código mide ese offset al arrancar y lo resta de las lecturas siguientes, así que enciende la placa cuando la sonda esté a temperatura ambiente.

C++ (Arduino IDE)
1// K tipi termokupl + LM358 (kazanç 101) + LM35 soğuk uç / K-type thermocouple + LM358 (gain 101) + LM35 cold junction
2const int TC_PIN = A1;           // LM358 pin 7 (2OUT)
3const int LM35_PIN = A2;         // LM35 çıkışı / LM35 output
4const float GAIN = 101.0;        // 1 + 100k / 1k
5const float MV_PER_C = 0.041;    // K tipi: yaklaşık 41 µV/°C / K-type: about 41 µV/°C
6float zeroMv = 0;                // açılışta ölçülen ofset / offset measured at power-up
7
8float readMv(int pin) {
9  long sum = 0;
10  for (int i = 0; i < 64; i++) sum += analogRead(pin);   // 64 okumanın ortalaması / average of 64 readings
11  return sum / 64.0 * 5000.0 / 1023.0;
12}
13
14void setup() {
15  Serial.begin(115200);
16  delay(500);
17  zeroMv = readMv(TC_PIN);       // prob oda sıcaklığında olmalı / probe must be at room temperature
18  Serial.print("Ofset / offset: ");
19  Serial.print(zeroMv, 1);
20  Serial.println(" mV");
21}
22
23void loop() {
24  float coldC = readMv(LM35_PIN) / 10.0;           // LM35: 10 mV/°C
25  float tcMv = (readMv(TC_PIN) - zeroMv) / GAIN;   // termokupl gerilimi / thermocouple voltage
26  float hotC = coldC + tcMv / MV_PER_C;            // soğuk uç telafisi / cold-junction compensation
27
28  Serial.print("Ortam / ambient: ");
29  Serial.print(coldC, 1);
30  Serial.print(" °C   Prob / probe: ");
31  Serial.print(hotC, 1);
32  Serial.println(" °C");
33  delay(500);
34}
Si el offset es negativo, la salida se queda pegada a 0 V y el circuito no muestra nada hasta que la tensión del termopar supera ese offset; si al arrancar lees en A1 un offset muy cercano a cero, eso es lo que ocurre. Además, el offset del LM358 varía con la temperatura, y la aproximación de 41 µV/°C solo es exacta a pocos grados entre 0 y 500 °C. Para trabajos que exigen precisión, como hornos, impresoras 3D o tratamientos térmicos, usa un módulo MAX6675 o MAX31855, que incluye compensación de unión fría y salida digital, o un op-amp de precisión sin deriva (zero-drift).

Adaptar la señal al ADC de Arduino: llevarla al rango correcto

El trabajo real de un op-amp en los proyectos con Arduino es llevar la señal de un sensor al rango en el que el ADC la aprovecha mejor. La regla es sencilla: el valor máximo de la señal debe acercarse a la parte alta del rango del ADC, pero sin invadir los extremos donde el op-amp y el ADC dejan de ser lineales. Por ejemplo, el LM35 da 0–500 mV entre 0 y 50 °C; leído directamente en un Uno, obtienes una resolución de 0,49 °C por paso. Si amplificas la misma señal con una ganancia de 6,6 hasta 0–3,3 V, la resolución baja a 0,074 °C. El diseño paso a paso:

  1. Averigua el rango de salida del sensor: apunta de la hoja de datos la tensión de salida mínima y máxima (LM35, 0–50 °C: 0–0,5 V).
  2. Elige el rango objetivo: la zona segura es de unos 0,02–3,5 V para un Uno con LM358, 0,15–2,5 V para un ESP32 y 0,03–3,25 V para una Pico con MCP6002.
  3. Calcula la ganancia: G = máximo objetivo / máximo del sensor = 3,3 / 0,5 = 6,6. Para 1 + Rf / Rg = 6,6 en un no inversor, elige Rf = 56 kΩ y Rg = 10 kΩ.
  4. Quita el offset: si el sensor trabaja en un rango que no empieza en cero, como 1–2 V, resta primero la tensión de referencia (Vref en un inversor o un amplificador diferencial) y luego amplifica.
  5. Protege y filtra: pon una resistencia de 1 kΩ en serie entre la salida del op-amp y el pin del ADC, y 100 nF entre el pin y GND. Este filtro RC atenúa el ruido por encima de unos 1,6 kHz y limita la corriente de fallo que pueda entrar al pin.
  6. Recalcula en el software: divide la tensión medida entre la ganancia para obtener la tensión real del sensor (Vsensor = Vadc / G); mide las resistencias con el multímetro para afinar la ganancia.
PlacaADCRango de entrada recomendadoPasoPines analógicos
Arduino Uno10 bits0–5 V (0–1,1 V con la referencia interna)4,88 mV (1,07 mV)A0–A5
ESP3212 bitsUnos 0,15–2,5 V (atenuación por defecto de 11 dB)~0,8 mVGPIO 32–39 (ADC1, funciona también con Wi-Fi)
Raspberry Pi Pico12 bits0–3,3 V0,81 mVGP26, GP27, GP28
Para señales muy pequeñas en el Uno, analogReference(INTERNAL) baja la referencia del ADC a 1,1 V y reduce el paso a 1,07 mV; a veces ni siquiera hace falta una etapa de op-amp extra. Eso sí, en este modo una entrada superior a 1,1 V satura la lectura. Para los detalles del ADC, consulta la guía de ADC y conversión analógico-digital.

Leer la salida del op-amp con el ESP32: interruptor por palmadas

Como el ESP32 funciona a 3,3 V, monta el mismo circuito de micrófono con un MCP6002 y aliméntalo desde el pin 3V3; usa dos resistencias de 100 kΩ para el punto medio (1,65 V). Si alimentas un LM358 a 5 V, su salida puede llegar a 3,5 V y forzar el pin del ESP32. Conecta la salida del op-amp al GPIO 34, uno de los canales ADC1 que funcionan también con el Wi-Fi activo. El código siguiente mide la amplitud pico a pico en ventanas de 20 ms, usa los milivoltios calibrados de analogReadMilliVolts() y aplica histéresis por software con dos umbrales distintos: cada palmada cambia el estado del LED integrado. Si usas la placa por primera vez, empieza por los pasos de instalación de la guía Qué es el ESP32.

C++ (Arduino IDE)
1// ESP32: MCP6002 mikrofon yükselteci ile el çırpma anahtarı / ESP32: clap switch with an MCP6002 mic preamp
2const int MIC_PIN = 34;      // MCP6002 çıkışı, ADC1 kanalı / MCP6002 output, ADC1 channel
3const int LED_PIN = 2;       // dahili LED / onboard LED
4const int ON_MV = 800;       // üst eşik, mV tepe-tepe / upper threshold, mV peak-to-peak
5const int OFF_MV = 300;      // alt eşik: histerezis / lower threshold: hysteresis
6
7bool loud = false;
8bool ledOn = false;
9
10void setup() {
11  Serial.begin(115200);
12  pinMode(LED_PIN, OUTPUT);
13}
14
15void loop() {
16  int minMv = 3300, maxMv = 0;
17  unsigned long start = millis();
18  while (millis() - start < 20) {                // 20 ms pencere / 20 ms window
19    int mv = analogReadMilliVolts(MIC_PIN);      // kalibre edilmiş mV / calibrated mV
20    if (mv < minMv) minMv = mv;
21    if (mv > maxMv) maxMv = mv;
22  }
23  int pp = maxMv - minMv;
24
25  if (!loud && pp > ON_MV) {                     // üst eşik aşıldı: alkış / upper threshold crossed: a clap
26    loud = true;
27    ledOn = !ledOn;
28    digitalWrite(LED_PIN, ledOn ? HIGH : LOW);
29    Serial.printf("Alkış / clap: %d mV p-p\n", pp);
30    delay(250);                                  // yankıları yok say / ignore echoes
31  } else if (loud && pp < OFF_MV) {              // ses alt eşiğin altına indi / sound fell below the lower threshold
32    loud = false;
33  }
34}

Raspberry Pi Pico y MicroPython: medir corriente con una resistencia shunt

Otra tarea práctica de un op-amp es medir corriente. Si pones una resistencia shunt de 0,1 Ω entre el terminal negativo de un motor o una tira LED y GND, una corriente de 1 A solo provoca en ella una caída de 100 mV. Un amplificador no inversor montado con un MCP6002 (Rf = 100 kΩ, Rg = 4,7 kΩ) multiplica esa tensión por 22,3: 1 A pasa a ser 2,23 V, y con el rango de 3,3 V de la Pico puedes medir hasta unos 1,45 A. El extremo superior del shunt va al pin 3 del MCP6002 y la salida del op-amp (pin 1) al pin GP26 (ADC0) de la Pico; el op-amp se alimenta desde el pin 3V3(OUT) y la GND de la fuente de la carga se une a la de la Pico. A 1,5 A el shunt disipa 0,225 W, así que usa una resistencia de al menos 0,5 W.

MicroPython
1# Pico: 0,1 Ω şönt + MCP6002 (kazanç 22,3) ile akım ölçümü / current sensing with a 0.1 Ω shunt + MCP6002 (gain 22.3)
2from machine import ADC
3import time
4
5adc = ADC(26)                 # GP26 = ADC0, MCP6002 pin 1
6VREF = 3.3
7GAIN = 1 + 100000 / 4700      # Rf = 100k, Rg = 4.7k -> 22.3
8SHUNT = 0.1                   # şönt direnci, ohm / shunt resistance, ohms
9
10def read_volts(n=100):
11    total = 0
12    for _ in range(n):        # 100 okumanın ortalaması / average of 100 readings
13        total += adc.read_u16()
14    return total / n * VREF / 65535
15
16zero = read_volts()           # yük kapalıyken ofset / offset with the load off
17print("Sıfır / zero: {:.3f} V".format(zero))
18
19while True:
20    v_out = read_volts() - zero
21    amps = v_out / GAIN / SHUNT           # I = V / R
22    print("Akım / current: {:.3f} A".format(max(amps, 0)))
23    time.sleep(0.5)

Al arrancar, con la carga apagada, el código mide el offset del op-amp y lo resta de las lecturas siguientes; promediar 100 lecturas atenúa el ruido del ADC. Para corrientes mayores, baja el valor del shunt o la ganancia; comprueba la caída de tensión y la potencia disipada en el shunt con la herramienta Ley de Ohm. Si prefieres una solución hecha, el sensor de corriente ACS712 de efecto Hall mide la corriente manteniendo la carga aislada de tu circuito. Si configuras la Pico por primera vez, la guía Qué es la Raspberry Pi Pico explica la instalación de MicroPython.

Otros circuitos con op-amp

CircuitoFórmula / comportamiento¿Dónde se usa?
Sumador (mezclador)Vsal = −Rf × (V1/R1 + V2/R2 + …)Mezclador de audio, combinar varias señales
Amplificador diferencialVsal = (R2 / R1) × (V2 − V1)Quitar un offset, medir la diferencia entre dos puntos
Amplificador de instrumentaciónGanancia alta ajustada con una sola resistencia, excelente rechazo en modo comúnCélulas de carga, puentes de Wheatstone, señales biomédicas
IntegradorCondensador en la realimentación; la salida es la integral de la entrada en el tiempoGenerador de onda triangular, control PI
Filtro activo (Sallen-Key)Filtrado de segundo orden con dos resistencias y dos condensadoresFiltros de audio, filtro antialiasing antes del ADC
Disparador SchmittComparador con realimentación positiva, dos umbrales distintosSalida digital limpia a partir de una señal ruidosa

Para sensores en puente como las células de carga, en los que las dos salidas están a mitad de la alimentación y la diferencia entre ellas es de solo unos milivoltios, los chips ya hechos son más prácticos: el HX711 integra un amplificador con ganancia de hasta 128 y un ADC de 24 bits. El op-amp de la placa de un sensor de pulso, por su parte, amplifica y filtra la débil señal del sensor de luz, y por eso el Arduino ve una onda de pulso clara al primer intento.

Sensor de pulso cardíaco Pulse Sensor
Pulse Sensor: el op-amp de la placa amplifica y filtra el minúsculo cambio de la luz reflejada por el dedo; en reposo la salida queda a la mitad de la alimentación.

Ideas de proyectos con op-amp

  • Lámpara que se enciende con una palmada: controla un módulo de relé con el preamplificador de micrófono y el código del ESP32 con histéresis.
  • Vúmetro: convierte la amplitud pico a pico en una barra que sube con la música en una tira LED WS2812B.
  • Termómetro para horno: mide hasta 500 °C con el amplificador de termopar y muestra el valor en una pantalla OLED.
  • Luz nocturna sin código: haz un LED que se encienda en la oscuridad con una LDR y un LM358 como comparador, sin ningún microcontrolador.
  • Báscula digital: lee una célula de carga con el HX711 y monta una báscula de cocina con precisión de un gramo.
  • Monitor de corriente del motor: mide la corriente del motor de tu coche robot con un shunt y un op-amp, y para el motor cuando la corriente suba porque se ha bloqueado.

Errores frecuentes y soluciones

SíntomaCausa probableSolución
Salida siempre a 0 V o arriba del todoSin realimentación o conectada a la entrada equivocada; ganancia demasiado alta; entrada fuera del rango de entradaComprueba que Rf vaya a la entrada −, baja la ganancia, asegúrate de que la entrada esté entre 0 y V+ − 1,5 V
Circuito con LM741 que no funciona a 5 VEl LM741 necesita una alimentación simétrica y más altaUsa un LM358 o un MCP6002
La salida no pasa de 3,5 VLa salida del LM358 se queda en V+ − 1,5 VElige la ganancia en consecuencia o usa un op-amp rail-to-rail
Lecturas ruidosas e inestablesSin desacoplo de alimentación, cables largos, ganancia innecesariamente alta100 nF en los pines de alimentación, cables cortos, filtro RC en la salida, promedio por software
El circuito oscila soloEl op-amp alimenta directamente un cable largo o una carga capacitiva grandePon una resistencia de 100–470 Ω en serie en la salida
La salida del comparador nunca subeEl LM393 es de colector abierto y no tiene pull-upConecta 4,7–10 kΩ entre la salida y la alimentación
Pin del ESP32 o de la Pico dañadoEl op-amp se alimentó a 5 V o 12 V y la salida superó 3,3 VAlimenta el op-amp a 3,3 V o pon un divisor y un diodo de enclavamiento en la salida
Salida atascada en 0 V con señales pequeñasUn offset de entrada negativo pega la salida abajo con alimentación simpleUsa un op-amp de precisión o da a la entrada una pequeña polarización
Cuando busques una avería en un circuito con op-amp, mide primero con el multímetro la tensión de las dos entradas. En un amplificador con realimentación negativa que funciona bien, la diferencia entre las entradas + y − no pasa de unos milivoltios. Si la diferencia es grande, el op-amp está saturado: la salida está pegada a uno de los raíles, y la causa es la ganancia, el rango de entrada o una conexión de realimentación rota. Para hacer la medida, consulta la guía cómo usar un multímetro.

Un op-amp es un traductor que pasa el mundo analógico a un idioma que el microcontrolador entiende: cuando conoces las dos reglas y las dos fórmulas de ganancia, puedes adaptar al ADC cualquier señal, venga de un micrófono, un termopar, una resistencia shunt o un sensor en puente. Prueba valores con la herramienta Ganancia de op-amp; en la app BlueGrays encontrarás proyectos analógicos como la medida de luz con una LDR, una luz nocturna, un voltímetro digital, la medida de temperatura con un NTC y los sensores de llama y de gas, paso a paso con esquemas y código.

Preguntas frecuentes

¿Para qué sirve un amplificador operacional?

Un amplificador operacional sirve para amplificar señales débiles, comparar dos tensiones, sumar o restar señales, filtrarlas y hacer de buffer de fuentes de alta impedancia. En los proyectos con Arduino se usa sobre todo para elevar señales de milivoltios, como las de un micrófono, un termopar o una resistencia shunt, a un nivel que el ADC pueda leer.

¿Cómo se calcula la ganancia de un op-amp?

En el amplificador no inversor la ganancia es 1 + Rf / Rg, y en el inversor es −Rf / Rent. Por ejemplo, con Rf = 100 kΩ y Rg = 1 kΩ la ganancia no inversora es 101 y la inversora −100. En decibelios se calcula como 20 × log10(ganancia).

¿Qué diferencia hay entre el LM358 y el LM741?

El LM358 integra dos op-amps en un encapsulado, funciona con una alimentación simple de 3–30 V y su rango de entrada incluye 0 V, por lo que se puede usar directamente con los 5 V del Arduino. El LM741 es un op-amp simple pensado para alimentación simétrica como ±15 V y en la práctica no funciona con 5 V simples. Sus patillajes también son distintos.

¿Funciona un op-amp con una sola fuente de 5 V?

Sí, los modelos diseñados para alimentación simple funcionan, como el LM358, el LM324 y el MCP6002. Para señales de alterna tienes que subir la entrada a la mitad de la alimentación y tener en cuenta los límites de salida; la salida del LM358 solo llega a unos 3,5 V con 5 V.

¿Qué diferencia hay entre un op-amp y un comparador?

Un op-amp lleva compensación de frecuencia para ser estable con realimentación negativa, y su salida puede entregar y absorber corriente. Los comparadores como el LM393 están pensados para conmutar rápido sin realimentación, y la mayoría tiene salida de colector abierto que necesita una resistencia pull-up. Un op-amp puede hacer de comparador lento, pero un comparador no debe usarse como amplificador.

¿Qué es un op-amp rail-to-rail?

En un op-amp rail-to-rail, la entrada o la salida pueden acercarse a pocas decenas de milivoltios de las tensiones de alimentación. Por ejemplo, el MCP6002 da 0,025–4,975 V con 5 V, mientras que el LM358 solo llega a unos 3,5 V. En placas de 3,3 V como el ESP32 y la Raspberry Pi Pico necesitas un op-amp rail-to-rail para aprovechar todo el rango del ADC.

Ver todos los proyectos
Medir la intensidad de luz con LDR
#11Principiante

Medir la intensidad de luz con LDR

¿Quieres ver en números cuánta luz hay en tu habitación? El LDR, una pequeña pieza sensible a la luz, mide la luz ambiente y el Arduino escribe el valor en la pantalla del ordenador cada medio segundo

4.6(81)
139
Luz nocturna con LDR
#12Principiante

Luz nocturna con LDR

Una pequeña lamparita que se enciende sola cuando oscurece y se apaga cuando llega la mañana. Un sensor de luz mide la claridad de la habitación, y el Arduino enciende el LED cuando está lo bastante o

4.8(102)
205
Lectura de la intensidad luminosa con el módulo LDR del ESP32
#113Principiante

Lectura de la intensidad luminosa con el módulo LDR del ESP32

Visualización en tiempo real en el monitor serie del valor bruto del ADC del módulo LDR y del porcentaje relativo de luz calculado a partir de referencias de oscuridad y claridad. Este porcentaje no es una medición en lux. Explica el funcionamiento de la calibración del módulo. Es recomendable realizarlo antes del Proyecto 10, ya que se utiliza para determinar el valor umbral.

4.6(36)
55
Voltímetro digital con pantalla LCD
#56Intermedio
Premium

Voltímetro digital con pantalla LCD

Descubre cuánto voltaje da una pila o un adaptador con un medidor hecho por ti. Un divisor de dos resistencias baja la tensión alta a un nivel que la placa puede leer, y el Arduino calcula el valor re

4.5(27)
36
Medición de temperatura con NTC y pantalla LCD 2x16
#44Principiante
Premium

Medición de temperatura con NTC y pantalla LCD 2x16

Mide la temperatura del ambiente con un sensor que parece una pequeña cuenta. Esta pieza, llamada NTC, deja pasar la electricidad con más facilidad cuanto más se calienta; el Arduino lee ese cambio, l

4.5(33)
44
Uso del sensor de llama
#50Intermedio
Premium

Uso del sensor de llama

Un pequeño vigilante que detecta el fuego antes que tú, en la cocina o en el taller. El sensor de llama capta la luz invisible que desprende el fuego; si todo va bien se enciende el LED verde, y cuand

4.6(33)
44
Uso del sensor de gas
#51Principiante
Premium

Uso del sensor de gas

Un pequeño vigilante que detecta un escape de gas en la cocina antes que tú. El sensor de gas olfatea el aire sin parar; mientras todo va bien se enciende el LED verde, y cuando el gas del aire supera

4.6(37)
50
Brillo de LED con Potenciómetro en ESP32 (Analógico → PWM)
#115Intermedio
Premium

Brillo de LED con Potenciómetro en ESP32 (Analógico → PWM)

En este proyecto controlamos el brillo de un LED de forma analógica mediante un potenciómetro. El pin ADC del ESP32 lee la tensión de 0-3,3 V procedente del potenciómetro y este valor se convierte en una señal PWM (modulación por ancho de pulso) que se envía al LED. Al girar el potenciómetro, el LED se enciende y se apaga gradualmente. Con Arduino Core 3.0+ se usa directamente analogWrite(); en el ESP32-S2/S3, la resolución del ADC es de 12 bits.

4.5(19)
32