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.




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.

| Fitur | Motor TT kuning (1:48) |
|---|---|
| Tegangan kerja | 3–6 V |
| Rasio gigi | 1:48 (gigi plastik) |
| Kecepatan tanpa beban | Sekitar 90–120 RPM di 3 V, 200–250 RPM di 6 V |
| Arus tanpa beban | Sekitar 150–160 mA |
| Arus stall | Sekitar 1,1–1,5 A |
| Diameter roda (di kit) | 65 mm |
| Kecepatan mobil di 6 V | Sekitar 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
| Komponen | Jml | Catatan |
|---|---|---|
| Kit sasis mobil robot akrilik 2WD | 1 | Biasanya berisi 2 motor TT, 2 roda, roda caster, saklar, braket motor, dan sekrup |
| Arduino Uno R3 (kloningan juga boleh) + kabel USB | 1 | Nano juga bisa; nomor pinnya sama |
| Modul driver motor L298N | 1 | 2 A per kanal; mengendalikan dua motor secara terpisah |
| Modul Bluetooth HC-05 atau HC-06 | 1 | Untuk berkomunikasi dengan ponsel Android |
| Sel Li-ion 18650 | 2 | Sel bermerek yang sanggup memberi minimal 5 A |
| Dudukan baterai 18650 2 slot (seri) | 1 | Menyambungkan dua sel secara seri untuk 7,4 V |
| Charger 18650 | 1 | Charger 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 + 1 | Pembagi tegangan untuk input RXD HC-05 |
| Kapasitor keramik 100 nF | 2–4 | Di terminal motor untuk meredam noise |
| Kapasitor elektrolit 470–1000 µF (16 V atau lebih) | 1 | Dianjurkan; di input daya L298N |
| Kabel ties, double tape, spacer M3 | Beberapa | Untuk 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.
| Barang | Tingkat harga | Tips hemat |
|---|---|---|
| Kit sasis (termasuk motor dan roda) | Sedang | Kit biasanya lebih murah daripada membeli motor, roda, dan caster secara terpisah |
| Arduino Uno | Sedang (kloningan) – tinggi (asli) | Board kloningan sudah cukup untuk belajar; kamu juga bisa memakai lagi Uno atau Nano yang sudah kamu punya |
| Driver motor L298N | Rendah | Satu modul mengendalikan dua motor; satu juga cukup untuk 4WD |
| HC-05 / HC-06 | Rendah – sedang | Jika kamu hanya mengendalikan dari ponsel, HC-06 sudah cukup |
| 2× sel 18650 + charger | Pos terbesar | Sel sangat murah berlabel “9900 mAh” biasanya palsu; jangan berhemat di sini |
| Kabel, resistor, kapasitor, sekrup | Rendah | Kebanyakan sudah ada di starter kit |
2WD atau 4WD?
| Fitur | 2WD (2 motor + caster) | 4WD (4 motor) |
|---|---|---|
| Berbelok | Berputar di tempat, tajam dan mudah | Berbelok dengan menyeret roda ke samping (skid steer); kesulitan di karpet |
| Tarikan arus | Sekitar 0,3–0,6 A selama berjalan | Sekitar dua kali lipat |
| Umur baterai | Lebih lama | Lebih singkat |
| Permukaan kasar | Caster bisa tersangkut di tepian | Cengkeraman lebih baik |
| Berjalan lurus | Caster bisa mendorong mobil keluar jalur ketika berputar | Lebih stabil |
| Sambungan L298N | Setiap motor di kanalnya sendiri | Dua motor di setiap sisi diparalel di satu kanal |
| Paling cocok untuk | Mobil pertama, robot pengikut garis | Luar 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.

| Sumber daya | Tegangan | Kemampuan arus | Untuk mobil robot |
|---|---|---|---|
| Baterai 9 V PP3 | 9 V | Sangat rendah | Tidak cocok; penyebab reset paling umum |
| 4× AA alkaline | 6 V (cepat turun di bawah beban) | Sedang | Lemah; hanya sekitar 4 V yang sampai ke motor setelah L298N |
| 4× AA NiMH (isi ulang) | 4,8 V | Bagus | Tegangannya 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) | Tinggi | Terlalu tinggi untuk motor TT; melampaui batas 12 V jumper 5V |
| Power bank USB | 5 V | Bagus | Hanya untuk memberi daya Arduino secara terpisah |
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.
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
- 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.
- 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.
- Jika kamu berencana memakai cakram encoder, pasang sekarang di sisi dalam poros motor; akan sulit dilakukan setelah roda terpasang.
- Pasang roda caster di tengah ujung lain sasis memakai spacer. Pilih tinggi spacer yang membuat sasis sejajar dengan lantai.
- Dorong roda sampai masuk penuh, sejajarkan dengan poros berbentuk D; roda yang longgar membuat mobil terus miring.
- 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.
- 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.
- Sambungkan saklar secara seri dengan kabel positif baterai agar kamu bisa menyalakan dan mematikan mobil tanpa melepas sel.
- 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.
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.

| Terminal L298N | Sambungan |
|---|---|
| OUT1, OUT2 | Motor kiri (pada 4WD, dua motor kiri diparalel) |
| OUT3, OUT4 | Motor kanan (pada 4WD, dua motor kanan diparalel) |
| 12V | Plus baterai lewat saklar |
| GND | Minus baterai dan pin GND Arduino (ground bersama) |
| 5V | Tidak disambung dengan Arduino Uno; memberi daya board pada ESP32 dan Pico |
| Jumper 5V | Tetap terpasang (baterai di bawah 12 V) |
| Jumper ENA dan ENB | Dilepas; pinnya ke output PWM Arduino |
| Sambungan | Arduino Uno | ESP32 | Raspberry Pi Pico |
|---|---|---|---|
| ENA L298N (kecepatan motor kiri) | D5 (PWM) | GPIO 25 | GP15 |
| IN1 L298N | D7 | GPIO 27 | GP14 |
| IN2 L298N | D8 | GPIO 33 | GP13 |
| ENB L298N (kecepatan motor kanan) | D6 (PWM) | GPIO 26 | GP10 |
| IN3 L298N | D9 | GPIO 32 | GP12 |
| IN4 L298N | D4 | GPIO 4 | GP11 |
| TXD HC-05 | D10 (RX SoftwareSerial) | Tidak perlu (Bluetooth bawaan) | GP1 (RX UART0) |
| RXD HC-05 | D11, lewat pembagi 1 kΩ / 2 kΩ | Tidak perlu | GP0 (TX UART0), langsung |
| VCC HC-05 | 5V | Tidak perlu | Output 5V L298N |
| Daya board | VIN ← plus baterai setelah saklar | 5V (VIN) ← output 5V L298N | VSYS ← output 5V L298N |
| GND | Disatukan dengan GND L298N dan minus baterai | Disatukan | Disatukan |
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.
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}| Gerakan | Motor kiri | Motor kanan | Kode |
|---|---|---|---|
| Maju | Maju | Maju | drive(180, 180) (maju) |
| Mundur | Mundur | Mundur | drive(-180, -180) (mundur) |
| Berputar ke kiri di tempat | Mundur | Maju | drive(-180, 180) (putar kiri) |
| Berputar ke kanan di tempat | Maju | Mundur | drive(180, -180) (putar kanan) |
| Belok kiri melebar | Maju pelan | Maju | drive(90, 180) (belok kiri) |
| Berhenti | Berhenti | Berhenti | drive(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.

- 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.
- Cari HC-05 di pengaturan Bluetooth ponsel Android-mu dan lakukan pairing dengan PIN 1234 (atau 0000 jika gagal).
- 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.
- 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.
- Cabut kabel USB, nyalakan saklar, letakkan mobil di lantai, dan kendarai.
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}| Huruf | Gerakan | Motor 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-kanan | Satu sisi setengah kecepatan |
| H, J (diagonal belakang) | Mundur-kiri, mundur-kanan | Satu sisi setengah kecepatan |
| S (stop) | Berhenti | 0 / 0 |
| 0–9, q (kecepatan) | Tingkat kecepatan | 0 → 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().
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.
| Gejala | Kemungkinan penyebab | Solusi |
|---|---|---|
| Selalu miring ke sisi yang sama | Motor berputar dengan kecepatan berbeda | Koreksi software dengan TRIM, atau encoder |
| Membelok ketika mulai, lalu lurus | Satu motor mulai lebih lambat, atau caster berputar | Soft start; ball caster sebagai ganti caster putar |
| Kemiringannya berbeda setiap kali | Roda longgar, ban selip, atau braket motor bengkok | Masukkan roda penuh ke poros, kencangkan sekrupnya |
| Berputar di tempat alih-alih maju | Kabel salah satu motor terbalik | Tukar kabel motor itu di terminal OUT |
| Kemiringan bertambah seiring baterai melemah | Perbedaan antar motor membesar pada tegangan rendah | Isi baterai; atur TRIM dengan baterai penuh |
| Tertarik ke satu sisi ketika makin cepat | Beban berada di satu sisi | Pindahkan 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:
- Isi penuh sel-selnya; kalibrasi dengan baterai penuh memberi hasil yang konsisten.
- Tempel selotip lurus sepanjang 2 meter di lantai dan letakkan mobil di awalnya, menghadap searah selotip.
- Di loop() sketch pertama, sisakan hanya forward() dan jeda 3 detik, lalu biarkan mobil berjalan.
- Jika mobil miring ke kanan, motor kiri lebih cepat: naikkan TRIM sebesar 3; jika miring ke kiri, turunkan TRIM sebesar 3.
- Ulangi sampai kemiringan dalam 2 meter tinggal beberapa sentimeter, lalu salin nilai TRIM yang sama ke sketch Bluetooth.
- 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.
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()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.
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:
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: stopLangkah 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.



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.
Proyek untuk dibuat setelah membaca ini
Lihat semua proyek
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

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

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

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

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

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

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

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
Artikel lainnya
Aplikasi BlueGrays
Rakit rangkaian ini langkah demi langkah di ponselmu
Skema pengkabelan, kode, dan daftar komponen dalam satu layar. 200+ proyek Arduino, ESP32, dan Pico siap dibuat.
Pindai dengan ponselmu
Arahkan kamera ke kode ini dan toko aplikasi di ponselmu akan terbuka.
atau buka toko aplikasi

