Bases · 23 min de lecture

Amplificateur opérationnel : fonctionnement, gain et LM358

Amplificateur opérationnel (ampli-op) : montages inverseur et non inverseur, suiveur, comparateur, brochage LM358 et LM741, alimentation simple et ADC Arduino.

Un amplificateur opérationnel (ampli-op, AOP ou op-amp en anglais) est un petit circuit intégré, le plus souvent à huit broches, qui multiplie par des centaines de milliers la minuscule différence de tension entre ses deux entrées. C'est la réponse courte à la question qu'est-ce qu'un amplificateur opérationnel, mais un gain aussi énorme ne sert pas à grand-chose tout seul. La magie apparaît quand quelques résistances renvoient une partie de la sortie vers l'entrée : l'ampli-op devient alors un amplificateur précis dont le gain est fixé par un rapport de résistances, un étage tampon, un comparateur ou un filtre. Du préampli de micro au capteur de pouls, du module de balance à la carte son, il y a un ampli-op dans presque chaque recoin de l'électronique analogique.

Avec Arduino, la raison principale pour laquelle tu as besoin d'un ampli-op est la suivante : beaucoup de capteurs donnent des signaux de quelques millivolts, alors que le CAN (ADC) de l'Arduino Uno ne distingue que des pas de 4,88 mV. Un thermocouple de type K ne produit que 4,1 mV à 100 °C ; branché directement, l'Arduino remarque à peine cette température. Dans ce guide, tu vas apprendre les règles de l'ampli-op idéal, les formules des montages inverseur et non inverseur, le suiveur de tension, le comparateur, le brochage du LM358 et du LM741, le fonctionnement en alimentation simple et la façon d'adapter les signaux d'un micro et d'un thermocouple à l'ADC d'un Arduino, d'un ESP32 et d'un Raspberry Pi Pico, avec des valeurs réelles.

Qu'est-ce qu'un amplificateur opérationnel et comment fonctionne-t-il ?

Un ampli-op possède cinq bornes de base : l'entrée non inverseuse (+), l'entrée inverseuse (−), la sortie et deux broches d'alimentation (V+ et V−). Il ne regarde que la différence entre ses deux entrées et la multiplie par son gain en boucle ouverte (A) : Vsortie = A × (V+ − V−). Sur le LM358, A vaut typiquement 100 000 (100 dB). Une différence de seulement 0,1 mV entre les entrées demande donc 10 V en sortie ; mais la sortie ne peut pas dépasser l'alimentation, si bien que la sortie d'un ampli-op sans contre-réaction reste presque toujours collée à l'un des rails : il sature. Ce comportement est utile dans les montages comparateurs. Pour faire un amplificateur, on renvoie une partie de la sortie vers l'entrée inverseuse à travers des résistances ; c'est la contre-réaction (rétroaction négative), et dès lors ce sont les résistances qui fixent le gain, plus l'ampli-op.

CaractéristiqueAmpli-op idéalLM358 (typique)LM741 (typique)
Gain en boucle ouverteInfini100 000 (100 dB)200 000 (106 dB)
Courant d'entrée (polarisation)020 nA80 nA
Tension de décalage (offset) d'entrée03 mV (7 mV max)1 mV (5 mV max)
Produit gain-bande passante (GBW)Infini0,7 MHzEnviron 1 MHz
Vitesse de balayage (slew rate)Infinie0,3 V/µs0,5 V/µs
Excursion de sortieJusqu'aux railsProche de 0 V, en haut V+ − 1,5 V1 à 3 V à l'intérieur de chaque rail
AlimentationIllimitée3–30 V simple ou ±1,5–±15 V±10–±18 V recommandée (LM741C)

Règles de l'ampli-op idéal : court-circuit virtuel et courant d'entrée nul

  • Règle 1 – Les entrées ne consomment aucun courant : un ampli-op idéal a une résistance d'entrée infinie, aucun courant n'entre donc dans les broches + et −. En pratique, le LM358 consomme environ 20 nA, ce qui ne provoque qu'une erreur de 2 mV même à travers une résistance de 100 kΩ.
  • Règle 2 – Court-circuit virtuel : avec une contre-réaction, la sortie fait tout ce qu'il faut pour amener les deux entrées à la même tension ; au final V+ = V−. Les entrées ne sont pas reliées entre elles, mais elles se trouvent à la même tension.
  • Règle pratique – La sortie ne peut pas dépasser l'alimentation : même si la formule demande 12 V, un ampli-op alimenté en 5 V ne monte au mieux qu'à l'alimentation, et un LM358 seulement jusqu'à environ 3,5 V. Une sortie bloquée à cette limite est dite écrêtée ou saturée.

Avec ces règles, tu peux résoudre presque n'importe quel montage à ampli-op sur papier en quelques lignes : trouve d'abord la tension de l'entrée +, considère que l'entrée − est à la même tension, puis écris les courants dans les résistances avec la loi d'Ohm. Comme le courant ne peut pas entrer dans l'entrée, il doit passer par la résistance de contre-réaction, et c'est de là que vient la tension de sortie. Attention : la deuxième règle n'est valable qu'avec une contre-réaction. Dans les montages sans contre-réaction, comme le comparateur, les entrées sont à des tensions différentes et la sortie est à l'un des rails. Si tu veux réviser les calculs de courant et de tension, jette un œil au guide sur la loi d'Ohm.

Montage non inverseur : formule du gain et exemple

Dans le montage non inverseur, le signal arrive directement sur l'entrée +. Une résistance de contre-réaction (Rf) relie la sortie à l'entrée −, et une résistance de masse (Rg) relie l'entrée − à GND. Ces deux résistances forment un pont diviseur : la tension sur l'entrée − vaut Vsortie × Rg / (Rf + Rg). D'après la règle du court-circuit virtuel, elle est égale à l'entrée, d'où la formule Vsortie = Ventrée × (1 + Rf / Rg). Avec Rf = 10 kΩ et Rg = 1 kΩ, le gain vaut 11 : un signal de 100 mV devient 1,1 V. La sortie évolue dans le même sens que l'entrée, le gain ne descend jamais sous 1 et la résistance d'entrée du montage est très élevée, il ne charge donc pas le capteur.

RfRg (Rin dans le montage inverseur)Gain non inverseurGain inverseur
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)
Tu peux calculer le gain, sa valeur en dB et la tension de sortie avec tes propres résistances dans l'outil Gain d'ampli-op ; il t'avertit aussi à l'avance quand la sortie va buter sur la limite d'alimentation et s'écrêter. Pour trouver la résistance réelle la plus proche de la valeur calculée, utilise l'outil Valeur normalisée.

Montage inverseur et masse virtuelle

Dans le montage inverseur, l'entrée + est reliée à GND et le signal arrive sur l'entrée − à travers une résistance Rin ; Rf est toujours entre la sortie et l'entrée −. D'après la règle du court-circuit virtuel, l'entrée − est elle aussi à 0 V, sans pourtant être reliée à GND ; on l'appelle la masse virtuelle. Le courant Ventrée / Rin qui traverse Rin ne peut pas entrer dans l'entrée, il passe donc par Rf, et la sortie devient Vsortie = −(Rf / Rin) × Ventrée. Avec Rin = 10 kΩ et Rf = 47 kΩ, le gain vaut −4,7 : une entrée de 0,5 V donne une sortie de −2,35 V. Le signe moins indique que le signal est inversé. La résistance d'entrée du montage vaut à peu près Rin, il peut donc charger un capteur à forte résistance interne.

Une jolie utilisation du montage inverseur est le sommateur (mélangeur) : si tu branches plusieurs signaux sur l'entrée −, chacun à travers sa propre résistance, la sortie est la somme pondérée et inversée de ces signaux. Dans un montage Arduino en alimentation simple, il faut toutefois relier l'entrée + de l'inverseur à une référence, par exemple la moitié de l'alimentation, au lieu de GND ; sinon les entrées positives demandent une sortie négative et la sortie reste collée à 0 V. La formule devient alors Vsortie = Vref − (Rf / Rin) × (Ventrée − Vref).

Suiveur de tension (buffer) : le montage le plus utile, avec un gain de 1

Relie la sortie directement à l'entrée − et envoie le signal sur l'entrée + : tu obtiens un suiveur de tension (étage tampon, buffer). Comme Rf est nulle et Rg infinie, le gain vaut exactement 1 et Vsortie = Ventrée. À quoi sert un montage qui n'amplifie pas ? Il ne prélève presque aucun courant sur son entrée mais peut fournir des milliampères en sortie ; il transforme une source à haute impédance en source à basse impédance. La fiche technique de l'ATmega328P indique que son ADC fonctionne au mieux avec une impédance de source de 10 kΩ ou moins. Un pont diviseur de 100 kΩ + 100 kΩ se comporte comme une source de 50 kΩ, et quand l'Arduino passe d'une voie à l'autre, la mesure peut dériver de quelques pas. Place un suiveur après le pont et le problème disparaît.

Autres usages classiques du suiveur : lisser un signal PWM avec un filtre RC puis le tamponner pour obtenir un DAC simple, distribuer une tension de référence prise sur un potentiomètre à plusieurs circuits, et attaquer un long câble depuis la sortie d'un ampli-op plutôt que depuis la sortie fragile d'un capteur. En alimentation simple, le LM358 suit jusqu'à 0 V, mais sous 5 V il ne dépasse pas environ 3,5 V ; pour tamponner toute la plage 0–5 V, choisis un ampli-op rail-to-rail.

L'ampli-op en comparateur

Sans contre-réaction, un ampli-op devient un interrupteur qui compare deux tensions : si l'entrée + dépasse l'entrée −, ne serait-ce que de quelques millivolts, la sortie monte à la limite haute, sinon elle descend à 0 V. Une veilleuse sans microcontrôleur en est un bel exemple. Relie le point milieu d'un pont monté dans l'ordre 5V, 10 kΩ, LDR, GND à l'entrée +, et le curseur d'un potentiomètre à l'entrée −. Dans le noir, la résistance de la LDR augmente, la tension du point milieu franchit le seuil réglé au potentiomètre et une LED reliée à la sortie par 330 Ω s'allume. Le LM358 suffit pour ça, mais il est lent : avec une vitesse de balayage de 0,3 V/µs, la sortie met plus de 10 µs pour passer de 0 à 3,5 V.

Pour les tâches qui demandent des transitions rapides et nettes, on utilise un vrai comparateur comme le LM393. Le LM393 a le même brochage que le LM358, mais sa sortie est à collecteur ouvert : il ne peut que tirer la sortie vers GND, et pour qu'elle monte il faut une résistance de rappel (pull-up), par exemple 10 kΩ, entre la sortie et l'alimentation. Tu peux ainsi relier la pull-up au 3,3 V et envoyer sans risque la sortie d'un comparateur alimenté en 5 V vers un ESP32 ou un Pico. La petite puce à côté du potentiomètre ajustable bleu du capteur de son KY-038 et des modules d'humidité du sol, de pluie, de flamme et de gaz est presque toujours un LM393.

Module capteur de son KY-038 avec comparateur LM393
Capteur de son KY-038 : le signal du micro est comparé par le comparateur LM393 de la carte à un seuil réglé avec le potentiomètre ajustable, puis transformé en sortie numérique.

Avec des signaux lents ou bruités proches du seuil, la sortie d'un comparateur peut osciller des centaines de fois par seconde ; la veilleuse clignote au crépuscule. La solution est l'hystérésis, autrement dit un trigger de Schmitt. Envoie le signal sur l'entrée + à travers une résistance R1 de 10 kΩ et relie une résistance R2 de 1 MΩ de la sortie à l'entrée +. À chaque basculement de la sortie, cette réaction positive décale légèrement le seuil ; l'écart entre les seuils de montée et de descente vaut environ excursion de sortie × R1 / R2. Avec une sortie qui bascule entre 0 et 5 V, 5 × 10k / 1M donne 50 mV d'hystérésis, ce qui suffit en général à absorber le bruit. Tu peux appliquer la même idée en logiciel avec deux seuils distincts ; l'exemple ESP32 plus bas fait exactement cela.

Le LM393 n'est pas un ampli-op : il n'a pas de compensation en fréquence interne, il oscille donc dans un montage amplificateur à contre-réaction, et sans résistance de rappel sa sortie ne monte jamais. À l'inverse, tu peux utiliser un ampli-op en comparateur, mais il reste lent avec des signaux rapides. En bref : un ampli-op pour amplifier, un comparateur pour détecter un seuil.

Brochage du LM358 et du LM741

Les deux ampli-op que tu croiseras le plus en électronique amateur sont le LM358 double et le classique LM741 simple. Tous deux existent en boîtier DIP 8 broches. Tiens la puce de façon à lire son marquage, l'encoche vers la gauche : la broche 1 est en bas à gauche et la numérotation tourne dans le sens inverse des aiguilles d'une montre. Les brochages sont différents, tu ne peux donc pas simplement remplacer l'un par l'autre :

BrocheLM358 (ampli-op double)LM741 (ampli-op simple)
11OUT – sortie AOffset null (réglage d'offset)
21IN− – entrée inverseuse AEntrée inverseuse (−)
31IN+ – entrée non inverseuse AEntrée non inverseuse (+)
4GND (V−)V− (alimentation négative)
52IN+ – entrée non inverseuse BOffset null (réglage d'offset)
62IN− – entrée inverseuse BSortie
72OUT – sortie BV+ (alimentation positive)
8VCC (V+)NC (non connectée)
CaractéristiqueLM358LM741MCP6002
Nombre de voies212
Alimentation3–30 V simple±10–±18 V symétrique recommandée1,8–6 V simple
En 5 V simpleFonctionneNe fonctionne pratiquement pasFonctionne
En 3,3 VMédiocre (sortie ~1,8 V max)Ne fonctionne pasTrès bien
Plage d'entréeDe 0 V à V+ − 1,5 V~3 V à l'intérieur des railsJusqu'à 0,3 V au-delà des rails
Plage de sortie (en 5 V)~0,02–3,5 VInutilisable0,025–4,975 V (rail-to-rail)
GBW / vitesse de balayage0,7 MHz / 0,3 V/µs~1 MHz / 0,5 V/µs1 MHz / 0,6 V/µs
Consommation0,35 mA / voie1,7 mA0,1 mA / voie

Le LM741 est la vedette des manuels depuis 1968, mais il a été conçu pour une alimentation symétrique comme ±15 V : ses entrées doivent rester à environ 3 V des rails et sa sortie à 1–3 V. En 5 V simple, une fois ces marges retirées, il ne reste aucune plage utilisable ; si un montage à LM741 ne fonctionne pas alimenté par la broche 5V de l'Arduino, c'est pour cette raison. Le LM358, lui, a été conçu pour l'alimentation simple : ses entrées incluent 0 V, sa sortie peut s'approcher de 0 V à quelques millivolts près, et son seul défaut est de plafonner à V+ − 1,5 V. Sur les cartes en 3,3 V comme l'ESP32 et le Pico, utilise un ampli-op rail-to-rail comme le MCP6002 ; il a le même brochage que le LM358 et se monte donc directement à sa place. S'il te faut quatre voies, le LM324 à 14 broches est le grand frère quadruple du LM358.

Monter la puce à l'envers ou inverser les broches d'alimentation fait chauffer l'ampli-op et le détruit en quelques secondes. Vérifie l'encoche avant de l'insérer et n'oublie pas que sur le LM358 8 = VCC, 4 = GND, alors que sur le LM741 7 = V+, 4 = V−. Place un condensateur céramique de 100 nF entre les broches d'alimentation de chaque ampli-op, le plus près possible de la puce.

Fonctionnement en alimentation simple : masse virtuelle et rail-to-rail

La plupart des montages à ampli-op des manuels utilisent une alimentation symétrique comme ±15 V, et le signal oscille de part et d'autre de 0 V. Dans le monde Arduino, tu n'as en général que 5 V ou 3,3 V. Ce n'est pas un problème pour les signaux continus qui restent toujours positifs, comme ceux d'un thermocouple, d'une résistance de shunt ou d'un LM35 ; on les amplifie directement avec un ampli-op dont la plage d'entrée inclut 0 V. En revanche, les signaux alternatifs qui partent dans le positif et le négatif, comme celui d'un micro, doivent d'abord être remontés au milieu de l'alimentation. Pour cela, tu crées une tension de point milieu avec deux résistances et tu ajoutes à côté un condensateur de 10 µF pour réduire le bruit. Ce point s'appelle la masse virtuelle ou référence ; le signal s'y superpose à travers un condensateur de liaison.

  • Choisis le bon ampli-op : les modèles dont la plage d'entrée n'inclut pas 0 V, comme le LM741 ou le TL072, écrêtent de façon inattendue en alimentation simple ; utilise un LM358, un LM324 ou un MCP6002.
  • Tiens compte des limites de sortie : en 5 V, la sortie du LM358 va d'environ 0,02 à 3,5 V, donc pour des signaux alternatifs un point milieu vers 1,8 V est mieux équilibré que 2,5 V. Le MCP6002 s'approche à environ 25 mV des deux rails, son point milieu peut donc être exactement VCC/2.
  • Alimente l'ampli-op avec la même tension que la carte : un ampli-op alimenté en 12 V peut envoyer plus de 10 V sur une broche de l'ESP32 ou du Pico si le gain est mal choisi.
  • Utilise une masse commune : les GND du capteur, de l'ampli-op et de la carte doivent être reliées ; tu trouveras pourquoi dans le guide sur la masse commune.
  • Ne laisse pas la voie inutilisée en l'air : câble la moitié libre du LM358 en suiveur (sortie vers l'entrée −) et relie son entrée + à GND ou au point milieu ; des entrées flottantes peuvent provoquer des oscillations et une consommation inutile.

Amplifier le signal d'un micro : préampli pour micro électret

Les micros électret ont une sensibilité typique d'environ −44 dBV/Pa ; autrement dit, même avec une forte pression acoustique de 94 dB, ils ne donnent qu'environ 6 mV. Une conversation normale à un mètre reste autour de 0,1 mV, tandis qu'un claquement de mains juste à côté du micro peut atteindre quelques dizaines de millivolts. Avec le pas de 4,88 mV de l'Arduino, ce signal n'apparaît pas du tout ou ne bouge que de quelques pas ; c'est aussi pourquoi la sortie analogique de modules comme le capteur de son KY-038 est si faible. La solution est un amplificateur alternatif non inverseur d'un gain d'environ 100. Le montage ci-dessous utilise la voie A du LM358 :

ComposantValeurBranchement
Résistance de polarisation du micro2,2 kΩEntre 5V et la borne + du micro (borne − du micro à GND)
Condensateur de liaison C11 µFDe la borne + du micro à la broche 3 du LM358 (1IN+)
Résistances du point milieu100 kΩ et 56 kΩ100 kΩ de la broche 3 au 5V, 56 kΩ de la broche 3 à GND (environ 1,8 V)
Contre-réaction Rf100 kΩEntre la broche 1 (1OUT) et la broche 2 (1IN−)
Rg et C21 kΩ + 10 µFEn série de la broche 2 à GND (borne − de C2 à GND)
AlimentationBroche 8 et broche 4Broche 8 au 5V, broche 4 à GND, 100 nF entre les deux
SortieBroche 1Arduino Uno A0 (ESP32 GPIO 34, Pico GP26 : avec MCP6002 et 3,3 V)

Grâce au condensateur C2, le montage est en continu un suiveur de gain 1 ; dans le silence, la sortie repose au point milieu, vers 1,8 V. Aux fréquences audio, en revanche, C2 se comporte comme un court-circuit et le gain devient 1 + 100k / 1k = 101 (40 dB). La fréquence de coupure basse est fixée par Rg et C2 : 1 / (2π × 1 kΩ × 10 µF) ≈ 16 Hz. La limite haute est dictée par le produit gain-bande passante de l'ampli-op : sur le LM358, 0,7 MHz / 101 ≈ 7 kHz, ce qui suffit pour la voix. Si tu veux plus de gain, n'oublie pas que la bande passante diminue dans la même proportion ; pour un gain de 1000, mieux vaut le répartir sur deux étages d'environ 32 chacun.

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}

Le code prend autant d'échantillons que possible pendant 50 ms, cherche la plus petite et la plus grande valeur et convertit l'écart en volts ; c'est l'amplitude crête à crête du son. En divisant le résultat par 101, on obtient la tension produite par le micro lui-même. Dans une pièce calme, la sortie ne bouge que de quelques pas d'ADC (0,01–0,02 V), tandis qu'un claquement de mains proche dépasse facilement 1 V. Si le signal s'écrête, c'est-à-dire si la sortie bute sur 0 V ou 3,5 V, descends Rf à 47 kΩ. Tu trouveras comment stabiliser la mesure dans le guide sur le filtrage des données de capteur.

Amplifier un thermocouple : thermocouple de type K et LM358

Un thermocouple de type K produit une petite tension proportionnelle à l'écart de température à la jonction où deux métaux différents se rejoignent : environ 41 µV/°C. On mesure 4,1 mV à 100 °C, 20,6 mV à 500 °C et 41,3 mV à 1000 °C. Branché directement sur l'Arduino, un pas d'ADC (4,88 mV) correspond à environ 119 °C ; ce n'est pas une mesure. Un montage non inverseur de gain 101 réalisé sur la voie B du LM358 porte le signal à 4,14 mV/°C : un pas vaut désormais environ 1,2 °C, et la limite de sortie de 3,5 V du LM358 permet de mesurer jusqu'à environ 700–800 °C selon l'offset. Le câblage : borne + du thermocouple sur la broche 5 (2IN+), borne − à GND ; Rf = 100 kΩ entre les broches 7 et 6, Rg = 1 kΩ entre la broche 6 et GND ; la broche 7 va sur l'entrée A1 de l'Arduino. Sur un type K, le fil d'alumel, qui est la borne −, est légèrement magnétique : pratique pour distinguer les bornes.

En réalité, un thermocouple mesure l'écart entre la soudure chaude et la soudure froide, là où ses fils rejoignent la connexion en cuivre. Pour connaître la vraie température, il faut mesurer séparément la température de la soudure froide et l'ajouter ; c'est la compensation de soudure froide. Le code ci-dessous utilise pour cela un LM35 placé juste à côté des bornes de connexion (sortie sur A2). De plus, l'offset d'entrée du LM358, de 3 à 7 mV, est lui aussi multiplié par 101 et crée en sortie une erreur de 0,3 à 0,7 V, soit 70 à 170 °C. Le code mesure cet offset au démarrage et le soustrait des mesures suivantes ; mets donc la carte sous tension quand la sonde est à température ambiante.

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 l'offset est négatif, la sortie reste collée à 0 V et le montage n'affiche rien tant que la tension du thermocouple ne dépasse pas cet offset ; si tu lis au démarrage sur A1 un offset très proche de zéro, c'est ce qui se passe. L'offset du LM358 dérive aussi avec la température, et l'approximation de 41 µV/°C n'est juste qu'à quelques degrés près entre 0 et 500 °C. Pour les travaux qui exigent de la précision, comme un four, une imprimante 3D ou un traitement thermique, utilise un module MAX6675 ou MAX31855, qui intègre la compensation de soudure froide et une sortie numérique, ou un ampli-op de précision sans dérive (zero-drift).

Adapter le signal à l'ADC de l'Arduino : le placer dans la bonne plage

Le vrai travail d'un ampli-op dans les projets Arduino est d'amener le signal d'un capteur dans la plage que l'ADC exploite le mieux. La règle est simple : la valeur maximale du signal doit approcher le haut de la plage de l'ADC, sans déborder sur les extrémités où l'ampli-op et l'ADC ne sont plus linéaires. Par exemple, le LM35 donne 0–500 mV entre 0 et 50 °C ; lu directement sur un Uno, tu obtiens une résolution de 0,49 °C par pas. Si tu amplifies le même signal avec un gain de 6,6 jusqu'à 0–3,3 V, la résolution descend à 0,074 °C. Voici la conception étape par étape :

  1. Trouve la plage de sortie du capteur : relève dans la fiche technique la tension de sortie minimale et maximale (LM35, 0–50 °C : 0–0,5 V).
  2. Choisis la plage cible : la zone sûre est d'environ 0,02–3,5 V pour un Uno avec LM358, 0,15–2,5 V pour un ESP32 et 0,03–3,25 V pour un Pico avec MCP6002.
  3. Calcule le gain : G = maximum visé / maximum du capteur = 3,3 / 0,5 = 6,6. Pour 1 + Rf / Rg = 6,6 en montage non inverseur, choisis Rf = 56 kΩ et Rg = 10 kΩ.
  4. Retire l'offset : si le capteur travaille dans une plage qui ne commence pas à zéro, comme 1–2 V, soustrais d'abord la tension de référence (Vref dans un inverseur, ou un amplificateur différentiel), puis amplifie.
  5. Protège et filtre : mets une résistance série de 1 kΩ entre la sortie de l'ampli-op et la broche de l'ADC, et 100 nF entre la broche et GND. Ce filtre RC atténue le bruit au-dessus d'environ 1,6 kHz et limite tout courant de défaut vers la broche.
  6. Recalcule dans le logiciel : divise la tension mesurée par le gain pour retrouver la vraie tension du capteur (Vcapteur = Vadc / G) ; mesure les résistances au multimètre pour préciser le gain.
CarteADCPlage d'entrée conseilléePasBroches analogiques
Arduino Uno10 bits0–5 V (0–1,1 V avec la référence interne)4,88 mV (1,07 mV)A0–A5
ESP3212 bitsEnviron 0,15–2,5 V (atténuation par défaut de 11 dB)~0,8 mVGPIO 32–39 (ADC1, fonctionne aussi avec le Wi-Fi)
Raspberry Pi Pico12 bits0–3,3 V0,81 mVGP26, GP27, GP28
Pour les très petits signaux sur l'Uno, analogReference(INTERNAL) abaisse la référence de l'ADC à 1,1 V et réduit le pas à 1,07 mV ; parfois, un étage d'ampli-op supplémentaire devient inutile. Mais dans ce mode, une entrée supérieure à 1,1 V sature la mesure. Pour les détails de l'ADC, consulte le guide sur l'ADC et la conversion analogique-numérique.

Lire la sortie d'un ampli-op avec l'ESP32 : interrupteur à claquement de mains

Comme l'ESP32 fonctionne en 3,3 V, monte le même circuit de micro avec un MCP6002 et alimente-le par la broche 3V3 ; utilise deux résistances de 100 kΩ pour le point milieu (1,65 V). Si tu alimentes un LM358 en 5 V, sa sortie peut atteindre 3,5 V et malmener la broche de l'ESP32. Relie la sortie de l'ampli-op au GPIO 34, l'une des voies ADC1 qui fonctionnent aussi quand le Wi-Fi est actif. Le code ci-dessous mesure l'amplitude crête à crête sur des fenêtres de 20 ms, utilise les millivolts étalonnés de analogReadMilliVolts() et applique une hystérésis logicielle avec deux seuils distincts : chaque claquement de mains inverse l'état de la LED intégrée. Si tu utilises la carte pour la première fois, commence par les étapes d'installation du guide Qu'est-ce que l'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 et MicroPython : mesurer un courant avec une résistance de shunt

Autre tâche pratique pour un ampli-op : mesurer un courant. Si tu places une résistance de shunt de 0,1 Ω entre la borne négative d'un moteur ou d'un ruban LED et GND, un courant de 1 A n'y fait chuter que 100 mV. Un montage non inverseur à MCP6002 (Rf = 100 kΩ, Rg = 4,7 kΩ) multiplie cette tension par 22,3 : 1 A devient 2,23 V, et avec la plage de 3,3 V du Pico tu mesures jusqu'à environ 1,45 A. Le haut du shunt va sur la broche 3 du MCP6002 et la sortie de l'ampli-op (broche 1) sur la broche GP26 (ADC0) du Pico ; l'ampli-op est alimenté par la broche 3V3(OUT) et la masse de l'alimentation de la charge est reliée à celle du Pico. À 1,5 A, le shunt dissipe 0,225 W : utilise une résistance d'au moins 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)

Au démarrage, charge coupée, le code mesure l'offset de l'ampli-op et le soustrait des mesures suivantes ; la moyenne de 100 lectures atténue le bruit de l'ADC. Pour des courants plus forts, baisse la valeur du shunt ou le gain ; vérifie la chute de tension et la puissance dissipée dans le shunt avec l'outil Loi d'Ohm. Si tu préfères une solution toute faite, le capteur de courant ACS712 à effet Hall mesure le courant en gardant la charge isolée de ton montage. Si tu configures le Pico pour la première fois, le guide Qu'est-ce que le Raspberry Pi Pico explique l'installation de MicroPython.

Autres montages à ampli-op

MontageFormule / comportementOù l'utilise-t-on ?
Sommateur (mélangeur)Vsortie = −Rf × (V1/R1 + V2/R2 + …)Table de mixage audio, combiner plusieurs signaux
Amplificateur différentielVsortie = (R2 / R1) × (V2 − V1)Retirer un offset, mesurer l'écart entre deux points
Amplificateur d'instrumentationGain élevé réglé par une seule résistance, excellente réjection du mode communCapteurs de force, ponts de Wheatstone, signaux biomédicaux
IntégrateurCondensateur dans la contre-réaction ; la sortie est l'intégrale de l'entrée dans le tempsGénérateur de signal triangulaire, régulation PI
Filtre actif (Sallen-Key)Filtrage du deuxième ordre avec deux résistances et deux condensateursFiltres audio, filtre anti-repliement avant l'ADC
Trigger de SchmittComparateur à réaction positive, deux seuils distinctsSortie numérique propre à partir d'un signal bruité

Pour les capteurs en pont comme les capteurs de force, dont les deux sorties sont au milieu de l'alimentation et ne diffèrent que de quelques millivolts, les puces toutes faites sont plus pratiques : le HX711 intègre un amplificateur de gain jusqu'à 128 et un ADC 24 bits. L'ampli-op de la carte d'un capteur de pouls, lui, amplifie et filtre le faible signal du capteur de lumière ; c'est pourquoi l'Arduino voit une onde de pouls nette dès le premier essai.

Capteur de pouls Pulse Sensor
Pulse Sensor : l'ampli-op de la carte amplifie et filtre la minuscule variation de la lumière réfléchie par le doigt ; au repos, la sortie se tient à la moitié de l'alimentation.

Idées de projets avec un ampli-op

  • Lampe qui s'allume en claquant des mains : commande un module relais avec le préampli de micro et le code ESP32 à hystérésis.
  • Vumètre : transforme l'amplitude crête à crête en une barre qui monte avec la musique sur un ruban LED WS2812B.
  • Thermomètre de four : mesure jusqu'à 500 °C avec l'amplificateur de thermocouple et affiche la valeur sur un écran OLED.
  • Veilleuse sans code : réalise une LED qui s'allume dans le noir avec une LDR et un LM358 en comparateur, sans aucun microcontrôleur.
  • Balance numérique : lis un capteur de force avec le HX711 et construis une balance de cuisine précise au gramme.
  • Surveillance du courant moteur : mesure le courant du moteur de ta voiture robot avec un shunt et un ampli-op, et arrête le moteur quand le courant monte parce qu'il est bloqué.

Erreurs fréquentes et solutions

SymptômeCause probableSolution
Sortie toujours à 0 V ou tout en hautPas de contre-réaction ou branchée sur la mauvaise entrée ; gain trop élevé ; entrée hors de la plage d'entréeVérifie que Rf va bien à l'entrée −, baisse le gain, assure-toi que l'entrée est entre 0 et V+ − 1,5 V
Montage à LM741 qui ne marche pas en 5 VLe LM741 demande une alimentation symétrique plus élevéeUtilise un LM358 ou un MCP6002
La sortie ne dépasse pas 3,5 VLa sortie du LM358 plafonne à V+ − 1,5 VChoisis le gain en conséquence ou utilise un ampli-op rail-to-rail
Mesures bruitées et instablesPas de découplage d'alimentation, fils longs, gain inutilement élevé100 nF sur les broches d'alimentation, fils courts, filtre RC en sortie, moyenne logicielle
Le montage oscille tout seulL'ampli-op attaque directement un long câble ou une forte charge capacitiveAjoute une résistance série de 100–470 Ω en sortie
La sortie du comparateur ne monte jamaisLe LM393 est à collecteur ouvert et n'a pas de pull-upRelie 4,7–10 kΩ entre la sortie et l'alimentation
Broche de l'ESP32 ou du Pico endommagéeL'ampli-op était alimenté en 5 V ou 12 V et la sortie a dépassé 3,3 VAlimente l'ampli-op en 3,3 V ou ajoute un pont diviseur et une diode d'écrêtage en sortie
Sortie bloquée à 0 V avec de petits signauxUn offset d'entrée négatif colle la sortie en bas en alimentation simpleUtilise un ampli-op de précision ou applique une petite polarisation à l'entrée
Pour dépanner un montage à ampli-op, mesure d'abord au multimètre la tension des deux entrées. Dans un amplificateur à contre-réaction qui fonctionne correctement, l'écart entre les entrées + et − ne dépasse pas quelques millivolts. Si l'écart est grand, l'ampli-op est saturé : la sortie est collée à un rail, et la cause est le gain, la plage d'entrée ou une liaison de contre-réaction coupée. Pour la mesure elle-même, consulte le guide comment utiliser un multimètre.

Un ampli-op est un traducteur qui transpose le monde analogique dans une langue que le microcontrôleur comprend : une fois que tu connais les deux règles et les deux formules de gain, tu peux adapter à l'ADC n'importe quel signal, qu'il vienne d'un micro, d'un thermocouple, d'une résistance de shunt ou d'un capteur en pont. Essaie des valeurs avec l'outil Gain d'ampli-op ; dans l'application BlueGrays, tu trouveras des projets analogiques comme la mesure de lumière avec une LDR, une veilleuse, un voltmètre numérique, la mesure de température avec une CTN et les capteurs de flamme et de gaz, pas à pas avec schémas et code.

Questions fréquentes

À quoi sert un amplificateur opérationnel ?

Un amplificateur opérationnel sert à amplifier des signaux faibles, comparer deux tensions, additionner ou soustraire des signaux, les filtrer et tamponner des sources à haute impédance. Dans les projets Arduino, on l'utilise surtout pour porter des signaux de quelques millivolts, comme ceux d'un micro, d'un thermocouple ou d'une résistance de shunt, à un niveau que l'ADC peut lire.

Comment calculer le gain d'un ampli-op ?

En montage non inverseur, le gain vaut 1 + Rf / Rg, et en montage inverseur −Rf / Rin. Par exemple, avec Rf = 100 kΩ et Rg = 1 kΩ, le gain non inverseur vaut 101 et le gain inverseur −100. En décibels, on calcule 20 × log10(gain).

Quelle est la différence entre le LM358 et le LM741 ?

Le LM358 réunit deux ampli-op dans un boîtier, fonctionne avec une alimentation simple de 3 à 30 V et sa plage d'entrée inclut 0 V ; il s'utilise donc directement avec le 5 V de l'Arduino. Le LM741 est un ampli-op simple prévu pour une alimentation symétrique comme ±15 V et ne fonctionne pratiquement pas en 5 V simple. Leurs brochages sont aussi différents.

Un ampli-op fonctionne-t-il avec une seule alimentation de 5 V ?

Oui, les modèles conçus pour l'alimentation simple fonctionnent, comme le LM358, le LM324 et le MCP6002. Pour des signaux alternatifs, il faut remonter l'entrée au milieu de l'alimentation et tenir compte des limites de sortie ; la sortie du LM358 ne monte qu'à environ 3,5 V sous 5 V.

Quelle est la différence entre un ampli-op et un comparateur ?

Un ampli-op est compensé en fréquence pour rester stable avec une contre-réaction, et sa sortie peut fournir et absorber du courant. Les comparateurs comme le LM393 sont conçus pour basculer vite sans contre-réaction, et la plupart ont une sortie à collecteur ouvert qui demande une résistance de rappel. Un ampli-op peut servir de comparateur lent, mais un comparateur ne doit pas servir d'amplificateur.

Qu'est-ce qu'un ampli-op rail-to-rail ?

Sur un ampli-op rail-to-rail, l'entrée ou la sortie peut s'approcher à quelques dizaines de millivolts des tensions d'alimentation. Par exemple, le MCP6002 fournit 0,025 à 4,975 V sous 5 V, alors que le LM358 ne monte qu'à environ 3,5 V. Sur les cartes en 3,3 V comme l'ESP32 et le Raspberry Pi Pico, il faut un ampli-op rail-to-rail pour exploiter toute la plage de l'ADC.

Voir tous les projets
Mesurer l'intensité lumineuse avec une LDR
#11Débutant

Mesurer l'intensité lumineuse avec une LDR

Envie de voir en chiffres à quel point ta chambre est lumineuse ? Le LDR, une petite pièce sensible à la lumière, mesure la lumière ambiante, et l'Arduino écrit la valeur sur l'écran de ton ordinateur

4.6(81)
139
Veilleuse avec LDR
#12Débutant

Veilleuse avec LDR

Une petite veilleuse qui s'allume toute seule quand il fait nuit et s'éteint au matin. Un capteur de lumière mesure la clarté de la pièce, et l'Arduino allume la LED quand il fait assez sombre puis l'

4.8(102)
205
Mesure de l'intensité lumineuse avec le module LDR ESP32
#113Débutant

Mesure de l'intensité lumineuse avec le module LDR ESP32

Suivi en temps réel sur le moniteur série de la valeur brute de l'ADC du module LDR et du pourcentage relatif de luminosité calculé à partir de références dans l'obscurité et à la lumière. Ce pourcentage n'est pas une mesure en lux. Permet de comprendre le principe de calibrage du module. Il est préférable de réaliser cet exercice avant le projet 10, car il sert à déterminer la valeur seuil.

4.6(36)
55
Voltmètre numérique avec écran LCD
#56Intermédiaire
Premium

Voltmètre numérique avec écran LCD

Découvre quelle tension fournit une pile ou un adaptateur avec un appareil de mesure fait maison. Un diviseur de deux résistances abaisse la tension élevée à un niveau que la carte peut lire, et l'Ard

4.5(27)
36
Mesure de la température avec NTC et écran LCD 2x16
#44Débutant
Premium

Mesure de la température avec NTC et écran LCD 2x16

Mesure la température ambiante avec un capteur qui ressemble à une petite perle. Cette pièce, appelée NTC, laisse passer l'électricité de plus en plus facilement en chauffant ; l'Arduino lit ce change

4.5(33)
44
Utilisation du détecteur de flamme
#50Intermédiaire
Premium

Utilisation du détecteur de flamme

Un petit gardien qui repère le feu avant toi, dans la cuisine ou l'atelier. Le capteur de flamme capte la lumière invisible émise par le feu ; quand tout va bien, la LED verte est allumée, et quand il

4.6(33)
44
Utilisation des capteurs de gaz
#51Débutant
Premium

Utilisation des capteurs de gaz

Un petit gardien qui repère une fuite de gaz dans la cuisine avant toi. Le capteur de gaz renifle l'air sans arrêt ; tant que tout va bien, la LED verte reste allumée, et quand le gaz dans l'air dépas

4.6(37)
50
Luminosité d'une LED avec un Potentiomètre sur ESP32 (Analogique → PWM)
#115Intermédiaire
Premium

Luminosité d'une LED avec un Potentiomètre sur ESP32 (Analogique → PWM)

Dans ce projet, nous contrôlons la luminosité d'une LED de manière analogique à l'aide d'un potentiomètre. La broche ADC de l'ESP32 lit la tension entre 0 et 3,3 V provenant du potentiomètre, puis cette valeur est convertie en signal PWM (modulation de largeur d'impulsion) envoyé à la LED. Ainsi, la LED s'allume et s'éteint progressivement. Avec Arduino Core 3.0+, analogWrite() est utilisable directement; sur ESP32-S2/S3, la résolution de l'ADC est fixée à 12 bits.

4.5(19)
32