Komponen · 15 mnt baca

Motor Shield L293D Arduino: AFMotor, 4 Motor DC, Stepper, dan Servo

Cara memakai motor shield L293D: library AFMotor, jumper PWR, pin yang masih bebas, kode mobil 4WD, motor stepper, servo, batas 0,6 A, dan solusi motor yang tidak mau berputar.

Motor shield L293D adalah board driver motor yang langsung ditancapkan di atas Arduino Uno dan memungkinkanmu menggerakkan 4 motor DC, 2 motor stepper, dan 2 servo dari satu board. Dua chip L293D di atasnya memasok arus yang dibutuhkan motor, membalik arah putarannya, dan mengatur kecepatannya dengan PWM, jadi kamu bisa mengendalikan semua motor mobil robot beroda empat tanpa satu kabel jumper pun. Hampir semua board yang beredar di pasaran adalah tiruan desain lama Adafruit, Motor Shield V1, dan diprogram dengan library yang sama: AFMotor.

Di panduan ini kamu akan belajar apa saja yang ada di shield, pin Arduino mana yang dipakainya dan mana yang tetap bebas untuk sensor, cara kerja jumper PWR yang sering membingungkan dalam tiga susunan catu daya yang berbeda, perintah-perintah library AFMotor, dan kode lengkap mobil robot beroda empat yang kamu kendalikan dari ponsel. Di bagian akhir kami membahas batas arus 0,6 A, kenapa chip-nya panas, perbandingannya dengan L298N, dan semua penyebab “motorku tidak mau berputar” yang sudah diketahui dalam satu tabel.

Motor shield L293D dilihat dari atas: terminal M1–M4, header servo, dan jumper daya
Motor shield L293D (desain Adafruit V1): 74HC595 di tengah dengan chip L293D di kedua sisinya; terminal M1–M2 di kiri, M3–M4 di kanan, dua header servo di kiri atas, serta terminal daya eksternal dan jumper PWR di bawah.

Apa itu motor shield L293D dan bagaimana cara kerjanya?

Untuk memutar motor DC ke dua arah, kamu butuh rangkaian empat sakelar yang disebut H-bridge; idenya kami jelaskan secara detail di Mengendalikan Motor DC dengan L298N. Chip L293D berisi dua H-bridge, dan karena shield membawa dua chip ini, totalnya kamu dapat empat kanal motor. Huruf “D” di namanya menandakan bahwa dioda proteksi yang meredam lonjakan tegangan balik dari motor ketika dimatikan sudah tertanam di dalam chip. L293D juga mematikan output-nya sendiri ketika terlalu panas.

Trik utama shield ini adalah shift register 74HC595 di tengahnya. Masing-masing dari empat motor butuh dua sinyal untuk arah dan satu untuk kecepatan, jadi totalnya 12 pin Arduino. Shield mengirim delapan sinyal arah secara serial ke 74HC595 dan hanya menghabiskan 4 pin untuk itu (D4, D7, D8, D12), ditambah 4 pin PWM untuk kecepatan (D3, D5, D6, D11). Desain ini menghemat pin, tapi ada harganya: kamu tidak bisa menggerakkan motor langsung dengan digitalWrite; kamu butuh library yang menggeser bit arah ke dalam register. Library itu adalah AFMotor.

FiturNilai
Chip driver2 × L293D (total 4 H-bridge)
Kontrol arahShift register 74HC595 (D4, D7, D8, D12)
Tegangan catu motor4,5–25 V (terminal daya eksternal)
Arus per kanal0,6 A kontinu, puncak sangat singkat 1,2 A
Kontrol kecepatanPWM 8-bit, setSpeed(0–255)
Motor yang bisa digerakkan4 motor DC, 2 stepper, atau 2 DC + 1 stepper
Servo2, dicatu dari jalur 5 V Arduino (D9 dan D10)
ProteksiDioda bawaan, pemutusan termal
Board yang kompatibelArduino Uno R3 dan Mega 2560 (Uno R4 dan Leonardo tidak didukung)

Apa saja yang ada di board? Terminal, header, dan jumper

BagianFungsinya
Blok terminal M1 dan M2 (kiri)Motor DC 1 dan 2; sekrup GND di tengah untuk kabel common motor stepper unipolar
Blok terminal M3 dan M4 (kanan)Motor DC 3 dan 4, atau port stepper 2
EXT_PWR (+M dan GND)Input daya motor: battery pack atau adaptor
Jumper PWRJika terpasang, menghubungkan catu motor ke jalur Vin Arduino
SER1 dan SERVO_2Dua header servo (−, +, S); D10 dan D9
LED PWRMenunjukkan ada tidaknya daya motor; kalau mati, motor tidak akan berputar
Tombol RESETSalinan tombol reset Arduino di atas shield
Baris A0–A5Pin analog yang bebas; di kebanyakan board ada juga baris +5V dan GND di sebelahnya

Pin mana yang dipakai shield dan mana yang tetap bebas?

Pin ArduinoTugas di shieldKapan terpakai?
D3Kecepatan M2 (PWM, Timer2)Ketika M2 atau stepper 1 dipakai
D4Clock 74HC595 (CLK)Ketika motor DC atau stepper mana pun dipakai
D5Kecepatan M4 (PWM, Timer0)Ketika M4 atau stepper 2 dipakai
D6Kecepatan M3 (PWM, Timer0)Ketika M3 atau stepper 2 dipakai
D7Output enable 74HC595 (EN)Ketika motor mana pun dipakai
D8Input data 74HC595 (DATA)Ketika motor mana pun dipakai
D9Sinyal SERVO_2 (Timer1)Hanya ketika servo itu dipakai
D10Sinyal SER1 (Timer1)Hanya ketika servo itu dipakai
D11Kecepatan M1 (PWM, Timer2)Ketika M1 atau stepper 1 dipakai
D12Latch 74HC595 (LATCH)Ketika motor mana pun dipakai
D0, D1Tidak dipakai (jalur serial USB)Selama upload dan selama Serial Monitor terbuka
D2Tidak dipakai; ada pad solder kecil di boardTidak pernah
D13Tidak dipakai, tapi tidak dikeluarkan ke atas shieldTidak pernah
A0–A5 (D14–D19)Tidak dipakai; dikeluarkan dalam satu baris di tepi boardTidak pernah

Enam pin analog yang bebas sudah lebih dari cukup untuk sensor, karena A0–A5 di Uno juga bisa berfungsi sebagai pin digital 14–19 kalau perlu. Contoh susunan yang praktis: sensor jarak HC-SR04 atau modul Bluetooth lewat SoftwareSerial di A0 dan A1, sensor garis atau sensor rintangan di A2 dan A3, dan bus I2C (OLED, LCD, MPU6050) di A4 dan A5. Untuk encoder roda atau tombol yang memakai attachInterrupt(), D2 adalah satu-satunya pin yang bebas; pin interrupt Uno yang lain, D3, adalah pin kecepatan M2. Kalau kamu tidak memakai servo, D9 dan D10 juga bebas. Susunan board-mu bisa kamu lihat di alat Pinout, dan kemampuan setiap pin di Pinout Arduino Uno.

Selama shield terpasang, jangan pakai D3–D8, D11, atau D12 untuk keperluan lain di kodemu. Misalnya, kalau kamu menyambungkan pin trig HC-SR04 ke D7 atau LED ke D12, data yang menuju 74HC595 jadi rusak dan motor berganti arah secara acak. Selain itu, sinyal kecepatan M1 dan M2 berasal dari Timer2: fungsi tone() dan library IRremote di Uno juga memakai Timer2, jadi selama keduanya berjalan, kontrol kecepatan M1 dan M2 jadi kacau.

Daya dan jumper PWR: tiga cara pengkabelan yang benar

Terminal EXT_PWR dua sekrup di tepi bawah board adalah input daya untuk motor; sisi positifnya biasanya bertanda “+M” atau “+”, dan sisi negatifnya “GND”. Jumper PWR tepat di sebelahnya menghubungkan jalur motor ini ke pin Vin Arduino. Dengan jumper terpasang, kedua board berjalan dari satu sumber: tegangan yang kamu masukkan ke EXT_PWR juga mencatu Arduino lewat Vin, atau adaptor yang dicolokkan ke jack DC Arduino juga mencatu motor. Dengan jumper dilepas, kedua jalur benar-benar terpisah. LED PWR di board hanya menyala kalau ada daya motor; itulah hal pertama yang perlu dicek sebelum kamu mulai mencari masalah pada motor.

SusunanDaya ArduinoDaya motorJumper PWR
Satu sumber (baterai atau adaptor 7–12 V)Sumber yang sama, lewat VinEXT_PWR atau jack DC ArduinoTerpasang
Arduino dari USB, motor dari bateraiKabel USBEXT_PWRDilepas
Dua sumber terpisah (paling aman)Jack DC atau USBEXT_PWRDilepas

Pilihan paling umum untuk mobil robot adalah satu sumber: kamu menyambungkan battery pack berisi dua sel 18650 ke EXT_PWR, memasang jumper, dan Arduino serta motor sama-sama berjalan dari baterai yang sama. Caranya sederhana, tapi ketika motor menarik arus besar waktu mulai berputar, tegangan baterai bisa turun sekejap dan Arduino bisa reset. Kalau itu terjadi, melepas jumper dan mencatu Arduino dari sumber terpisah (power bank, USB, atau adaptor 9 V) menyelesaikannya untuk seterusnya. Di meja kerja, susunan kedua adalah yang paling praktis: Arduino tetap tersambung ke komputermu, motor berjalan dari baterai, dan jumper dilepas.

Terminal EXT_PWR tidak punya dioda proteksi polaritas terbalik; menyambungkan baterai secara terbalik langsung merusak shield dan kemungkinan besar Arduino juga. Dengan jumper terpasang, jangan pernah menyambungkan sumber terpisah ke jack DC dan EXT_PWR sekaligus, karena kedua catu daya akan terhubung singkat satu sama lain. Dan jangan pernah memasukkan catu motor ke pin 5V Arduino.

Baterai mana yang sebaiknya dipilih? Tergantung arusnya, transistor output L293D “menelan” sekitar 1,5–2,6 V, jadi motor menerima tegangan sebanyak itu lebih rendah dari tegangan baterai. Untuk motor TT kuning 3–6 V di kit robot, dua sel lithium 18650 (nominal 7,4 V, 8,4 V ketika penuh) adalah pilihan ideal: motor mendapat sekitar 5,5–6 V, dan dengan jumper terpasang regulator Arduino juga nyaman. Empat baterai AA (6 V) hanya menyisakan sekitar 4 V untuk motor dan tidak cukup untuk mencatu Arduino lewat Vin. Baterai kotak 9 V (PP3) tidak bisa memberi lebih dari beberapa ratus miliampere; motor tidak berputar sama sekali atau baterainya habis dalam hitungan menit. Lama pemakaian bisa kamu perkirakan dengan kalkulator umur baterai, dan semua pilihan catu daya bisa kamu baca di Cara Memberi Daya ke Arduino.

Menginstal library AFMotor

  1. Buka Library Manager di Arduino IDE (Tools > Manage Libraries atau Ctrl+Shift+I).
  2. Ketik Adafruit Motor Shield di kotak pencarian. Akan muncul dua hasil: Adafruit Motor Shield library, yang deskripsinya menyebut “V1 firmware”, dan Adafruit Motor Shield V2 Library.
  3. Untuk shield L293D, instal yang V1. Library V2 untuk board yang sama sekali berbeda, yang berkomunikasi lewat I2C dan memakai chip TB6612.
  4. Tambahkan baris #include <AFMotor.h> di bagian atas sketch-mu.
  5. Kalau mau, buka File > Examples > Adafruit Motor Shield library > MotorTest dan uji board dengan satu motor di M1.
Kalau muncul AFMotor.h: No such file or directory ketika kompilasi, berarti library-nya belum terinstal sama sekali atau kamu tidak sengaja menginstal library V2; file header V2 bernama Adafruit_MotorShield.h dan tidak bisa dipakai dengan board L293D. Untuk masalah instalasi library lainnya, lihat Cara Instal Library Arduino.

Sketch pertama: memutar motor DC maju, mundur, dan dengan kecepatan berbeda

Kencangkan dua kabel motor ke dua sekrup terluar terminal M1 dan biarkan sekrup GND di tengah kosong. Sambungkan battery pack ke EXT_PWR, colokkan Arduino ke komputermu lewat USB, dan lepas jumper PWR (susunan kedua di atas). Kalau LED PWR menyala, upload kode di bawah: motor mula-mula berakselerasi lalu melambat dengan halus, kemudian berputar mundur selama dua detik dan berhenti.

C++ (Arduino IDE)
1#include <AFMotor.h>                  // Adafruit Motor Shield V1 kütüphanesi / library
2
3AF_DCMotor motor(1);                  // M1 klemensi / M1 terminal
4
5void setup() {
6  Serial.begin(9600);
7  Serial.println(F("L293D motor testi / motor test"));
8  motor.setSpeed(200);                // 0–255; bunu unutursan motor dönmez / skip this and the motor won't turn
9  motor.run(RELEASE);                 // başlangıçta dur / start stopped
10}
11
12void loop() {
13  motor.run(FORWARD);                 // ileri / forward
14  for (int s = 60; s <= 255; s++) {   // yavaşça hızlan / ramp up
15    motor.setSpeed(s);
16    delay(10);
17  }
18  for (int s = 255; s >= 60; s--) {   // yavaşça yavaşla / ramp down
19    motor.setSpeed(s);
20    delay(10);
21  }
22  motor.run(RELEASE);                 // dur / stop
23  delay(500);
24
25  motor.setSpeed(180);
26  motor.run(BACKWARD);                // geri / backward
27  delay(2000);
28  motor.run(RELEASE);
29  delay(1000);
30}
PerintahFungsinya
AF_DCMotor motor(1);Membuat motor di terminal M1; menerima angka 1 sampai 4
AF_DCMotor motor(1, MOTOR12_64KHZ);Sekaligus memilih frekuensi PWM untuk M1 dan M2
motor.setSpeed(200);Mengatur kecepatan dari 0 sampai 255 (0 berhenti, 255 kecepatan penuh)
motor.run(FORWARD);Berputar maju
motor.run(BACKWARD);Berputar mundur
motor.run(RELEASE);Berhenti menggerakkan motor; motor berhenti
motor.run(BRAKE);Didefinisikan di library, tapi tidak melakukan apa-apa di V1

Kecepatan diatur dengan menyalakan dan mematikan daya motor ribuan kali per detik; detailnya ada di Apa Itu PWM?. Karena M1 dan M2 memakai Timer2, frekuensinya bisa kamu pilih: MOTOR12_64KHZ, MOTOR12_8KHZ (default), MOTOR12_2KHZ, dan MOTOR12_1KHZ. Dengan 64 kHz, dengingan motor tidak terdengar lagi, tapi L293D jadi lebih panas pada frekuensi itu. Sebaliknya, M3 dan M4 terikat ke Timer0; karena timer itu juga menjalankan millis() dan delay(), library tidak mengubah frekuensinya, dan kedua kanal ini selalu berjalan di sekitar 1 kHz.

Kesalahan paling umum adalah lupa setSpeed(). Library mengatur kecepatan ke 0 ketika membuat motor, jadi meskipun kamu menulis run(FORWARD), motor tidak akan bergerak tanpa kecepatan. Selain itu, kebanyakan motor TT hanya mendengung tapi tidak berputar di bawah 80–100, jadi mulailah dari 100–120 atau lebih.

Kode mobil robot empat roda (4WD)

Motor DC TT kuning bergearbox dengan roda
Motor TT kuning bergearbox dari kit robot: bekerja di 3–6 V, menarik sekitar 150 mA tanpa beban dan lebih dari 1 A ketika macet (stall).

Pemakaian favorit motor shield L293D adalah mobil robot empat roda, karena masing-masing dari empat motor mendapat terminalnya sendiri dan tidak ada kabel yang semrawut. Mobil seperti ini tidak punya kemudi; ia berbelok seperti tank: kalau dua roda kiri berputar ke satu arah dan dua roda kanan ke arah sebaliknya, mobil berputar di tempat. Karena itu kode tidak mengendalikan motor satu per satu, melainkan sebagai dua kelompok, sisi kiri dan sisi kanan. Untuk kendali dari ponsel, kita menyambungkan modul Bluetooth HC-05 ke pin A0 dan A1 yang bebas dengan SoftwareSerial; modul ini dibahas secara detail di Modul Bluetooth HC-05.

BagianSambungan
Motor kiri depanM1
Motor kiri belakangM2
Motor kanan belakangM3
Motor kanan depanM4
TXD HC-05A0 (RX SoftwareSerial)
RXD HC-05A1, lewat pembagi tegangan 1 kΩ + 2 kΩ (5 V → 3,3 V)
VCC dan GND HC-05Baris +5V dan GND di shield
2 × sel 18650 (7,4 V)EXT_PWR (+M dan GND), jumper PWR terpasang
C++ (Arduino IDE)
1#include <AFMotor.h>
2#include <SoftwareSerial.h>
3
4AF_DCMotor frontLeft(1);              // M1: sol ön / front left
5AF_DCMotor rearLeft(2);               // M2: sol arka / rear left
6AF_DCMotor rearRight(3);              // M3: sağ arka / rear right
7AF_DCMotor frontRight(4);             // M4: sağ ön / front right
8
9SoftwareSerial bt(A0, A1);            // RX = A0 (HC-05 TXD), TX = A1 (HC-05 RXD, bölücüyle / via a divider)
10
11int speed = 200;                      // 0–255 arası sürüş hızı / driving speed 0–255
12
13void setSide(AF_DCMotor &a, AF_DCMotor &b, int value) {   // -255 … 255
14  uint8_t dir = value > 0 ? FORWARD : (value < 0 ? BACKWARD : RELEASE);
15  uint8_t pwm = constrain(abs(value), 0, 255);
16  a.setSpeed(pwm);
17  b.setSpeed(pwm);
18  a.run(dir);
19  b.run(dir);
20}
21
22void drive(int left, int right) {     // sol ve sağ taraf / left and right side
23  setSide(frontLeft, rearLeft, left);
24  setSide(frontRight, rearRight, right);
25}
26
27void setup() {
28  Serial.begin(9600);                 // hata ayıklama / debugging
29  bt.begin(9600);                     // HC-05 varsayılan hızı / default baud rate
30  drive(0, 0);
31}
32
33void loop() {
34  if (!bt.available()) return;
35  char c = bt.read();
36  Serial.println(c);
37
38  switch (c) {
39    case 'F': drive(speed, speed);        break;   // ileri / forward
40    case 'B': drive(-speed, -speed);      break;   // geri / backward
41    case 'L': drive(-speed, speed);       break;   // yerinde sola / spin left
42    case 'R': drive(speed, -speed);       break;   // yerinde sağa / spin right
43    case 'G': drive(speed / 3, speed);    break;   // ileri-sola kavis / curve forward-left
44    case 'I': drive(speed, speed / 3);    break;   // ileri-sağa kavis / curve forward-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, 90, 240);   // hız kademesi / speed step
49  }
50}

Inti kodenya adalah fungsi drive(left, right): fungsi ini menerima nilai -255 sampai 255 untuk tiap sisi, dengan positif berarti maju, negatif berarti mundur, dan nol berarti berhenti. setSide() memberi kedua motor di satu sisi kecepatan dan arah yang sama. Perintahnya berupa huruf tunggal yang dikirim aplikasi bergaya “Arduino Bluetooth RC Car” dari toko aplikasi: F maju, B mundur, L dan R berputar di tempat, G dan I berbelok melengkung, S berhenti. Slider kecepatan di aplikasi mengirim angka 0 sampai 9; kode mengubahnya menjadi nilai PWM antara 90 dan 240, dan karena batas bawahnya 90, motor tetap bisa mulai berputar di pengaturan terendah. Kalau ada roda yang berputar ke arah yang salah, jangan ubah kodenya; tukar dua kabel motor itu di terminalnya. Untuk perakitan sasis dan versi dua motor, lihat Cara Membuat Mobil Robot Arduino.

Pin RXD HC-05 bekerja di 3,3 V; jangan sambungkan sinyal TX 5 V Arduino ke sana tanpa menurunkannya dengan pembagi tegangan. Selain itu, kalau koneksi putus, mobil terus melaju dengan perintah terakhir; kamu bisa dengan mudah menambahkan aturan pengaman dengan millis() yang memanggil drive(0, 0) begitu satu detik berlalu sejak huruf terakhir.

Menggerakkan motor stepper: 28BYJ-48 dan NEMA 17

Shield bisa menggerakkan dua stepper sekaligus: port stepper 1 memakai terminal M1 dan M2, dan port 2 memakai M3 dan M4. Dengan motor bipolar (4 kabel, seperti NEMA 17), satu kumparan disambungkan ke M1 dan kumparan lainnya ke M2. Dengan motor unipolar (5 atau 6 kabel), kedua kumparan juga masuk ke M1 dan M2, dan kabel common-nya ke sekrup GND di tengah blok terminal. Untuk 28BYJ-48 yang populer, pengkabelannya: kabel biru dan kuning ke M1, kabel pink dan oranye ke M2, dan kabel common merah ke GND. Memakai motor ini dengan board ULN2003 dibahas di Apa Itu Motor Stepper?.

Gaya langkahCara kerjanyaKapan dipakai
SINGLESatu kumparan dialiri arus pada satu waktuArus paling kecil, torsi paling rendah
DOUBLEDua kumparan dialiri arus bersamaanTorsi lebih besar; pilihan paling umum
INTERLEAVEBergantian antara satu dan dua kumparan (half-step)Resolusi dua kali lipat, putaran lebih halus
MICROSTEPArus kumparan berubah bertahap dengan PWM; setiap langkah penuh dibagi menjadi 16Putaran pelan dan senyap; torsi turun

28BYJ-48 adalah motor 5 V; untuk uji ini, catu motornya dari 4 baterai AA (6 V), lepas jumper, dan jalankan Arduino dari USB. Karena ada gearbox di dalam motor, satu putaran sama dengan 2048 langkah penuh:

C++ (Arduino IDE)
1#include <AFMotor.h>
2
3// 28BYJ-48: tam adımda tur başına 2048 adım / 2048 full steps per revolution
4AF_Stepper stepper(2048, 1);          // 1 = M1 + M2, 2 = M3 + M4
5
6void setup() {
7  stepper.setSpeed(10);               // dakikada 10 tur / 10 RPM
8}
9
10void loop() {
11  stepper.step(2048, FORWARD, DOUBLE);       // bir tur ileri, güçlü tork / one turn forward, more torque
12  delay(500);
13  stepper.step(4096, BACKWARD, INTERLEAVE);  // yarım adımla bir tur geri / one turn back in half steps
14  stepper.release();                         // bobinleri kapat, ısınmasın / de-energise the coils
15  delay(1000);
16}

setSpeed() mengatur jumlah putaran per menit; karena gearbox-nya, 28BYJ-48 tidak bisa berputar lebih cepat dari sekitar 10–15 RPM. Yang perlu diwaspadai adalah step() bersifat blocking: sampai motor menyelesaikan langkah yang diminta, loop() tidak melakukan apa pun. Kalau kamu ingin membaca sensor atau menggerakkan motor DC selagi stepper berputar, pakai fungsi onestep() dari library ini bersama library AccelStepper; contoh AFMotor_ConstantSpeed yang ikut dengan library menunjukkan persis hal itu. Memanggil release() ketika motor sedang menunggu akan mematikan kumparan dan mencegah panas, tapi selama itu porosnya kehilangan torsi penahan.

Kebanyakan motor NEMA 17 menarik 1,5–2 A per kumparan dan punya hambatan kumparan sekitar 1,5–3 Ω. Karena L293D tidak punya pembatas arus, motor-motor ini melampaui batas kanal berkali-kali lipat ketika disambungkan ke 12 V, dan chip mematikan dirinya sendiri dalam hitungan detik. Dengan shield L293D, pakai hanya stepper dengan hambatan kumparan tinggi yang menarik kurang dari 0,4 A di 12 V; untuk NEMA 17 yang bertenaga, driver A4988 adalah pilihan yang tepat.

Menyambungkan servo: header SER1 dan SERVO_2

Dua header tiga pin di sudut shield adalah untuk servo. Menurut tanda di board, pin-pinnya adalah − (GND), + (5 V), dan S (sinyal): kabel cokelat servo ke −, yang merah ke +, dan yang oranye ke S. Menurut skema rangkaian board, header SER1 tersambung ke D10 dan header SERVO_2 ke D9 (beberapa sumber menulis nomornya terbalik; kalau servo tidak bergerak, coba pin yang satunya di kode). Servo digerakkan dengan library Servo standar, dan Timer1 yang dipakainya di Uno tidak bentrok dengan timer motor, jadi motor DC dan servo bisa bekerja bersamaan tanpa masalah.

Servo tidak dicatu dari baterai motor, melainkan dari jalur 5 V Arduino. Itu tidak masalah untuk SG90, tapi servo besar seperti MG996R bisa menarik lebih dari 1 A ketika bergerak; regulator Arduino jadi panas, tegangannya anjlok, dan board reset. Dengan servo besar, colokkan hanya kabel sinyalnya ke header, catu + dan − servo dari sumber 5–6 V terpisah, dan satukan ground-nya. Detailnya ada di Servo MG996R dengan Arduino dan Apa Itu Motor Servo?. Kode di bawah menggerakkan servo di SER1 ke kiri dan ke kanan selagi motor di M3 berputar:

C++ (Arduino IDE)
1#include <AFMotor.h>
2#include <Servo.h>
3
4AF_DCMotor motor(3);                  // M3 klemensi / M3 terminal
5Servo servo1;                         // SER1 başlığı / SER1 header
6
7void setup() {
8  servo1.attach(10);                  // SER1 = D10, SERVO_2 = D9
9  motor.setSpeed(170);
10  motor.run(FORWARD);                 // motor dönerken servo tarar / servo sweeps while the motor runs
11}
12
13void loop() {
14  for (int a = 20; a <= 160; a += 2) {   // sağa tara / sweep right
15    servo1.write(a);
16    delay(15);
17  }
18  for (int a = 160; a >= 20; a -= 2) {   // sola tara / sweep left
19    servo1.write(a);
20    delay(15);
21  }
22}

Batas arus (0,6 A) dan panas

Baris terpenting di datasheet L293D adalah 0,6 A kontinu dan puncak 1,2 A per kanal. Nilai puncak hanya untuk pulsa yang sangat singkat; kalau sebuah motor menarik 1 A selama beberapa detik, chip-nya kewalahan. Hitungan sederhana menunjukkan kenapa chip ini panas: L293D adalah driver model lama dengan transistor bipolar, dan pada 0,6 A biasanya ada jatuh tegangan 1,4 V di transistor atas dan 1,2 V di transistor bawah. Jadi ketika motor menarik 0,6 A, 0,6 A × 2,6 V ≈ 1,6 W panas dihasilkan di dalam chip; dua motor di chip yang sama menghasilkan dua kali lipatnya, sekitar 3 W. Chip DIP kecil tanpa heatsink tidak bisa membuang panas sebanyak itu, suhunya naik cepat, dan akhirnya pemutusan termal mematikan output-nya. Gejalanya sudah akrab: motor berjalan sebentar, berhenti, lalu jalan lagi begitu chip-nya dingin.

Motor TT kuning menarik sekitar 150 mA tanpa beban dan 200–300 mA ketika melaju di lantai, masih dalam batas shield. Masalahnya ada di momen ketika roda mendorong rintangan atau mobil berputar di tempat: motor TT yang macet bisa menarik 1–1,5 A, dan di mobil 4WD keempat motor bekerja keras bersamaan ketika berputar di tempat. Untuk mengetahui arus motormu yang sebenarnya, sambungkan multimeter secara seri dengan motor dan ukur sambil menahan roda sebentar dengan tangan; caranya ada di Cara Memakai Multimeter. Agar shield tetap dingin:

  • Pakai soft start: Jangan langsung lompat dari 0 ke 255; naikkan kecepatan bertahap selama 200–300 ms, dan arus awal turun cukup banyak.
  • Jangan biarkan motor macet: Di robot penghindar rintangan, hentikan mobil sebelum menabrak rintangan; motor yang macet menghasilkan panas paling banyak.
  • Tempelkan heatsink di chip: Heatsink aluminium kecil dengan thermal tape sedikit menurunkan suhu L293D.
  • Solder L293D kedua di atasnya: Adafruit juga mencatat bahwa kamu bisa menumpuk L293D kedua tepat di atas chip yang ada, kaki ke kaki, untuk menambah kapasitas arus; kedua chip berbagi arus.
  • Jangan pakai tegangan lebih dari yang dibutuhkan: Memberi 12 V ke motor 6 V menaikkan arus sekaligus panasnya.
  • Ganti ke driver yang tepat: Kalau motormu terus-menerus menarik lebih dari 0,6 A, pakai driver berbasis L298N atau TB6612FNG.

Motor shield L293D atau L298N?

Modul driver motor ganda L298N
Modul L298N: dua H-bridge dalam satu chip, heatsink besar, dan 2 A per kanal; disambungkan dengan kabel, jadi cocok untuk board apa pun.
FiturMotor shield L293DModul L298N
Jumlah motor4 DC, atau 2 stepper + 2 servo2 DC atau 1 stepper
Arus per kanal0,6 A kontinu, puncak 1,2 A2 A kontinu, puncak 3 A
Tegangan motor4,5–25 V5–35 V
Jatuh teganganSekitar 1,5–2,6 VSekitar 2–3 V
SambunganDitancapkan ke Uno, tanpa kabelKabel jumper; pin-nya kamu pilih sendiri
Pin yang dipakai8 pin tetap + D9 dan D10 untuk servo6 pin (ENA, IN1–IN4, ENB)
LibraryWajib AFMotorTidak perlu (digitalWrite, analogWrite)
ESP32 dan PicoTidak cocokLangsung bisa
Paling cocok untukMobil 4WD dengan motor TT, kit belajarMotor yang lebih kuat, robot 2WD

Singkatnya, kalau kamu membuat mobil 4WD dengan motor TT di Arduino Uno, shield L293D membuat pengkabelan seminimal mungkin dan menaruh keempat motor di satu board. Kalau motormu lebih kuat, board-mu ESP32 atau Pico, atau kamu ingin bebas memilih pin, L298N lebih fleksibel; detailnya ada di Mengendalikan Motor DC dengan L298N. Kalau kamu ingin yang lebih efisien dari keduanya, TB6612FNG berbasis MOSFET punya jatuh tegangan yang sangat rendah dan membuat baterai lebih awet. Jenis motor mana yang cocok untuk pekerjaan apa kami bandingkan di Motor DC vs Servo vs Stepper.

Bisakah dipakai dengan ESP32, Raspberry Pi Pico, atau Mega?

Shield ini bekerja dengan baik di Arduino Mega 2560: shield duduk di pin digital dan analog pertama Mega, dan AFMotor mengenali timer Mega. Shield ini tidak bisa dipakai dengan Uno R4, Leonardo, ESP32, atau Raspberry Pi Pico, karena AFMotor menulis langsung ke register timer ATmega328P dan ATmega2560. Kalau ESP32 dipilih, kompilasi berhenti dengan 'DC_MOTOR_PWM_RATE' was not declared in this scope, dan kalau Leonardo dipilih, berhenti dengan #error "This chip is not supported!". Board ESP32 berbentuk Uno (seperti ESPDuino-32) secara fisik muat di shield, tapi nomor pin dan level sinyal 3,3 V-nya berbeda. Di board-board ini jauh lebih mudah memakai L298N, TB6612FNG, atau satu chip L293D saja sebagai ganti shield. Input L293D menganggap apa pun di atas 2,3 V sebagai HIGH, jadi chip ini langsung bisa dipakai dengan board 3,3 V:

Pin L293DFungsiRaspberry Pi PicoESP32
1 (1,2EN)Kecepatan (PWM)GP15GPIO 25
2 (1A)Arah 1GP14GPIO 26
7 (2A)Arah 2GP13GPIO 27
3 dan 6 (1Y, 2Y)Terminal motorKe motorKe motor
4, 5, 12, 13GND (panas juga keluar lewat pin-pin ini)GNDGND
16 (VCC1)Catu logika, 5 VVBUS (pin 40)5V (VIN)
8 (VCC2)Catu motorPositif bateraiPositif baterai
MicroPython
1from machine import Pin, PWM
2import time
3
4en = PWM(Pin(15))                 # L293D pin 1 (1,2EN): hız / speed
5en.freq(1000)
6in1 = Pin(14, Pin.OUT)            # L293D pin 2 (1A): yön / direction
7in2 = Pin(13, Pin.OUT)            # L293D pin 7 (2A): yön / direction
8
9def motor(speed):                 # -100 … 100
10    in1.value(1 if speed > 0 else 0)
11    in2.value(1 if speed < 0 else 0)
12    en.duty_u16(int(abs(speed) * 655.35))
13
14while True:
15    motor(80)                     # ileri / forward
16    time.sleep(2)
17    motor(0)                      # dur / stop
18    time.sleep(0.5)
19    motor(-60)                    # geri / backward
20    time.sleep(2)
21    motor(0)
22    time.sleep(0.5)

Ground Pico dan baterai harus disambungkan. Di ESP32 kamu membuat logika yang sama dalam bahasa Arduino: arah dengan digitalWrite dan kecepatan dengan analogWrite di pin-pin pada tabel. Kalau board-board ini masih baru buatmu, mulailah dari Apa Itu ESP32? dan Apa Itu Raspberry Pi Pico?.

Motor tidak berputar: kesalahan umum dan solusinya

GejalaKemungkinan penyebabSolusi
Tidak ada motor yang berputar, LED PWR matiTidak ada daya motor: EXT_PWR kosong atau hanya USB yang tersambungSambungkan baterai 6–12 V ke EXT_PWR; motor tidak akan berputar sampai LED menyala
LED menyala, kode sudah di-upload, tapi motor tidak bergerakTidak ada setSpeed() di kode, atau nomor motor tidak cocok dengan terminalTambahkan setSpeed(200) di setup(); cek bahwa AF_DCMotor(1) cocok dengan M1
Motor mendengung tapi tidak berputarNilai PWM terlalu rendah atau baterai lemahMulai di atas 100; isi ulang baterai atau pakai dua sel 18650
“AFMotor.h: No such file or directory”Library belum terinstal, atau yang terinstal malah V2Instal Adafruit Motor Shield library V1 dari Library Manager
“This chip is not supported!” atau error “DC_MOTOR_PWM_RATE”Uno R4, Leonardo, atau ESP32 dipilih sebagai boardPilih Uno atau Mega di Tools > Board
Arduino reset ketika motor mulai berputarArus awal menarik turun tegangan baterai (brownout)Lepas jumper dan catu Arduino secara terpisah; solder kapasitor 100 nF di antara terminal motor
Motor berjalan sebentar lalu berhenti, chip sangat panasPemutusan termal L293D sudah aktifKurangi beban, pakai soft start, tambahkan heatsink, atau pindah ke L298N
Motor berganti arah secara acakD4, D7, D8, atau D12 dipakai untuk keperluan lain di kodePindahkan sensormu ke A0–A5
Kecepatan M1 dan M2 tidak berubah, M3 dan M4 normaltone() atau IRremote sedang memakai Timer2Pindahkan motor-motor ini ke M3 dan M4 atau hapus kode yang bentrok
Satu roda berputar mundurKabel motor terbalik di terminalTukar dua kabel motor itu
Board berperilaku aneh begitu shield dipasangSoket USB Uno menyentuh titik solderan di bawah shield, atau ada pin yang bengkokTempelkan isolasi listrik di atas soket USB, luruskan pin, lalu pasang ulang shield
Cara tercepat menemukan masalah adalah menyederhanakan uji ke bentuk paling dasar: kesampingkan dulu seluruh sketch mobil, sambungkan satu motor saja ke M1, cek bahwa LED PWR menyala, dan upload sketch pertama di atas. Kalau itu jalan, masalahnya ada di kodemu, bukan di shield; kalau tidak, mulailah dari catu daya dan library. Semua alasan Arduino terus restart dibahas di Kenapa Arduino-ku Terus Reset?.

Ide proyek dengan motor shield L293D

  • Mobil 4WD kendali Bluetooth: Robot penggerak empat roda yang kamu kendalikan dari ponsel dengan kode di atas.
  • Robot penghindar rintangan: Mobil yang memindai bagian depannya dengan HC-SR04 yang dipasang di servo SER1 lalu berbelok ke arah yang paling lapang; panduan lengkapnya ada di Robot Penghindar Rintangan dengan Arduino.
  • Robot pengikut garis: Ikuti garis hitam di lantai dengan sensor inframerah di A0–A3; tuning PID dibahas di Robot Pengikut Garis dengan Arduino.
  • Slider kamera: Gerakkan kamera pelan-pelan di sepanjang rel dengan motor stepper dan rekam video time-lapse.
  • Kepala pan-tilt: Colokkan dua servo ke dua header servo dan arahkan kamera atau laser di dua sumbu; untuk servo yang lebih banyak, lihat Lengan Robot Arduino.
  • Gorden otomatis atau ban berjalan: Buka dan tutup gorden dengan motor DC tergantung cahaya, atau buat ban berjalan (conveyor) kecil.

Ringkasan memakai motor shield L293D dengan benar: instal library V1, cek LED PWR, atur jumper sesuai susunan catu dayamu, jangan lupa setSpeed(), sambungkan sensor ke A0–A5, dan jaga motormu di bawah batas 0,6 A. Ikuti aturan-aturan ini, dan shield kecil ini sanggup menanggung seluruh “otot” robot empat motor sendirian. Di aplikasi BlueGrays kamu akan menemukan proyek mobil kendali Bluetooth, robot penghindar rintangan, motor stepper, dan servo langkah demi langkah, lengkap dengan skema rangkaian dan kodenya.

Pertanyaan umum

Berapa motor yang bisa digerakkan motor shield L293D?

Shield ini bisa menggerakkan 4 motor DC sekaligus, masing-masing secara independen maju, mundur, dan dengan kecepatan berbeda. Sebagai ganti motor DC, kamu juga bisa menyambungkan 2 stepper (pasangan M1–M2 dan M3–M4), atau 2 motor DC ditambah 1 stepper. Selain itu ada dua header servo; servo digerakkan dari D9 dan D10, terpisah dari motor.

Apa fungsi jumper PWR di motor shield L293D?

Dengan jumper terpasang, catu motor shield terhubung ke jalur Vin Arduino dan kedua board berjalan dari satu sumber. Kalau kamu mencatu Arduino dari USB dan motor dari baterai terpisah, jumper harus dilepas. Menyambungkan sumber terpisah ke jack DC dan EXT_PWR sekaligus dengan jumper terpasang membuat kedua catu daya terhubung singkat.

Baterai apa yang sebaiknya dipakai dengan motor shield L293D?

Untuk mobil robot dengan motor TT, pilihan terbaik adalah dua sel lithium 18650 (7,4 V); karena L293D kehilangan sekitar 2 V, motor menerima 5,5–6 V. Empat baterai AA hanya menyisakan sekitar 4 V untuk motor, dan baterai kotak 9 V (PP3) tidak bisa memasok arus yang cukup untuk menggerakkan motor. Perhatikan polaritas ketika menyambungkan baterai ke EXT_PWR, karena terminalnya tidak punya proteksi polaritas terbalik.

Bagaimana cara mengatasi “AFMotor.h: No such file or directory”?

Error ini berarti library AFMotor belum terinstal. Cari Adafruit Motor Shield di Library Manager dan instal Adafruit Motor Shield library yang deskripsinya menyebut V1. Library V2 untuk board lain dan tidak berisi file AFMotor.h.

Berapa arus yang sanggup ditangani motor shield L293D, dan kenapa bisa panas?

Setiap kanal bisa memberi 0,6 A secara kontinu dan 1,2 A untuk puncak yang sangat singkat. Karena transistor L293D menjatuhkan sekitar 2,6 V pada 0,6 A, hampir 1,5 W panas dihasilkan per motor; itulah sebabnya chip-nya panas dan mematikan dirinya sendiri ketika batasnya terlampaui. Pastikan motormu tidak macet, dan pakai driver yang lebih kuat seperti L298N untuk motor yang terus-menerus menarik lebih dari 0,6 A.

Mana yang lebih baik, motor shield L293D atau L298N?

Kalau kamu membuat mobil 4WD dengan motor TT di Arduino Uno, shield L293D lebih praktis karena langsung ditancapkan tanpa kabel dan punya empat kanal motor. Kalau kamu memakai motor yang lebih kuat, ESP32 atau Pico, atau ingin memilih pin sendiri, L298N dengan 2 A per kanal lebih cocok. Keduanya kehilangan sekitar 2 V dari tegangan motor.

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
Menggunakan Motor Stepper
#67Menengah
Premium

Menggunakan Motor Stepper

Motor yang berputar selangkah demi selangkah, persis sejauh yang kamu mau, seperti jarum jam. Lewat board driver, Arduino memutar motor stepper kecil satu putaran penuh ke satu arah, menunggu satu det

4.5(31)
42
Servo 360 Derajat dari Motor Stepper
#68Menengah
Premium

Servo 360 Derajat dari Motor Stepper

Ajari motor stepper biasa untuk pergi ke sudut mana pun yang kamu mau, satu lingkaran penuh. Arduino menghitung berapa langkah yang dibutuhkan setiap sudut; motor bergerak ke 0, 90, 45, 180, 135, dan

4.5(22)
32
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
Menggerakkan Motor Servo dengan Potensiometer
#36Pemula
Premium

Menggerakkan Motor Servo dengan Potensiometer

Ketika kamu memutar kenop potensiometer, lengan motor servo ikut berputar: satu ujung kenop berarti nol derajat, ujung lainnya berarti setengah putaran. Arduino terus membaca posisi kenop dan servo la

4.6(37)
52
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