Panduan · 16 mnt baca

Cara Membuat Mobil Robot Arduino: Kendali Bluetooth Langkah demi Langkah

Buat mobil robot Arduino langkah demi langkah: komponen dan biaya, pengkabelan L298N dan HC-05, baterai 18650, kode penggerak, kendali dari ponsel, serta solusi mobil miring dan reset.

Membuat mobil Arduino adalah salah satu cara paling seru untuk belajar elektronika dan coding dalam satu proyek. Dengan dua motor DC bergigi, driver motor L298N, dua baterai 18650, modul Bluetooth HC-05, dan Arduino Uno, kamu bisa membuat mobil robot yang dikendalikan dari ponsel dalam satu akhir pekan. Sambil jalan kamu akan melihat sendiri kenapa motor tidak bisa disambung langsung ke Arduino, kenapa pilihan baterai begitu penting, dan bagaimana beberapa baris kode menggerakkan kendaraan sungguhan.

Di panduan ini kita membuat mobil robot 2WD (dua motor) bersama-sama dari awal sampai akhir: daftar komponen dan rincian biaya, perakitan sasis, tabel pengkabelan, kode maju-mundur-belok, dan kendali Bluetooth dari ponselmu. Dua masalah yang paling sering membuat pemula kesulitan, mobil tidak berjalan lurus dan Arduino reset ketika motor mulai berputar, masing-masing mendapat bagiannya sendiri dengan solusi praktis yang sudah diukur. Di bagian terakhir kamu akan menemukan cara mengendalikan mobil yang sama dengan ESP32 atau Raspberry Pi Pico, dan cara mengubahnya menjadi robot penghindar rintangan atau robot pengikut garis.

Board Arduino Uno
Board Arduino Uno
Driver motor L298N
Driver motor L298N
Modul Bluetooth HC-05
Modul Bluetooth HC-05
Baterai Li-ion 18650
Baterai Li-ion 18650

Bagaimana cara kerja mobil robot Arduino?

Kamu bisa membagi mobil robot menjadi empat bagian. Arduino adalah otaknya: ia membaca perintah dari ponsel dan memutuskan motor mana yang berputar ke arah mana dan seberapa cepat. Driver motor L298N adalah ototnya: ia mengubah sinyal 5 V Arduino yang lemah menjadi arus tinggi yang dibutuhkan motor. Motor bergigi memutar roda, dan paket baterai memberi daya ke semuanya. Mobil seperti ini tidak punya setir; mobil berbelok dengan memutar kedua roda pada kecepatan atau arah yang berbeda. Ini disebut differential drive: jika roda kiri berputar maju dan roda kanan mundur, mobil berputar ke kanan di tempat. Roda caster kecil yang bisa berputar bebas di depan atau belakang menjaga badan mobil tetap seimbang.

Motor TT bergigi kuning dan set roda 65 mm
Motor standar mobil robot: motor TT dengan gearbox plastik kuning dan roda 65 mm. Gearbox menurunkan kecepatan motor 48 kali dan menaikkan torsinya.
FiturMotor TT kuning (1:48)
Tegangan kerja3–6 V
Rasio gigi1:48 (gigi plastik)
Kecepatan tanpa bebanSekitar 90–120 RPM di 3 V, 200–250 RPM di 6 V
Arus tanpa bebanSekitar 150–160 mA
Arus stallSekitar 1,1–1,5 A
Diameter roda (di kit)65 mm
Kecepatan mobil di 6 VSekitar 0,7 m/dtk (π × 0,065 m × 200 / 60)

Baris terpenting di tabel adalah arus stall: ketika roda mendorong rintangan atau mobil mulai berjalan, setiap motor sesaat menarik lebih dari 1 ampere. Pin Arduino paling banyak hanya bisa memberi 20–40 mA, jadi motor selalu disambung lewat driver. Selama menjalankan tugas ini, L298N kehilangan sekitar 1,5–2,5 V; dengan paket baterai 7,4 V, motor masih mendapat 5–6 V, tepat di rentang ideal untuk motor TT. Kami menjelaskan isi driver ini dan ide H-bridge secara rinci di Mengendalikan Motor DC dengan L298N.

Daftar komponen

KomponenJmlCatatan
Kit sasis mobil robot akrilik 2WD1Biasanya berisi 2 motor TT, 2 roda, roda caster, saklar, braket motor, dan sekrup
Arduino Uno R3 (kloningan juga boleh) + kabel USB1Nano juga bisa; nomor pinnya sama
Modul driver motor L298N12 A per kanal; mengendalikan dua motor secara terpisah
Modul Bluetooth HC-05 atau HC-061Untuk berkomunikasi dengan ponsel Android
Sel Li-ion 186502Sel bermerek yang sanggup memberi minimal 5 A
Dudukan baterai 18650 2 slot (seri)1Menyambungkan dua sel secara seri untuk 7,4 V
Charger 186501Charger yang mengisi setiap sel secara terpisah
Kabel jumper (male-female dan female-female)20+Antara Arduino, L298N, dan HC-05
Resistor 1 kΩ dan 2 kΩ1 + 1Pembagi tegangan untuk input RXD HC-05
Kapasitor keramik 100 nF2–4Di terminal motor untuk meredam noise
Kapasitor elektrolit 470–1000 µF (16 V atau lebih)1Dianjurkan; di input daya L298N
Kabel ties, double tape, spacer M3BeberapaUntuk mengunci posisi board dan kabel

Kebanyakan kit sasis juga menyertakan dudukan baterai 4×AA; seperti yang akan kamu lihat sebentar lagi, dudukan itu terlalu lemah jika dipadukan dengan L298N, karena itu kami menambahkan sel 18650 ke daftar. HC-06 adalah saudara HC-05 yang lebih sederhana dan hanya bisa bekerja sebagai slave, dan itu sudah sangat cukup untuk mengendalikan mobil dari ponsel. Cakram plastik bercelah di kit adalah cakram encoder untuk sensor kecepatan yang bisa kamu pakai nanti agar mobil berjalan benar-benar lurus; jangan dibuang, simpan saja dulu.

Biaya: ke mana anggarannya habis?

Harga terus berubah tergantung penjual dan kurs, jadi kami tidak menyebut angka; sebagai gantinya kami menunjukkan barang mana yang paling banyak menghabiskan anggaran dan di mana kamu bisa berhemat. Aturan umumnya: modul elektronik (L298N, HC-05, resistor) murah, sedangkan sebagian besar anggaran habis untuk board, kit sasis, dan terutama baterai serta charger. Baterai adalah tempat terakhir untuk berhemat: sel 18650 yang bagus bisa diisi ulang ratusan kali dan dipakai lagi di setiap proyek robot yang kamu buat berikutnya.

BarangTingkat hargaTips hemat
Kit sasis (termasuk motor dan roda)SedangKit biasanya lebih murah daripada membeli motor, roda, dan caster secara terpisah
Arduino UnoSedang (kloningan) – tinggi (asli)Board kloningan sudah cukup untuk belajar; kamu juga bisa memakai lagi Uno atau Nano yang sudah kamu punya
Driver motor L298NRendahSatu modul mengendalikan dua motor; satu juga cukup untuk 4WD
HC-05 / HC-06Rendah – sedangJika kamu hanya mengendalikan dari ponsel, HC-06 sudah cukup
2× sel 18650 + chargerPos terbesarSel sangat murah berlabel “9900 mAh” biasanya palsu; jangan berhemat di sini
Kabel, resistor, kapasitor, sekrupRendahKebanyakan sudah ada di starter kit
Jika kamu sudah punya starter kit Arduino, board, kabel jumper, dan resistornya sudah tersedia; kamu hanya butuh kit sasis, L298N, HC-05, dan baterai. “Smart car kit” siap pakai yang semua isinya ada dalam satu kotak memang praktis karena membawa board motor dan kode siap pakai sendiri, tapi harganya lebih mahal dan menghilangkan kesempatan untuk mempelajari pengkabelannya.

2WD atau 4WD?

Fitur2WD (2 motor + caster)4WD (4 motor)
BerbelokBerputar di tempat, tajam dan mudahBerbelok dengan menyeret roda ke samping (skid steer); kesulitan di karpet
Tarikan arusSekitar 0,3–0,6 A selama berjalanSekitar dua kali lipat
Umur bateraiLebih lamaLebih singkat
Permukaan kasarCaster bisa tersangkut di tepianCengkeraman lebih baik
Berjalan lurusCaster bisa mendorong mobil keluar jalur ketika berputarLebih stabil
Sambungan L298NSetiap motor di kanalnya sendiriDua motor di setiap sisi diparalel di satu kanal
Paling cocok untukMobil pertama, robot pengikut garisLuar ruangan, beban lebih berat

Kami menganjurkan 2WD untuk mobil pertamamu: lebih murah, menarik arus lebih kecil, mudah berputar di tempat, dan lebih cocok untuk proyek lanjutan seperti robot pengikut garis. Jika kamu membuat mobil 4WD, sambungkan dua motor di setiap sisi secara paralel ke terminal OUT yang sama dan pastikan keduanya berputar ke arah yang sama. Satu kanal L298N lalu membawa arus dua motor; itu tidak masalah ketika berjalan biasa, tapi ketika roda macet batas 2 A per kanal bisa terlampaui dan proteksi panas driver memutus motor.

Catu daya: kenapa dua sel 18650?

Kebanyakan masalah mobil robot berasal dari baterai yang salah. Sumber daya yang tepat harus memenuhi dua syarat sekaligus: masih menyisakan tegangan yang cukup untuk motor setelah rugi-rugi L298N, dan tidak anjlok ketika motor menarik beberapa ampere ketika mulai berputar. Dua sel Li-ion 18650 seri (2S) memberi 8,4 V ketika penuh dan rata-rata 7,4 V, dan dengan mudah memberi beberapa ampere. Arduino Uno menganjurkan 7–12 V di input VIN, jadi paket yang sama bisa memberi daya ke motor sekaligus Arduino. Dengan sel 2500 mAh, mobil 2WD yang menarik rata-rata 0,8 A selama berjalan (motor ditambah board) secara teori berjalan sekitar 3 jam; karena paketnya tidak pernah kamu kosongkan sepenuhnya, 2–2,5 jam adalah angka yang lebih realistis. Untuk menghitung dengan nilaimu sendiri, pakai alat Umur baterai.

Sel isi ulang Li-ion 18650
Sel Li-ion 18650: diameter 18 mm dan panjang 65 mm; 4,2 V ketika penuh dan rata-rata 3,6–3,7 V. Dua sel seri membentuk paket 7,4 V yang ideal untuk mobil robot.
Sumber dayaTeganganKemampuan arusUntuk mobil robot
Baterai 9 V PP39 VSangat rendahTidak cocok; penyebab reset paling umum
4× AA alkaline6 V (cepat turun di bawah beban)SedangLemah; hanya sekitar 4 V yang sampai ke motor setelah L298N
4× AA NiMH (isi ulang)4,8 VBagusTegangannya tidak cukup dengan L298N
2× Li-ion 18650 (2S)7,4 V (8,4 V penuh)Tinggi (beberapa ampere)Pilihan terbaik
3× Li-ion 18650 (3S)11,1 V (12,6 V penuh)TinggiTerlalu tinggi untuk motor TT; melampaui batas 12 V jumper 5V
Power bank USB5 VBagusHanya untuk memberi daya Arduino secara terpisah
Sel Li-ion bertenaga tapi butuh perawatan. Cek arah plus dan minus dua kali ketika memasang sel; sel 18650 yang terpasang terbalik atau terhubung singkat menjadi sangat panas dan bisa menyebabkan kebakaran. Tegangan per sel tidak boleh turun di bawah 3,0 V; isi ulang ketika mobilmu mulai melambat (sekitar 6,6 V untuk paket). Modul TP4056 hanya mengisi satu sel dan tidak bisa langsung mengisi paket seri; keluarkan sel dari dudukannya, isi dengan charger 18650, dan jangan pernah meninggalkannya tanpa pengawasan selama diisi.

Daripada menebak sisa muatan, kamu bisa mengukurnya. Sambungkan plus baterai (setelah saklar) ke A0 lewat pembagi tegangan dari dua resistor 10 kΩ: paket 8,4 V muncul sebagai 4,2 V di A0, di bawah batas baca 5 V Arduino. Pembagi ini hanya menarik sekitar 0,4 mA, jadi tidak memengaruhi umur baterai.

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

Perakitan langkah demi langkah

  1. Kelupas kertas pelindung dari komponen akrilik. Jika motor datang tanpa kabel, solder dua kabel ke setiap motor dan perkuat sambungan solder dengan lem tembak; kabel motor yang putus karena getaran adalah kerusakan yang paling umum.
  2. Pasang motor di bagian bawah sasis dengan braket akrilik berbentuk T dan sekrup M3 panjang dari kit. Kedua poros motor harus segaris, dan terminal kabel motor sebaiknya menghadap ke dalam.
  3. Jika kamu berencana memakai cakram encoder, pasang sekarang di sisi dalam poros motor; akan sulit dilakukan setelah roda terpasang.
  4. Pasang roda caster di tengah ujung lain sasis memakai spacer. Pilih tinggi spacer yang membuat sasis sejajar dengan lantai.
  5. Dorong roda sampai masuk penuh, sejajarkan dengan poros berbentuk D; roda yang longgar membuat mobil terus miring.
  6. Letakkan dudukan baterai dengan double tape atau Velcro di posisi yang bebannya dekat dengan as roda. Jika sebagian besar beban bertumpu di caster, roda penggerak akan selip.
  7. Pasang Arduino dan L298N di dek atas dengan spacer plastik. Port USB Arduino harus mudah dijangkau dan heatsink L298N harus berada di udara terbuka; pastikan sekrup logam tidak menyentuh titik solder di bawah board.
  8. Sambungkan saklar secara seri dengan kabel positif baterai agar kamu bisa menyalakan dan mematikan mobil tanpa melepas sel.
  9. Pilin dua kabel setiap motor bersama-sama dalam perjalanan ke L298N, buat semua kabel pendek, dan ikat dengan kabel ties. Sebelum memasang sel, cek dengan multimeter bahwa tidak ada hubungan singkat di antara terminal baterai.
Sebelum memasang motor di sasis, sentuhkan kaki setiap motor sebentar ke 2 baterai AA untuk mengecek arah putarannya dan tandai kabelnya. Jika kamu menandai kedua motor sehingga “kabel merah ke plus berarti maju”, kamu tidak akan salah arah ketika mengkabel.

Diagram pengkabelan

Bayangkan pengkabelannya dalam dua bagian: sisi daya (baterai, saklar, L298N, motor) dan sisi sinyal (kabel tipis dari Arduino ke L298N dan HC-05). Lepas jumper kecil di pin ENA dan ENB L298N; pin-pin ini akan kita sambungkan ke output PWM Arduino untuk mengatur kecepatan lewat kode. Biarkan jumper 5V L298N tetap terpasang: karena paketnya di bawah 12 V, regulator board sendiri memberi daya ke logika driver.

Modul driver motor L298N dua kanal
Driver motor L298N: motor ke terminal sekrup biru di sisi-sisinya dan baterai ke terminal tiga jalur di depan; pin ENA, IN1–IN4, dan ENB ke Arduino.
Terminal L298NSambungan
OUT1, OUT2Motor kiri (pada 4WD, dua motor kiri diparalel)
OUT3, OUT4Motor kanan (pada 4WD, dua motor kanan diparalel)
12VPlus baterai lewat saklar
GNDMinus baterai dan pin GND Arduino (ground bersama)
5VTidak disambung dengan Arduino Uno; memberi daya board pada ESP32 dan Pico
Jumper 5VTetap terpasang (baterai di bawah 12 V)
Jumper ENA dan ENBDilepas; pinnya ke output PWM Arduino
SambunganArduino UnoESP32Raspberry Pi Pico
ENA L298N (kecepatan motor kiri)D5 (PWM)GPIO 25GP15
IN1 L298ND7GPIO 27GP14
IN2 L298ND8GPIO 33GP13
ENB L298N (kecepatan motor kanan)D6 (PWM)GPIO 26GP10
IN3 L298ND9GPIO 32GP12
IN4 L298ND4GPIO 4GP11
TXD HC-05D10 (RX SoftwareSerial)Tidak perlu (Bluetooth bawaan)GP1 (RX UART0)
RXD HC-05D11, lewat pembagi 1 kΩ / 2 kΩTidak perluGP0 (TX UART0), langsung
VCC HC-055VTidak perluOutput 5V L298N
Daya boardVIN ← plus baterai setelah saklar5V (VIN) ← output 5V L298NVSYS ← output 5V L298N
GNDDisatukan dengan GND L298N dan minus bateraiDisatukanDisatukan
Jangan pernah melanggar tiga aturan: semua GND (minus baterai, L298N, Arduino, HC-05) harus disatukan; motor tidak boleh pernah diberi daya dari pin 5V Arduino; dan output 5V L298N tidak boleh ke pin VIN Arduino. VIN butuh minimal 7 V; dengan 5 V regulator Arduino tidak bisa bekerja dengan benar dan board menjadi tidak stabil. Pin RXD HC-05 adalah input 3,3 V; turunkan sinyal TX 5 V dari Uno dengan pembagi 1 kΩ dan 2 kΩ: D11 → 1 kΩ → RXD, RXD → 2 kΩ → GND (5 V × 2/3 ≈ 3,3 V).

Kami sengaja memilih D5 dan D6 sebagai pin kecepatan. Di Uno, library Servo mematikan PWM di pin 9 dan 10, dan fungsi tone() mematikannya di pin 3 dan 11. Dengan ENA dan ENB di 5 dan 6, kendali kecepatan motormu tetap bekerja ketika nanti kamu menambahkan servo atau buzzer. D2 dan D3 dicadangkan untuk encoder karena mendukung interupsi. Kamu bisa melihat tata letak pin board-mu di alat Pinout.

Sketch pertama: maju, mundur, kiri, dan kanan

Sebelum masuk ke Bluetooth, mari uji motor dan pengkabelannya sendiri dulu. Jantung kodenya adalah fungsi drive(left, right): fungsi ini menerima kecepatan setiap motor secara terpisah dari -255 sampai 255, di mana nilai positif berarti maju, nilai negatif mundur, dan nol berhenti. Kami menjelaskan bagaimana nilai kecepatan berubah menjadi tegangan di Apa Itu PWM?. Sebelum meng-upload, letakkan mobil di atas kotak agar roda berputar bebas; jeda 3 detik di setup() memberimu waktu untuk itu.

C++ (Arduino IDE)
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}
GerakanMotor kiriMotor kananKode
MajuMajuMajudrive(180, 180) (maju)
MundurMundurMundurdrive(-180, -180) (mundur)
Berputar ke kiri di tempatMundurMajudrive(-180, 180) (putar kiri)
Berputar ke kanan di tempatMajuMundurdrive(180, -180) (putar kanan)
Belok kiri melebarMaju pelanMajudrive(90, 180) (belok kiri)
BerhentiBerhentiBerhentidrive(0, 0) (berhenti)

Dengan roda di udara, mobil seharusnya bergerak maju, mundur, kiri, dan kanan bergantian. Jika satu roda berputar ke arah yang salah, jangan ubah kodenya; tukar dua kabel motor itu di terminal OUT L298N. Jika kedua roda berputar ke arah yang salah, tukar kabel kedua motor. Jika motor berdengung tapi tidak berputar, nilai SPEED terlalu rendah: kebanyakan motor TT butuh nilai PWM minimal sekitar 80–120 untuk mulai bergerak, dan ambang ini naik seiring baterai melemah.

Kendali Bluetooth dari ponselmu (HC-05)

HC-05 bekerja seperti kabel serial nirkabel antara ponsel dan Arduino: aplikasi di ponsel mengirim satu huruf, Arduino membacanya lalu menjalankan gerakan yang sesuai. Kebanyakan aplikasi pengendali yang kamu temukan di Play Store dengan mencari “Bluetooth RC Car” atau “Bluetooth RC Controller” mengirim F untuk maju, B untuk mundur, L untuk kiri, R untuk kanan, dan S untuk berhenti ketika kamu melepas tombol; sebagian juga memakai G, I, H, dan J untuk arah diagonal, serta 0–9 ditambah q untuk kecepatan. Pin, pola LED, dan perintah AT modul ini dibahas di Modul Bluetooth HC-05.

Modul Bluetooth HC-05
HC-05: terhubung ke ponsel lewat Bluetooth klasik (SPP); kecepatan bawaannya 9600 baud dan PIN pairing-nya 1234 atau 0000.
  1. Saklar mobil boleh tetap mati selama kamu meng-upload sketch di bawah; Arduino dan HC-05 mendapat daya lewat USB. Jika LED HC-05 berkedip cepat, modul sedang menunggu koneksi.
  2. Cari HC-05 di pengaturan Bluetooth ponsel Android-mu dan lakukan pairing dengan PIN 1234 (atau 0000 jika gagal).
  3. Buka aplikasi pengendali, beri izin Bluetooth dan perangkat di sekitar, lalu pilih HC-05 dari daftar perangkat. Begitu terhubung, LED modul berkedip pendek dua kali setiap dua detik.
  4. Biarkan Arduino tetap tersambung lewat USB, buka Serial Monitor di 9600 baud, lalu tekan tombol-tombol di aplikasi. Huruf yang dikirim setiap tombol muncul di layar; jika aplikasimu mengirim huruf yang berbeda, ubah baris case di kode agar cocok.
  5. Cabut kabel USB, nyalakan saklar, letakkan mobil di lantai, dan kendarai.
C++ (Arduino IDE)
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}
HurufGerakanMotor kiri / kanan
F (forward)Maju+kecepatan / +kecepatan
B (back)Mundur−kecepatan / −kecepatan
L (left)Berputar ke kiri−kecepatan / +kecepatan
R (right)Berputar ke kanan+kecepatan / −kecepatan
G, I (diagonal depan)Maju-kiri, maju-kananSatu sisi setengah kecepatan
H, J (diagonal belakang)Mundur-kiri, mundur-kananSatu sisi setengah kecepatan
S (stop)Berhenti0 / 0
0–9, q (kecepatan)Tingkat kecepatan0 → 100, 9 → 240, q → 255

TIMEOUT di kode adalah fitur keamanan: aplikasi-aplikasi ini terus mengirim huruf yang sama selama kamu menahan tombol, jadi jika tidak ada huruf yang datang selama 600 ms, kode menganggap koneksi terputus dan menghentikan mobil. Dengan begitu mobil tidak terus melaju ke dinding ketika ponsel keluar jangkauan atau aplikasi tertutup. Jika aplikasimu hanya mengirim huruf sekali per tekanan tombol, mobil akan berhenti setelah 600 ms; dalam kasus itu atur TIMEOUT ke 0 untuk mematikan fitur ini. Kami juga sama sekali tidak memakai delay() di loop(); jeda panjang membuat perintah terlambat, dan kamu akan tahu alasannya di millis() vs delay().

HC-05 dan HC-06 memakai Bluetooth klasik, jadi tidak bisa dipakai dengan iPhone; iOS tidak mengizinkan koneksi serial semacam ini. Jika kamu ingin mengendalikan dengan iPhone, pakai modul BLE seperti HM-10 atau ESP32 dengan BLE. Jika kamu ingin membuat aplikasi pengendali sendiri, lihat panduan Bluetooth Arduino dengan App Inventor.

Mobil tidak berjalan lurus: penyebab dan solusinya

Jika mobil perlahan miring ke satu sisi walaupun kamu memberi kedua motor nilai PWM yang sama untuk “maju”, jangan khawatir; ini masalah mobil robot yang paling umum. Motor bergigi murah berputar dengan kecepatan berbeda bahkan pada tegangan yang sama: perbedaan gesekan gigi, sikat, dan magnet membuat setiap motor sedikit berbeda. Tambahkan roda yang longgar, caster yang terus berputar, atau beban yang menumpuk di satu sisi, dan kemiringan 20–30 cm dalam 2 meter itu sangat normal. Perbaiki dulu penyebab mekaniknya, lalu koreksi sisa perbedaannya lewat software.

GejalaKemungkinan penyebabSolusi
Selalu miring ke sisi yang samaMotor berputar dengan kecepatan berbedaKoreksi software dengan TRIM, atau encoder
Membelok ketika mulai, lalu lurusSatu motor mulai lebih lambat, atau caster berputarSoft start; ball caster sebagai ganti caster putar
Kemiringannya berbeda setiap kaliRoda longgar, ban selip, atau braket motor bengkokMasukkan roda penuh ke poros, kencangkan sekrupnya
Berputar di tempat alih-alih majuKabel salah satu motor terbalikTukar kabel motor itu di terminal OUT
Kemiringan bertambah seiring baterai melemahPerbedaan antar motor membesar pada tegangan rendahIsi baterai; atur TRIM dengan baterai penuh
Tertarik ke satu sisi ketika makin cepatBeban berada di satu sisiPindahkan baterai dan board ke tengah, dekat as roda

Setelah masalah mekanik beres, lakukan penyetelan halus lewat software. Konstanta TRIM di kode memperlambat motor yang lebih cepat dalam persen: nilai positif memperlambat motor kiri, nilai negatif motor kanan. Kalibrasikan seperti ini:

  1. Isi penuh sel-selnya; kalibrasi dengan baterai penuh memberi hasil yang konsisten.
  2. Tempel selotip lurus sepanjang 2 meter di lantai dan letakkan mobil di awalnya, menghadap searah selotip.
  3. Di loop() sketch pertama, sisakan hanya forward() dan jeda 3 detik, lalu biarkan mobil berjalan.
  4. Jika mobil miring ke kanan, motor kiri lebih cepat: naikkan TRIM sebesar 3; jika miring ke kiri, turunkan TRIM sebesar 3.
  5. Ulangi sampai kemiringan dalam 2 meter tinggal beberapa sentimeter, lalu salin nilai TRIM yang sama ke sketch Bluetooth.
  6. Kalibrasikan di kecepatan yang paling sering kamu pakai; perbedaan antar motor sedikit berubah tergantung kecepatan.

Tingkat berikutnya untuk berjalan benar-benar lurus dan mengukur jarak adalah encoder. Kamu memasang cakram 20 celah dari kit di poros motor dan menghitung setiap celah dengan sensor kecepatan bercelah berbasis LM393. Sambungkan output sensor ke pin D2 dan D3 yang mendukung interupsi dan bandingkan jumlah pulsa kedua roda: jika sisi kiri lebih unggul, perlambat sedikit motor kiri. Kendali proporsional (P) sederhana ini menjaga mobil tetap lurus apa pun tingkat baterai dan lantainya. Roda 65 mm menempuh sekitar 20,4 cm per putaran, jadi setiap pulsa berarti kira-kira 1 cm perjalanan. Kami menjelaskan cara kerja interupsi di Interupsi Arduino.

Arduino reset ketika motor mulai berputar

Jika Arduino memulai ulang atau HC-05 kehilangan koneksinya (LED-nya mulai berkedip cepat lagi) ketika mobil mulai berjalan, berganti arah, atau menabrak rintangan, masalahnya hampir selalu ada di sisi daya. Ketika mulai berputar, dua motor bersama-sama bisa menarik 2–3 A; baterai yang lemah tidak sanggup memberikannya dan tegangannya anjlok sesaat. Prosesor Uno me-reset dirinya demi keamanan ketika catu dayanya turun di bawah 2,7 V (brown-out). Ditambah lagi noise listrik dari sikat motor dan tegangan jatuh di kabel yang tipis. Berikut solusinya, dimulai dari yang paling efektif:

  • Ganti baterainya: pakai dua sel 18650 yang terisi sebagai ganti baterai 9 V atau sel AA yang sudah lemah; kebanyakan masalah selesai di sini.
  • Pakai jalur daya yang benar: beri daya Arduino dari baterai lewat VIN; jangan sambungkan output 5V L298N ke VIN.
  • Kapasitor motor: solder kapasitor keramik 100 nF di antara dua terminal setiap motor; kapasitor ini meredam noise sikat langsung dari sumbernya.
  • Kapasitor cadangan: sambungkan kapasitor elektrolit 470–1000 µF ke terminal 12V dan GND L298N (kaki plus ke 12V). Kapasitor ini menutupi kebutuhan arus sesaat ketika mulai berputar.
  • Soft start: alih-alih langsung melompat ke 255, naikkan kecepatan bertahap seperti di bawah; lonjakan arusnya jadi lebih kecil.
  • Berhenti dulu sebelum mundur: beralih langsung dari maju ke mundur mendorong arus motor ke puncaknya; berhentilah 100–200 ms sebelum berganti arah.
  • Kabel daya yang tebal dan pendek: jangan pakai kabel jumper atau breadboard di antara baterai dan L298N; pakai kabel minimal 0,5 mm² dan terminal sekrup.
  • Catu daya terpisah: jika masalahnya berlanjut, beri daya Arduino dari power bank dan motor dari baterai, lalu satukan kedua GND-nya.
C++ (Arduino IDE)
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()
Cara mudah untuk mengetahui apakah masalahnya di daya atau di kode: lepas kabel VIN, biarkan Arduino mendapat daya lewat USB dari komputermu (sambungan GND tetap terpasang), lalu jalankan motor dari baterai. Jika reset berhenti, masalahnya pasti di sisi daya. Menyambungkan multimeter antara VIN dan GND dan memperhatikan tegangannya ketika mobil mulai berjalan juga langsung menunjukkan penurunannya. Untuk penyebab lain, lihat Arduino Terus Reset.

Mobil robot dengan ESP32 dan Raspberry Pi Pico

ESP32 punya Bluetooth klasik bawaan, jadi kamu tidak butuh HC-05: library BluetoothSerial membuat koneksi serial yang sama dengan ponsel dan aplikasi pengendali di atas bekerja tanpa perubahan. Input L298N menganggap apa pun di atas sekitar 2,3 V sebagai HIGH, jadi sinyal 3,3 V ESP32 sudah cukup. Beri daya board ESP32 dari output 5V L298N ke pin 5V (VIN) board; jangan sambungkan baterai langsung ke pin itu. Kode ini tidak bisa dikompilasi untuk ESP32-S3 dan ESP32-C3, karena keduanya hanya punya BLE.

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

Raspberry Pi Pico standar tidak punya Bluetooth, jadi kamu menyambungkan HC-05 ke pin UART0. Karena Pico bekerja di 3,3 V, kali ini tidak perlu pembagi tegangan. Beri daya Pico lewat pin VSYS dan HC-05 langsung dari output 5V L298N; ketika berjalan dengan baterai tanpa USB, tidak ada tegangan di pin VBUS. Di kode Pico kecepatannya diberikan dalam persen dari -100 sampai 100:

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

Langkah berikutnya: tingkatkan mobilmu

  • Robot penghindar rintangan: tambahkan sensor jarak HC-SR04 di depan dan motor servo yang memutarnya ke kiri dan kanan; detailnya di panduan Robot Penghindar Rintangan.
  • Robot pengikut garis: pasang 2–3 sensor inframerah TCRT5000 di bawah bagian depan dan ikuti garis hitam di lantai; lihat Robot Pengikut Garis.
  • Remote joystick: buat remote sungguhan tanpa ponsel dengan Arduino kedua, modul joystick, dan nRF24L01.
  • Remote inframerah: kendarai dengan tombol remote TV-mu; petakan kode dari Penerima IR dan Remote ke perintah gerak.
  • Mengemudi lewat Wi-Fi: pakai ESP32 untuk menyajikan halaman pengendali yang terbuka di browser ponselmu; panduan Web Server dan WebSocket ESP32 membahas dasar-dasarnya.
  • Encoder dan jarak: pakai sensor kecepatan untuk berjalan tepat 1 meter dan berbelok tepat 90 derajat; ini dasar robot pemecah labirin.
  • Lengan robot: tambahkan lengan robot kecil berpenggerak servo di atas mobil untuk membawa benda.
Sensor jarak HC-SR04
Sensor jarak HC-SR04
Sensor inframerah TCRT5000
Sensor inframerah TCRT5000
Motor servo SG90
Motor servo SG90

Kesalahan umum dan solusinya

  • Tidak ada motor yang berputar: GND tidak disatukan, saklar mati, jumper ENA dan ENB sudah dilepas tapi pinnya tidak disambung, atau baterainya habis.
  • LED L298N menyala tapi motor hanya berdengung: nilai PWM di bawah ambang mulai motor atau tegangan baterai rendah; naikkan kecepatan dan isi baterainya.
  • Sketch tidak mau di-upload: mungkin port atau board yang dipilih salah; jika kamu menyambungkan HC-05 ke pin 0 dan 1, lepas selama upload. Penyebab lain ada di Kode Arduino Gagal Di-upload.
  • Ponsel melihat HC-05 tapi tidak mau terhubung: modul sedang terhubung ke ponsel lain, aplikasi belum diberi izin “perangkat di sekitar”, atau PIN pairing-nya salah.
  • Mobil bereaksi terlambat terhadap perintah: ada delay() di loop() atau terlalu banyak yang dicetak ke Serial Monitor; lakukan penantianmu dengan millis().
  • Heatsink L298N jadi sangat panas: roda macet, atau pada mobil 4WD arus per kanal terlalu tinggi; cek gesekan mekaniknya.
  • Mobil tersentak sesaat ketika dinyalakan: pin tidak terdefinisi sebentar ketika board mulai; atur pin sebagai output dan panggil drive(0, 0) di baris-baris paling awal setup().

Mobil robot Arduino adalah titik awal yang hebat untuk belajar kendali motor, manajemen daya, komunikasi nirkabel, dan mencari bug dalam satu proyek. Ketika selesai, kamu punya sasis yang sedikit lebih pintar dengan setiap sensor baru. Di aplikasi BlueGrays kamu akan menemukan proyek Mobil Kendali Bluetooth dengan L298N, Robot Penghindar Rintangan, dan Deteksi Permukaan Hitam dan Putih TCRT5000 langkah demi langkah, lengkap dengan skema rangkaian dan kode.

Pertanyaan umum

Apa saja yang dibutuhkan untuk membuat mobil Arduino, dan berapa biayanya?

Untuk mobil Bluetooth dasar kamu butuh kit sasis 2WD (2 motor TT, roda, caster), Arduino Uno, driver motor L298N, modul Bluetooth HC-05, dua sel 18650 dengan dudukannya, dan beberapa kabel jumper. Harganya bervariasi tergantung penjual; modulnya murah, dan sebagian besar anggaran habis untuk board, kit sasis, dan baterai beserta charger. Jika kamu sudah punya starter kit, biayanya turun cukup banyak.

Baterai apa yang sebaiknya dipakai untuk mobil robot Arduino?

Pilihan terbaik adalah dua sel Li-ion 18650 seri: keduanya memberi 7,4 V, masih menyisakan 5–6 V untuk motor setelah rugi-rugi L298N sekitar 2 V, dan menyuplai arus tinggi yang dibutuhkan ketika mulai berputar. Baterai 9 V PP3 tidak sanggup memberi arus yang cukup dan menyebabkan reset, sedangkan 4 sel AA membuat motor berputar pelan dengan L298N.

Kenapa mobil Arduino-ku tidak berjalan lurus?

Motor bergigi murah berputar dengan kecepatan berbeda bahkan pada nilai PWM yang sama, dan roda yang longgar, caster, serta beban yang tidak merata menambah kemiringannya. Perbaiki dulu masalah mekaniknya, lalu perlambat sedikit motor yang lebih cepat dengan nilai trim di kode. Untuk berjalan benar-benar lurus kamu butuh encoder untuk mengukur dan menyamakan kecepatan kedua roda.

Kenapa Arduino-ku reset ketika motor mulai berputar?

Motor menarik beberapa ampere ketika mulai berputar dan tegangan baterai yang lemah anjlok sesaat; prosesor Uno me-reset dirinya ketika catu dayanya turun. Pakai sel 18650 yang terisi, tambahkan kapasitor 100 nF di terminal motor dan kapasitor 470–1000 µF di input L298N, lalu naikkan kecepatan secara bertahap. Jika masalahnya berlanjut, beri daya Arduino dari sumber terpisah dan satukan GND-nya.

Apakah mobil Bluetooth HC-05 bisa dipakai dengan iPhone?

Tidak. HC-05 dan HC-06 memakai profil port serial dari Bluetooth klasik, dan iOS tidak mengizinkan aplikasi biasa membuka koneksi semacam itu. Untuk mengendalikan mobil dari iPhone, pakai modul BLE seperti HM-10 atau ESP32 dengan BLE; ponsel Android terhubung ke HC-05 tanpa masalah.

Bisakah aku memakai motor shield L293D sebagai ganti L298N?

Bisa. Motor shield L293D dipasang di atas Arduino Uno dan bisa mengendalikan empat motor DC, sehingga pengkabelan di mobil 4WD lebih sederhana. Namun arus kontinunya hanya sekitar 0,6 A per kanal, jadi lebih cepat kewalahan daripada L298N ketika motor macet, dan shield ini memakai banyak pin. Jika kamu menginginkan yang lebih efisien, driver MOSFET seperti TB6612FNG kehilangan tegangan jauh lebih sedikit.

Lihat semua proyek
Mobil Kendali Bluetooth dengan L298N
#80Mahir
Premium

Mobil Kendali Bluetooth dengan L298N

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

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

Robot Penghindar Rintangan

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

5.0(38)
49
Kendalikan LED dari Ponselmu lewat Bluetooth
#34Pemula
Premium

Kendalikan LED dari Ponselmu lewat Bluetooth

Latihan kecil untuk menyalakan dan mematikan lampu kamarmu dari ponsel. Modul Bluetooth meneruskan huruf yang dikirim dari ponselmu ke Arduino; satu huruf menyalakan LED merah, huruf lain menyalakan L

4.8(68)
89
Deteksi Permukaan Hitam dan Putih TCRT5000
#78Menengah
Premium

Deteksi Permukaan Hitam dan Putih TCRT5000

Dengan sensor kecil yang menjadi mata robot pengikut garis, kamu bisa tahu apakah lantainya hitam atau putih. TCRT5000 menyinari lantai dengan cahaya tak terlihat dan mengecek berapa banyak yang terpa

4.7(40)
49
Membaca Pantulan (Kedekatan) dengan TCRT5000
#77Menengah
Premium

Membaca Pantulan (Kedekatan) dengan TCRT5000

Dengan sensor kecil yang memancarkan cahaya tak terlihat dan mengukur berapa banyak yang terpantul kembali, kamu bisa mendeteksi permukaan di depannya. Makin dekat sebuah benda atau permukaan berwarna

4.6(33)
43
Pengukuran Jarak HC-SR04 (Tampilan Serial)
#27Pemula

Pengukuran Jarak HC-SR04 (Tampilan Serial)

Sensor HC-SR04 bekerja persis seperti kelelawar yang mencari jalan dalam gelap: ia mengirim suara yang tidak bisa kamu dengar, mendengarkan pantulannya, dan mengukur seberapa jauh benda di depannya. A

4.6(46)
71
Sensor Parkir dengan HC-SR04
#28Menengah
Premium

Sensor Parkir dengan HC-SR04

Versi mini sensor parkir mobil: makin dekat sesuatu, makin cepat bunyi bipnya. Sensor jarak mengukur benda di depannya; jika jaraknya lebih dari 20 sentimeter LED hijau tetap menyala, dan begitu lebih

4.8(64)
85
Menggunakan Motor Servo
#35Pemula
Premium

Menggunakan Motor Servo

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

4.7(48)
67