Arduino Kendini Resetliyor mu? Servo, Röle ve Donma Çözümü
Arduino kendini resetliyor ya da donuyor mu? Servo ve röle akımı, gerilim düşmesi, ortak GND, 470 µF kondansatör, RAM taşması ve watchdog ile adım adım çözüm.
Arduino kendini resetliyor ya da bir süre çalıştıktan sonra donuyorsa sorun neredeyse hiçbir zaman kartın bozuk olmasından kaynaklanmaz. Vakaların büyük çoğunluğunda sebep beslemedir: bir servo dönmeye başladığında, bir motor kalktığında ya da bir röle çektiğinde çekilen ani akım 5 V hattını bir anlığına çökertir ve işlemcinin düşük gerilim koruması (brown-out) kartı yeniden başlatır. Geri kalan vakalarda röle ve motorların ürettiği elektriksel parazit, uzun kablolar, RAM'in dolması, unutulmuş bir watchdog ya da bilgisayarın akımı yetmeyen USB portu suçludur.
Bu rehberde önce kartın gerçekten resetlenip resetlenmediğini ya da yalnızca donup donmadığını ayırt etmeyi öğreneceksin. Ardından her sebebin nasıl çalıştığını gerçek akım ve gerilim değerleriyle açıklayacak; ayrı besleme ve ortak GND, 100–470 µF kondansatör, flyback diyotu, String yerine sabit tampon ve watchdog çözümlerini kodlarıyla göstereceğiz. Arduino'nun kendi besleme gerilimini ve boş RAM'ini ölçen bir teşhis kodu ile belirtiden çözüme giden adım adım teşhis tablosu da yazıda seni bekliyor; ESP32 ve Raspberry Pi Pico için reset sebebini okuyan örnekler de var.

Reset mi, donma mı? Önce belirtiyi doğru tanı
Resetlenen bir Arduino, sanki USB kablosunu çıkarıp yeniden takmışsın gibi programı en baştan çalıştırır: setup() yeniden işler, servo başlangıç açısına döner, LCD'de açılış yazısı tekrar belirir ve Seri Monitör'de açılış mesajını yeniden görürsün. Donan bir Arduino ise hiçbir şeye tepki vermez; LED'ler son durumlarında kalır, seri çıktı kesilir ve kart sen reset tuşuna basana kadar öyle bekler. İkisinin sebepleri ve çözümleri farklı olduğu için işe hangisini yaşadığını bularak başla. Bunu anlamanın en kolay yolu, setup() içine bir Serial.println("BASLADI") satırı ekleyip Seri Monitör'ü açık bırakmaktır.
| Belirti | Resetlenme | Donma |
|---|---|---|
| setup() yeniden çalışıyor mu? | Evet, açılış mesajı tekrar görünür | Hayır |
| Seri çıktı | Kesilir, ardından açılış mesajıyla yeniden başlar | Kesilir ve bir daha gelmez |
| Çıkışlar ve LED'ler | Kısa süre söner, sonra başlangıç durumuna döner | Son durumunda takılı kalır |
| En sık sebep | Gerilim düşmesi, parazit, watchdog | Sonsuz döngü, kilitlenen I2C hattı, bozulan RAM |
| İlk bakılacak yer | Besleme, GND ve kablolar | Kod, bellek kullanımı ve sensör kabloları |
Arduino neden kendini resetler? Reset kaynakları
Arduino Uno ve Nano'daki ATmega328P işlemcisini yeniden başlatabilen yalnızca birkaç kaynak vardır ve her birinin kendine özgü bir tetikleyicisi bulunur. Kartın besleme gerilimi belirli bir eşiğin altına indiğinde brown-out dedektörü (BOD) devreye girer; Uno ve Nano'da bu eşik, yonganın fuse (yapılandırma) bitleriyle 2,7 V olarak ayarlanmıştır. RESET pinini LOW'a çeken her şey, yani reset tuşu, bilgisayarın DTR sinyali ya da bu pine bağlı uzun bir kablonun topladığı parazit de kartı baştan başlatır. Bir de gerçek bir reset olmadığı hâlde öyle görünen bir durum vardır: bozulan bellek yüzünden program 0 adresine atlar ve kod en baştan çalışır, ama donanım birimleri sıfırlanmadığı için kart tuhaf davranmaya başlar.
| Reset kaynağı | Ne tetikler? | Tipik belirti |
|---|---|---|
| Güç açılışı (POR) | Kabloyu takmak, beslemenin tamamen gidip gelmesi | Normal açılış |
| Harici reset (RESET pini) | Reset tuşu, Seri Monitör'ü açmak (DTR), RESET pinindeki parazit | Port açılınca ya da kabloya dokununca baştan başlama |
| Brown-out (BOD, 2,7 V) | Servo, motor, röle ya da LED şeridin çektiği ani akım, zayıf pil | Yük hareket ettiği anda reset |
| Watchdog | wdt_reset() süresi içinde çağrılmadı | Düzenli aralıklarla (ör. tam 2 saniyede bir) reset |
| Yazılım çökmesi | Dizi sınırı aşımı, RAM taşması, bozuk işaretçi | Dakikalar ya da saatler sonra rastgele reset veya donma |
Servo, motor ve röle akımı: gerilim düşmesi nasıl reset yapar?
Bir SG90 servo hareket ederken 100–250 mA çeker, ama kalkış anında ve kolu zorlandığında akım 0,5 A'in üstüne fırlar. Bilgisayarın USB 2.0 portu en fazla 500 mA verir ve Uno'nun USB hattındaki sigorta da bu sınırda çalışır. Servo, kartın kendi 50 mA'i ve birkaç modül bu sınırı aştığında port ya da sigorta akımı kısar, 5 V hattı bir anlığına çöker ve gerilim 2,7 V'un altına inerse BOD kartı resetler. Daha sinsi olan durum, gerilimin 2,7 V ile yaklaşık 3,8 V arasında kalmasıdır: ATmega328P'nin veri sayfasına göre 16 MHz'de güvenle çalışmak için yaklaşık 3,8 V gerekir. Bu gri bölgede BOD devreye girmez ama işlemci hız sınırının dışında çalışır; bu yüzden kart reset yerine donabilir, saçma değerler üretebilir ya da I2C ekranlar ve sensörler kendi içlerinde kilitlenebilir.
| Yük | Normal akım | Tepe akım | Uno'nun 5V pininden beslenir mi? |
|---|---|---|---|
| SG90 mikro servo | 100–250 mA | 0,5 A ve üzeri (kalkış, zorlanma) | Yalnızca tek servo ve hafif yükle |
| MG996R servo | 0,5–0,9 A | 2,5 A'e kadar | Hayır, ayrı 5–6 V kaynak şart |
| TT redüktörlü DC motor | 70–250 mA | ~1 A (kalkış, sıkışma) | Hayır, motor sürücü ve ayrı kaynak |
| 5 V röle modülü (tek kanal) | 70–90 mA | Bobin enerjilenirken kısa darbe | 1–2 kanal evet, 4 ve üzeri ayrı kaynaktan |
| WS2812B LED (tanesi) | ~20 mA (tek renk tam parlak) | 60 mA (tam beyaz) | Hayır; 30 LED tam beyazda 1,8 A ister |
Kablolar da hesaba katılmalıdır. Breadboard projelerinde kullanılan ince jumper kablolar çoğunlukla 26–28 AWG'dir ve 28 AWG bakır telin direnci metre başına yaklaşık 0,21 Ω'dur. Servoyu 20 cm'lik iki kabloyla (gidiş ve dönüş toplam 0,4 m) ve breadboard üzerinden beslediğinde kablolar yaklaşık 0,085 Ω, dört breadboard teması da birlikte 0,2 Ω civarında direnç ekler. Ohm kanununa göre (V = I × R) 1 A'lik bir servo darbesi bu 0,29 Ω üzerinde yaklaşık 0,3 V kaybettirir. İnce ve uzun bir USB kablosu, sigorta ve kart üzerindeki koruma elemanları da birlikte yarım ohm civarında direnç ekler; aynı darbede Arduino'nun 5 V hattı 4,5 V'un altına iner, bilgisayarın portu akımı sınırlamaya başlarsa düşüş çok daha derin olur. Kendi devrendeki düşümü Ohm kanunu hesaplayıcısıyla bulabilirsin.
Çözüm 1: Ayrı besleme ve ortak GND
- Servo ve motorlar için ayrı bir kaynak seç: servolar için 5–6 V ve servo başına en az 1 A (MG996R için 2–3 A) verebilen bir adaptör, 4×AA NiMH paket ya da 5–6 V'a ayarlanmış bir LM2596 buck modülü.
- Kaynağın artısını yalnızca servoların kırmızı kablosuna ya da motor sürücünün güç girişine bağla; bu hattı Arduino'nun 5V pinine bağlama.
- Kaynağın eksisini (GND) hem yüke hem de Arduino'nun GND pinine bağla. Bu ortak GND olmadan sinyal pininin gerilimi anlamını yitirir; servo titrer ya da hiç dönmez.
- GND'leri tek bir noktada, kaynağın yanında birleştir (yıldız topraklama). Motor akımı Arduino'nun üzerinden, onun GND izlerinden geçerek dönmemeli; aksi hâlde her motor darbesinde Arduino'nun GND seviyesi oynar.
- Arduino'yu kendi girişinden besle: USB, DC jakı (7–12 V) ya da regüleli 5 V. Böylece servo kaynağı çökse bile işlemci etkilenmez.
- Son olarak servo hareket ederken Arduino'nun 5V ile GND pinleri arasını ölç ya da aşağıdaki teşhis kodunu çalıştır; gerilim 4,75 V'un altına inmemeli.

Çözüm 2: Kondansatör (100–470 µF) ve diyot
Elektrolitik kondansatör, yükün yanında duran küçük bir enerji deposu gibi çalışır: servo ani akım istediğinde bu akımı, kablolar ve kaynak yetişene kadar kendi üzerinden verir. Ne kadar yardımcı olacağını ΔV = I × Δt / C formülü söyler. 470 µF'lık bir kondansatör, 1 A'lik ve 100 µs süren bir darbede gerilimin yalnızca 0,21 V düşmesine izin verir; aynı darbe 1 ms sürerse düşüş 2,1 V olur. Yani kondansatör kısa darbeleri ve motor fırçalarının ürettiği gürültüyü yutar, ama yetersiz bir kaynağın yerini tutmaz. Servo hattına 470–1000 µF, Arduino'nun 5V ile GND'si arasına 100 µF koy ve her birinin yanına yüksek frekanslı gürültü için üzerinde 104 yazan 100 nF'lık bir seramik kondansatör ekle. Kodları okumak için kondansatör kodu aracını, paralel bağladığın kondansatörlerin toplamını bulmak için kondansatör ağı hesaplayıcısını kullanabilirsin; türlerin farkı Kondansatör nedir? yazısında.
| Nereye? | Değer | Neden? |
|---|---|---|
| Servo besleme hattı, servonun yanında | 470–1000 µF / 10–16 V elektrolitik + 100 nF | Kalkış darbesini yumuşatır |
| DC motorun iki ucu arası | 100 nF seramik | Fırça kıvılcımlarının ürettiği paraziti süzer |
| Arduino 5V ile GND arası | 100 µF elektrolitik + 100 nF | İşlemcinin hattını kısa düşüşlerden korur |
| WS2812B şerit girişi | 1000 µF / 10 V | Açılış akımını ve renk değişimi darbelerini karşılar |
| Sensör ve modül besleme pinleri | 100 nF seramik | Uzun kabloların taşıdığı gürültüyü süzer |

Röle bobinleri, motorlar ve solenoidler birer bobindir. İçlerinden geçen akım aniden kesildiğinde bobin bu değişime karşı koyar ve uçlarında besleme geriliminin çok üstünde, onlarca hatta yüzlerce voltluk kısa bir gerilim sıçraması üretir. Bu sıçrama hatta yayılarak Arduino'yu resetler, sürücü transistörünü ya da pini de bozabilir. Çözüm, bobine ters yönde paralel bağlanan bir serbest geçiş (flyback) diyotudur: 1N4007'nin çizgili katot ucu artıya, diğer ucu transistöre giden uca bağlanır. Hazır röle modüllerinde bu diyot zaten vardır; çıplak bir röle, solenoid ya da transistör veya MOSFET ile sürdüğün bir motor kullanıyorsan diyotu kendin eklemelisin. PWM ile hızı ayarlanan motorlarda daha hızlı olan 1N5819 Schottky diyot daha iyi sonuç verir. Ayrıntılar için Diyot nedir? ve Arduino MOSFET kullanımı yazılarına bakabilirsin.

Parazit, röle kontakları ve uzun kablolar
Kartın tam olarak röle bıraktığı anda resetlenmesi, besleme değil parazit sorununa işaret eder. Röle bir su pompasını, fanı, floresan lambayı ya da kontaktörü kapattığında kontaklar arasında küçük bir ark oluşur ve bu ark geniş bantlı elektromanyetik gürültü yayar. Gürültü yakındaki sensör kablolarına, RESET hattına ve I2C hatlarına bulaşarak işlemciyi resetler ya da bir modülü kilitler. Bunu önlemek için optokuplörlü bir röle modülü kullan, JD-VCC köprüsünü çıkarıp röle bobinlerini ayrı bir 5 V kaynaktan besle; böylece bobin akımı ve parazit Arduino'nun hattından uzak kalır. Şebekeye bağlı endüktif yüklerde kontakların ya da yükün uçlarına bir RC snubber (100 Ω + 100 nF, X2 sınıfı) veya varistör eklemek arkı büyük ölçüde bastırır. Bağlantı ayrıntılarını Röle modülü nedir?, yalıtımın mantığını da Optokuplör nedir? yazısında bulabilirsin.
- I2C kısa kalsın: I2C, kart içindeki kısa mesafeler için tasarlanmıştır. SDA ve SCL kablolarını 50 cm'nin altında tut; daha uzun hatlarda pull-up dirençlerini 4,7 kΩ'dan 2,2 kΩ'a düşür ve hızı 100 kHz'de bırak.
- Bükümlü kablo kullan: Her sinyal kablosunu bir GND kablosuyla birlikte bük; ağ kablosundaki bükümlü çiftler bu iş için idealdir.
- Güç ve sinyali ayır: Sensör kablolarını motor, röle ve 220 V kablolarına paralel döşeme; kesişmeleri gerekiyorsa dik açıyla kesiştir.
- RESET pinini boş bırak: RESET pinine bağlı uzun bir kablo anten gibi davranır ve dokunulduğunda ya da yakındaki bir motor çalıştığında kartı resetler. Harici reset tuşu gerekiyorsa kabloyu kısa tut.
- Ferrit ve kutu: Motor kablolarına takılan ferrit halkalar ve metal bir kutu yüksek frekanslı gürültüyü azaltır.
- Zaman aşımı koy: Gürültü I2C hattını kilitlerse Wire kütüphanesi varsayılan ayarda sonsuza kadar bekler ve kart donar. Aşağıdaki kod zaman aşımıyla bu donmayı önler.
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 taşması ve String kullanımı
Arduino Uno'nun yalnızca 2 KB SRAM'i vardır ve bu küçük alanı global değişkenler, dinamik bellek (heap) ve fonksiyon çağrılarının kullandığı yığıt (stack) paylaşır. Derleme sonunda Low memory available, stability problems may occur. uyarısını görüyorsan kart büyük ihtimalle bir süre sonra çökecektir. En sinsi sebep String sınıfıdır: her birleştirmede heap'te yeni bir parça ayrılır, eskisi serbest kalır ve zamanla bellek delik deşik olur. Bir gün yığıt heap'e çarpar ve program rastgele bir anda resetlenir ya da donar. Bu sorun genellikle dakikalar ya da saatler sonra ortaya çıktığı için besleme sorunlarından kolayca ayırt edilir. Sabit metinleri F() makrosuyla flaşta bırak, String yerine sabit boyutlu char dizileri ve snprintf() kullan, fonksiyonların içinde büyük yerel diziler tanımlama. Aşağıdaki kod boş RAM'i her saniye yazar; değer sürekli azalıyorsa bellek sızıntısı vardır. Konunun tamamı Arduino bellek yetersiz yazısında.
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: donmaya karşı emniyet kemeri
Watchdog (bekçi zamanlayıcısı), işlemcinin içinde kendi 128 kHz'lik osilatörüyle bağımsız çalışan bir sayaçtır. Programın onu düzenli olarak wdt_reset() ile beslemesi gerekir; belirlenen süre (15 ms ile 8 saniye arası) içinde besleme gelmezse watchdog kartı resetler. Böylece kilitlenen bir I2C hattı, sonsuz döngüye giren bir fonksiyon ya da gürültüyle bozulan bir sensör okuması kartı sonsuza kadar dondurmaz; kart birkaç saniye içinde kendine gelir. Watchdog'un bir onarım değil emniyet kemeri olduğunu unutma: besleme ya da bellek sorununu çözmez, yalnızca sahada çalışan bir projenin kendi kendine toparlanmasını sağlar. Süreyi kodundaki en uzun işlemden belirgin biçimde uzun seç; içinde delay(3000) olan bir kodda 2 saniyelik watchdog kartı sürekli resetler.
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}Teşhis kodu: Arduino kendi gerilimini ve RAM'ini ölçsün
Multimetre, milisaniyelik gerilim düşüşlerini göremeyecek kadar yavaştır. Bunun yerine Arduino'nun kendisini basit bir ölçü aleti gibi kullanabilirsin: aşağıdaki kod ADC ile yonganın dahili 1,1 V referansını ölçüp besleme gerilimini buradan hesaplar; bunu saniyede yaklaşık 9000 kez yapar ve her saniyenin en düşük değerini yazar. Ayrıca her açılışta EEPROM'daki bir sayacı bir artırır; böylece Seri Monitör'ü sonradan açsan bile kartın kaç kez yeniden başladığını görürsün. Test yükü olarak D9'daki servoyu 2 saniyede bir 0 ile 180 derece arasında oynatır; kendi projen varsa ölçüm kısmını onun koduna ekleyebilirsin. Seri Monitör'ü 115200 baud hızında aç.
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}Sonuçları şöyle oku: USB'den beslenen sağlıklı bir Uno'da en düşük değer 4,6–5,1 V arasında kalır. Servo her hareket ettiğinde değer 4,5 V'un altına iniyorsa ve resetler bu anlara denk geliyorsa sorun beslemededir. Gerilim sabit kaldığı hâlde açılış numarası artıyorsa sebebi parazitte ya da yazılımda ara; bu sırada boş RAM değeri giderek azalıyorsa bellek sızıntısı vardır. Dahili 1,1 V referansı yongadan yongaya yaklaşık %10 farklı olabileceği için ölçümü bir kez multimetreyle karşılaştır: multimetre 4,95 V gösterirken kod 5,10 V yazıyorsa 1125300 sabitini 1125300 × 4,95 / 5,10 ≈ 1092200 yap. Teşhis bitince EEPROM sayacını koddan çıkar; EEPROM hücrelerinin yaklaşık 100.000 yazma ömrü vardır.
Adım adım teşhis tablosu: belirti, sebep, çözüm
Tabloyu yukarıdan aşağıya oku; ilk satırlar en sık görülen sebeplerdir. Her seferinde yalnızca bir şeyi değiştir ve teşhis kodunu yeniden çalıştır. Aynı anda üç şeyi değiştirirsen sorunu hangisinin çözdüğünü öğrenemezsin ve aynı hata bir sonraki projede yine karşına çıkar.
| Belirti | Olası sebep | Nasıl doğrularsın? | Çözüm |
|---|---|---|---|
| Servo ya da motor hareket edince reset | Ani akım 5 V hattını çökertiyor | Teşhis kodunda en düşük gerilim 4,5 V'un altına iniyor | Ayrı 5–6 V kaynak, ortak GND, 470–1000 µF |
| Röle çekerken değil, bırakırken reset | Kontak arkı ve bobin sıçraması (parazit) | Röleye bağlı yükü sökünce sorun kayboluyor | JD-VCC ile ayrı besleme, snubber ya da varistör, flyback diyot |
| Seri Monitör'ü açınca baştan başlıyor | DTR otomatik reseti (normal davranış) | Port her açıldığında BASLADI görünüyor | Arıza değil; gerekirse RESET ile GND arasına 10 µF |
| Yalnızca bilgisayara takılıyken reset, adaptörle sorunsuz | USB portunun ya da hub'ın akımı yetmiyor | Başka port ve kısa, kalın kabloyla düzeliyor | Arka porta ya da beslemeli hub'a tak, yükleri ayrı besle |
| 9V pille çalışırken hareket anında reset | Pilin iç direnci yüksek, gerilim çöküyor | Hareket anında Vin 7 V'un altına iniyor | 6×AA ya da 2S 18650 paket |
| Dakikalar ya da saatler sonra reset veya donma | RAM taşması, String parçalanması | Boş RAM giderek azalıyor | F(), char dizisi, snprintf, küçük yerel diziler |
| Tam olarak belli aralıklarla reset | Watchdog zamanında beslenmiyor | Reset aralığı watchdog süresine eşit | wdt_reset() ekle ya da süreyi uzat, uzun delay() kullanma |
| Nano'da watchdog sonrası kod hiç başlamıyor | Eski önyükleyicinin watchdog hatası | Kart yalnızca Old Bootloader seçeneğiyle yükleniyor | Optiboot önyükleyicisini yaz |
| Uzun sensör kablosu takılınca rastgele donma | I2C hattı gürültüyle kilitleniyor | Wire zaman aşımı bayrağı kalkıyor | Kısa ve bükümlü kablo, 2,2 kΩ pull-up, setWireTimeout, watchdog |
| Elini yaklaştırınca ya da dokununca reset | RESET pininde uzun kablo, statik elektrik | Kablo sökülünce düzeliyor | RESET hattını kısa tut, devreyi kutuya al |
| Regülatör çok ısınıyor, ardından reset | 12 V jakla yüksek akım, regülatör ısıl korumaya giriyor | Regülatör elle tutulamayacak kadar sıcak | 7–9 V adaptör ya da 5 V buck modülü |
| Kart hiç açılmıyor ya da port kayboluyor | Kısa devre, USB sigortası attı | Modüller sökülünce kart açılıyor | Kısa devreyi bul, kartın sağlamlığını kontrol et |
USB portunun akımı yetmiyor ve Seri Monitör reseti
Bilgisayarın USB 2.0 portu 500 mA, USB 3.0 portu 900 mA verir; ama Uno'nun USB sigortası 500 mA'de sınırladığı için USB 3.0 portu sana fazladan akım kazandırmaz. Beslemesiz bir USB hub'ı tek bir portun akımını bütün cihazlara paylaştırır, kasanın ön panelindeki girişler ince iç kablolar yüzünden gerilim kaybettirir, pille çalışan dizüstü bilgisayarlar da portları tasarruf modunda zayıf besleyebilir. Kartı doğrudan arkadaki bir porta, kısa ve kaliteli bir kabloyla tak. Bir de arıza olmayan bir reset vardır: Uno ve Nano, Seri Monitör ya da bir Python programı portu açtığında DTR sinyaliyle kendini resetler; kod yüklemeyi mümkün kılan da bu özelliktir. Python'dan haberleşiyorsan portu açtıktan sonra 2 saniye bekle (Arduino ile Python seri haberleşme). Reseti tamamen kapatmak istersen RESET ile GND arasına 10 µF kondansatör tak ve kod yüklerken çıkar. Seri port ayrıntıları Arduino Serial Monitor yazısında.
ESP32 kendini resetliyor: reset sebebini okumak
ESP32 aynı sorunlara daha da duyarlıdır, çünkü 3,3 V ile çalışır ve Wi-Fi gönderimi sırasında 240 mA civarında, anlık tepelerde daha fazla akım çeker; Espressif en az 500 mA verebilen bir kaynak önerir. İşin güzel tarafı, ESP32'nin neden yeniden başladığını kendisi söylemesidir. Seri Monitör'deki Brownout detector was triggered yazısı gerilim düşmesini, açılıştaki rst:0xf (RTCWDT_BROWN_OUT_RESET) ya da Guru Meditation Error satırları da reset sebebini gösterir. Aşağıdaki kod aynı bilgiyi esp_reset_reason() ile okur ve anlaşılır bir yazıya çevirir. ESP32'de EN tuşu yongayı tamamen kapatıp açtığı için bu tuşla yapılan reset de güç açılışı olarak görünür. Mesajların tamamı ve çözümleri için ESP32 brownout ve Guru Meditation hataları yazısına bakabilirsin.
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: reset nedeni ve watchdog (MicroPython)
Raspberry Pi Pico, üzerindeki buck-boost regülatör sayesinde VSYS pininde 1,8–5,5 V arasındaki her gerilimle çalıştığı için gerilim düşmelerine Arduino'dan daha dayanıklıdır. Yine de servoyu USB'den gelen VBUS pinine bağladığında akım doğrudan bilgisayarın portundan çekilir ve port çökerse Pico da kapanır; 3V3 pininden de toplamda 300 mA'den fazla akım çekmemelisin. Pico'nun reset pini olan RUN, yonganın içindeki yaklaşık 50 kΩ'luk bir dirençle yukarı çekilir; bu pine uzun bir kablo bağlamak, Arduino'daki RESET pini gibi parazite açık bir kapı bırakır. MicroPython'da machine.reset_cause() Pico'da yalnızca iki değer döndürür: güç açılışı ya da RUN pini için PWRON_RESET, watchdog ya da machine.reset() için WDT_RESET. Watchdog en fazla 8388 ms'ye ayarlanabilir ve bir kez başlatıldıktan sonra durdurulamaz; Thonny'de programı durdursan bile kartı resetlemeye devam eder. Bu yüzden kodun başına 3 saniyelik bir bekleme koy.
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)Projene göre doğru güç düzeni
- Robot araba: Motorları L298N ya da L9110S üzerinden 2S 18650 paketten besle ve motor uçlarına 100 nF kondansatör koy; kurulum Arduino araba yapımı yazısında.
- Servolu robot kol: Dört ya da daha fazla servo için 5–6 V ve en az 3–5 A veren bir kaynak kullan, servo hattına 1000 µF ekle; seçim için MG996R servo ve Arduino robot kol yazılarına bak.
- Pompalı ve röleli sulama sistemi: Pompayı ayrı kaynaktan besle, röleyi JD-VCC ile ayır ve uzun sensör kablolarını pompa kablosundan uzak tut (toprak nem sensörü).
- LED şerit ve NeoPixel: Her 30 LED için yaklaşık 2 A hesapla, şerit girişine 1000 µF ve veri hattına 300–500 Ω direnç koy (WS2812B NeoPixel).
- DC motor sürme: Transistör ya da MOSFET ile sürdüğün her motorda flyback diyotunu unutma; hazır sürücü kartları için L298N ile DC motor kontrolü yazısına bak.
- Sahada çalışan sensör istasyonu: Watchdog'u aç, I2C zaman aşımını ayarla ve beslemeyi LM2596 voltaj düşürücü gibi verimli bir kaynaktan al.
Arduino'nun kendini resetlemesi can sıkıcıdır, ama hemen her zaman ölçülebilir ve çözülebilir bir sebebi vardır: önce belirtiyi tanı, ardından teşhis koduyla gerilimi ve RAM'i ölç, sonra beslemeyi ayır, GND'leri birleştir, kondansatörü ve diyotu ekle, gerekirse watchdog ile emniyete al. Bu düzeni bir kez kurduğunda servolu, motorlu ve röleli projelerin günlerce sorunsuz çalışır. BlueGrays uygulamasında servo motor kontrolü, L298N'li Bluetooth araba, engelden kaçan robot, 220 V ampul kontrolü ve akıllı sulama istasyonu projelerini doğru güç bağlantılarını gösteren devre şemaları ve adım adım kodlarıyla bulabilirsin.
Sıkça sorulan sorular
Arduino neden kendi kendine resetleniyor?
En sık sebep, servo, motor ya da rölenin çektiği ani akımın 5 V hattını bir anlığına düşürmesi ve işlemcinin 2,7 V'luk düşük gerilim korumasının kartı yeniden başlatmasıdır. Bunun dışında röle kontaklarının ürettiği parazit, RAM taşması, beslenmeyen bir watchdog ve akımı yetmeyen USB portu da resetlere yol açar. Servoyu ve motorları ayrı kaynaktan besleyip GND'leri birleştirmek sorunun çoğunu çözer.
Servo dönünce Arduino neden resetleniyor?
Küçük bir SG90 servo bile kalkış anında 0,5 A'in üstünde akım çeker ve kartın diğer yükleriyle birlikte USB portunun ve Uno'nun 500 mA'lik sigortasının sınırını aşar. Gerilim çöktüğünde kart resetlenir. Servoyu 5–6 V'luk ayrı bir kaynaktan besle, kaynağın GND'sini Arduino'nun GND'sine bağla ve servo hattına 470–1000 µF kondansatör ekle.
Röle çekince Arduino neden resetleniyor?
Röle bobini enerjilenirken ani akım çeker, bırakırken de bobin ve kontaklar parazit üretir. Özellikle pompa, fan ya da floresan gibi endüktif yükler kapatılırken oluşan ark Arduino'yu resetleyebilir. Optokuplörlü bir modülde JD-VCC köprüsünü çıkarıp röleleri ayrı kaynaktan besle, yükün uçlarına snubber ya da varistör ekle ve sensör kablolarını yük kablolarından uzak tut.
Arduino neden bir süre sonra donuyor?
Dakikalar ya da saatler sonra ortaya çıkan donmaların en sık sebebi RAM'in dolması ve String birleştirmelerinin belleği parçalamasıdır. Gürültüyle kilitlenen bir I2C hattı ya da sonsuz bir döngüde bekleyen kod da kartı dondurur. Boş RAM'i ölç, String yerine char dizisi kullan, Wire.setWireTimeout() ile zaman aşımı koy ve emniyet için watchdog'u aç.
Arduino'ya hangi kondansatör takılır?
Servo ve motor besleme hattına 470–1000 µF, Arduino'nun 5V ile GND'si arasına 100 µF elektrolitik kondansatör uygundur. Her birinin yanına 100 nF (104) seramik kondansatör eklemek yüksek frekanslı gürültüyü de süzer. Elektrolitik kondansatörün gerilim değeri hattın en az iki katı olmalı ve şeritli eksi bacağı GND'ye bağlanmalıdır.
Seri Monitör açılınca Arduino neden resetleniyor?
Uno ve Nano, seri port açıldığında DTR sinyaliyle kendini resetler; bu bir arıza değil, kod yüklemeyi mümkün kılan otomatik reset özelliğidir. Python gibi bir programdan haberleşiyorsan portu açtıktan sonra 2 saniye bekle. Reseti kapatmak istersen RESET ile GND arasına 10 µF kondansatör tak ve kod yüklemeden önce çıkar.
Bu yazıdan sonra yapabileceğin projeler
Tüm projeleri gör
Servo Motor Kullanım
Küçük bir servo motorun kolu sırayla üç konuma döner: en başa, tam ortaya ve en sona, her durakta iki saniye bekleyerek. Arduino motora hangi açıda durması gerektiğini söyler, motor da oraya gidip ora

220V Ampülü Buton(Push) İle Yakma
Butona bastığın sürece 220 voltluk gerçek bir ampul yanar, bıraktığın anda söner. Arduino'nun küçük sinyali ampulü doğrudan yakamaz; araya röle denen elektrikli bir anahtar girer ve ampulün devresini

L298N ile Bluetooth Kontrollü Araba
Telefonunu kumandaya çevirip kendi robot arabanı sür. Arduino, Bluetooth modülü üzerinden telefondaki bir kumanda uygulamasından gelen komutları alır ve motor sürücüyle tekerlekleri döndürür; araba il

Engelden Kaçan Robot
Kendi yolunu bulan akıllı bir araç yapmaya ne dersin? Engelden Kaçan Robot, önündeki ultrasonik sensör sayesinde çevresini sürekli tarar. Bir engelle karşılaştığında durur, servo motoruyla sağına ve s

Akıllı Sulama İstasyonu
Tatile gidince çiçeklerin kurumasın diye kendi kendine sulayan bir bahçıvan. Toprak nem sensörü toprağın ne kadar ıslak olduğunu ölçer; toprak kuruyunca Arduino su pompasını birkaç saniye çalıştırır v

Servo Çember Koreografisi — 32 Servo ile Animasyonlu Desenler
Arduino Mega üzerinde çember şeklinde dizilmiş 32 servo motorla çalışan görsel bir animasyon projesi. Servolar tek bir dizi (array) içinde yönetiliyor ve Mega'nın 22–53 numaralı pinlerine bağlanarak dört farklı hareket dizisi sergiliyor: tüm servoların rastgele açılara gittiği kaotik bir titreşim, hepsinin aynı anda hareket ettiği senkron süpürme, çember etrafında akıcı şekilde dönen bir dalga ve son olarak sağa sola sallanan bir pusula ibresi. Dönen dalga efekti, her servonun aktif servoya olan

ESP32 Servo Motor (Potansiyometre Kontrolü)
Bu projede potansiyometre ile SG90 servo motoru kontrol ediyoruz. Potansiyometreden okunan analog değeri 0-180 derece aralığına map'leyerek servo açısını ayarlıyoruz. ESP32Servo kütüphanesi, ESP32'nin çıkış verebilen uygun GPIO'larında servo sinyali üretir; bu projede GPIO 18 kullanılır. Bu, robotik kollar, kamera gimbal'ları ve otomatik kapı mekanizmaları için temel bir kontrol yöntemidir.
Diğer yazılar
BlueGrays uygulaması
Bu devreyi telefonunda adım adım kur
Devre şeması, kod ve parça listesi tek ekranda. 200'den fazla Arduino, ESP32 ve Pico projesi seni bekliyor.
Telefonunla tara
Kamerayı koda tut; telefonunun uygulama mağazası açılır.
ya da mağazada aç

