Arduino Araba Yapımı: Bluetooth Kontrollü Robot Araba Adım Adım
Arduino araba yapımı adım adım: malzeme listesi ve maliyet, L298N ve HC-05 kablolama, 18650 pil, ileri-geri kodu, telefondan kontrol ve düz gitmeme çözümü.
Arduino araba yapımı, elektronik ile kodlamayı aynı projede öğrenmenin en keyifli yollarından biridir. İki redüktörlü DC motor, bir L298N motor sürücü, iki adet 18650 pil, bir HC-05 Bluetooth modülü ve bir Arduino Uno ile bir hafta sonunda telefondan sürülen bir robot araba yapabilirsin. Bu projede motorların neden doğrudan Arduino'ya bağlanamadığını, pil seçiminin neden bu kadar önemli olduğunu ve birkaç satır kodun gerçek bir aracı nasıl hareket ettirdiğini bizzat görürsün.
Bu rehberde 2WD (iki motorlu) bir robot arabayı baştan sona birlikte kuruyoruz: malzeme listesi ve maliyet kalemleri, şasi montajı, kablolama tabloları, ileri-geri-dönüş kodu ve telefondan Bluetooth kontrol. Yeni başlayanların en çok takıldığı iki soruna, yani arabanın düz gitmemesine ve motorlar çalışınca Arduino'nun resetlenmesine ayrı başlıklarda ölçülü çözümler veriyoruz. Son bölümlerde aynı arabayı ESP32 ve Raspberry Pi Pico ile sürmeyi ve onu engelden kaçan ya da çizgi izleyen bir robota dönüştürmeyi bulacaksın.




Arduino robot araba nasıl çalışır?
Bir robot arabayı dört bölüme ayırabilirsin. Arduino beyindir: telefondan gelen komutu okur ve hangi motorun hangi yöne, ne hızla döneceğine karar verir. L298N motor sürücü kastır: Arduino'nun zayıf 5 V'luk sinyallerini motorların ihtiyaç duyduğu yüksek akıma çevirir. Redüktörlü motorlar tekerlekleri döndürür, pil paketi de hepsine enerji verir. Bu arabalarda direksiyon yoktur; dönüşler iki tekerleğin farklı hız ya da yönde dönmesiyle yapılır. Buna diferansiyel sürüş denir: sol tekerlek ileri, sağ tekerlek geri dönerse araba olduğu yerde sağa döner. Önde ya da arkada serbestçe dönen küçük bir sarhoş teker ise gövdeyi dengede tutar.

| Özellik | Sarı TT motor (1:48) |
|---|---|
| Çalışma gerilimi | 3–6 V |
| Dişli oranı | 1:48 (plastik dişli) |
| Yüksüz hız | 3 V'ta yaklaşık 90–120, 6 V'ta 200–250 devir/dakika |
| Yüksüz akım | Yaklaşık 150–160 mA |
| Kilitlenme (stall) akımı | Yaklaşık 1,1–1,5 A |
| Tekerlek çapı (kitlerde) | 65 mm |
| 6 V'ta arabanın hızı | Yaklaşık 0,7 m/s (π × 0,065 m × 200 / 60) |
Tablodaki en önemli satır kilitlenme akımıdır: tekerlek bir engele dayandığında ya da araba ilk kalkışı yaptığında her motor kısa bir süre 1 amperin üzerinde akım çeker. Bir Arduino pini ise en fazla 20–40 mA verebilir; bu yüzden motorlar her zaman bir sürücü üzerinden bağlanır. L298N bu işi yaparken üzerinde yaklaşık 1,5–2,5 V kaybeder; 7,4 V'luk bir pil paketiyle motorlara 5–6 V kalır, bu da TT motorların ideal çalışma aralığıdır. Sürücünün iç yapısını ve H-köprüsü mantığını L298N ile DC Motor Kontrolü yazısında ayrıntılı anlattık.
Malzeme listesi
| Parça | Adet | Not |
|---|---|---|
| 2WD akrilik robot araba şasi kiti | 1 | Genelde 2 TT motor, 2 tekerlek, sarhoş teker, anahtar, motor tutucular ve vidalarla gelir |
| Arduino Uno R3 (klon olabilir) + USB kablo | 1 | Nano da olur; pin numaraları aynıdır |
| L298N motor sürücü modülü | 1 | Kanal başına 2 A; iki motoru bağımsız sürer |
| HC-05 ya da HC-06 Bluetooth modülü | 1 | Android telefonla haberleşme için |
| 18650 Li-ion pil | 2 | Markalı, en az 5 A deşarj akımı verebilen hücreler |
| 2'li 18650 pil yuvası (seri) | 1 | İki pili seri bağlayarak 7,4 V verir |
| 18650 şarj cihazı | 1 | Hücreleri ayrı ayrı şarj eden bir şarj aleti |
| Jumper kablo (erkek-dişi ve dişi-dişi) | 20+ | Arduino, L298N ve HC-05 arası |
| 1 kΩ ve 2 kΩ direnç | 1 + 1 | HC-05'in RXD girişi için gerilim bölücü |
| 100 nF seramik kondansatör | 2–4 | Motor uçlarına; parazitleri bastırır |
| 470–1000 µF elektrolitik kondansatör (16 V ya da üstü) | 1 | Önerilir; L298N besleme girişine |
| Kablo bağı, çift taraflı bant, M3 aralayıcı | Birkaç | Kartları ve kabloları sabitlemek için |
Şasi kitlerinin çoğunda 4 adet AA pil yuvası da bulunur; birazdan göreceğin gibi o yuva L298N ile birlikte zayıf kalır, bu yüzden listeye 18650 pil ekledik. HC-06, HC-05'in yalnızca bağımlı (slave) çalışan daha basit kardeşidir ve telefonla araba kontrolü için tamamen yeterlidir. Kitte gelen delikli plastik diskler, ileride arabayı tam düz götürmek için kullanabileceğin hız sensörü (enkoder) diskleridir; şimdilik atma, kenara koy.
Maliyet: bütçe nereye gidiyor?
Fiyatlar satıcıya ve kura göre sürekli değiştiği için rakam vermiyoruz; bunun yerine bütçenin hangi kalemlere gittiğini ve nerede tasarruf edebileceğini gösteriyoruz. Genel kural şudur: elektronik modüller (L298N, HC-05, dirençler) ucuzdur; bütçenin büyük kısmını kart, şasi kiti ve özellikle pil ile şarj aleti oluşturur. Pil, tasarruf edilecek son kalemdir: kaliteli 18650 hücreler yüzlerce kez şarj edilir ve sonraki bütün robot projelerinde yeniden kullanılır.
| Kalem | Fiyat seviyesi | Tasarruf ipucu |
|---|---|---|
| Şasi kiti (motor ve tekerlek dahil) | Orta | Motor, tekerlek ve sarhoş tekeri ayrı ayrı almak yerine kit almak genelde daha ucuzdur |
| Arduino Uno | Orta (klon) – yüksek (orijinal) | Öğrenmek için klon kart yeterlidir; elindeki Uno ya da Nano'yu kullanabilirsin |
| L298N motor sürücü | Düşük | Tek modül iki motoru sürer; 4WD için de bir tane yeter |
| HC-05 / HC-06 | Düşük – orta | Yalnızca telefonla süreceksen HC-06 yeterlidir |
| 2 adet 18650 pil + şarj aleti | En yüksek kalem | Çok ucuz ve "9900 mAh" yazan hücreler genelde sahtedir; burada tasarruf etme |
| Kablo, direnç, kondansatör, vida | Düşük | Başlangıç setlerinde çoğu zaten bulunur |
2WD mi, 4WD mi?
| Özellik | 2WD (2 motor + sarhoş teker) | 4WD (4 motor) |
|---|---|---|
| Dönüş | Yerinde, keskin ve kolay döner | Tekerlekler yanlamasına kayarak döner (skid steer); halıda zorlanır |
| Akım tüketimi | Sürüşte yaklaşık 0,3–0,6 A | Yaklaşık iki katı |
| Pil ömrü | Daha uzun | Daha kısa |
| Engebeli zemin | Sarhoş teker eşiğe takılabilir | Daha iyi tutunur |
| Düz gitme | Sarhoş teker yön değiştirirken arabayı saptırabilir | Daha kararlıdır |
| L298N bağlantısı | Her motor ayrı bir kanala | Aynı taraftaki iki motor bir kanala paralel |
| Kime uygun? | İlk araba, çizgi izleyen robot | Dış mekân, daha ağır yükler |
İlk araban için 2WD'yi öneriyoruz: daha ucuzdur, daha az akım çeker, yerinde rahat döner ve çizgi izleyen robot gibi sonraki projelere daha uygundur. 4WD yaparsan aynı taraftaki iki motoru aynı OUT klemensine paralel bağla ve ikisinin aynı yöne döndüğünü kontrol et. Bu durumda bir L298N kanalı iki motorun akımını taşır; normal sürüşte sorun olmaz, ama tekerlekler sıkıştığında kanal başına 2 A sınırı aşılabilir ve sürücü ısıl korumaya geçerek motorları keser.
Güç kaynağı: neden 2 adet 18650 pil?
Robot arabalardaki sorunların büyük kısmı yanlış pil seçiminden çıkar. Doğru kaynak iki şartı birlikte sağlamalıdır: L298N'in kaybından sonra motorlara yeterli gerilim bırakmalı ve motorlar kalkışta amperlerce akım çektiğinde gerilimi çökmemelidir. Seri bağlı iki 18650 Li-ion pil (2S) tam doluyken 8,4 V, ortalama 7,4 V verir ve birkaç amperi rahatça sağlar. Arduino Uno da VIN girişi için 7–12 V önerir; yani aynı paket hem motorları hem de Arduino'yu besleyebilir. 2500 mAh'lik hücrelerle, sürüş sırasında motorlar ve kartlarla birlikte ortalama 0,8 A çeken bir 2WD araba teorik olarak 3 saat civarında çalışır; pratikte pili tamamen boşaltmadığın için 2–2,5 saat hesaplamak daha doğrudur. Kendi değerlerinle hesap yapmak için Pil ömrü aracını kullanabilirsin.

| Güç kaynağı | Gerilim | Akım verebilme | Robot araba için |
|---|---|---|---|
| 9 V kare pil | 9 V | Çok düşük | Uygun değil; resetlenmenin en sık sebebi |
| 4 adet AA alkalin | 6 V (yük altında hızla düşer) | Orta | Zayıf; L298N kaybından sonra motorlara yaklaşık 4 V kalır |
| 4 adet AA NiMH (şarjlı) | 4,8 V | İyi | L298N ile gerilim yetersiz kalır |
| 2 adet 18650 Li-ion (2S) | 7,4 V (dolu 8,4 V) | Yüksek (birkaç amper) | En iyi seçim |
| 3 adet 18650 Li-ion (3S) | 11,1 V (dolu 12,6 V) | Yüksek | TT motorlar için fazla; 5V jumper'ının 12 V sınırı aşılır |
| USB powerbank | 5 V | İyi | Yalnızca Arduino'yu ayrı beslemek için |
Pilin ne kadar kaldığını tahmin etmek yerine ölçebilirsin. Pilin artısını (anahtardan sonra) iki adet 10 kΩ dirençten oluşan bir gerilim bölücü ile A0'a bağla: 8,4 V'luk paket A0'da 4,2 V olarak görünür ve Arduino'nun 5 V'luk okuma sınırının altında kalır. Bölücü yalnızca 0,4 mA civarında akım çektiği için pil ömrünü etkilemez.
1// Pil + (anahtardan sonra) → 10 kΩ → A0 → 10 kΩ → GND / battery + (after the switch) → 10 kΩ → A0 → 10 kΩ → GND
2const float DIVIDER = 2.0; // iki eşit direnç gerilimi yarıya böler / two equal resistors halve the voltage
3
4void setup() {
5 Serial.begin(9600);
6}
7
8void loop() {
9 float v = analogRead(A0) * 5.0 / 1023.0 * DIVIDER;
10 Serial.print(F("Pil / Battery: "));
11 Serial.print(v, 2);
12 Serial.println(F(" V"));
13 if (v < 6.6) Serial.println(F("Sarj et / Charge now")); // hücre başına 3,3 V / 3.3 V per cell
14 delay(1000);
15}Montaj adım adım
- Akrilik parçaların koruyucu kâğıdını soy. Motorların kabloları lehimsiz geldiyse her motora iki kablo lehimle ve lehim noktalarını sıcak silikonla destekle; titreşimle kopan motor kablosu en sık arıza sebebidir.
- Motorları kitteki T şeklindeki akrilik tutucular ve uzun M3 vidalarla şasinin altına sabitle. İki motorun mili aynı hizada olmalı, motorların kablo uçları da içe bakmalıdır.
- Enkoder disklerini kullanacaksan motor milinin iç tarafına şimdi tak; tekerlek takıldıktan sonra takmak zordur.
- Sarhoş tekeri aralayıcılarla şasinin diğer ucuna, ortaya monte et. Aralayıcı yüksekliğini şasi yere paralel duracak şekilde seç.
- Tekerlekleri milin D biçimli kesitine denk getirerek sonuna kadar it; gevşek bir tekerlek arabayı sürekli saptırır.
- Pil yuvasını, ağırlığın tekerlek aksına yakın olacağı bir yere çift taraflı bant ya da cırt bantla yerleştir. Ağırlığın çoğu sarhoş tekerin üstünde kalırsa tahrik tekerlekleri kayar.
- Arduino'yu ve L298N'i plastik aralayıcılarla üst yüzeye monte et. Arduino'nun USB girişine kolay ulaşabilmeli, L298N'in soğutucusu ise havada kalmalıdır; metal vidaların kartların altındaki lehimlere değmemesine dikkat et.
- Anahtarı pilin artı kablosuna seri bağla; böylece arabayı pilleri çıkarmadan açıp kapatabilirsin.
- Motor kablolarını kendi içinde burarak (bükümlü) L298N'e götür, tüm kabloları kısa tut ve kablo bağıyla topla. Pilleri takmadan önce multimetreyle pil uçları arasında kısa devre olmadığını kontrol et.
Kablolama şeması
Kablolamayı iki parçada düşün: güç tarafı (pil, anahtar, L298N, motorlar) ve sinyal tarafı (Arduino'dan L298N'e ve HC-05'e giden ince kablolar). L298N'in ENA ve ENB pinleri üzerindeki küçük jumper'ları çıkar; bu pinleri Arduino'nun PWM çıkışlarına bağlayarak hızı kodla ayarlayacağız. L298N'in 5V jumper'ı ise yerinde kalsın: paket 12 V'un altında olduğu için kartın kendi regülatörü sürücünün lojik devresini besler.

| L298N klemensi | Bağlantı |
|---|---|
| OUT1, OUT2 | Sol motor (4WD'de sol taraftaki iki motor paralel) |
| OUT3, OUT4 | Sağ motor (4WD'de sağ taraftaki iki motor paralel) |
| 12V | Anahtar üzerinden pilin artı ucu |
| GND | Pilin eksi ucu ve Arduino'nun GND pini (ortak toprak) |
| 5V | Arduino Uno'da boş kalır; ESP32 ve Pico'da kartı besler |
| 5V jumper'ı | Takılı kalır (pil 12 V'un altında) |
| ENA ve ENB jumper'ları | Çıkarılır; pinler Arduino'nun PWM çıkışlarına gider |
| Bağlantı | Arduino Uno | ESP32 | Raspberry Pi Pico |
|---|---|---|---|
| L298N ENA (sol motor hızı) | D5 (PWM) | GPIO 25 | GP15 |
| L298N IN1 | D7 | GPIO 27 | GP14 |
| L298N IN2 | D8 | GPIO 33 | GP13 |
| L298N ENB (sağ motor hızı) | D6 (PWM) | GPIO 26 | GP10 |
| L298N IN3 | D9 | GPIO 32 | GP12 |
| L298N IN4 | D4 | GPIO 4 | GP11 |
| HC-05 TXD | D10 (SoftwareSerial RX) | Gerekmez (dahili Bluetooth) | GP1 (UART0 RX) |
| HC-05 RXD | D11, 1 kΩ / 2 kΩ bölücü üzerinden | Gerekmez | GP0 (UART0 TX), doğrudan |
| HC-05 VCC | 5V | Gerekmez | L298N 5V çıkışı |
| Kartın beslemesi | VIN ← anahtardan sonra pilin artısı | 5V (VIN) ← L298N 5V çıkışı | VSYS ← L298N 5V çıkışı |
| GND | L298N GND ve pil eksisiyle ortak | Ortak | Ortak |
Hız pinleri olarak D5 ve D6'yı bilerek seçtik. Servo kütüphanesi Uno'da 9 ve 10 numaralı pinlerdeki PWM'i, tone() fonksiyonu da 3 ve 11 numaralı pinlerdekini devre dışı bırakır. ENA ve ENB 5 ile 6'da olunca ileride bir servo ya da buzzer eklediğinde motor hız kontrolün bozulmaz. D2 ve D3 ise kesme (interrupt) destekleyen pinler oldukları için enkoderlere ayrıldı. Kartının pin düzenini Pinout aracında görebilirsin.
İlk kod: ileri, geri, sağa ve sola dönüş
Bluetooth'a geçmeden önce motorların ve kablolamanın doğru çalıştığını tek başına test edelim. Kodun kalbi drive(sol, sağ) fonksiyonudur: iki motorun hızını -255 ile 255 arasında ayrı ayrı alır; artı değer ileri, eksi değer geri, sıfır dur demektir. Hız değerinin nasıl gerilime dönüştüğünü PWM Nedir? yazısında anlattık. Kodu yüklemeden önce arabayı tekerlekleri boşta kalacak şekilde bir kutunun üstüne koy; setup() içindeki 3 saniyelik bekleme sana bu süreyi tanır.
1// Sol motor / left motor: ENA=5, IN1=7, IN2=8 — Sağ motor / right motor: ENB=6, IN3=9, IN4=4
2const int ENA = 5, IN1 = 7, IN2 = 8;
3const int ENB = 6, IN3 = 9, IN4 = 4;
4
5const int SPEED = 180; // temel hız 0-255 / base speed 0-255
6const int TRIM = 0; // % düzeltme: + sol, - sağ motoru yavaşlatır / % trim: + slows left, - slows right
7
8void drive(int left, int right) { // her biri -255 … 255 / each -255 … 255
9 if (TRIM > 0) left = left * (100 - TRIM) / 100;
10 if (TRIM < 0) right = right * (100 + TRIM) / 100;
11 digitalWrite(IN1, left > 0); digitalWrite(IN2, left < 0);
12 digitalWrite(IN3, right > 0); digitalWrite(IN4, right < 0);
13 analogWrite(ENA, abs(left));
14 analogWrite(ENB, abs(right));
15}
16
17void forward() { drive(SPEED, SPEED); }
18void backward() { drive(-SPEED, -SPEED); }
19void turnLeft() { drive(-SPEED, SPEED); } // yerinde sola / spin left in place
20void turnRight() { drive(SPEED, -SPEED); } // yerinde sağa / spin right in place
21void stopCar() { drive(0, 0); }
22
23void setup() {
24 int pins[] = {ENA, IN1, IN2, ENB, IN3, IN4};
25 for (int p : pins) pinMode(p, OUTPUT);
26 stopCar();
27 delay(3000); // tekerlekleri kaldırmak için zaman / time to lift the wheels
28}
29
30void loop() {
31 forward(); delay(1500);
32 stopCar(); delay(500);
33 backward(); delay(1500);
34 stopCar(); delay(500);
35 turnLeft(); delay(600);
36 stopCar(); delay(500);
37 turnRight(); delay(600);
38 stopCar(); delay(2000);
39}| Hareket | Sol motor | Sağ motor | Kod |
|---|---|---|---|
| İleri | İleri | İleri | drive(180, 180) |
| Geri | Geri | Geri | drive(-180, -180) |
| Yerinde sola dönüş | Geri | İleri | drive(-180, 180) |
| Yerinde sağa dönüş | İleri | Geri | drive(180, -180) |
| Geniş sola dönüş | Yavaş ileri | İleri | drive(90, 180) |
| Dur | Durur | Durur | drive(0, 0) |
Tekerlekler havadayken sırayla ileri, geri, sola ve sağa dönmelidir. Bir tekerlek ters dönüyorsa kodu değiştirme; o motorun iki kablosunu L298N'in OUT klemensinde yer değiştir. İki tekerlek de ters dönüyorsa iki motorun kablolarını da çevir. Motorlar vınlıyor ama dönmüyorsa SPEED değeri çok düşüktür: TT motorların çoğu harekete geçmek için en az 80–120 civarında bir PWM değeri ister ve bu eşik pil boşaldıkça yükselir.
Telefondan Bluetooth kontrol (HC-05)
HC-05, telefon ile Arduino arasında kablosuz bir seri kablo gibi çalışır: telefondaki uygulama bir harf gönderir, Arduino bu harfi okur ve ilgili hareketi yapar. Play Store'da "Bluetooth RC Car" ya da "Bluetooth RC Controller" diye aratınca çıkan kumanda uygulamalarının çoğu ileri için F, geri için B, sol için L, sağ için R ve tuş bırakıldığında dur için S gönderir; bazıları çapraz yönler için G, I, H, J ve hız için 0–9 ile q harflerini de kullanır. Modülün pinleri, LED durumları ve AT komutları HC-05 Bluetooth Modülü yazısında.

- Aşağıdaki kodu yüklerken arabanın anahtarı kapalı kalabilir; Arduino ve HC-05 USB'den beslenir. HC-05'in LED'i hızlı hızlı yanıp sönüyorsa modül bağlantı bekliyordur.
- Android telefonun Bluetooth ayarlarında HC-05'i bul ve 1234 (olmazsa 0000) şifresiyle eşleştir.
- Kumanda uygulamasını aç, Bluetooth ve yakındaki cihazlar izinlerini ver, cihaz listesinden HC-05'i seç. Bağlantı kurulunca modülün LED'i iki saniyede bir çift kısa yanıp söner.
- Arduino'yu USB'den bağlı tutup Seri Monitör'ü 9600 baud ile aç ve uygulamada tuşlara bas. Her tuşun gönderdiği harf ekranda görünür; uygulaman farklı harfler gönderiyorsa koddaki case satırlarını onlara göre değiştir.
- USB kablosunu çıkar, anahtarı aç ve arabayı yere koyarak sür.
1#include <SoftwareSerial.h>
2
3SoftwareSerial bt(10, 11); // RX, TX → HC-05 TXD, RXD (RXD bölücüyle / RXD via divider)
4
5const int ENA = 5, IN1 = 7, IN2 = 8; // sol motor / left motor
6const int ENB = 6, IN3 = 9, IN4 = 4; // sağ motor / right motor
7const int TRIM = 0; // % düzeltme / % trim
8const unsigned long TIMEOUT = 600; // ms; 0 = kapalı / 0 = disabled
9
10int speed = 200; // 0-255
11unsigned long lastCmd = 0;
12
13void drive(int left, int right) {
14 if (TRIM > 0) left = left * (100 - TRIM) / 100;
15 if (TRIM < 0) right = right * (100 + TRIM) / 100;
16 digitalWrite(IN1, left > 0); digitalWrite(IN2, left < 0);
17 digitalWrite(IN3, right > 0); digitalWrite(IN4, right < 0);
18 analogWrite(ENA, abs(left));
19 analogWrite(ENB, abs(right));
20}
21
22void setup() {
23 int pins[] = {ENA, IN1, IN2, ENB, IN3, IN4};
24 for (int p : pins) pinMode(p, OUTPUT);
25 drive(0, 0);
26 Serial.begin(9600); // gelen harfleri görmek için / to see incoming letters
27 bt.begin(9600); // HC-05 veri modu hızı / HC-05 data mode baud rate
28}
29
30void loop() {
31 if (bt.available()) {
32 char c = bt.read();
33 Serial.println(c);
34 lastCmd = millis();
35 int half = speed / 2;
36 switch (c) {
37 case 'F': drive(speed, speed); break; // ileri / forward
38 case 'B': drive(-speed, -speed); break; // geri / backward
39 case 'L': drive(-speed, speed); break; // yerinde sola / spin left
40 case 'R': drive(speed, -speed); break; // yerinde sağa / spin right
41 case 'G': drive(half, speed); break; // ileri-sol / forward-left
42 case 'I': drive(speed, half); break; // ileri-sağ / forward-right
43 case 'H': drive(-half, -speed); break; // geri-sol / back-left
44 case 'J': drive(-speed, -half); break; // geri-sağ / back-right
45 case 'S': drive(0, 0); break; // dur / stop
46 case 'q': speed = 255; break; // tam hız / full speed
47 default:
48 if (c >= '0' && c <= '9') speed = map(c - '0', 0, 9, 100, 240); // hız kademesi / speed level
49 }
50 }
51 if (TIMEOUT > 0 && millis() - lastCmd > TIMEOUT) drive(0, 0); // komut yoksa dur / no command: stop
52}| Harf | Hareket | Sol / sağ motor |
|---|---|---|
| F | İleri | +hız / +hız |
| B | Geri | −hız / −hız |
| L | Yerinde sola | −hız / +hız |
| R | Yerinde sağa | +hız / −hız |
| G, I | İleri-sol, ileri-sağ | Bir taraf yarım hız |
| H, J | Geri-sol, geri-sağ | Bir taraf yarım hız |
| S | Dur | 0 / 0 |
| 0–9, q | Hız kademesi | 0 → 100, 9 → 240, q → 255 |
Koddaki TIMEOUT bir güvenlik önlemidir: bu tür uygulamalar tuşa basılı tuttuğun sürece aynı harfi art arda gönderir, bu yüzden 600 ms boyunca hiçbir harf gelmezse kod bağlantının koptuğunu varsayar ve arabayı durdurur. Böylece telefon menzil dışına çıktığında ya da uygulama kapandığında araba duvara doğru gitmeye devam etmez. Kullandığın uygulama her tuş için harfi yalnızca bir kez gönderiyorsa araba 600 ms sonra durur; o zaman TIMEOUT değerini 0 yaparak bu özelliği kapat. Ayrıca loop() içinde hiç delay() kullanmadık; uzun beklemeler komutların gecikmesine yol açar, nedenini millis() ve delay() yazısında bulabilirsin.
Araba düz gitmiyor: sebepleri ve çözümü
"İleri" komutunda iki motora aynı PWM değerini verdiğin hâlde araba yavaşça bir yana kayıyorsa endişelenme; bu, robot arabaların en yaygın sorunudur. Ucuz redüktörlü motorlar aynı gerilimde bile birbirinden farklı hızlarda döner: dişli sürtünmesi, fırça ve mıknatıs farkları her motoru biraz farklı yapar. Buna gevşek bir tekerlek, yönü sürekli değişen bir sarhoş teker ya da bir tarafa yığılmış ağırlık eklenince 2 metrelik bir yolda 20–30 cm sapma görmek olağandır. Önce mekanik sebepleri gider, sonra kalan farkı yazılımla düzelt.
| Belirti | Olası sebep | Çözüm |
|---|---|---|
| Hep aynı tarafa kayıyor | Motorların hızı farklı | TRIM ile yazılımsal düzeltme ya da enkoder |
| Kalkışta bir yana dönüp sonra düzeliyor | Bir motor daha geç harekete geçiyor ya da sarhoş teker yön değiştiriyor | Yumuşak kalkış; sarhoş teker yerine bilyeli teker (ball caster) |
| Sapma her seferinde farklı | Gevşek tekerlek, kayan lastik ya da eğri motor tutucu | Tekerleği mile tam oturt, vidaları sık |
| İleri yerine olduğu yerde dönüyor | Bir motorun kabloları ters | O motorun kablolarını OUT klemensinde yer değiştir |
| Pil azaldıkça sapma artıyor | Düşük gerilimde motorlar arasındaki fark büyür | Pili şarj et; TRIM'i dolu pille ayarla |
| Hızlandıkça bir yana çekiyor | Ağırlık bir tarafta | Pili ve kartları ortaya, tekerlek aksına yakın yerleştir |
Mekanik sorunları giderdikten sonra yazılımla ince ayar yap. Koddaki TRIM sabiti hızlı olan motoru yüzde olarak yavaşlatır: pozitif değer sol motoru, negatif değer sağ motoru yavaşlatır. Ayarı şöyle yap:
- Pilleri tam şarj et; ayarı dolu pille yapmak sonuçları tutarlı kılar.
- Yere 2 metrelik düz bir bant yapıştır ve arabayı bandın başına, bantla aynı doğrultuda koy.
- İlk koddaki loop() içinde yalnızca forward() ve 3 saniyelik bir bekleme bırakıp arabayı sür.
- Araba sağa kayıyorsa sol motor hızlıdır, TRIM'i 3 artır; sola kayıyorsa TRIM'i 3 azalt.
- Sapma 2 metrede birkaç santimetreye inene kadar tekrarla, sonra aynı TRIM değerini Bluetooth koduna da yaz.
- Ayarı en çok kullandığın hızda yap; motorlar arasındaki fark hız değiştikçe biraz değişir.
Kusursuz düz gitme ve gidilen mesafeyi ölçmek için bir sonraki seviye enkoderdir. Kitte gelen 20 delikli diskleri motor miline takıp LM393 tabanlı yarıklı hız sensörüyle her deliği sayarsın. Sensör çıkışlarını kesme destekli D2 ve D3 pinlerine bağlayıp iki tekerleğin darbe sayısını karşılaştırırsın: sol taraf öne geçtiyse sol motoru biraz yavaşlatırsın. Bu basit oransal (P) kontrol, pil durumundan ve zeminden bağımsız olarak arabayı düz tutar. 65 mm'lik tekerlekte bir tur yaklaşık 20,4 cm olduğu için her darbe yaklaşık 1 cm yol demektir. Kesme mantığını Arduino Interrupt yazısında anlatıyoruz.
Motorlar çalışınca Arduino resetleniyor
Araba kalkarken, yön değiştirirken ya da bir engele çarptığında Arduino yeniden başlıyorsa ya da HC-05'in bağlantısı kopuyorsa (LED yeniden hızlı yanıp sönmeye başlar) sorun neredeyse her zaman güç tarafındadır. İki motor kalkış anında birlikte 2–3 A çekebilir; zayıf bir pil bu akımı veremeyince gerilimi bir anlığına çöker. Uno'nun işlemcisi besleme 2,7 V'un altına düştüğünde kendini güvenlik için sıfırlar (brown-out). Buna motor fırçalarının ürettiği elektriksel gürültü ve ince kablolardaki gerilim düşümü de eklenir. Çözümler, etkisi en büyük olandan başlayarak şöyle:
- Pili değiştir: 9 V kare pil ya da yorgun AA piller yerine dolu 2 adet 18650 kullan; sorunların çoğu burada biter.
- Doğru besleme yolu: Arduino'yu pilden VIN üzerinden besle; L298N'in 5V çıkışını VIN'e bağlama.
- Motor kondansatörleri: Her motorun iki ucu arasına 100 nF seramik kondansatör lehimle; fırça gürültüsünü kaynağında bastırır.
- Tampon kondansatör: L298N'in 12V ve GND klemenslerine 470–1000 µF elektrolitik kondansatör bağla (artı ucu 12V'a). Kalkış anındaki kısa akım ihtiyacını bu kondansatör karşılar.
- Yumuşak kalkış: Hızı birden 255 yapmak yerine aşağıdaki gibi kademeli artır; ani akım darbesi küçülür.
- Önce dur, sonra yön değiştir: İleri giderken birden geri vermek motorun akımını en yüksek seviyeye çıkarır; yön değiştirmeden önce 100–200 ms dur.
- Kalın ve kısa güç kabloları: Pil ile L298N arasında jumper kablo ve breadboard kullanma; en az 0,5 mm²'lik kablo ve klemens kullan.
- Ayrı besleme: Hâlâ sorun varsa Arduino'yu bir powerbank'ten, motorları pilden besle ve iki kaynağın GND'sini birleştir.
1// Yumuşak kalkış: ilk koddaki drive() ile kullan / soft start: use with drive() from the first sketch
2void rampTo(int target) {
3 for (int s = 60; s < target; s += 20) {
4 drive(s, s);
5 delay(15); // yaklaşık 10 adımda tam hız / full speed in about 10 steps
6 }
7 drive(target, target);
8}
9
10// Kullanım: forward() yerine rampTo(SPEED) / usage: rampTo(SPEED) instead of forward()ESP32 ve Raspberry Pi Pico ile robot araba
ESP32'nin içinde klasik Bluetooth bulunduğu için HC-05'e gerek kalmaz: BluetoothSerial kütüphanesi telefonla aynı seri bağlantıyı kurar ve yukarıdaki kumanda uygulamaları değişmeden çalışır. L298N'in girişleri yaklaşık 2,3 V'un üzerini HIGH saydığı için ESP32'nin 3,3 V'luk sinyalleri yeterlidir. ESP32 kartını L298N'in 5V çıkışından, kartın 5V (VIN) pinine bağlayarak besle; pili doğrudan bu pine verme. Bu kod ESP32-S3 ve ESP32-C3'te derlenmez, çünkü onlarda yalnızca BLE vardır.
1#include "BluetoothSerial.h"
2
3BluetoothSerial bt;
4
5const int ENA = 25, IN1 = 27, IN2 = 33; // sol motor / left motor
6const int ENB = 26, IN3 = 32, IN4 = 4; // sağ motor / right motor
7
8int speed = 200; // 0-255
9unsigned long lastCmd = 0;
10
11void drive(int left, int right) {
12 digitalWrite(IN1, left > 0); digitalWrite(IN2, left < 0);
13 digitalWrite(IN3, right > 0); digitalWrite(IN4, right < 0);
14 analogWrite(ENA, abs(left));
15 analogWrite(ENB, abs(right));
16}
17
18void setup() {
19 int pins[] = {ENA, IN1, IN2, ENB, IN3, IN4};
20 for (int p : pins) pinMode(p, OUTPUT);
21 drive(0, 0);
22 bt.begin("BlueGrays-Car"); // telefonda görünecek ad / name shown on the phone
23}
24
25void loop() {
26 if (bt.available()) {
27 char c = bt.read();
28 lastCmd = millis();
29 switch (c) {
30 case 'F': drive(speed, speed); break; // ileri / forward
31 case 'B': drive(-speed, -speed); break; // geri / backward
32 case 'L': drive(-speed, speed); break; // yerinde sola / spin left
33 case 'R': drive(speed, -speed); break; // yerinde sağa / spin right
34 case 'S': drive(0, 0); break; // dur / stop
35 case 'q': speed = 255; break; // tam hız / full speed
36 default:
37 if (c >= '0' && c <= '9') speed = map(c - '0', 0, 9, 100, 240);
38 }
39 }
40 if (millis() - lastCmd > 600) drive(0, 0); // komut yoksa dur / no command: stop
41}Standart Raspberry Pi Pico'da Bluetooth olmadığı için HC-05'i UART0 pinlerine bağlarsın. Pico 3,3 V ile çalıştığından bu kez gerilim bölücüye gerek yoktur. Pico'yu VSYS pininden, HC-05'i de doğrudan L298N'in 5V çıkışından besle; pil ile çalışırken USB takılı olmadığından VBUS pininde gerilim olmaz. Pico kodunda hız -100 ile 100 arasında yüzde olarak verilir:
1from machine import Pin, PWM, UART
2import time
3
4bt = UART(0, baudrate=9600, tx=Pin(0), rx=Pin(1)) # GP0 → HC-05 RXD, GP1 ← HC-05 TXD
5
6ena = PWM(Pin(15)); ena.freq(1000) # sol motor hızı / left motor speed
7enb = PWM(Pin(10)); enb.freq(1000) # sağ motor hızı / right motor speed
8in1, in2 = Pin(14, Pin.OUT), Pin(13, Pin.OUT)
9in3, in4 = Pin(12, Pin.OUT), Pin(11, Pin.OUT)
10
11def drive(left, right): # -100 … 100 (%)
12 in1.value(left > 0); in2.value(left < 0)
13 in3.value(right > 0); in4.value(right < 0)
14 ena.duty_u16(int(abs(left) * 655))
15 enb.duty_u16(int(abs(right) * 655))
16
17speed = 80
18last = time.ticks_ms()
19drive(0, 0)
20
21while True:
22 if bt.any():
23 c = bt.read(1)
24 last = time.ticks_ms()
25 if c == b'F': drive(speed, speed) # ileri / forward
26 elif c == b'B': drive(-speed, -speed) # geri / backward
27 elif c == b'L': drive(-speed, speed) # yerinde sola / spin left
28 elif c == b'R': drive(speed, -speed) # yerinde sağa / spin right
29 elif c == b'S': drive(0, 0) # dur / stop
30 elif c == b'q': speed = 100 # tam hız / full speed
31 elif c and 48 <= c[0] <= 57: # '0'…'9' hız kademesi / speed level
32 speed = 40 + (c[0] - 48) * 6
33 if time.ticks_diff(time.ticks_ms(), last) > 600:
34 drive(0, 0) # komut yoksa dur / no command: stopSonraki adımlar: arabanı geliştir
- Engelden kaçan robot: Öne bir HC-SR04 mesafe sensörü ve onu sağa sola çeviren bir servo motor ekle; ayrıntılar Engelden Kaçan Robot rehberinde.
- Çizgi izleyen robot: Ön tarafın altına 2–3 adet TCRT5000 kızılötesi sensör takarak yerdeki siyah bir şeridi takip et; bkz. Çizgi İzleyen Robot.
- Joystick'li kumanda: İkinci bir Arduino, bir joystick modülü ve nRF24L01 ile telefonsuz, gerçek bir kumanda yap.
- Kızılötesi kumanda: Evdeki TV kumandasının tuşlarıyla sür; IR Alıcı ve Kumanda yazısındaki kodları yön komutlarına bağla.
- Wi-Fi ile sürüş: ESP32 ile telefonun tarayıcısında açılan bir kumanda sayfası yap; ESP32 Web Server ve WebSocket rehberi bunun temelini anlatır.
- Enkoder ve mesafe: Hız sensörleriyle arabayı tam 1 metre ilerletip 90 derece döndür; labirent çözen robotların temeli budur.
- Robot kol: Arabanın üstüne servo motorlu küçük bir robot kol ekleyerek nesne taşı.



Sık yapılan hatalar ve çözümleri
- Hiçbir motor dönmüyor: GND'ler ortak değil, anahtar kapalı, ENA ve ENB jumper'ları çıkarılmış ama pinler bağlanmamış ya da pil boş.
- L298N'in LED'i yanıyor ama motorlar yalnızca vınlıyor: PWM değeri motorun kalkış eşiğinin altında ya da pil gerilimi düşük; hızı artır, pili şarj et.
- Kod yüklenmiyor: Yanlış port ya da kart seçili olabilir; HC-05'i 0 ve 1 numaralı pinlere bağladıysan yüklerken çıkar. Diğer sebepler Arduino Kod Yüklenmiyor yazısında.
- Telefon HC-05'i görüyor ama bağlanmıyor: Modül başka bir telefona bağlı, uygulamaya "yakındaki cihazlar" izni verilmemiş ya da eşleştirme şifresi yanlış.
- Araba komutlara geç tepki veriyor: loop() içinde delay() var ya da Seri Monitör'e çok fazla yazdırılıyor; beklemeleri millis() ile yap.
- L298N'in soğutucusu çok ısınıyor: Tekerlekler sıkışıyor ya da 4WD'de kanal başına akım fazla; mekanik sürtünmeyi kontrol et.
- Araba açılır açılmaz bir an hareket ediyor: Açılışta pinler kısa bir süre tanımsızdır; setup()'ın ilk satırlarında pinleri çıkış yapıp drive(0, 0) çağır.
Arduino robot araba; motor kontrolü, güç yönetimi, kablosuz haberleşme ve hata ayıklamayı tek projede öğreten harika bir başlangıçtır. Bitirdiğinde elinde, her yeni sensörle biraz daha akıllanan bir gövde olur. BlueGrays uygulamasında L298N ile Bluetooth kontrollü araba, engelden kaçan robot ve TCRT5000 ile siyah-beyaz zemin algılama projelerini devre şemaları ve kodlarıyla adım adım bulabilirsin.
Sıkça sorulan sorular
Arduino araba yapmak için neler gerekir, maliyeti ne kadar?
Temel bir Bluetooth araba için 2WD şasi kiti (2 TT motor, tekerlekler, sarhoş teker), Arduino Uno, L298N motor sürücü, HC-05 Bluetooth modülü, 2 adet 18650 pil ile pil yuvası ve birkaç jumper kablo yeterlidir. Fiyatlar satıcıya göre değişir; modüller ucuzdur, bütçenin büyük kısmını kart, şasi kiti ve pil ile şarj aleti oluşturur. Elinde bir başlangıç seti varsa maliyet belirgin şekilde düşer.
Arduino robot araba hangi pille çalışır?
En iyi seçenek seri bağlı 2 adet 18650 Li-ion pildir: 7,4 V verir, L298N'in yaklaşık 2 V'luk kaybından sonra motorlara 5–6 V bırakır ve kalkışta gereken yüksek akımı sağlar. 9 V kare pil yeterli akımı veremediği için resetlenmelere yol açar; 4 adet AA pil ise L298N ile motorları yavaş çalıştırır.
Arduino araba neden düz gitmiyor?
Ucuz redüktörlü motorlar aynı PWM değerinde bile farklı hızlarda döner; gevşek tekerlek, sarhoş teker ve dengesiz ağırlık da sapmayı artırır. Önce mekanik sorunları gider, sonra koddaki bir düzeltme (trim) değeriyle hızlı motoru biraz yavaşlat. Tam düz gitme için enkoderle iki tekerleğin devrini ölçüp eşitlemek gerekir.
Motorlar çalışınca Arduino neden resetleniyor?
Motorlar kalkışta amperlerce akım çeker ve zayıf bir pilin gerilimi bir anlığına çöker; Uno'nun işlemcisi beslemesi düşünce kendini sıfırlar. Dolu 18650 piller kullan, motor uçlarına 100 nF, L298N girişine 470–1000 µF kondansatör ekle ve hızı kademeli artır. Sorun sürerse Arduino'yu ayrı bir kaynaktan besleyip GND'leri birleştir.
HC-05 ile yapılan Bluetooth araba iPhone ile çalışır mı?
Hayır. HC-05 ve HC-06 klasik Bluetooth'un seri port profilini kullanır ve iOS, sıradan uygulamaların bu bağlantıyı kurmasına izin vermez. iPhone ile kontrol için HM-10 gibi bir BLE modülü ya da BLE destekli bir ESP32 kullanmalısın; Android telefonlar HC-05'e sorunsuz bağlanır.
L298N yerine L293D motor shield kullanılabilir mi?
Evet. L293D motor shield Arduino Uno'nun üstüne takılır ve dört DC motoru sürebildiği için 4WD arabalarda kablolamayı kolaylaştırır. Ancak kanal başına sürekli akımı yaklaşık 0,6 A'dır, bu yüzden motorlar sıkıştığında L298N'den daha çabuk zorlanır ve shield birçok pini kullanır. Daha verimli bir seçenek isteyenler için TB6612FNG gibi MOSFET'li sürücüler daha az gerilim kaybeder.
Bu yazıdan sonra yapabileceğin projeler
Tüm projeleri gör
L298N ile Bluetooth Kontrollü Araba
Arduino ve HC-05 Bluetooth modülü ile telefondan kontrol edilebilen 4WD (dört motorlu, dört tekerlekten çekişli) robot araba projesi. L298N motor sürücü kartı üzerinden her bir taraftaki iki motor par

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

Bluetooth İle Telefondan Led Yakma
HC-06 Bluetooth modülü ile telefondan gönderilen komutlarla LED'leri açıp kapatan kablosuz kontrol projesi. Seri haberleşme üzerinden Bluetooth veri alışverişini öğretir.

TCRT5000 Siyah Beyaz Zemin Tespiti
TCRT5000 sensörü ile zemin rengini algılayarak siyah zeminde kırmızı, beyaz zeminde yeşil LED yakan proje. Çizgi izleyen robotların temelini oluşturan renk eşik algılama mantığını öğretir.

TCRT5000 Kullanımı Mesafe Ölçme
TCRT5000 kızılötesi sensörü ile yüzeyden yansıyan ışık miktarını ölçerek I2C LCD ekranda analog değer olarak gösteren proje. Optik mesafe/yüzey algılama temellerini öğretir.

HC-SR04 Mesafe Ölçme (Serial Ekran)
HC-SR04 ultrasonik sensör ile mesafe ölçüp sonucu Serial Monitor'da cm cinsinden gösteren proje. Ses dalgası ile mesafe hesaplama prensibini öğretir.

HC-SR04 ile Park Sensörü
HC-SR04 sensörü ile nesne yaklaştıkça buzzer bip hızını artıran ve LED ile uyaran park sensörü projesi. Mesafeye orantılı geri bildirim mantığını öğretir.

Servo Motor Kullanım
Servo motoru 0°, 90° ve 180° açılarına sırayla konumlandıran temel kullanım projesi. Servo kütüphanesi ve açı kontrol mantığını öğretir.

