Guias · 18 min de leitura

Arduino reiniciando sozinho? Resolva problemas de servo, relé e travamento

Arduino reiniciando ou travando? Resolva passo a passo: corrente de servo e relé, quedas de tensão, GND comum, capacitores de 470 µF, estouro de RAM e o watchdog.

Se o seu Arduino fica reiniciando ou trava depois de funcionar um tempo, a placa quase nunca está com defeito. Na maioria dos casos, a causa é a alimentação: quando um servo começa a se mover, um motor acelera ou um relé fecha, o consumo repentino de corrente derruba a linha de 5 V por um instante e a proteção contra tensão baixa do processador (brown-out) reinicia a placa. Nos casos restantes, o culpado é o ruído elétrico de relés e motores, fios longos, a RAM cheia, um watchdog esquecido ou uma porta USB do computador que não fornece corrente suficiente.

Neste guia, você vai aprender primeiro a distinguir se a placa está realmente reiniciando ou só travando. Depois explicamos como cada causa funciona, com valores reais de corrente e tensão, e mostramos as soluções com código: alimentação separada e GND comum, capacitores de 100–470 µF, diodos de roda livre, buffers fixos no lugar de String e o watchdog. Você também vai encontrar um sketch de diagnóstico que mede a própria tensão de alimentação do Arduino e a RAM livre, uma tabela de diagnóstico passo a passo do sintoma à solução e exemplos que leem o motivo do reinício no ESP32 e no Raspberry Pi Pico.

Placa Arduino Uno R3
Arduino Uno R3: os 5 V do USB passam por um fusível rearmável de 500 mA. Quando a placa reinicia, o programa começa de novo a partir do setup(); o botão RESET e o pino RESET fazem o mesmo.

Reinício ou travamento? Identifique o sintoma primeiro

Um Arduino que reinicia roda o programa desde o começo, como se você tivesse tirado e posto o cabo USB de novo: o setup() roda outra vez, o servo volta ao ângulo inicial, o LCD mostra de novo o texto de abertura e a mensagem de início reaparece no Monitor Serial. Já um Arduino travado não responde a nada; os LEDs ficam no último estado, a saída serial para e a placa fica assim até você apertar o botão de reset. Como as causas e as soluções são diferentes, comece descobrindo qual é o seu caso. O jeito mais fácil é acrescentar uma linha Serial.println("STARTED") ao setup() e deixar o Monitor Serial aberto.

SintomaReinícioTravamento
O setup() roda de novo?Sim, a mensagem de início aparece de novoNão
Saída serialPara e depois recomeça com a mensagem de inícioPara e nunca mais volta
Saídas e LEDsApagam por um instante e voltam ao estado inicialFicam presos no último estado
Causa mais comumQueda de tensão, ruído, watchdogLaço infinito, barramento I2C travado, RAM corrompida
Verifique primeiroAlimentação, GND e ligaçõesCódigo, uso de memória e ligações dos sensores

Por que um Arduino reinicia sozinho? As fontes de reset

Só algumas fontes conseguem reiniciar o processador ATmega328P do Arduino Uno e do Nano, e cada uma tem seu próprio gatilho. Quando a tensão de alimentação cai abaixo de um certo limite, entra em ação o detector de brown-out (BOD); no Uno e no Nano, a configuração dos fusíveis põe esse limite em 2,7 V. Qualquer coisa que leve o pino RESET a LOW também reinicia a placa: o botão de reset, o sinal DTR do computador ou o ruído captado por um fio longo ligado a esse pino. Há também um caso que parece um reset, mas não é: a memória corrompida faz o programa saltar para o endereço 0 e o código recomeça, mas, como os periféricos de hardware não são reiniciados, a placa começa a se comportar de forma estranha.

Fonte de resetO que dispara?Sintoma típico
Ligação da alimentação (POR)Conectar o cabo, a alimentação cair por completoPartida normal
Reset externo (pino RESET)Botão de reset, abrir o Monitor Serial (DTR), ruído no pino RESETReinicia quando a porta é aberta ou quando se toca em um fio
Brown-out (BOD, 2,7 V)Corrente de partida de servo, motor, relé ou fita de LED, bateria fracaReinicia no momento em que a carga se move
WatchdogO wdt_reset() não foi chamado a tempoReinicia em intervalos regulares (ex.: exatamente a cada 2 segundos)
Falha de softwareArray fora dos limites, estouro de RAM, ponteiro erradoReinício ou travamento aleatório depois de minutos ou horas

Corrente de servo, motor e relé: como uma queda de tensão causa um reset

Um servo SG90 consome 100–250 mA enquanto se move, mas na partida e com o braço carregado a corrente salta acima de 0,5 A. Uma porta USB 2.0 de computador fornece no máximo 500 mA, e o fusível da linha USB do Uno trabalha no mesmo limite. Quando o servo, os 50 mA da própria placa e alguns módulos passam desse limite, a porta ou o fusível limitam a corrente, a linha de 5 V cai por um instante e, se a tensão ficar abaixo de 2,7 V, o BOD reinicia a placa. O caso mais traiçoeiro é quando a tensão fica entre 2,7 V e uns 3,8 V: segundo a folha de dados do ATmega328P, o chip precisa de cerca de 3,8 V para funcionar com segurança a 16 MHz. Nessa zona cinzenta, o BOD não dispara, mas o processador funciona fora do seu limite de velocidade, então a placa pode travar em vez de reiniciar, gerar valores sem sentido, ou displays e sensores I2C podem travar internamente.

CargaCorrente normalCorrente de picoAlimentar pelo pino 5V do Uno?
Microsservo SG90100–250 mA0,5 A ou mais (partida, carga)Só um único servo com carga leve
Servo MG996R0,5–0,9 AAté 2,5 ANão, uma fonte separada de 5–6 V é obrigatória
Motor CC com redução TT70–250 mA~1 A (partida, travamento)Não, driver de motor e fonte separada
Módulo relé de 5 V (um canal)70–90 mAPulso curto quando a bobina é energizada1–2 canais sim, 4 ou mais com fonte separada
LED WS2812B (cada um)~20 mA (uma cor no brilho máximo)60 mA (branco total)Não; 30 LEDs em branco total precisam de 1,8 A

Os fios também importam. Os jumpers finos usados em projetos com protoboard costumam ser de 26–28 AWG, e o fio de cobre 28 AWG tem cerca de 0,21 Ω por metro. Se você alimenta o servo por dois fios de 20 cm (0,4 m de ida e volta) e uma protoboard, os fios acrescentam uns 0,085 Ω, e quatro contatos da protoboard somam cerca de 0,2 Ω. Pela lei de Ohm (V = I × R), um pulso de 1 A do servo perde cerca de 0,3 V nesses 0,29 Ω. Um cabo USB fino e longo, o fusível e as peças de proteção da placa acrescentam mais uns meio ohm; durante o mesmo pulso, a linha de 5 V do Arduino cai abaixo de 4,5 V e, se a porta do computador começar a limitar a corrente, a queda é bem mais funda. Você pode calcular a queda no seu próprio circuito com a calculadora da lei de Ohm.

Alimente pelo pino 5V do Uno no máximo um servo SG90, com carga leve. Nunca ligue servos grandes como o MG996R, motores CC ou fitas de LED no pino 5V ou 3.3V do Arduino: a placa vai reiniciar e, com o tempo, o fusível do USB, o regulador e até a porta USB do computador podem se danificar.

Solução 1: fonte de alimentação separada e GND comum

  1. Escolha uma fonte separada para servos e motores: para servos, um adaptador de 5–6 V que forneça pelo menos 1 A por servo (2–3 A para um MG996R), um pack de 4×AA NiMH ou um módulo buck LM2596 ajustado para 5–6 V.
  2. Ligue o positivo da fonte só aos fios vermelhos dos servos ou à entrada de alimentação do driver de motor; não ligue essa linha ao pino 5V do Arduino.
  3. Ligue o negativo (GND) da fonte tanto à carga quanto ao pino GND do Arduino. Sem esse GND comum, a tensão do pino de sinal fica sem referência; o servo treme ou nem se move.
  4. Una os GNDs em um único ponto ao lado da fonte (aterramento em estrela). A corrente do motor não pode voltar passando pelo Arduino e pelas trilhas de GND dele; senão, o nível do GND do Arduino se desloca a cada pulso do motor.
  5. Alimente o Arduino pela própria entrada: USB, o conector DC (7–12 V) ou 5 V regulados. Assim o processador não é afetado mesmo que a fonte dos servos caia.
  6. Por fim, meça entre os pinos 5V e GND do Arduino enquanto o servo se move, ou rode o sketch de diagnóstico abaixo; a tensão não deve cair abaixo de 4,75 V.
Módulo regulador de tensão abaixador LM2596
Módulo buck LM2596: o trimpot permite baixar uma tensão mais alta, como a de um adaptador de 12 V ou de um pack 2S de íon-lítio, para 5–6 V. É o jeito mais prático de montar uma linha de alimentação para servos independente do Arduino. Ajuste a saída com um multímetro antes de ligar a carga.
Explicamos por que um GND comum é essencial e como funciona o aterramento em estrela em O que é GND?, e como escolher baterias e adaptadores no guia de como alimentar o Arduino com bateria. A regra é simples: os fios de sinal vêm do Arduino, os fios de alimentação vêm da fonte, e os GNDs são unidos.

Solução 2: capacitores (100–470 µF) e diodos

Um capacitor eletrolítico funciona como um pequeno reservatório de energia ao lado da carga: quando o servo pede uma corrente repentina, ele mesmo fornece essa corrente até os fios e a fonte darem conta. A fórmula ΔV = I × Δt / C mostra o quanto ele ajuda. Um capacitor de 470 µF deixa a tensão cair só 0,21 V durante um pulso de 1 A que dura 100 µs; se o mesmo pulso durar 1 ms, a queda é de 2,1 V. Ou seja, um capacitor engole pulsos curtos e o ruído das escovas do motor, mas não substitui uma fonte insuficiente. Ponha 470–1000 µF na linha dos servos e 100 µF entre o 5V e o GND do Arduino, e acrescente ao lado de cada um um capacitor cerâmico de 100 nF com a marcação 104 para o ruído de alta frequência. Use a ferramenta de código de capacitores para ler as marcações e a calculadora de associação de capacitores para achar o total de capacitores em paralelo; as diferenças entre os tipos estão em O que é um capacitor?.

Onde?ValorPor quê?
Linha de alimentação dos servos, ao lado do servoEletrolítico de 470–1000 µF / 10–16 V + 100 nFSuaviza o pulso de partida
Entre os dois terminais de um motor CCCerâmico de 100 nFFiltra o ruído das faíscas das escovas
Entre o 5V e o GND do ArduinoEletrolítico de 100 µF + 100 nFProtege a linha do processador de quedas curtas
Entrada da fita WS2812B1000 µF / 10 VSegura a corrente de partida e os pulsos de troca de cor
Pinos de alimentação de sensores e módulosCerâmico de 100 nFFiltra o ruído trazido por fios longos
Capacitores eletrolíticos de valores diferentes
Capacitores eletrolíticos: um valor como 470 µF / 16 V é ideal para uma linha de servos de 5 V. A faixa no corpo marca a perna negativa (−); a tensão nominal deve ser pelo menos o dobro da tensão da linha.

Bobinas de relé, motores e solenoides são todos indutores. Quando a corrente que passa por eles é cortada de repente, a bobina resiste à mudança e produz um pico de tensão curto de dezenas ou até centenas de volts, muito acima da tensão de alimentação. Esse pico se espalha pela linha e reinicia o Arduino, e também pode destruir o transistor do driver ou o pino. A solução é um diodo de roda livre (flyback) ligado em paralelo com a bobina, ao contrário: a ponta do cátodo de um 1N4007, com a faixa, vai para o lado positivo, e a outra ponta para o lado que vai ao transistor. Os módulos relé prontos já têm esse diodo; se você usa um relé solto, um solenoide ou um motor acionado por transistor ou MOSFET, precisa acrescentar o diodo você mesmo. Para motores com controle de velocidade por PWM, o diodo Schottky 1N5819, mais rápido, dá melhores resultados. Para os detalhes, veja O que é um diodo? e como usar um MOSFET com Arduino.

Diodo retificador 1N4007
Diodo 1N4007: a faixa cinza no corpo é a ponta do cátodo (−). Ligado ao contrário sobre uma bobina, ele curto-circuita e apaga o pico de tensão criado quando a corrente é cortada.

Ruído, contatos de relé e fios longos

Se a placa reinicia exatamente quando um relé desliga, o problema é ruído, não alimentação. Quando um relé desliga uma bomba d'água, uma ventoinha, uma lâmpada fluorescente ou um contator, forma-se um pequeno arco entre os contatos, e esse arco irradia ruído eletromagnético de banda larga. O ruído se acopla aos fios de sensores próximos, à linha RESET e às linhas I2C, reiniciando o processador ou travando um módulo. Para evitar isso, use um módulo relé com optoacoplador, tire o jumper JD-VCC e alimente as bobinas dos relés por uma fonte de 5 V separada; isso mantém a corrente das bobinas e o ruído longe da linha do Arduino. Com cargas indutivas ligadas à rede, um snubber RC (100 Ω + 100 nF, classe X2) ou um varistor sobre os contatos ou sobre a carga reduz muito o arco. Os detalhes das ligações estão em O que é um módulo relé?, e a ideia por trás da isolação em O que é um optoacoplador?.

  • Mantenha o I2C curto: o I2C foi feito para distâncias curtas em uma placa de circuito. Mantenha os fios SDA e SCL com menos de 50 cm; em trechos mais longos, baixe os resistores de pull-up de 4,7 kΩ para 2,2 kΩ e deixe a velocidade em 100 kHz.
  • Use fios trançados: trance cada fio de sinal com um fio de GND; os pares trançados de um cabo de rede são ideais para isso.
  • Separe alimentação e sinal: não passe fios de sensores em paralelo com fios de motor, relé ou da rede elétrica; se precisarem se cruzar, cruze em ângulo reto.
  • Deixe o pino RESET em paz: um fio longo no pino RESET funciona como antena e reinicia a placa quando é tocado ou quando um motor próximo funciona. Se você precisa de um botão de reset externo, mantenha o fio curto.
  • Ferrites e um gabinete: anéis de ferrite nos fios dos motores e um gabinete metálico reduzem o ruído de alta frequência.
  • Acrescente um tempo limite: se o ruído travar o barramento I2C, a biblioteca Wire espera para sempre por padrão e a placa trava. O código abaixo evita esse travamento com um tempo limite.
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}

Estouro de RAM e uso de String

O Arduino Uno tem só 2 KB de SRAM, e esse espaço pequeno é dividido entre as variáveis globais, a memória dinâmica (heap) e a pilha (stack) usada pelas chamadas de função. Se você vir o aviso Low memory available, stability problems may occur. no fim da compilação, a placa provavelmente vai falhar depois de um tempo. A causa mais traiçoeira é a classe String: cada concatenação aloca um pedaço novo no heap, o antigo é liberado e, com o tempo, a memória fica cheia de buracos. Um dia a pilha colide com o heap e o programa reinicia ou trava em um momento aleatório. Como isso costuma aparecer depois de minutos ou horas, é fácil de distinguir dos problemas de alimentação. Guarde textos constantes na flash com a macro F(), use arrays de char de tamanho fixo e snprintf() no lugar de String, e não declare arrays locais grandes dentro de funções. O código abaixo mostra a RAM livre a cada segundo; se o valor não para de cair, há um vazamento de memória. A história completa está em memória insuficiente no Arduino.

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: um cinto de segurança contra travamentos

O watchdog timer é um contador dentro do processador que funciona de forma independente, com o seu próprio oscilador de 128 kHz. O seu programa precisa alimentá-lo regularmente com wdt_reset(); se não for alimentado dentro do tempo definido (entre 15 ms e 8 segundos), o watchdog reinicia a placa. Assim, um barramento I2C travado, uma função presa em um laço infinito ou uma leitura de sensor corrompida por ruído não conseguem travar a placa para sempre; ela se recupera em poucos segundos. Lembre-se de que o watchdog é um cinto de segurança, não um conserto: ele não corrige problemas de alimentação ou de memória, só permite que um projeto em campo se recupere sozinho. Escolha um tempo limite bem maior que a operação mais longa do seu código; em um código com delay(3000), um watchdog de 2 segundos vai reiniciar a placa sem parar.

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}
O watchdog é perigoso em clones do Nano com o bootloader antigo. Esse bootloader não desliga o timer depois de um reset do watchdog; o timer continua rodando no período mais curto (cerca de 16 ms) e o bootloader não consegue terminar o trabalho dele nesse tempo. O resultado é um ciclo infinito de resets em que o seu código nunca começa; a placa só se recupera quando você tira e põe o cabo USB, e o ciclo recomeça na primeira vez que o watchdog dispara. Se a sua placa precisa da opção ATmega328P (Old Bootloader) em Ferramentas > Processador, grave o bootloader Optiboot antes de usar o watchdog; explicamos como em erros ao carregar código no Arduino. O bootloader Optiboot do Uno não tem esse problema.

Sketch de diagnóstico: deixe o Arduino medir a própria tensão e a RAM

Um multímetro é lento demais para ver quedas de tensão de milissegundos. Em vez disso, você pode usar o próprio Arduino como um instrumento de medição simples: o código abaixo usa o ADC para medir a referência interna de 1,1 V do chip e calcula a partir dela a tensão de alimentação, cerca de 9000 vezes por segundo, e mostra o menor valor de cada segundo. Ele também incrementa um contador na EEPROM a cada inicialização, então mesmo que você abra o Monitor Serial depois, dá para ver quantas vezes a placa reiniciou. Como carga de teste, ele move o servo do D9 entre 0 e 180 graus a cada 2 segundos; se você tem o seu próprio projeto, pode acrescentar a parte de medição ao código dele. Abra o Monitor Serial em 115200 baud.

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}

Leia os resultados assim: em um Uno saudável alimentado pelo USB, o menor valor fica entre 4,6 e 5,1 V. Se o valor cai abaixo de 4,5 V toda vez que o servo se move e os resets coincidem com esses momentos, o problema é a alimentação. Se o número de inicializações continua subindo enquanto a tensão fica estável, procure ruído ou uma causa de software; se a RAM livre também diminui o tempo todo, há um vazamento de memória. A referência interna de 1,1 V pode variar cerca de 10% de um chip para outro, então compare a leitura uma vez com um multímetro: se o multímetro mostra 4,95 V enquanto o código mostra 5,10 V, mude a constante 1125300 para 1125300 × 4,95 / 5,10 ≈ 1092200. Tire o contador da EEPROM do código quando terminar; as células da EEPROM aguentam cerca de 100.000 gravações.

Tabela de diagnóstico passo a passo: sintoma, causa, solução

Leia a tabela de cima para baixo; as primeiras linhas são as causas mais comuns. Mude só uma coisa de cada vez e rode o sketch de diagnóstico de novo. Se você mudar três coisas de uma vez, não vai saber qual resolveu o problema, e a mesma falha vai voltar no seu próximo projeto.

SintomaCausa provávelComo confirmarSolução
Reinicia quando um servo ou motor se moveA corrente de partida derruba a linha de 5 VA menor tensão no sketch de diagnóstico cai abaixo de 4,5 VFonte separada de 5–6 V, GND comum, 470–1000 µF
Reinicia quando um relé solta, não quando fechaArco nos contatos e pico da bobina (ruído)O problema some quando a carga do relé é retiradaFonte separada via JD-VCC, snubber ou varistor, diodo de roda livre
Recomeça quando o Monitor Serial abreAuto-reset por DTR (comportamento normal)STARTED aparece toda vez que a porta abreNão é defeito; se preciso, 10 µF entre RESET e GND
Reinicia só no computador, funciona bem no adaptadorA porta USB ou o hub não fornece corrente suficienteResolve com outra porta e um cabo curto e grossoUse uma porta traseira ou um hub com alimentação, alimente as cargas separadamente
Reinicia nos movimentos quando funciona com bateria de 9VResistência interna alta, a tensão desabaO Vin cai abaixo de 7 V durante o movimento6×AA ou um pack 2S de 18650
Reinicia ou trava depois de minutos ou horasEstouro de RAM, fragmentação por StringA RAM livre não para de diminuirF(), arrays de char, snprintf, arrays locais pequenos
Reinicia em intervalos regulares exatosO watchdog não é alimentado a tempoO intervalo entre resets é igual ao tempo limite do watchdogAcrescente wdt_reset() ou aumente o tempo limite, evite delay() longo
No Nano, o código nunca começa depois de um reset do watchdogBug do watchdog no bootloader antigoA placa só carrega com a opção Old BootloaderGrave o bootloader Optiboot
Travamentos aleatórios quando um cabo de sensor longo está ligadoO barramento I2C trava por ruídoA flag de tempo limite da Wire está ativadaFios curtos e trançados, pull-ups de 2,2 kΩ, setWireTimeout, watchdog
Reinicia quando você aproxima a mão ou tocaFio longo no pino RESET, eletricidade estáticaResolve quando o fio é retiradoMantenha a linha RESET curta, ponha o circuito em um gabinete
O regulador esquenta muito e depois reiniciaCorrente alta com 12 V no conector, desligamento térmico do reguladorO regulador fica quente demais para tocarAdaptador de 7–9 V ou um módulo buck de 5 V
A placa não liga ou a porta someCurto-circuito, fusível do USB desarmouA placa liga quando os módulos são retiradosEncontre o curto, verifique se a placa foi danificada

Porta USB que não fornece corrente suficiente e o reset do Monitor Serial

A porta USB 2.0 de um computador fornece 500 mA, e a USB 3.0, 900 mA; mas como o fusível do USB do Uno limita em 500 mA, uma porta USB 3.0 não dá corrente a mais. Um hub USB sem alimentação divide a corrente de uma porta entre todos os dispositivos, as portas frontais perdem tensão pelos cabos internos finos, e notebooks na bateria podem alimentar mal as portas no modo de economia de energia. Ligue a placa direto em uma porta traseira, com um cabo curto e de boa qualidade. Também há um reset que não é defeito: o Uno e o Nano reiniciam sozinhos pelo sinal DTR quando o Monitor Serial ou um programa em Python abre a porta, e é justamente esse recurso que torna o carregamento possível. Se você se comunica pelo Python, espere 2 segundos depois de abrir a porta (comunicação serial entre Arduino e Python). Se quiser desativar o reset de vez, ponha um capacitor de 10 µF entre RESET e GND e tire-o na hora de carregar. Os detalhes da porta serial estão em Monitor Serial do Arduino.

ESP32 reiniciando sem parar: lendo o motivo do reset

O ESP32 é ainda mais sensível aos mesmos problemas, porque funciona com 3,3 V e consome cerca de 240 mA durante a transmissão Wi-Fi, mais em picos curtos; a Espressif recomenda uma fonte capaz de fornecer pelo menos 500 mA. A boa notícia é que o próprio ESP32 diz por que reiniciou. A mensagem Brownout detector was triggered no Monitor Serial significa uma queda de tensão, e as linhas rst:0xf (RTCWDT_BROWN_OUT_RESET) ou Guru Meditation Error na inicialização mostram o motivo do reset. O código abaixo lê a mesma informação com esp_reset_reason() e a transforma em um texto legível. No ESP32, o botão EN desliga e liga o chip por completo, então um reset por esse botão também aparece como ligação da alimentação. Para todas as mensagens e soluções, veja brownout e erros Guru Meditation no ESP32.

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: motivo do reset e watchdog (MicroPython)

Graças ao regulador buck-boost, o Raspberry Pi Pico funciona com qualquer tensão entre 1,8 e 5,5 V no pino VSYS, então tolera quedas de tensão melhor que um Arduino. Mesmo assim, se você ligar um servo no pino VBUS, que leva os 5 V do USB, a corrente é puxada direto da porta do computador e, se a porta cair, o Pico cai junto; você também não deve puxar mais de 300 mA no total do pino 3V3. O pino de reset do Pico, o RUN, é puxado para cima por um resistor interno de cerca de 50 kΩ; ligar um fio longo nele deixa uma porta aberta para o ruído, como o pino RESET do Arduino. No MicroPython, machine.reset_cause() retorna só dois valores no Pico: PWRON_RESET para ligação da alimentação ou o pino RUN, e WDT_RESET para o watchdog ou machine.reset(). O watchdog pode ser ajustado para no máximo 8388 ms e não pode ser parado depois de iniciado; ele continua reiniciando a placa mesmo que você pare o programa no Thonny. Por isso ponha uma espera de 3 segundos no início do código.

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)

A disposição de alimentação certa para o seu projeto

  • Carrinho robô: alimente os motores com um pack 2S de 18650 por um L298N ou L9110S e ponha um capacitor de 100 nF sobre os terminais do motor; a montagem está em como fazer um carrinho robô com Arduino.
  • Braço robótico com servos: para quatro ou mais servos, use uma fonte de 5–6 V que forneça pelo menos 3–5 A e acrescente 1000 µF à linha dos servos; para escolher as peças, veja servo MG996R e braço robótico com Arduino.
  • Sistema de irrigação com bomba e relé: alimente a bomba por uma fonte separada, isole o relé com o JD-VCC e mantenha os fios longos dos sensores longe do cabo da bomba (sensor de umidade do solo).
  • Fitas de LED e NeoPixels: reserve cerca de 2 A para cada 30 LEDs e ponha 1000 µF na entrada da fita e um resistor de 300–500 Ω na linha de dados (WS2812B NeoPixel).
  • Acionando motores CC: não esqueça o diodo de roda livre em cada motor acionado por transistor ou MOSFET; para placas de driver prontas, veja controle de motor CC com o L298N.
  • Estação de sensores em campo: ative o watchdog, defina um tempo limite para o I2C e tire a alimentação de uma fonte eficiente como o conversor abaixador LM2596.

Um Arduino que reinicia sozinho irrita, mas quase sempre há uma causa mensurável e corrigível: primeiro identifique o sintoma, depois meça a tensão e a RAM com o sketch de diagnóstico, então separe a alimentação, una os GNDs, acrescente o capacitor e o diodo e, se preciso, proteja o projeto com o watchdog. Com essa estrutura montada, os seus projetos com servo, motor e relé vão funcionar por dias sem problema. No app BlueGrays você encontra controle de servo motor, um carrinho Bluetooth com L298N, um robô que desvia de obstáculos, controle de lâmpada de 220 V e uma estação de irrigação inteligente, com esquemas de circuito que mostram as ligações de alimentação corretas e código passo a passo.

Perguntas frequentes

Por que o meu Arduino fica reiniciando?

A causa mais comum é a corrente repentina de um servo, motor ou relé derrubar a linha de 5 V por um instante, fazendo a proteção contra tensão baixa de 2,7 V do processador reiniciar a placa. Ruído dos contatos de relés, estouro de RAM, um watchdog não alimentado e uma porta USB que não fornece corrente suficiente também causam resets. Alimentar servos e motores por uma fonte separada e unir os GNDs resolve a maioria dos casos.

Por que o meu Arduino reinicia quando o servo se move?

Até um pequeno servo SG90 consome mais de 0,5 A na partida e, junto com as outras cargas da placa, passa do limite da porta USB e do fusível de 500 mA do Uno. Quando a tensão desaba, a placa reinicia. Alimente o servo por uma fonte separada de 5–6 V, ligue o GND dessa fonte ao GND do Arduino e acrescente um capacitor de 470–1000 µF à linha do servo.

Por que o meu Arduino reinicia quando um relé chaveia?

A bobina de um relé puxa uma corrente repentina quando é energizada, e a bobina e os contatos geram ruído quando ele solta. O arco criado ao desligar cargas indutivas como bombas, ventoinhas ou lâmpadas fluorescentes pode reiniciar o Arduino. Em um módulo com optoacoplador, tire o jumper JD-VCC e alimente os relés por uma fonte separada, acrescente um snubber ou varistor sobre a carga e mantenha os fios dos sensores longe dos fios da carga.

Por que o meu Arduino trava depois de um tempo?

Travamentos que aparecem depois de minutos ou horas costumam ser causados pela RAM enchendo e por concatenações de String que fragmentam a memória. Um barramento I2C travado por ruído ou um código esperando em um laço infinito também podem travar a placa. Meça a RAM livre, use arrays de char no lugar de String, defina um tempo limite com Wire.setWireTimeout() e ative o watchdog como rede de segurança.

Que capacitor devo acrescentar ao meu circuito com Arduino?

470–1000 µF na linha de alimentação dos servos e motores e um capacitor eletrolítico de 100 µF entre o 5V e o GND do Arduino funcionam bem. Acrescentar ao lado de cada um um capacitor cerâmico de 100 nF (104) também filtra o ruído de alta frequência. A tensão nominal do eletrolítico deve ser pelo menos o dobro da tensão da linha, e a perna negativa, com a faixa, vai ao GND.

Por que o meu Arduino reinicia quando abro o Monitor Serial?

O Uno e o Nano reiniciam sozinhos pelo sinal DTR quando a porta serial é aberta; isso não é defeito, e sim o recurso de auto-reset que torna o carregamento possível. Se você se comunica por um programa como o Python, espere 2 segundos depois de abrir a porta. Para desativar o reset, ponha um capacitor de 10 µF entre RESET e GND e tire-o antes de carregar.

Ver todos os projetos
Uso de servo motor
#35Iniciante
Premium

Uso de servo motor

O braço de um pequeno servo motor gira para três posições em sequência: o início, o meio e o fim do percurso, esperando dois segundos em cada parada. O Arduino informa ao motor em qual ângulo ficar, e

4.7(48)
67
Acender uma lâmpada de 220V com botão de pressão
#19Avançado
Premium

Acender uma lâmpada de 220V com botão de pressão

Enquanto você mantém o botão pressionado, uma lâmpada de 220 volts fica acesa e apaga assim que você solta. O sinal fraco do Arduino não consegue acender a lâmpada diretamente, então um relé, que é um

4.4(30)
38
Carrinho controlado por Bluetooth com L298N
#80Avançado
Premium

Carrinho controlado por Bluetooth com L298N

Transforme seu celular em um controle remoto e dirija seu próprio carrinho robô. O Arduino recebe os comandos de um aplicativo de controle remoto no celular por meio de um módulo Bluetooth e aciona as

5.0(38)
65
Robô que desvia de obstáculos
#81Avançado
Premium

Robô que desvia de obstáculos

Que tal construir um veículo inteligente que encontra seu próprio caminho? O robô que desvia de obstáculos monitora o ambiente constantemente com o sensor ultrassônico na parte da frente. Ao encontrar

5.0(38)
49
Estação de irrigação inteligente
#83Avançado
Premium

Estação de irrigação inteligente

Um jardineiro que rega suas plantas sozinho para que elas não sequem enquanto você está de férias. Um sensor de umidade do solo mede o quanto a terra está úmida; quando ela seca, o Arduino aciona a bo

5.0(42)
57
Coreografia em círculo: animações com 32 servos
#102Avançado
Premium

Coreografia em círculo: animações com 32 servos

Um projeto de animação visual com 32 servo motores dispostos em círculo e controlados por um Arduino Mega. Os servos são gerenciados em um único array e conectados aos pinos 22–53 do Mega. Eles executam quatro sequências de movimento: uma vibração caótica em que todos vão para ângulos aleatórios, uma varredura sincronizada em que todos se movem ao mesmo tempo, uma onda que gira suavemente pelo círculo e, por fim, uma agulha de bússola que oscila de um lado para o outro.

4.5(40)
62
Servo motor com ESP32 (controle por potenciômetro)
#118Intermediário
Premium

Servo motor com ESP32 (controle por potenciômetro)

Neste projeto, controlamos um servo motor SG90 com um potenciômetro. Ajustamos o ângulo do servo mapeando o valor analógico lido do potenciômetro para a faixa de 0 a 180 graus. A biblioteca ESP32Servo gera sinais para o servo nos GPIOs do ESP32 adequados e capazes de operar como saída; este projeto usa o GPIO 18. Esse é um método básico de controle para braços robóticos, estabilizadores de câmera e mecanismos de portas automáticas.

4.3(29)
42