Panduan · 15 mnt baca

Arduino Terus Reset? Solusi Masalah Servo, Relay, dan Arduino Macet

Arduino terus reset atau macet? Atasi langkah demi langkah: arus servo dan relay, penurunan tegangan, GND bersama, kapasitor 470 µF, RAM yang meluap, dan watchdog.

Kalau Arduino-mu terus reset atau macet setelah berjalan beberapa lama, board-nya hampir tidak pernah rusak. Dalam kebanyakan kasus penyebabnya adalah catu daya: ketika servo mulai bergerak, motor mulai berputar, atau relay menarik kontaknya, lonjakan arus yang tiba-tiba membuat jalur 5 V anjlok sekejap dan proteksi tegangan rendah prosesor (brown-out) me-restart board. Pada kasus sisanya, biang keroknya adalah derau listrik dari relay dan motor, kabel yang panjang, RAM yang penuh, watchdog yang terlupakan, atau port USB komputer yang tidak sanggup memberi arus cukup.

Di panduan ini kamu akan belajar dulu membedakan apakah board benar-benar reset atau hanya macet. Setelah itu kami jelaskan cara kerja setiap penyebab dengan nilai arus dan tegangan yang nyata, lalu menunjukkan solusinya beserta kode: catu daya terpisah dan GND bersama, kapasitor 100–470 µF, dioda flyback, buffer berukuran tetap sebagai pengganti String, dan watchdog. Kamu juga akan menemukan sketch diagnostik yang mengukur tegangan catu Arduino sendiri dan RAM yang masih kosong, tabel pemecahan masalah langkah demi langkah dari gejala sampai solusi, serta contoh membaca penyebab reset di ESP32 dan Raspberry Pi Pico.

Board Arduino Uno R3
Arduino Uno R3: 5 V dari USB melewati sekring 500 mA yang bisa pulih sendiri (polyfuse). Ketika board reset, program mulai lagi dari setup(); tombol RESET dan pin RESET melakukan hal yang sama.

Reset atau macet? Kenali gejalanya dulu

Arduino yang reset menjalankan program dari awal, seolah-olah kamu mencabut lalu menancapkan lagi kabel USB-nya: setup() berjalan lagi, servo kembali ke sudut awalnya, LCD menampilkan lagi teks pembukanya, dan pesan awal muncul lagi di Serial Monitor. Sebaliknya, Arduino yang macet tidak merespons apa pun; LED tetap di keadaan terakhirnya, output serial berhenti, dan board diam seperti itu sampai kamu menekan tombol reset. Karena penyebab dan solusinya berbeda, mulailah dengan mencari tahu mana yang kamu alami. Cara paling mudah adalah menambahkan baris Serial.println("STARTED") ke setup() dan membiarkan Serial Monitor tetap terbuka.

GejalaResetMacet
Apakah setup() berjalan lagi?Ya, pesan awal muncul lagiTidak
Output serialBerhenti, lalu mulai lagi dengan pesan awalBerhenti dan tidak pernah kembali
Output dan LEDPadam sebentar, lalu kembali ke keadaan awalTertahan di keadaan terakhir
Penyebab paling umumPenurunan tegangan, derau, watchdogLoop tanpa akhir, bus I2C yang terkunci, RAM yang rusak
Cek duluCatu daya, GND, dan pengkabelanKode, pemakaian memori, dan pengkabelan sensor

Kenapa Arduino me-reset dirinya sendiri? Sumber reset

Hanya ada sedikit sumber yang bisa me-restart prosesor ATmega328P di Arduino Uno dan Nano, dan masing-masing punya pemicunya sendiri. Ketika tegangan catu turun di bawah ambang tertentu, brown-out detector (BOD) mulai bekerja; di Uno dan Nano, pengaturan fuse bit chip menetapkan ambang ini di 2,7 V. Apa pun yang menarik pin RESET ke LOW juga me-restart board: tombol reset, sinyal DTR dari komputer, atau derau yang ditangkap kabel panjang yang terhubung ke pin itu. Ada juga kasus yang terlihat seperti reset padahal bukan: memori yang rusak membuat program melompat ke alamat 0 dan kode mulai dari awal, tetapi karena periferal hardware tidak ikut di-reset, board mulai berperilaku aneh.

Sumber resetApa pemicunya?Gejala khas
Power-on (POR, daya dinyalakan)Menancapkan kabel, daya hilang sepenuhnyaMenyala normal
Reset eksternal (pin RESET)Tombol reset, membuka Serial Monitor (DTR), derau di pin RESETMulai dari awal ketika port dibuka atau kabel disentuh
Brown-out (BOD, 2,7 V)Arus lonjakan (inrush) servo, motor, relay, atau LED strip, baterai lemahReset tepat ketika beban bergerak
Watchdogwdt_reset() tidak dipanggil tepat waktuReset dengan interval teratur (mis. tepat setiap 2 detik)
Crash perangkat lunakArray melewati batas, RAM meluap, pointer yang salahReset atau macet acak setelah beberapa menit atau jam

Arus servo, motor, dan relay: bagaimana penurunan tegangan menyebabkan reset

Servo SG90 menarik 100–250 mA ketika bergerak, tetapi ketika mulai berputar dan ketika lengannya terbebani, arusnya melonjak di atas 0,5 A. Port USB 2.0 komputer memberi paling banyak 500 mA, dan sekring di jalur USB Uno juga bekerja di batas yang sama. Ketika servo, 50 mA milik board sendiri, dan beberapa modul melewati batas ini, port atau sekring membatasi arus, jalur 5 V anjlok sekejap, dan jika tegangan turun di bawah 2,7 V, BOD me-reset board. Kasus yang lebih licik adalah ketika tegangan tertahan di antara 2,7 V dan sekitar 3,8 V: menurut datasheet ATmega328P, chip ini butuh kira-kira 3,8 V agar bisa berjalan aman di 16 MHz. Di zona abu-abu ini BOD tidak terpicu, tetapi prosesor berjalan di luar batas kecepatannya, sehingga board bisa macet alih-alih reset, menghasilkan nilai ngawur, atau layar dan sensor I2C bisa terkunci di dalam dirinya sendiri.

BebanArus normalArus puncakBoleh diberi daya dari pin 5V Uno?
Servo mikro SG90100–250 mA0,5 A atau lebih (mulai berputar, terbebani)Hanya satu servo dengan beban ringan
Servo MG996R0,5–0,9 ASampai 2,5 ATidak, catu 5–6 V terpisah wajib
Motor DC gearbox TT70–250 mA~1 A (mulai berputar, tertahan/stall)Tidak, pakai driver motor dan catu terpisah
Modul relay 5 V (satu kanal)70–90 mAPulsa singkat ketika kumparan mulai dialiri arus1–2 kanal ya, 4 atau lebih dari catu terpisah
LED WS2812B (per buah)~20 mA (satu warna, kecerahan penuh)60 mA (putih penuh)Tidak; 30 LED putih penuh butuh 1,8 A

Kabel juga berpengaruh. Kabel jumper tipis yang dipakai di proyek breadboard biasanya 26–28 AWG, dan kawat tembaga 28 AWG punya hambatan sekitar 0,21 Ω per meter. Kalau kamu memberi daya ke servo lewat dua kabel 20 cm (0,4 m pergi-pulang) dan breadboard, kabelnya menambah sekitar 0,085 Ω dan empat kontak breadboard menambah sekitar 0,2 Ω bersama-sama. Menurut hukum Ohm (V = I × R), pulsa servo 1 A kehilangan sekitar 0,3 V di hambatan 0,29 Ω ini. Kabel USB yang tipis dan panjang, sekring, dan komponen proteksi di board menambah kira-kira setengah ohm lagi; pada pulsa yang sama jalur 5 V Arduino turun di bawah 4,5 V, dan kalau port komputer mulai membatasi arus, penurunannya jauh lebih dalam. Kamu bisa menghitung penurunan tegangan di rangkaianmu sendiri dengan kalkulator hukum Ohm.

Dari pin 5V Uno, beri daya paling banyak satu servo SG90 dengan beban ringan. Jangan pernah menghubungkan servo besar seperti MG996R, motor DC, atau LED strip ke pin 5V atau 3.3V Arduino: board akan reset, dan dalam jangka panjang sekring USB, regulator, bahkan port USB komputermu bisa rusak.

Solusi 1: Catu daya terpisah dan GND bersama

  1. Pilih catu terpisah untuk servo dan motor: untuk servo, adaptor 5–6 V yang memberi minimal 1 A per servo (2–3 A untuk MG996R), paket 4×AA NiMH, atau modul buck LM2596 yang disetel ke 5–6 V.
  2. Hubungkan kutub positif catu hanya ke kabel merah servo atau ke input daya driver motor; jangan hubungkan jalur ini ke pin 5V Arduino.
  3. Hubungkan kutub negatif catu (GND) ke beban sekaligus ke pin GND Arduino. Tanpa GND bersama ini, tegangan pin sinyal tidak punya acuan; servo bergetar atau sama sekali tidak bergerak.
  4. Satukan semua GND di satu titik di dekat catu daya (star grounding atau pentanahan bintang). Arus motor tidak boleh kembali lewat Arduino dan jalur GND-nya; kalau tidak, level GND Arduino bergeser setiap ada pulsa motor.
  5. Beri daya ke Arduino dari input-nya sendiri: USB, jack DC (7–12 V), atau 5 V teregulasi. Dengan begitu prosesor tidak terpengaruh meskipun catu servo anjlok.
  6. Terakhir, ukur tegangan di antara pin 5V dan GND Arduino ketika servo bergerak, atau jalankan sketch diagnostik di bawah; tegangannya tidak boleh turun di bawah 4,75 V.
Modul regulator tegangan step-down LM2596
Modul buck LM2596: dengan trimpot-nya kamu bisa menurunkan tegangan yang lebih tinggi, misalnya dari adaptor 12 V atau paket Li-ion 2S, ke 5–6 V. Ini cara paling praktis untuk membuat jalur daya servo yang terpisah dari Arduino. Setel output-nya dengan multimeter sebelum menghubungkan beban.
Kenapa GND bersama itu wajib dan bagaimana star grounding bekerja kami jelaskan di Ground Bersama (GND), sedangkan cara memilih baterai dan adaptor ada di panduan Cara Memberi Daya ke Arduino dengan Baterai. Aturannya sederhana: kabel sinyal datang dari Arduino, kabel daya datang dari catu daya, dan semua GND disatukan.

Solusi 2: Kapasitor (100–470 µF) dan dioda

Kapasitor elektrolit bekerja seperti penyimpan energi kecil yang duduk di sebelah beban: ketika servo meminta arus mendadak, kapasitor sendiri yang memasok arus itu sampai kabel dan catu daya sempat menyusul. Rumus ΔV = I × Δt / C memberi tahu seberapa besar bantuannya. Kapasitor 470 µF hanya membiarkan tegangan turun 0,21 V selama pulsa 1 A yang berlangsung 100 µs; kalau pulsa yang sama berlangsung 1 ms, penurunannya 2,1 V. Dengan kata lain, kapasitor menelan pulsa singkat dan derau dari sikat motor, tetapi tidak bisa menggantikan catu daya yang kurang kuat. Pasang 470–1000 µF di jalur servo dan 100 µF di antara 5V dan GND Arduino, lalu tambahkan kapasitor keramik 100 nF bertanda 104 di samping masing-masing untuk meredam derau frekuensi tinggi. Pakai alat kode kapasitor untuk membaca tandanya dan kalkulator jaringan kapasitor untuk menghitung total kapasitor yang dipasang paralel; perbedaan antarjenisnya dibahas di Apa Itu Kapasitor?.

Di mana?NilaiKenapa?
Jalur catu servo, di dekat servoElektrolit 470–1000 µF / 10–16 V + 100 nFMelunakkan pulsa ketika servo mulai bergerak
Di antara dua terminal motor DCKeramik 100 nFMenyaring derau dari percikan sikat motor
Di antara 5V dan GND ArduinoElektrolit 100 µF + 100 nFMelindungi jalur prosesor dari penurunan singkat
Input strip WS2812B1000 µF / 10 VMenahan arus lonjakan awal dan pulsa pergantian warna
Pin catu sensor dan modulKeramik 100 nFMenyaring derau yang terbawa kabel panjang
Kapasitor elektrolit dengan berbagai nilai
Kapasitor elektrolit: nilai seperti 470 µF / 16 V ideal untuk jalur servo 5 V. Garis di badannya menandai kaki negatif (−); rating tegangannya minimal dua kali tegangan jalur.

Kumparan relay, motor, dan solenoid semuanya adalah induktor. Ketika arus yang melewatinya diputus mendadak, kumparan melawan perubahan itu dan menghasilkan lonjakan tegangan singkat sebesar puluhan bahkan ratusan volt, jauh di atas tegangan catu. Lonjakan ini menyebar di sepanjang jalur dan me-reset Arduino, bahkan bisa merusak transistor driver atau pin-nya. Solusinya adalah dioda flyback yang dipasang paralel dengan kumparan, dengan arah terbalik: ujung katoda 1N4007 yang bergaris ke sisi positif, ujung lainnya ke sisi yang menuju transistor. Modul relay siap pakai sudah dilengkapi dioda ini; kalau kamu memakai relay polos, solenoid, atau motor yang dikendalikan transistor atau MOSFET, kamu harus menambahkan diodanya sendiri. Untuk motor dengan pengaturan kecepatan PWM, dioda Schottky 1N5819 yang lebih cepat memberi hasil lebih baik. Selengkapnya, lihat Apa Itu Dioda? dan Memakai MOSFET dengan Arduino.

Dioda penyearah 1N4007
Dioda 1N4007: garis abu-abu di badannya adalah ujung katoda (−). Bila dipasang terbalik di kedua ujung kumparan, dioda ini menghubung-singkatkan dan meredam lonjakan tegangan yang muncul ketika arus diputus.

Derau, kontak relay, dan kabel panjang

Kalau board reset tepat ketika relay mati, masalahnya adalah derau, bukan catu daya. Ketika relay mematikan pompa air, kipas, lampu neon, atau kontaktor, terbentuk busur listrik kecil di antara kontaknya, dan busur ini memancarkan derau elektromagnetik pita lebar. Derau itu masuk ke kabel sensor di dekatnya, jalur RESET, dan jalur I2C, sehingga prosesor reset atau sebuah modul terkunci. Untuk mencegahnya, pakai modul relay dengan optocoupler, lepas jumper JD-VCC, dan beri daya kumparan relay dari catu 5 V terpisah; cara ini menjauhkan arus kumparan dan derau dari jalur Arduino. Untuk beban induktif listrik PLN, snubber RC (100 Ω + 100 nF, kelas X2) atau varistor di kedua ujung kontak atau beban sangat menekan busur listriknya. Detail pengkabelan bisa kamu temukan di Apa Itu Modul Relay? dan konsep isolasinya di Apa Itu Optocoupler?.

  • Buat I2C tetap pendek: I2C dirancang untuk jarak pendek di atas papan sirkuit. Jaga kabel SDA dan SCL di bawah 50 cm; untuk jalur yang lebih panjang, turunkan resistor pull-up dari 4,7 kΩ ke 2,2 kΩ dan biarkan kecepatannya di 100 kHz.
  • Pakai kabel terpilin: Pilin setiap kabel sinyal bersama satu kabel GND; pasangan terpilin di kabel jaringan (LAN) ideal untuk ini.
  • Pisahkan daya dan sinyal: Jangan menarik kabel sensor sejajar dengan kabel motor, relay, atau listrik PLN; kalau harus bersilangan, silangkan tegak lurus.
  • Jangan ganggu pin RESET: Kabel panjang di pin RESET bertindak seperti antena dan me-reset board ketika disentuh atau ketika motor di dekatnya berjalan. Kalau kamu butuh tombol reset eksternal, buat kabelnya pendek.
  • Ferit dan casing: Cincin ferit di kabel motor dan casing logam mengurangi derau frekuensi tinggi.
  • Tambahkan timeout: Kalau derau mengunci bus I2C, library Wire secara default menunggu selamanya dan board pun macet. Kode di bawah mencegah macet ini dengan timeout.
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 meluap dan pemakaian String

Arduino Uno hanya punya 2 KB SRAM, dan ruang kecil ini dipakai bersama oleh variabel global, memori dinamis (heap), dan stack yang dipakai pemanggilan fungsi. Kalau di akhir kompilasi kamu melihat peringatan Low memory available, stability problems may occur., besar kemungkinan board akan crash setelah beberapa lama. Penyebab paling licik adalah kelas String: setiap penggabungan mengalokasikan potongan baru di heap, potongan lama dibebaskan, dan lama-lama memori penuh lubang. Suatu hari stack bertabrakan dengan heap dan program reset atau macet di momen acak. Karena masalah ini biasanya baru muncul setelah beberapa menit atau jam, ia mudah dibedakan dari masalah catu daya. Simpan teks konstan di flash dengan makro F(), pakai array char berukuran tetap dan snprintf() sebagai pengganti String, dan jangan mendeklarasikan array lokal yang besar di dalam fungsi. Kode di bawah mencetak RAM kosong setiap detik; kalau nilainya terus turun, ada kebocoran memori. Pembahasan lengkapnya ada di memori Arduino tidak cukup.

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: sabuk pengaman melawan macet

Watchdog timer adalah penghitung di dalam prosesor yang berjalan mandiri dengan osilator 128 kHz miliknya sendiri. Programmu harus “memberinya makan” secara teratur dengan wdt_reset(); kalau tidak diberi makan dalam waktu yang ditentukan (antara 15 ms dan 8 detik), watchdog me-reset board. Dengan begitu bus I2C yang terkunci, fungsi yang terjebak di loop tanpa akhir, atau pembacaan sensor yang rusak karena derau tidak bisa membuat board macet selamanya; board pulih dalam beberapa detik. Ingat, watchdog adalah sabuk pengaman, bukan perbaikan: ia tidak menyelesaikan masalah catu daya atau memori, hanya membuat proyek yang berjalan di lapangan bisa pulih sendiri. Pilih timeout yang jelas lebih lama daripada operasi terpanjang di kodemu; pada kode yang berisi delay(3000), watchdog 2 detik akan me-reset board terus-menerus.

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}
Watchdog berbahaya di Nano klon dengan bootloader lama. Bootloader ini tidak mematikan timer setelah watchdog reset; timer terus berjalan dengan periode terpendeknya (sekitar 16 ms) dan bootloader tidak sempat menyelesaikan tugasnya dalam waktu itu. Hasilnya adalah loop reset tanpa akhir dan kodemu tidak pernah mulai; board baru pulih ketika kamu mencabut lalu menancapkan lagi kabel USB, dan loop itu dimulai lagi begitu watchdog terpicu untuk pertama kali. Kalau board-mu harus memakai ATmega328P (Old Bootloader) di Tools > Processor, tulis (burn) bootloader Optiboot sebelum memakai watchdog; caranya kami jelaskan di kode Arduino yang gagal di-upload. Bootloader Optiboot milik Uno tidak punya masalah ini.

Sketch diagnostik: biarkan Arduino mengukur tegangan dan RAM-nya sendiri

Multimeter terlalu lambat untuk melihat penurunan tegangan yang hanya berlangsung milidetik. Sebagai gantinya, kamu bisa memakai Arduino itu sendiri sebagai alat ukur sederhana: kode di bawah memakai ADC untuk mengukur referensi internal chip sebesar 1,1 V lalu menghitung tegangan catu dari situ, sekitar 9000 kali per detik, dan mencetak nilai terendah setiap detik. Kode ini juga menaikkan penghitung di EEPROM setiap kali board menyala, jadi meskipun kamu baru membuka Serial Monitor belakangan, kamu tetap bisa melihat berapa kali board sudah restart. Sebagai beban uji, kode ini menggerakkan servo di D9 antara 0 dan 180 derajat setiap 2 detik; kalau kamu punya proyek sendiri, bagian pengukurannya bisa ditambahkan ke kode proyekmu. Buka Serial Monitor di 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}

Baca hasilnya seperti ini: pada Uno yang sehat dan diberi daya dari USB, nilai terendah tetap di antara 4,6 dan 5,1 V. Kalau nilainya turun di bawah 4,5 V setiap kali servo bergerak dan reset terjadi bersamaan dengan momen itu, masalahnya ada di catu daya. Kalau nomor boot terus bertambah padahal tegangannya stabil, cari penyebab berupa derau atau perangkat lunak; kalau pada waktu yang sama RAM kosong terus berkurang, ada kebocoran memori. Referensi internal 1,1 V bisa berbeda sekitar 10% dari satu chip ke chip lain, jadi bandingkan pembacaannya sekali dengan multimeter: kalau multimeter menunjukkan 4,95 V sementara kode mencetak 5,10 V, ubah konstanta 1125300 menjadi 1125300 × 4,95 / 5,10 ≈ 1092200. Hapus penghitung EEPROM dari kode kalau sudah selesai; sel EEPROM dirancang untuk sekitar 100.000 kali tulis.

Tabel pemecahan masalah langkah demi langkah: gejala, penyebab, solusi

Baca tabel dari atas ke bawah; baris-baris pertama adalah penyebab yang paling umum. Ubah hanya satu hal setiap kali, lalu jalankan lagi sketch diagnostiknya. Kalau kamu mengubah tiga hal sekaligus, kamu tidak akan tahu mana yang menyelesaikan masalah, dan kerusakan yang sama akan muncul lagi di proyekmu berikutnya.

GejalaKemungkinan penyebabCara memastikanSolusi
Reset ketika servo atau motor bergerakArus lonjakan membuat jalur 5 V anjlokTegangan terendah di sketch diagnostik turun di bawah 4,5 VCatu 5–6 V terpisah, GND bersama, 470–1000 µF
Reset ketika relay lepas, bukan ketika menarikBusur kontak dan lonjakan kumparan (derau)Masalah hilang ketika beban relay dilepasCatu terpisah lewat JD-VCC, snubber atau varistor, dioda flyback
Mulai dari awal ketika Serial Monitor dibukaAuto-reset DTR (perilaku normal)STARTED muncul setiap kali port dibukaBukan kerusakan; kalau perlu, 10 µF di antara RESET dan GND
Reset hanya di komputer, aman dengan adaptorPort USB atau hub tidak sanggup memberi arus cukupBeres dengan port lain dan kabel yang pendek dan tebalPakai port belakang atau hub berdaya, beri daya beban secara terpisah
Reset ketika ada gerakan, dengan baterai 9VHambatan dalam tinggi, tegangan anjlokVin turun di bawah 7 V ketika bergerak6×AA atau paket 2S 18650
Reset atau macet setelah beberapa menit atau jamRAM meluap, fragmentasi StringRAM kosong terus berkurangF(), array char, snprintf, array lokal yang kecil
Reset dengan interval yang persis teraturWatchdog tidak diberi makan tepat waktuInterval reset sama dengan timeout watchdogTambahkan wdt_reset() atau perpanjang timeout, hindari delay() yang lama
Di Nano, kode tidak pernah mulai setelah watchdog resetBug watchdog pada bootloader lamaBoard hanya bisa di-upload dengan opsi Old BootloaderTulis (burn) bootloader Optiboot
Macet acak ketika kabel sensor yang panjang dipasangBus I2C terkunci karena derauFlag timeout Wire aktifKabel pendek terpilin, pull-up 2,2 kΩ, setWireTimeout, watchdog
Reset ketika tanganmu mendekat atau menyentuhKabel panjang di pin RESET, listrik statisBeres ketika kabelnya dilepasBuat jalur RESET pendek, masukkan rangkaian ke casing
Regulator sangat panas, lalu resetArus besar dengan 12 V di jack, regulator masuk thermal shutdownRegulator terlalu panas untuk disentuhAdaptor 7–9 V atau modul buck 5 V
Board tidak menyala atau port-nya hilangKorsleting, sekring USB putusBoard menyala ketika modul dilepasCari korsletingnya, cek apakah board rusak

Port USB tidak sanggup memberi arus cukup, dan reset dari Serial Monitor

Port USB 2.0 komputer memberi 500 mA dan port USB 3.0 memberi 900 mA; tetapi karena sekring USB Uno membatasi di 500 mA, port USB 3.0 tidak memberimu arus tambahan. Hub USB tanpa catu daya membagi arus satu port ke semua perangkatnya, port di panel depan casing kehilangan tegangan karena kabel internalnya tipis, dan laptop yang berjalan dengan baterai bisa memberi daya lemah ke port-nya dalam mode hemat daya. Tancapkan board langsung ke port belakang dengan kabel pendek berkualitas baik. Ada juga reset yang bukan kerusakan: Uno dan Nano me-reset dirinya lewat sinyal DTR ketika Serial Monitor atau program Python membuka port, dan justru fitur inilah yang membuat upload kode bisa dilakukan. Kalau kamu berkomunikasi dari Python, tunggu 2 detik setelah membuka port (komunikasi serial Arduino dan Python). Kalau ingin mematikan reset ini sepenuhnya, pasang kapasitor 10 µF di antara RESET dan GND, lalu lepas ketika meng-upload. Detail port serial ada di Serial Monitor Arduino.

ESP32 terus reset: membaca penyebab reset

ESP32 bahkan lebih sensitif terhadap masalah yang sama karena berjalan di 3,3 V dan menarik sekitar 240 mA selama transmisi Wi-Fi, lebih besar lagi pada puncak singkat; Espressif menyarankan catu daya yang sanggup memberi minimal 500 mA. Kabar baiknya, ESP32 sendiri memberi tahu kenapa ia restart. Pesan Brownout detector was triggered di Serial Monitor berarti ada penurunan tegangan, dan baris rst:0xf (RTCWDT_BROWN_OUT_RESET) atau Guru Meditation Error ketika boot menunjukkan penyebab reset. Kode di bawah membaca informasi yang sama dengan esp_reset_reason() dan mengubahnya menjadi teks yang mudah dibaca. Di ESP32, tombol EN mematikan dan menyalakan chip sepenuhnya, jadi reset dengan tombol ini juga tercatat sebagai power-on. Untuk semua pesan dan solusinya, lihat error brownout dan Guru Meditation 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: penyebab reset dan watchdog (MicroPython)

Berkat regulator buck-boost-nya, Raspberry Pi Pico berjalan dengan tegangan berapa pun antara 1,8 dan 5,5 V di pin VSYS, sehingga lebih tahan terhadap penurunan tegangan dibanding Arduino. Meski begitu, kalau kamu menghubungkan servo ke pin VBUS yang membawa 5 V dari USB, arusnya ditarik langsung dari port komputer, dan kalau port itu anjlok, Pico ikut mati; kamu juga tidak boleh menarik lebih dari 300 mA total dari pin 3V3. Pin reset Pico, RUN, ditarik ke atas oleh resistor internal chip sekitar 50 kΩ; menghubungkan kabel panjang ke pin ini membuka pintu bagi derau, persis seperti pin RESET di Arduino. Di MicroPython, machine.reset_cause() di Pico hanya mengembalikan dua nilai: PWRON_RESET untuk power-on atau pin RUN, dan WDT_RESET untuk watchdog atau machine.reset(). Watchdog bisa disetel paling lama 8388 ms dan tidak bisa dihentikan setelah dimulai; ia tetap me-reset board meskipun kamu menghentikan program di Thonny. Karena itu, taruh jeda 3 detik di awal kodemu.

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)

Susunan daya yang tepat untuk proyekmu

  • Mobil robot: Beri daya motor dari paket 2S 18650 lewat L298N atau L9110S dan pasang kapasitor 100 nF di kedua terminal motor; cara merakitnya ada di Mobil Robot Arduino.
  • Lengan robot servo: Untuk empat servo atau lebih, pakai catu 5–6 V yang memberi minimal 3–5 A dan tambahkan 1000 µF di jalur servo; untuk memilih komponen, lihat servo MG996R dan lengan robot Arduino.
  • Sistem penyiraman dengan pompa dan relay: Beri daya pompa dari catu terpisah, isolasi relay dengan JD-VCC, dan jauhkan kabel sensor yang panjang dari kabel pompa (sensor kelembapan tanah).
  • LED strip dan NeoPixel: Siapkan sekitar 2 A untuk setiap 30 LED, pasang 1000 µF di input strip dan resistor 300–500 Ω di jalur data (LED strip WS2812B NeoPixel).
  • Mengendalikan motor DC: Jangan lupa dioda flyback di setiap motor yang kamu kendalikan dengan transistor atau MOSFET; untuk board driver siap pakai, lihat Mengendalikan Motor DC dengan L298N.
  • Stasiun sensor di lapangan: Aktifkan watchdog, setel timeout I2C, dan ambil daya dari sumber yang efisien seperti buck converter LM2596.

Arduino yang me-reset dirinya sendiri memang menjengkelkan, tetapi hampir selalu ada penyebab yang bisa diukur dan diperbaiki: kenali dulu gejalanya, lalu ukur tegangan dan RAM dengan sketch diagnostik, kemudian pisahkan catu daya, satukan GND, tambahkan kapasitor dan dioda, dan amankan proyek dengan watchdog kalau perlu. Begitu susunan ini terpasang, proyek servo, motor, dan relay-mu akan berjalan berhari-hari tanpa masalah. Di aplikasi BlueGrays kamu akan menemukan proyek kendali motor servo, Mobil Kendali Bluetooth dengan L298N, Robot Penghindar Rintangan, menyalakan bohlam 220 V, dan Stasiun Penyiraman Pintar, lengkap dengan skema rangkaian yang menunjukkan koneksi daya yang benar dan kode langkah demi langkah.

Pertanyaan umum

Kenapa Arduino-ku terus reset?

Penyebab paling umum adalah arus mendadak dari servo, motor, atau relay yang membuat jalur 5 V turun sekejap, sehingga proteksi tegangan rendah 2,7 V di prosesor me-restart board. Derau dari kontak relay, RAM yang meluap, watchdog yang tidak diberi makan, dan port USB yang tidak sanggup memberi arus cukup juga menyebabkan reset. Memberi daya servo dan motor dari catu terpisah dan menyatukan GND menyelesaikan sebagian besar kasus.

Kenapa Arduino-ku reset ketika servo bergerak?

Bahkan servo SG90 yang kecil menarik lebih dari 0,5 A ketika mulai bergerak dan, bersama beban lain di board, melewati batas port USB dan sekring 500 mA milik Uno. Ketika tegangannya anjlok, board reset. Beri daya servo dari catu 5–6 V terpisah, hubungkan GND catu itu ke GND Arduino, dan tambahkan kapasitor 470–1000 µF di jalur servo.

Kenapa Arduino-ku reset ketika relay bekerja?

Kumparan relay menarik arus mendadak ketika mulai dialiri arus, dan kumparan serta kontaknya menghasilkan derau ketika relay lepas. Busur listrik yang muncul ketika beban induktif seperti pompa, kipas, atau lampu neon dimatikan bisa me-reset Arduino. Pada modul dengan optocoupler, lepas jumper JD-VCC dan beri daya relay dari catu terpisah, tambahkan snubber atau varistor di kedua ujung beban, dan jauhkan kabel sensor dari kabel beban.

Kenapa Arduino-ku macet setelah beberapa lama?

Macet yang muncul setelah beberapa menit atau jam paling sering disebabkan oleh RAM yang penuh dan penggabungan String yang memecah-mecah memori. Bus I2C yang terkunci karena derau atau kode yang menunggu di loop tanpa akhir juga bisa membuat board macet. Ukur RAM kosong, pakai array char sebagai pengganti String, setel timeout dengan Wire.setWireTimeout(), dan aktifkan watchdog sebagai jaring pengaman.

Kapasitor apa yang sebaiknya kutambahkan ke rangkaian Arduino?

470–1000 µF di jalur catu servo dan motor serta kapasitor elektrolit 100 µF di antara 5V dan GND Arduino bekerja dengan baik. Menambahkan kapasitor keramik 100 nF (104) di samping masing-masing juga menyaring derau frekuensi tinggi. Rating tegangan kapasitor elektrolit minimal dua kali tegangan jalur, dan kaki negatifnya yang bergaris dihubungkan ke GND.

Kenapa Arduino-ku reset ketika Serial Monitor dibuka?

Uno dan Nano me-reset dirinya lewat sinyal DTR ketika port serial dibuka; ini bukan kerusakan, melainkan fitur auto-reset yang membuat upload kode bisa dilakukan. Kalau kamu berkomunikasi dari program seperti Python, tunggu 2 detik setelah membuka port. Untuk mematikan reset ini, pasang kapasitor 10 µF di antara RESET dan GND dan lepas sebelum meng-upload.

Lihat semua proyek
Menggunakan Motor Servo
#35Pemula
Premium

Menggunakan Motor Servo

Lengan motor servo kecil berputar ke tiga posisi bergantian: penuh ke awal, tepat ke tengah, dan penuh ke akhir, menunggu dua detik di setiap perhentian. Arduino memberi tahu motor sudut mana yang har

4.7(48)
67
Menyalakan Bohlam 220V dengan Tombol Tekan
#19Mahir
Premium

Menyalakan Bohlam 220V dengan Tombol Tekan

Selama kamu menahan tombol, bohlam 220 volt sungguhan tetap menyala, dan mati begitu kamu melepasnya. Sinyal kecil Arduino tidak bisa langsung menyalakan bohlam, jadi relay, sakelar yang dikendalikan

4.4(30)
38
Mobil Kendali Bluetooth dengan L298N
#80Mahir
Premium

Mobil Kendali Bluetooth dengan L298N

Jadikan ponselmu remote dan kendarai mobil robotmu sendiri. Arduino menerima perintah dari aplikasi remote control di ponselmu lewat modul Bluetooth dan memutar roda dengan driver motor; mobil maju, m

5.0(38)
65
Robot Penghindar Rintangan
#81Mahir
Premium

Robot Penghindar Rintangan

Bagaimana kalau membuat kendaraan pintar yang mencari jalannya sendiri? Robot Penghindar Rintangan terus memindai sekelilingnya berkat sensor ultrasonik di depannya. Ketika menemui rintangan, robot be

5.0(38)
49
Stasiun Penyiraman Pintar
#83Mahir
Premium

Stasiun Penyiraman Pintar

Tukang kebun yang menyiram tanamanmu sendiri, supaya tanaman tidak kering ketika kamu berlibur. Sensor kelembapan tanah mengukur seberapa basah tanahnya; ketika kering, Arduino menyalakan pompa air be

5.0(42)
57
Koreografi Lingkaran Servo - Pola Animasi dengan 32 Servo
#102Mahir
Premium

Koreografi Lingkaran Servo - Pola Animasi dengan 32 Servo

Proyek animasi visual dengan 32 motor servo yang disusun melingkar di Arduino Mega. Servo-servo dikelola dalam satu array, tersambung ke pin 22-53 Mega, dan menampilkan empat urutan gerak: getaran kacau ketika semua servo bergerak ke sudut acak, sapuan serempak ketika semuanya bergerak bersamaan, gelombang yang berputar halus mengelilingi lingkaran, dan terakhir jarum kompas yang berayun ke kiri dan kanan.

4.5(40)
62
Motor Servo ESP32 (Kendali Potensiometer)
#118Menengah
Premium

Motor Servo ESP32 (Kendali Potensiometer)

Di proyek ini, kita mengendalikan motor servo SG90 memakai potensiometer. Kita mengatur sudut servo dengan memetakan nilai analog yang dibaca dari potensiometer ke rentang 0–180 derajat. Library ESP32Servo menghasilkan sinyal servo di pin GPIO ESP32 yang sesuai dan bisa menjadi output; proyek ini memakai GPIO 18. Ini metode kendali dasar untuk lengan robot, gimbal kamera, dan mekanisme pintu otomatis.

4.3(29)
42