Guides · 19 min de lecture

Arduino redémarre tout seul ou plante : causes et solutions

Arduino redémarre tout seul ou plante ? Courant des servos et relais, chute de tension, masse commune, condensateur 470 µF, RAM pleine et watchdog, pas à pas.

Si ton Arduino redémarre tout seul ou se fige après avoir fonctionné un moment, la carte n'est presque jamais en panne. Dans la plupart des cas, c'est l'alimentation : quand un servo se met en mouvement, qu'un moteur démarre ou qu'un relais colle, l'appel de courant soudain fait s'effondrer la ligne 5 V pendant un instant et la protection contre les sous-tensions du processeur (brown-out) redémarre la carte. Dans les autres cas, les coupables sont les parasites des relais et des moteurs, les longs câbles, une RAM pleine, un watchdog oublié ou un port USB d'ordinateur qui ne fournit pas assez de courant.

Dans ce guide, tu vas d'abord apprendre à distinguer une carte qui redémarre vraiment d'une carte qui se fige. Nous expliquerons ensuite chaque cause avec de vraies valeurs de courant et de tension, puis nous montrerons les solutions avec du code : alimentation séparée et masse commune, condensateurs de 100 à 470 µF, diodes de roue libre, tampons fixes au lieu de String et watchdog. Tu trouveras aussi un sketch de diagnostic qui mesure la tension d'alimentation et la RAM libre de l'Arduino lui-même, un tableau pas à pas du symptôme à la solution et des exemples qui lisent la cause du redémarrage sur l'ESP32 et la Raspberry Pi Pico.

Carte Arduino Uno R3
Arduino Uno R3 : le 5 V de l'USB passe par un fusible réarmable de 500 mA. Quand la carte redémarre, le programme repart de setup() ; le bouton RESET et la broche RESET font la même chose.

Redémarrage ou plantage ? Identifie d'abord le symptôme

Un Arduino qui redémarre exécute le programme depuis le tout début, comme si tu avais débranché puis rebranché le câble USB : setup() s'exécute à nouveau, le servo revient à son angle de départ, l'écran LCD réaffiche son texte d'accueil et le message de démarrage réapparaît dans le Moniteur série. Un Arduino figé, lui, ne réagit plus à rien ; les LED restent dans leur dernier état, la sortie série s'arrête et la carte reste ainsi jusqu'à ce que tu appuies sur le bouton reset. Comme les causes et les solutions sont différentes, commence par savoir lequel des deux tu as. Le plus simple est d'ajouter une ligne Serial.println("DEMARRAGE") dans setup() et de laisser le Moniteur série ouvert.

SymptômeRedémarragePlantage
setup() s'exécute-t-il à nouveau ?Oui, le message de démarrage réapparaîtNon
Sortie sérieS'interrompt puis reprend avec le message de démarrageS'interrompt et ne revient pas
Sorties et LEDS'éteignent brièvement puis reviennent à leur état initialRestent bloquées dans leur dernier état
Cause la plus fréquenteChute de tension, parasites, watchdogBoucle infinie, bus I2C bloqué, RAM corrompue
À vérifier en premierAlimentation, GND et câblageCode, utilisation de la mémoire et câbles des capteurs

Pourquoi un Arduino redémarre-t-il tout seul ? Les sources de reset

Seules quelques sources peuvent redémarrer le processeur ATmega328P de l'Arduino Uno et du Nano, et chacune a son propre déclencheur. Quand la tension d'alimentation descend sous un certain seuil, le détecteur de brown-out (BOD) entre en action ; sur l'Uno et le Nano, les bits de configuration de la puce (fuses) fixent ce seuil à 2,7 V. Tout ce qui met la broche RESET à LOW redémarre aussi la carte : le bouton reset, le signal DTR de l'ordinateur ou les parasites captés par un long fil relié à cette broche. Il existe aussi un cas qui ressemble à un reset sans en être un : à cause d'une mémoire corrompue, le programme saute à l'adresse 0 et le code repart du début, mais comme les périphériques matériels ne sont pas réinitialisés, la carte se met à se comporter bizarrement.

Source de resetQu'est-ce qui la déclenche ?Symptôme typique
Mise sous tension (POR)Brancher le câble, coupure complète de l'alimentationDémarrage normal
Reset externe (broche RESET)Bouton reset, ouverture du Moniteur série (DTR), parasites sur la broche RESETRepart à zéro à l'ouverture du port ou quand on touche un fil
Brown-out (BOD, 2,7 V)Appel de courant d'un servo, moteur, relais ou ruban LED, pile faibleReset au moment où la charge bouge
Watchdogwdt_reset() n'a pas été appelé à tempsResets à intervalles réguliers (par ex. toutes les 2 secondes pile)
Plantage logicielDépassement de tableau, RAM saturée, pointeur invalideReset ou blocage aléatoire après des minutes ou des heures

Courant des servos, moteurs et relais : comment une chute de tension provoque un reset

Un servo SG90 consomme 100 à 250 mA en mouvement, mais au démarrage et quand son bras force, le courant grimpe au-dessus de 0,5 A. Le port USB 2.0 d'un ordinateur fournit au maximum 500 mA, et le fusible de la ligne USB de l'Uno travaille à la même limite. Quand le servo, les 50 mA de la carte elle-même et quelques modules dépassent cette limite, le port ou le fusible limite le courant, la ligne 5 V s'effondre un instant et, si la tension passe sous 2,7 V, le BOD redémarre la carte. Le cas le plus sournois est celui où la tension reste entre 2,7 V et environ 3,8 V : d'après la fiche technique de l'ATmega328P, il faut environ 3,8 V pour fonctionner de façon sûre à 16 MHz. Dans cette zone grise, le BOD ne se déclenche pas, mais le processeur tourne hors de sa limite de vitesse ; la carte peut alors se figer au lieu de redémarrer, renvoyer des valeurs absurdes, ou bien les écrans et capteurs I2C peuvent se bloquer.

ChargeCourant normalCourant de pointeAlimentée par la broche 5V de l'Uno ?
Micro-servo SG90100–250 mA0,5 A et plus (démarrage, effort)Un seul servo et avec une charge légère
Servo MG996R0,5–0,9 AJusqu'à 2,5 ANon, une alimentation 5–6 V séparée est indispensable
Moteur à courant continu TT avec réducteur70–250 mA~1 A (démarrage, blocage)Non, pilote moteur et alimentation séparée
Module relais 5 V (une voie)70–90 mACourte pointe quand la bobine s'active1–2 voies oui, 4 et plus avec une alimentation séparée
LED WS2812B (chacune)~20 mA (une couleur à fond)60 mA (blanc complet)Non ; 30 LED en blanc complet demandent 1,8 A

Les câbles comptent aussi. Les fils de connexion fins utilisés sur une breadboard font en général 26 à 28 AWG, et un fil de cuivre de 28 AWG a une résistance d'environ 0,21 Ω par mètre. Si tu alimentes le servo avec deux fils de 20 cm (0,4 m aller-retour) en passant par une breadboard, les fils ajoutent environ 0,085 Ω et quatre contacts de la breadboard environ 0,2 Ω au total. D'après la loi d'Ohm (U = R × I), une pointe de 1 A du servo perd environ 0,3 V dans ces 0,29 Ω. Un câble USB fin et long, le fusible et les composants de protection de la carte ajoutent encore environ un demi-ohm ; pendant la même pointe, la ligne 5 V de l'Arduino descend sous 4,5 V, et si le port de l'ordinateur commence à limiter le courant, la chute est bien plus profonde. Tu peux calculer la chute dans ton propre circuit avec le calculateur de loi d'Ohm.

Par la broche 5V de l'Uno, n'alimente au maximum qu'un seul servo SG90, avec une charge légère. Ne branche jamais de gros servos comme le MG996R, de moteurs à courant continu ou de rubans LED sur la broche 5V ou 3.3V de l'Arduino : la carte redémarrera et, à la longue, le fusible USB, le régulateur et même le port USB de ton ordinateur peuvent être endommagés.

Solution 1 : alimentation séparée et masse commune

  1. Choisis une alimentation séparée pour les servos et les moteurs : pour les servos, un adaptateur 5–6 V qui fournit au moins 1 A par servo (2 à 3 A pour un MG996R), un pack de 4 piles AA NiMH ou un module abaisseur LM2596 réglé sur 5–6 V.
  2. Relie le plus de l'alimentation uniquement aux fils rouges des servos ou à l'entrée de puissance du pilote moteur ; ne relie pas cette ligne à la broche 5V de l'Arduino.
  3. Relie le moins (GND) de l'alimentation à la fois à la charge et à la broche GND de l'Arduino. Sans cette masse commune, la tension de la broche de signal n'a pas de référence ; le servo tremble ou ne bouge pas du tout.
  4. Réunis les GND en un seul point près de l'alimentation (masse en étoile). Le courant du moteur ne doit pas revenir à travers l'Arduino et ses pistes de masse ; sinon, la masse de l'Arduino bouge à chaque pointe du moteur.
  5. Alimente l'Arduino par sa propre entrée : USB, prise jack DC (7–12 V) ou 5 V régulé. Ainsi, le processeur n'est pas touché même si l'alimentation des servos s'effondre.
  6. Pour finir, mesure entre les broches 5V et GND de l'Arduino pendant que le servo bouge, ou lance le sketch de diagnostic plus bas ; la tension ne doit pas descendre sous 4,75 V.
Module abaisseur de tension LM2596
Module abaisseur LM2596 : avec son potentiomètre de réglage, il abaisse une tension plus élevée, comme celle d'un adaptateur 12 V ou d'une batterie Li-ion 2S, à 5–6 V ; c'est la façon la plus pratique de créer une ligne d'alimentation des servos indépendante de l'Arduino. Règle la sortie au multimètre avant de brancher la charge.
Nous expliquons pourquoi la masse commune est indispensable et comment fonctionne la masse en étoile dans Qu'est-ce que la GND ?, et comment choisir piles et adaptateurs dans le guide pour alimenter un Arduino sur batterie. La règle est simple : les fils de signal viennent de l'Arduino, les fils d'alimentation viennent de la source, et les masses sont reliées.

Solution 2 : condensateur (100–470 µF) et diode

Un condensateur électrolytique agit comme une petite réserve d'énergie placée juste à côté de la charge : quand le servo réclame un courant soudain, il le fournit lui-même le temps que les fils et l'alimentation suivent. La formule ΔU = I × Δt / C indique à quel point il aide. Un condensateur de 470 µF ne laisse chuter la tension que de 0,21 V pendant une pointe de 1 A qui dure 100 µs ; si la même pointe dure 1 ms, la chute atteint 2,1 V. Autrement dit, le condensateur absorbe les pointes brèves et le bruit des balais des moteurs, mais il ne remplace pas une alimentation insuffisante. Mets 470 à 1000 µF sur la ligne des servos et 100 µF entre 5V et GND de l'Arduino, et ajoute à côté de chacun un condensateur céramique de 100 nF marqué 104 contre les parasites haute fréquence. Pour lire les marquages, utilise l'outil code des condensateurs, et pour additionner des condensateurs en parallèle le calculateur de réseau de condensateurs ; les différences entre les types sont expliquées dans Qu'est-ce qu'un condensateur ?.

Où ?ValeurPourquoi ?
Ligne d'alimentation du servo, près du servo470–1000 µF / 10–16 V électrolytique + 100 nFAdoucit la pointe de démarrage
Entre les deux bornes d'un moteur à courant continu100 nF céramiqueFiltre les parasites des étincelles des balais
Entre 5V et GND de l'Arduino100 µF électrolytique + 100 nFProtège la ligne du processeur des chutes brèves
Entrée d'un ruban WS2812B1000 µF / 10 VEncaisse le courant d'allumage et les pointes lors des changements de couleur
Broches d'alimentation des capteurs et modules100 nF céramiqueFiltre les parasites apportés par les longs câbles
Condensateurs électrolytiques de différentes valeurs
Condensateurs électrolytiques : une valeur comme 470 µF / 16 V est idéale pour une ligne de servos en 5 V. La bande sur le boîtier repère la patte négative (−) ; la tension nominale doit valoir au moins le double de celle de la ligne.

Les bobines de relais, les moteurs et les solénoïdes sont des inductances. Quand le courant qui les traverse est coupé brusquement, la bobine s'oppose à ce changement et produit à ses bornes une courte pointe de tension de plusieurs dizaines, voire centaines de volts, bien au-dessus de la tension d'alimentation. Cette pointe se propage sur la ligne et redémarre l'Arduino ; elle peut aussi détruire le transistor de commande ou la broche. La solution est une diode de roue libre branchée en parallèle sur la bobine, en sens inverse : l'extrémité cathode d'une 1N4007, repérée par la bande, va au plus et l'autre au côté relié au transistor. Les modules relais intègrent déjà cette diode ; avec un relais nu, un solénoïde ou un moteur piloté par un transistor ou un MOSFET, tu dois l'ajouter toi-même. Pour les moteurs dont la vitesse est réglée en PWM, la diode Schottky 1N5819, plus rapide, donne de meilleurs résultats. Plus de détails dans Qu'est-ce qu'une diode ? et utiliser un MOSFET avec Arduino.

Diode de redressement 1N4007
Diode 1N4007 : la bande grise sur le boîtier repère la cathode (−). Branchée en inverse aux bornes d'une bobine, elle court-circuite et éteint la pointe de tension créée quand le courant est coupé.

Parasites, contacts de relais et longs câbles

Si la carte redémarre exactement au moment où un relais retombe, le problème vient des parasites et non de l'alimentation. Quand un relais coupe une pompe à eau, un ventilateur, un tube fluorescent ou un contacteur, un petit arc se forme entre les contacts et cet arc rayonne des perturbations électromagnétiques à large bande. Ces parasites se couplent aux câbles des capteurs voisins, à la ligne RESET et aux lignes I2C, puis redémarrent le processeur ou bloquent un module. Pour l'éviter, utilise un module relais à optocoupleur, retire le cavalier JD-VCC et alimente les bobines des relais avec une source 5 V séparée ; le courant des bobines et les parasites restent ainsi loin de la ligne de l'Arduino. Avec des charges inductives sur le secteur, un snubber RC (100 Ω + 100 nF, classe X2) ou une varistance aux bornes des contacts ou de la charge atténue fortement l'arc. Tu trouveras le câblage détaillé dans Qu'est-ce qu'un module relais ? et le principe de l'isolation dans Qu'est-ce qu'un optocoupleur ?.

  • I2C court : l'I2C a été conçu pour de courtes distances sur une carte. Garde les fils SDA et SCL sous 50 cm ; sur des liaisons plus longues, descends les résistances de pull-up de 4,7 kΩ à 2,2 kΩ et laisse la vitesse à 100 kHz.
  • Fils torsadés : torsade chaque fil de signal avec un fil de masse ; les paires torsadées d'un câble réseau sont idéales pour cela.
  • Sépare puissance et signal : ne fais pas courir les câbles des capteurs parallèlement à ceux des moteurs, des relais ou du secteur ; s'ils doivent se croiser, croise-les à angle droit.
  • Laisse la broche RESET tranquille : un long fil sur la broche RESET se comporte comme une antenne et redémarre la carte quand on le touche ou quand un moteur proche tourne. Si tu as besoin d'un bouton reset externe, garde son fil court.
  • Ferrites et boîtier : des tores de ferrite sur les câbles des moteurs et un boîtier métallique réduisent les parasites haute fréquence.
  • Ajoute un délai d'attente : si les parasites bloquent le bus I2C, la bibliothèque Wire attend indéfiniment par défaut et la carte se fige. Le code ci-dessous évite ce blocage grâce à un délai d'attente.
C++ (Arduino IDE)
1#include <Wire.h>
2
3const uint8_t ADDR = 0x27;   // örnek: I2C LCD adresi / example: I2C LCD address
4
5void setup() {
6  Serial.begin(9600);
7  Wire.begin();
8  Wire.setWireTimeout(25000, true);   // 25 ms; takılırsa I2C birimini sıfırla / reset the I2C unit on timeout
9}
10
11void loop() {
12  Wire.beginTransmission(ADDR);
13  byte err = Wire.endTransmission();  // 0 = cihaz cevap verdi / 0 = device answered
14
15  if (Wire.getWireTimeoutFlag()) {    // hat kilitlendi ama program donmadı / bus hung, sketch did not freeze
16    Serial.println(F("I2C zaman asimi / I2C timeout"));
17    Wire.clearWireTimeoutFlag();
18  } else if (err != 0) {
19    Serial.print(F("I2C hatasi / I2C error: "));
20    Serial.println(err);              // 2 = cihaz yok, 5 = zaman aşımı / 2 = no device, 5 = timeout
21  }
22  delay(1000);
23}

RAM saturée et utilisation de String

L'Arduino Uno n'a que 2 Ko de SRAM, et ce petit espace est partagé entre les variables globales, la mémoire dynamique (le tas) et la pile utilisée par les appels de fonctions. Si tu vois l'avertissement Low memory available, stability problems may occur. à la fin de la compilation, la carte finira très probablement par planter. La cause la plus sournoise est la classe String : chaque concaténation réserve un nouveau morceau sur le tas, l'ancien est libéré et, avec le temps, la mémoire se remplit de trous. Un jour, la pile rencontre le tas et le programme redémarre ou se fige à un moment aléatoire. Comme ce problème apparaît en général au bout de quelques minutes ou heures, il est facile à distinguer d'un souci d'alimentation. Garde les textes constants en flash avec la macro F(), utilise des tableaux de char de taille fixe et snprintf() au lieu de String, et ne déclare pas de grands tableaux locaux dans les fonctions. Le code ci-dessous affiche la RAM libre chaque seconde ; si la valeur ne cesse de baisser, il y a une fuite de mémoire. Tout le sujet est traité dans Arduino : mémoire insuffisante.

C++ (Arduino IDE)
1extern int __heap_start, *__brkval;
2
3// Heap ile stack arasındaki boş RAM / free RAM between heap and stack
4int freeRam() {
5  int v;
6  return (int)&v - (__brkval == 0 ? (int)&__heap_start : (int)__brkval);
7}
8
9char line[32];             // sabit tampon, bir kez ayrılır / fixed buffer, allocated once
10unsigned long counter = 0;
11
12void setup() {
13  Serial.begin(9600);
14}
15
16void loop() {
17  counter++;
18  // Kaçın / avoid: String s = "Sayac: " + String(counter) + " sn";
19  snprintf(line, sizeof(line), "Sayac: %lu sn", counter);  // heap kullanmaz / no heap use
20  Serial.println(line);
21
22  Serial.print(F("Bos RAM / free RAM: "));  // F(): metin flaşta kalır / text stays in flash
23  Serial.println(freeRam());                // sürekli azalıyorsa sızıntı var / steady drop = leak
24  delay(1000);
25}

Watchdog : la ceinture de sécurité contre les plantages

Le watchdog (chien de garde) est un compteur interne au processeur qui fonctionne de façon indépendante avec son propre oscillateur de 128 kHz. Ton programme doit le relancer régulièrement avec wdt_reset() ; s'il ne le fait pas dans le délai choisi (entre 15 ms et 8 secondes), le watchdog redémarre la carte. Ainsi, un bus I2C bloqué, une fonction coincée dans une boucle infinie ou une lecture de capteur faussée par des parasites ne peuvent pas figer la carte pour toujours ; elle se rétablit en quelques secondes. N'oublie pas que le watchdog est une ceinture de sécurité, pas une réparation : il ne règle ni les problèmes d'alimentation ni ceux de mémoire, il permet seulement à un projet installé sur le terrain de repartir tout seul. Choisis un délai nettement plus long que l'opération la plus longue de ton code ; avec un delay(3000) dans le code, un watchdog de 2 secondes redémarrera la carte sans arrêt.

C++ (Arduino IDE)
1#include <avr/wdt.h>
2
3const int LED_PIN = 13;
4
5void setup() {
6  MCUSR = 0;          // reset bayraklarını temizle / clear reset flags
7  wdt_disable();      // açılışta watchdog kapalı / watchdog off during startup
8  Serial.begin(9600);
9  pinMode(LED_PIN, OUTPUT);
10  Serial.println(F("Basladi / started"));
11  delay(500);
12  wdt_enable(WDTO_2S);  // 2 sn içinde beslenmezse reset / reset if not fed within 2 s
13}
14
15void loop() {
16  digitalWrite(LED_PIN, !digitalRead(LED_PIN));
17  delay(250);
18
19  // Seri Monitör'den 'x' gönder: takılmayı taklit eder / send 'x' to simulate a hang
20  if (Serial.available() && Serial.read() == 'x') {
21    Serial.println(F("Sonsuz donguye girildi / stuck in a loop"));
22    while (true) {}     // wdt_reset() yok: 2 sn sonra reset / no wdt_reset(): reset after 2 s
23  }
24
25  wdt_reset();          // her turda besle / feed it every loop
26}
Sur les clones de Nano équipés de l'ancien bootloader, le watchdog est dangereux. Ce bootloader ne désactive pas le minuteur après un reset du watchdog ; le minuteur continue de tourner avec sa période la plus courte (environ 16 ms) et le bootloader n'a pas le temps de finir son travail. Résultat : une boucle de resets sans fin dans laquelle ton code ne démarre jamais ; la carte ne s'en sort qu'en débranchant puis rebranchant le câble USB, et la boucle recommence dès que le watchdog se déclenche à nouveau. Si ta carte demande ATmega328P (Old Bootloader) dans Outils > Processeur, grave le bootloader Optiboot avant d'utiliser le watchdog ; nous expliquons comment dans erreur de téléversement Arduino. Le bootloader Optiboot de l'Uno n'a pas ce problème.

Sketch de diagnostic : l'Arduino mesure lui-même sa tension et sa RAM

Un multimètre est trop lent pour voir des chutes de tension de quelques millisecondes. À la place, tu peux utiliser l'Arduino lui-même comme un instrument de mesure simple : le code ci-dessous mesure avec l'ADC la référence interne de 1,1 V de la puce et en déduit la tension d'alimentation environ 9000 fois par seconde, et affiche la valeur la plus basse de chaque seconde. Il incrémente aussi un compteur dans l'EEPROM à chaque démarrage, si bien que même si tu ouvres le Moniteur série plus tard, tu vois combien de fois la carte a redémarré. Comme charge de test, il fait bouger le servo branché sur D9 entre 0 et 180 degrés toutes les 2 secondes ; si tu as ton propre projet, tu peux ajouter la partie mesure à son code. Ouvre le Moniteur série à 115200 bauds.

C++ (Arduino IDE)
1// Reset teşhis kodu (Uno, Nano) / reset diagnostic sketch (Uno, Nano)
2#include <EEPROM.h>
3#include <Servo.h>
4
5Servo servo;
6extern int __heap_start, *__brkval;
7
8int freeRam() {
9  int v;
10  return (int)&v - (__brkval == 0 ? (int)&__heap_start : (int)__brkval);
11}
12
13// Besleme gerilimini dahili 1,1 V referansla ölç / measure supply voltage against the internal 1.1 V reference
14long readVcc() {
15  ADMUX = _BV(REFS0) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1);
16  ADCSRA |= _BV(ADSC);                  // ölçümü başlat / start a conversion
17  while (bit_is_set(ADCSRA, ADSC)) {}   // bitmesini bekle / wait until it is done
18  return 1125300L / ADC;                // 1100 mV × 1023 / okuma → mV / reading → mV
19}
20
21long minVcc = 9999;
22unsigned long lastPrint = 0, lastMove = 0;
23bool sideA = false;
24
25void setup() {
26  Serial.begin(115200);
27  uint16_t boots;
28  EEPROM.get(0, boots);                 // açılış sayacı / boot counter
29  if (boots == 0xFFFF) boots = 0;       // boş EEPROM / blank EEPROM
30  EEPROM.put(0, ++boots);
31  Serial.print(F("BASLADI / STARTED  acilis no / boot #"));
32  Serial.println(boots);
33
34  servo.attach(9);                      // test yükü: servo D9'da / test load: servo on D9
35  readVcc();                            // ilk ölçümü at / discard the first reading
36  delay(5);
37}
38
39void loop() {
40  long v = readVcc();                   // saniyede ~9000 ölçüm / ~9000 samples per second
41  if (v < minVcc) minVcc = v;
42
43  if (millis() - lastMove >= 2000) {    // 2 sn'de bir servoyu oynat / move the servo every 2 s
44    lastMove = millis();
45    sideA = !sideA;
46    servo.write(sideA ? 180 : 0);
47  }
48
49  if (millis() - lastPrint >= 1000) {
50    lastPrint = millis();
51    Serial.print(F("sn/s: "));
52    Serial.print(millis() / 1000);
53    Serial.print(F("  min Vcc (mV): "));
54    Serial.print(minVcc);
55    Serial.print(F("  bos RAM / free RAM: "));
56    Serial.println(freeRam());
57    minVcc = 9999;                      // her saniye sıfırla / reset every second
58  }
59}

Lis les résultats ainsi : sur un Uno en bonne santé alimenté par USB, la valeur minimale reste entre 4,6 et 5,1 V. Si elle descend sous 4,5 V à chaque mouvement du servo et que les resets coïncident avec ces moments, le problème vient de l'alimentation. Si le numéro de démarrage augmente alors que la tension reste stable, cherche du côté des parasites ou du logiciel ; si en plus la RAM libre ne cesse de baisser, tu as une fuite de mémoire. La référence interne de 1,1 V peut varier d'environ 10 % d'une puce à l'autre ; compare donc une fois la mesure avec un multimètre : si le multimètre affiche 4,95 V alors que le code indique 5,10 V, remplace la constante 1125300 par 1125300 × 4,95 / 5,10 ≈ 1092200. Une fois le diagnostic terminé, retire le compteur EEPROM du code ; les cellules de l'EEPROM supportent environ 100 000 écritures.

Tableau de diagnostic pas à pas : symptôme, cause, solution

Lis le tableau de haut en bas ; les premières lignes sont les causes les plus fréquentes. Ne change qu'une seule chose à la fois et relance le sketch de diagnostic. Si tu modifies trois choses en même temps, tu ne sauras pas laquelle a résolu le problème, et la même panne reviendra dans ton prochain projet.

SymptômeCause probableComment le vérifierSolution
Reset quand un servo ou un moteur bougeL'appel de courant effondre la ligne 5 VLa tension minimale du sketch de diagnostic descend sous 4,5 VAlimentation 5–6 V séparée, masse commune, 470–1000 µF
Reset quand le relais retombe, pas quand il colleArc des contacts et pointe de la bobine (parasites)Le problème disparaît sans la charge du relaisAlimentation séparée via JD-VCC, snubber ou varistance, diode de roue libre
Repart à zéro à l'ouverture du Moniteur sérieAuto-reset par DTR (comportement normal)Le message de démarrage apparaît à chaque ouverture du portPas une panne ; si besoin, 10 µF entre RESET et GND
Reset seulement sur l'ordinateur, stable sur adaptateurLe port USB ou le hub ne fournit pas assez de courantRéglé avec un autre port et un câble court et épaisPort arrière ou hub alimenté, charges sur alimentation séparée
Reset lors d'un mouvement sur pile 9 VRésistance interne élevée, la tension s'effondreVin descend sous 7 V pendant le mouvement6 piles AA ou pack 2S 18650
Reset ou blocage après des minutes ou des heuresRAM saturée, fragmentation due à StringLa RAM libre baisse petit à petitF(), tableaux de char, snprintf, petits tableaux locaux
Reset à intervalles parfaitement réguliersLe watchdog n'est pas relancé à tempsL'intervalle correspond au délai du watchdogAjouter wdt_reset() ou allonger le délai, éviter les longs delay()
Sur un Nano, le code ne démarre plus après un reset du watchdogBug du watchdog de l'ancien bootloaderLa carte ne se programme qu'avec Old BootloaderGraver le bootloader Optiboot
Blocages aléatoires avec un long câble de capteurLe bus I2C se bloque à cause des parasitesL'indicateur de délai d'attente de Wire est levéFils courts et torsadés, pull-up de 2,2 kΩ, setWireTimeout, watchdog
Reset quand on approche la main ou qu'on toucheLong fil sur la broche RESET, électricité statiqueRéglé en retirant le filLigne RESET courte, circuit dans un boîtier
Le régulateur chauffe beaucoup, puis resetCourant élevé avec 12 V sur le jack, protection thermiqueRégulateur trop chaud pour être touchéAdaptateur 7–9 V ou module abaisseur 5 V
La carte ne s'allume pas ou le port disparaîtCourt-circuit, fusible USB déclenchéSans les modules, la carte s'allumeTrouver le court-circuit, vérifier si la carte est endommagée

Port USB trop faible et reset à l'ouverture du Moniteur série

Un port USB 2.0 fournit 500 mA et un port USB 3.0 900 mA ; mais comme le fusible USB de l'Uno limite à 500 mA, un port USB 3.0 ne t'apporte aucun courant supplémentaire. Un hub USB non alimenté partage le courant d'un seul port entre tous ses appareils, les prises en façade d'un PC perdent de la tension à cause de leurs fins câbles internes, et les portables sur batterie peuvent alimenter faiblement leurs ports en mode économie d'énergie. Branche la carte directement sur un port arrière avec un câble court et de bonne qualité. Il existe aussi un reset qui n'est pas une panne : l'Uno et le Nano se réinitialisent via le signal DTR quand le Moniteur série ou un programme Python ouvre le port, et c'est justement cette fonction qui permet le téléversement. Si tu communiques depuis Python, attends 2 secondes après l'ouverture du port (communication série entre Arduino et Python). Pour désactiver complètement ce reset, place un condensateur de 10 µF entre RESET et GND et retire-le pour téléverser. Les détails du port série sont dans Moniteur série Arduino.

L'ESP32 redémarre tout seul : lire la cause du reset

L'ESP32 est encore plus sensible aux mêmes problèmes, car il fonctionne en 3,3 V et consomme environ 240 mA lors des émissions Wi-Fi, davantage en pointes brèves ; Espressif recommande une alimentation capable de fournir au moins 500 mA. La bonne nouvelle, c'est que l'ESP32 te dit lui-même pourquoi il a redémarré. Le message Brownout detector was triggered dans le Moniteur série signale une chute de tension, et les lignes rst:0xf (RTCWDT_BROWN_OUT_RESET) ou Guru Meditation Error au démarrage indiquent la cause du reset. Le code ci-dessous lit cette même information avec esp_reset_reason() et la traduit en texte lisible. Sur l'ESP32, le bouton EN éteint et rallume complètement la puce ; un reset par ce bouton apparaît donc lui aussi comme une mise sous tension. Tous les messages et leurs solutions sont dans ESP32 : erreurs brownout et Guru Meditation.

C++ (Arduino IDE)
1#include <esp_system.h>
2
3// Reset sebebini yazıya çevir / turn the reset reason into text
4const char* reasonText(esp_reset_reason_t r) {
5  switch (r) {
6    case ESP_RST_POWERON:   return "Guc acilisi ya da EN tusu / power-on or EN button";
7    case ESP_RST_SW:        return "Yazilimla (ESP.restart) / software restart";
8    case ESP_RST_PANIC:     return "Cokme (Guru Meditation) / panic";
9    case ESP_RST_INT_WDT:   return "Kesme watchdog'u / interrupt watchdog";
10    case ESP_RST_TASK_WDT:  return "Gorev watchdog'u / task watchdog";
11    case ESP_RST_WDT:       return "Diger watchdog / other watchdog";
12    case ESP_RST_DEEPSLEEP: return "Derin uykudan uyanma / deep sleep wake-up";
13    case ESP_RST_BROWNOUT:  return "Gerilim dusmesi (brownout) / brownout";
14    default:                return "Bilinmeyen / unknown";
15  }
16}
17
18void setup() {
19  Serial.begin(115200);
20  delay(500);
21  esp_reset_reason_t r = esp_reset_reason();
22  Serial.print("Reset nedeni / reset reason: ");
23  Serial.println(reasonText(r));
24}
25
26void loop() {
27  Serial.print("Calisma suresi / uptime (s): ");
28  Serial.println(millis() / 1000);
29  delay(5000);
30}

Raspberry Pi Pico : cause du reset et watchdog (MicroPython)

Grâce à son régulateur buck-boost, la Raspberry Pi Pico fonctionne avec n'importe quelle tension entre 1,8 et 5,5 V sur la broche VSYS ; elle supporte donc mieux les chutes de tension qu'un Arduino. Pourtant, si tu branches un servo sur la broche VBUS, qui porte le 5 V de l'USB, le courant est tiré directement du port de l'ordinateur et, si le port s'effondre, la Pico s'éteint aussi ; évite également de tirer plus de 300 mA au total sur la broche 3V3. La broche de reset de la Pico, RUN, est tirée vers le haut par une résistance interne d'environ 50 kΩ ; y brancher un long fil ouvre la porte aux parasites, exactement comme la broche RESET de l'Arduino. En MicroPython, machine.reset_cause() ne renvoie que deux valeurs sur la Pico : PWRON_RESET pour la mise sous tension ou la broche RUN, et WDT_RESET pour le watchdog ou machine.reset(). Le watchdog se règle au maximum à 8388 ms et ne peut plus être arrêté une fois lancé ; il continue de redémarrer la carte même si tu arrêtes le programme dans Thonny. C'est pourquoi il vaut mieux placer une attente de 3 secondes au début du code.

MicroPython
1import machine, time
2from machine import Pin
3
4time.sleep(3)   # Thonny durdurabilsin diye bekle / wait so Thonny can stop the script
5
6neden = machine.reset_cause()
7if neden == machine.WDT_RESET:
8    print("Watchdog ya da machine.reset() / watchdog or machine.reset()")
9else:
10    print("Guc acilisi ya da RUN pini / power-on or RUN pin")
11
12led = Pin("LED", Pin.OUT)          # Pico ve Pico W dahili LED / onboard LED
13wdt = machine.WDT(timeout=5000)    # 5 sn; RP2040'ta en fazla 8388 ms / max 8388 ms on RP2040
14
15sayac = 0
16while True:
17    led.toggle()
18    sayac += 1
19    print("Calisiyor / running", sayac)
20    wdt.feed()                     # her turda besle / feed it every loop
21    time.sleep(1)

La bonne alimentation selon ton projet

  • Voiture robot : alimente les moteurs avec un pack 2S 18650 via un L298N ou un L9110S et place un condensateur de 100 nF aux bornes de chaque moteur ; le montage est décrit dans fabriquer une voiture robot Arduino.
  • Bras robotique à servos : pour quatre servos ou plus, utilise une alimentation 5–6 V qui fournit au moins 3 à 5 A et ajoute 1000 µF sur la ligne des servos ; pour le choix des composants, vois servo MG996R et bras robotique Arduino.
  • Arrosage avec pompe et relais : alimente la pompe séparément, isole le relais avec JD-VCC et éloigne les longs câbles des capteurs du câble de la pompe (capteur d'humidité du sol).
  • Rubans LED et NeoPixel : compte environ 2 A pour 30 LED, place 1000 µF à l'entrée du ruban et une résistance de 300 à 500 Ω sur la ligne de données (WS2812B NeoPixel).
  • Commande de moteurs à courant continu : n'oublie pas la diode de roue libre sur chaque moteur piloté par un transistor ou un MOSFET ; pour les cartes de pilotage toutes faites, vois piloter un moteur à courant continu avec le L298N.
  • Station de capteurs en extérieur : active le watchdog, règle un délai d'attente I2C et alimente l'ensemble avec une source efficace comme l'abaisseur de tension LM2596.

Un Arduino qui redémarre tout seul, c'est agaçant, mais il y a presque toujours une cause mesurable et réparable : identifie d'abord le symptôme, mesure ensuite la tension et la RAM avec le sketch de diagnostic, puis sépare l'alimentation, relie les masses, ajoute le condensateur et la diode et, si besoin, sécurise le projet avec le watchdog. Une fois ce montage en place, tes projets avec servos, moteurs et relais tourneront des jours sans souci. Dans l'application BlueGrays, tu trouveras la commande de servomoteurs, une voiture Bluetooth avec L298N, un robot qui évite les obstacles, la commande d'une lampe 230 V et une station d'arrosage intelligente, avec des schémas qui montrent les bons branchements d'alimentation et du code pas à pas.

Questions fréquentes

Pourquoi mon Arduino redémarre-t-il tout seul ?

La cause la plus fréquente est l'appel de courant soudain d'un servo, d'un moteur ou d'un relais, qui fait chuter la ligne 5 V un instant ; la protection contre les sous-tensions à 2,7 V du processeur redémarre alors la carte. Les parasites des contacts de relais, une RAM saturée, un watchdog non relancé et un port USB trop faible provoquent aussi des resets. Alimenter servos et moteurs séparément et relier les masses règle la plupart des cas.

Pourquoi l'Arduino redémarre-t-il quand le servo bouge ?

Même un petit servo SG90 consomme plus de 0,5 A au démarrage et, avec les autres charges de la carte, dépasse la limite du port USB et du fusible de 500 mA de l'Uno. Quand la tension s'effondre, la carte redémarre. Alimente le servo avec une source 5–6 V séparée, relie sa masse à la GND de l'Arduino et ajoute un condensateur de 470 à 1000 µF sur la ligne du servo.

Pourquoi l'Arduino redémarre-t-il quand un relais commute ?

La bobine d'un relais appelle un pic de courant en s'activant, et la bobine et les contacts produisent des parasites quand il retombe. L'arc qui se forme à la coupure de charges inductives comme une pompe, un ventilateur ou un tube fluorescent peut redémarrer l'Arduino. Sur un module à optocoupleur, retire le cavalier JD-VCC et alimente les relais séparément, ajoute un snubber ou une varistance sur la charge et éloigne les câbles des capteurs de ceux de la charge.

Pourquoi l'Arduino se fige-t-il au bout d'un moment ?

Les blocages qui apparaissent après des minutes ou des heures viennent le plus souvent d'une RAM qui se remplit et de concaténations de String qui fragmentent la mémoire. Un bus I2C bloqué par des parasites ou un code qui attend dans une boucle infinie figent aussi la carte. Mesure la RAM libre, utilise des tableaux de char au lieu de String, fixe un délai d'attente avec Wire.setWireTimeout() et active le watchdog par sécurité.

Quel condensateur mettre sur un montage Arduino ?

Sur la ligne d'alimentation des servos et des moteurs, 470 à 1000 µF conviennent, et entre 5V et GND de l'Arduino un électrolytique de 100 µF. Ajouter à côté de chacun un condensateur céramique de 100 nF (104) filtre aussi les parasites haute fréquence. La tension nominale de l'électrolytique doit valoir au moins le double de celle de la ligne, et sa patte négative, repérée par la bande, va à la GND.

Pourquoi l'Arduino redémarre-t-il quand j'ouvre le Moniteur série ?

L'Uno et le Nano se réinitialisent via le signal DTR à l'ouverture du port série ; ce n'est pas une panne mais l'auto-reset qui permet le téléversement. Si tu communiques depuis un programme comme Python, attends 2 secondes après l'ouverture du port. Pour désactiver ce reset, place un condensateur de 10 µF entre RESET et GND et retire-le avant de téléverser.

Voir tous les projets
Utilisation du servomoteur
#35Débutant
Premium

Utilisation du servomoteur

Le bras d'un petit servomoteur tourne tour à tour vers trois positions : tout au début, pile au milieu et tout au bout, en attendant deux secondes à chaque arrêt. L'Arduino indique au moteur l'angle à

4.7(48)
67
Ampoule 220V avec bouton poussoir (Push)
#19Avancé
Premium

Ampoule 220V avec bouton poussoir (Push)

Tant que tu appuies sur le bouton, une vraie ampoule de 220 volts reste allumée, et elle s'éteint dès que tu relâches. Le petit signal de l'Arduino ne peut pas allumer l'ampoule directement : un relai

4.4(30)
38
Voiture contrôlée par Bluetooth avec L298N
#80Avancé
Premium

Voiture contrôlée par Bluetooth avec L298N

Transforme ton téléphone en télécommande et pilote ta propre voiture robot. L'Arduino reçoit, via un module Bluetooth, les ordres d'une appli de télécommande sur ton téléphone et fait tourner les roue

5.0(38)
65
Robot évitant les obstacles
#81Avancé
Premium

Robot évitant les obstacles

Que diriez-vous de construire un véhicule intelligent qui trouve son propre chemin ? Le Robot Évitant les Obstacles scrute en permanence son environnement grâce au capteur ultrasonique situé devant lu

5.0(38)
49
Station d'irrigation intelligente
#83Avancé
Premium

Station d'irrigation intelligente

Un jardinier qui arrose tes plantes tout seul pour qu'elles ne sèchent pas pendant tes vacances. Un capteur d'humidité mesure à quel point la terre est mouillée ; quand elle devient sèche, l'Arduino f

5.0(42)
57
Chorégraphie de servos en cercle - Motifs animés avec 32 servos
#102Avancé
Premium

Chorégraphie de servos en cercle - Motifs animés avec 32 servos

Un projet d'animation visuelle utilisant 32 servomoteurs disposés en cercle sur un Arduino Mega. Les servos sont gérés en un seul réseau et connectés aux broches 22-53 du Mega pour afficher quatre séquences de mouvement différentes : une vibration chaotique où tous les servos se déplacent à des angles aléatoires, un balayage synchrone où ils se déplacent tous en même temps, une vague tournant doucement autour d'un cercle, et enfin une aiguille de boussole se balançant à gauche et à droite. L'eff

4.5(40)
62
Servomoteur ESP32 (commande par potentiomètre)
#118Intermédiaire
Premium

Servomoteur ESP32 (commande par potentiomètre)

Dans ce projet, nous contrôlons un servomoteur SG90 à l'aide d'un potentiomètre. Nous réglons l'angle du servomoteur en mappant la valeur analogique lue par le potentiomètre sur une plage de 0 à 180 degrés. La bibliothèque ESP32Servo génère des signaux de servomoteur sur les GPIO appropriés de l'ESP32 pouvant fonctionner en sortie ; ce projet utilise GPIO 18. Il s'agit d'une méthode de contrôle fondamentale pour les bras robotiques, les cardans de caméra et les mécanismes de portes automatiques.

4.3(29)
42