Rehberler · 14 dk okuma

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 Uno
Arduino Uno
L298N
L298N
HC-05
HC-05
18650 Li-ion
18650 Li-ion

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.

Sarı redüktörlü TT motor ve 65 mm tekerlek seti
Robot arabaların standart motoru: sarı plastik dişli kutulu TT motor ve 65 mm tekerlek. Dişli kutusu motorun hızını 48'de birine düşürüp torkunu artırır.
ÖzellikSarı TT motor (1:48)
Çalışma gerilimi3–6 V
Dişli oranı1:48 (plastik dişli)
Yüksüz hız3 V'ta yaklaşık 90–120, 6 V'ta 200–250 devir/dakika
Yüksüz akımYaklaşı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çaAdetNot
2WD akrilik robot araba şasi kiti1Genelde 2 TT motor, 2 tekerlek, sarhoş teker, anahtar, motor tutucular ve vidalarla gelir
Arduino Uno R3 (klon olabilir) + USB kablo1Nano da olur; pin numaraları aynıdır
L298N motor sürücü modülü1Kanal başına 2 A; iki motoru bağımsız sürer
HC-05 ya da HC-06 Bluetooth modülü1Android telefonla haberleşme için
18650 Li-ion pil2Markalı, 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ı1Hü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 + 1HC-05'in RXD girişi için gerilim bölücü
100 nF seramik kondansatör2–4Motor 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.

KalemFiyat seviyesiTasarruf ipucu
Şasi kiti (motor ve tekerlek dahil)OrtaMotor, tekerlek ve sarhoş tekeri ayrı ayrı almak yerine kit almak genelde daha ucuzdur
Arduino UnoOrta (klon) – yüksek (orijinal)Öğrenmek için klon kart yeterlidir; elindeki Uno ya da Nano'yu kullanabilirsin
L298N motor sürücüDüşükTek modül iki motoru sürer; 4WD için de bir tane yeter
HC-05 / HC-06Düşük – ortaYalnızca telefonla süreceksen HC-06 yeterlidir
2 adet 18650 pil + şarj aletiEn yüksek kalemÇok ucuz ve "9900 mAh" yazan hücreler genelde sahtedir; burada tasarruf etme
Kablo, direnç, kondansatör, vidaDüşükBaşlangıç setlerinde çoğu zaten bulunur
Elinde bir Arduino başlangıç seti varsa kart, jumper kablolar ve dirençler zaten hazırdır; yalnızca şasi kiti, L298N, HC-05 ve pil alman yeterli olur. Her şeyin tek kutuda geldiği hazır "akıllı araba kitleri" kendi motor kartını ve hazır kodunu getirdiği için rahattır, ama daha pahalıdır ve kablolamayı öğrenme fırsatını elinden alır.

2WD mi, 4WD mi?

Özellik2WD (2 motor + sarhoş teker)4WD (4 motor)
DönüşYerinde, keskin ve kolay dönerTekerlekler yanlamasına kayarak döner (skid steer); halıda zorlanır
Akım tüketimiSürüşte yaklaşık 0,3–0,6 AYaklaşık iki katı
Pil ömrüDaha uzunDaha kısa
Engebeli zeminSarhoş teker eşiğe takılabilirDaha iyi tutunur
Düz gitmeSarhoş teker yön değiştirirken arabayı saptırabilirDaha kararlıdır
L298N bağlantısıHer motor ayrı bir kanalaAynı taraftaki iki motor bir kanala paralel
Kime uygun?İlk araba, çizgi izleyen robotDış 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.

18650 Li-ion şarjlı pil
18650 Li-ion pil: 18 mm çapında, 65 mm boyunda; tam dolu 4,2 V, ortalama 3,6–3,7 V verir. İki tanesi seri bağlanınca robot araba için ideal 7,4 V'luk paket olur.
Güç kaynağıGerilimAkım verebilmeRobot araba için
9 V kare pil9 VÇok düşükUygun değil; resetlenmenin en sık sebebi
4 adet AA alkalin6 V (yük altında hızla düşer)OrtaZayıf; L298N kaybından sonra motorlara yaklaşık 4 V kalır
4 adet AA NiMH (şarjlı)4,8 VİyiL298N 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üksekTT motorlar için fazla; 5V jumper'ının 12 V sınırı aşılır
USB powerbank5 VİyiYalnızca Arduino'yu ayrı beslemek için
Li-ion piller güçlüdür ama dikkat ister. Pilleri yuvaya takarken artı ve eksi yönünü iki kez kontrol et; ters takılan ya da kısa devre olan 18650 pil çok ısınır ve yangın çıkarabilir. Hücre başına gerilim 3,0 V'un altına inmemeli; araban yavaşlamaya başladığında (paket yaklaşık 6,6 V) şarj et. TP4056 modülleri yalnızca tek hücre şarj eder, seri bağlı paketi doğrudan şarj edemez; pilleri yuvadan çıkarıp bir 18650 şarj aletinde şarj et ve şarj sırasında başından ayrılma.

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.

Arduino (C++)
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

  1. 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.
  2. 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.
  3. Enkoder disklerini kullanacaksan motor milinin iç tarafına şimdi tak; tekerlek takıldıktan sonra takmak zordur.
  4. Sarhoş tekeri aralayıcılarla şasinin diğer ucuna, ortaya monte et. Aralayıcı yüksekliğini şasi yere paralel duracak şekilde seç.
  5. Tekerlekleri milin D biçimli kesitine denk getirerek sonuna kadar it; gevşek bir tekerlek arabayı sürekli saptırır.
  6. 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.
  7. 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.
  8. Anahtarı pilin artı kablosuna seri bağla; böylece arabayı pilleri çıkarmadan açıp kapatabilirsin.
  9. 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.
Motorları şasiye takmadan önce her birinin uçlarını kısa bir an 2 adet AA pile değdirerek dönüş yönünü dene ve kabloları işaretle. İki motoru da "kırmızı kablo artıdayken ileri" olacak şekilde işaretlersen kablolama sırasında yön hatası yapmazsın.

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 çift kanallı motor sürücü modülü
L298N motor sürücü: yanlardaki mavi klemenslere motorlar, öndeki üçlü klemense pil bağlanır; ENA, IN1–IN4 ve ENB pinleri Arduino'ya gider.
L298N klemensiBağlantı
OUT1, OUT2Sol motor (4WD'de sol taraftaki iki motor paralel)
OUT3, OUT4Sağ motor (4WD'de sağ taraftaki iki motor paralel)
12VAnahtar üzerinden pilin artı ucu
GNDPilin eksi ucu ve Arduino'nun GND pini (ortak toprak)
5VArduino 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 UnoESP32Raspberry Pi Pico
L298N ENA (sol motor hızı)D5 (PWM)GPIO 25GP15
L298N IN1D7GPIO 27GP14
L298N IN2D8GPIO 33GP13
L298N ENB (sağ motor hızı)D6 (PWM)GPIO 26GP10
L298N IN3D9GPIO 32GP12
L298N IN4D4GPIO 4GP11
HC-05 TXDD10 (SoftwareSerial RX)Gerekmez (dahili Bluetooth)GP1 (UART0 RX)
HC-05 RXDD11, 1 kΩ / 2 kΩ bölücü üzerindenGerekmezGP0 (UART0 TX), doğrudan
HC-05 VCC5VGerekmezL298N 5V çıkışı
Kartın beslemesiVIN ← anahtardan sonra pilin artısı5V (VIN) ← L298N 5V çıkışıVSYS ← L298N 5V çıkışı
GNDL298N GND ve pil eksisiyle ortakOrtakOrtak
Üç kuralı asla çiğneme: tüm GND'ler (pil eksisi, L298N, Arduino, HC-05) birbirine bağlı olmalı; motorlar Arduino'nun 5V pininden beslenmemeli; L298N'in 5V çıkışı da Arduino'nun VIN pinine bağlanmamalı. VIN girişi en az 7 V ister; 5 V ile Arduino'nun regülatörü düzgün çalışmaz ve kart kararsızlaşır. HC-05'in RXD pini 3,3 V'luktur; Uno'nun 5 V'luk TX sinyalini 1 kΩ ve 2 kΩ'luk bölücüyle düşür: D11 → 1 kΩ → RXD, RXD → 2 kΩ → GND (5 V × 2/3 ≈ 3,3 V).

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.

Arduino (C++)
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}
HareketSol motorSağ motorKod
İleriİleriİleridrive(180, 180)
GeriGeriGeridrive(-180, -180)
Yerinde sola dönüşGeriİleridrive(-180, 180)
Yerinde sağa dönüşİleriGeridrive(180, -180)
Geniş sola dönüşYavaş ileriİleridrive(90, 180)
DurDururDururdrive(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.

HC-05 Bluetooth modülü
HC-05: klasik Bluetooth (SPP) ile telefona bağlanır; varsayılan hızı 9600 baud, eşleştirme şifresi 1234 ya da 0000'dır.
  1. 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.
  2. Android telefonun Bluetooth ayarlarında HC-05'i bul ve 1234 (olmazsa 0000) şifresiyle eşleştir.
  3. 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.
  4. 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.
  5. USB kablosunu çıkar, anahtarı aç ve arabayı yere koyarak sür.
Arduino (C++)
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}
HarfHareketSol / sağ motor
Fİleri+hız / +hız
BGeri−hız / −hız
LYerinde sola−hız / +hız
RYerinde sağa+hız / −hız
G, Iİleri-sol, ileri-sağBir taraf yarım hız
H, JGeri-sol, geri-sağBir taraf yarım hız
SDur0 / 0
0–9, qHız kademesi0 → 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.

HC-05 ve HC-06 klasik Bluetooth kullandığı için iPhone ile çalışmaz; iOS bu tür seri bağlantıya izin vermez. iPhone ile sürmek istiyorsan HM-10 gibi bir BLE modülü ya da BLE destekli bir ESP32 kullanmalısın. Kendi kumanda uygulamanı yapmak istersen App Inventor ile Arduino Bluetooth rehberine göz at.

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.

BelirtiOlası sebepÇözüm
Hep aynı tarafa kayıyorMotorların hızı farklıTRIM ile yazılımsal düzeltme ya da enkoder
Kalkışta bir yana dönüp sonra düzeliyorBir motor daha geç harekete geçiyor ya da sarhoş teker yön değiştiriyorYumuşak kalkış; sarhoş teker yerine bilyeli teker (ball caster)
Sapma her seferinde farklıGevşek tekerlek, kayan lastik ya da eğri motor tutucuTekerleği mile tam oturt, vidaları sık
İleri yerine olduğu yerde dönüyorBir motorun kabloları tersO motorun kablolarını OUT klemensinde yer değiştir
Pil azaldıkça sapma artıyorDüşük gerilimde motorlar arasındaki fark büyürPili şarj et; TRIM'i dolu pille ayarla
Hızlandıkça bir yana çekiyorAğırlık bir taraftaPili 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:

  1. Pilleri tam şarj et; ayarı dolu pille yapmak sonuçları tutarlı kılar.
  2. Yere 2 metrelik düz bir bant yapıştır ve arabayı bandın başına, bantla aynı doğrultuda koy.
  3. İlk koddaki loop() içinde yalnızca forward() ve 3 saniyelik bir bekleme bırakıp arabayı sür.
  4. Araba sağa kayıyorsa sol motor hızlıdır, TRIM'i 3 artır; sola kayıyorsa TRIM'i 3 azalt.
  5. Sapma 2 metrede birkaç santimetreye inene kadar tekrarla, sonra aynı TRIM değerini Bluetooth koduna da yaz.
  6. 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.
Arduino (C++)
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()
Sorunun güçten mi koddan mı kaynaklandığını anlamanın kolay yolu: VIN kablosunu çıkar, Arduino'yu USB'den bilgisayara bağlı tut (GND bağlantısı kalsın) ve motorları pilden çalıştır. Resetlenme kesiliyorsa sorun kesinlikle besleme tarafındadır. Multimetreyi VIN ile GND arasına bağlayıp araba kalkarken gerilime bakmak da çöküşü doğrudan gösterir. Diğer sebepler için Arduino Kendini Resetliyor yazısına bakabilirsin.

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.

Arduino (C++)
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:

MicroPython
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: stop

Sonraki 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şı.
HC-SR04
HC-SR04
TCRT5000
TCRT5000
SG90 servo
SG90 servo

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.

Tüm projeleri gör
L298N ile Bluetooth Kontrollü Araba
#80İleri
Premium

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

5.0(38)
64
Engelden Kaçan Robot
#81İleri
Premium

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

5.0(38)
49
Bluetooth İle Telefondan Led Yakma
#34Başlangıç
Premium

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.

4.8(68)
88
TCRT5000 Siyah Beyaz Zemin Tespiti
#78Orta
Premium

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.

4.7(40)
49
TCRT5000 Kullanımı Mesafe Ölçme
#77Orta
Premium

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.

4.6(33)
43
HC-SR04 Mesafe Ölçme (Serial Ekran)
#27Başlangıç

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.

4.6(44)
66
HC-SR04 ile Park Sensörü
#28Orta
Premium

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.

4.8(64)
83
Servo Motor Kullanım
#35Başlangıç
Premium

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.

4.7(48)
66