Mengendalikan motor DC menggunakan driver motor L293D dengan PWM Arduino
Membangun robot atau proyek otomatis sering kali bermuara pada satu tantangan mendasar: mengendalikan motor DC dengan presisi. Anda tidak hanya perlu menyalakan dan mematikannya, tetapi juga mengendalikan kecepatan dan arahnya. Di sinilah driver motor L293D berperan penting. Panduan ini akan memandu Anda melalui pembuatan pengendali motor yang kokoh menggunakan Arduino dan chip L293D yang populer. Pada akhirnya, Anda akan mampu memerintahkan motor untuk berputar pada kecepatan apa pun, ke arah mana pun, hanya dengan beberapa baris kode.
Proyek ini adalah blok bangunan dasar untuk berbagai aplikasi. Berikut beberapa ide untuk menginspirasi Anda:
- Membangun robot beroda dua: Gunakan dua rangkaian ini untuk menggerakkan sasis robot, mengendalikan setiap roda secara independen untuk pergerakan dan belokan yang presisi.
- Membuat penyiram tanaman otomatis: Kendalikan pompa air kecil untuk memberikan jumlah air yang tepat ke tanaman Anda berdasarkan pembacaan sensor kelembapan tanah.
- Merancang kipas pintar: Ganti sakelar manual pada kipas meja dengan sistem yang secara otomatis menyesuaikan kecepatan berdasarkan suhu atau perintah jarak jauh.
- Membuat penggeser kamera bermotor: Gerakkan kamera di sepanjang jalur dengan kecepatan lambat dan konsisten untuk video selang waktu yang halus.
- Membangun pelacak surya: Gunakan motor untuk memutar panel surya secara perlahan mengikuti matahari di langit, memaksimalkan pengumpulan energi.
Komponen Perangkat Keras
Sebelum memulai, kumpulkan komponen berikut. L293D adalah bintang utama, bertindak sebagai jembatan antara sinyal kontrol daya rendah dari Arduino Anda dan kebutuhan daya tinggi dari motor.
- Papan Arduino (Uno, Nano, dll.)
- IC Driver Motor L293D (atau modul berbasis IC ini)
- Motor DC (beroperasi antara 4,5V dan 36V)
- Catu Daya Eksternal (misalnya, baterai 9V atau catu daya bangku)
- Kabel Jumper
- Papan Roti (opsional, tetapi berguna untuk pembuatan prototipe)
Memahami Driver Motor L293D
L293D adalah driver setengah-H quadruple, yang berarti mengandung empat rangkaian setengah-jembatan independen. Konfigurasi ini memungkinkannya untuk mengendalikan arah motor dengan membalik polaritas tegangan yang diterapkan ke terminalnya. Ia dapat mengendalikan hingga dua motor DC dengan kontrol arah dan kecepatan penuh, atau hingga empat motor jika Anda hanya perlu menyalakan dan mematikannya.
Salah satu fitur terpenting dari L293D adalah dioda flyback internalnya. Motor adalah beban induktif, yang berarti mereka menahan perubahan arus. Ketika Anda tiba-tiba memutus daya ke motor, motor menghasilkan lonjakan tegangan tinggi yang dapat merusak Arduino Anda. Huruf "D" pada L293D menandakan bahwa dioda pelindung ini sudah terintegrasi ke dalam chip, menyelamatkan Anda dari keharusan menambahkannya secara eksternal. Ini adalah perbedaan penting dari chip L293 yang lebih lama, yang memerlukan dioda eksternal untuk pengoperasian yang aman.
Detail penting lainnya adalah batasan arus chip. L293D dapat menangani arus kontinu hingga 600 mA per saluran. Jika motor Anda menarik lebih dari ini, chip akan menjadi terlalu panas dan dapat rusak permanen. Untuk motor yang membutuhkan arus lebih besar, Anda akan memerlukan driver yang lebih kuat seperti L298N atau pelindung motor khusus.
Panduan Pengkabelan
Pengkabelan untuk proyek ini cukup sederhana. Kita akan menggunakan satu motor, yang memerlukan satu jembatan-H penuh (dua setengah-jembatan) dari L293D. Video ini mendemonstrasikan pengkabelan dengan jelas, dan diagram ditunjukkan di bawah ini.
Berikut rincian koneksinya:
- Koneksi Daya: Hubungkan pin 16 (VCC1) ke pin 5V Arduino. Ini memberi daya pada logika internal chip. Hubungkan pin 8 (VCC2) ke catu daya motor eksternal Anda (misalnya, 9V). Ini menyediakan daya ke motor itu sendiri. Hubungkan pin 4, 5, 12, dan 13 ke ground bersama dari Arduino dan catu daya eksternal Anda.
- Koneksi Motor: Hubungkan dua terminal motor DC Anda ke pin 3 dan 6 dari L293D. Polaritas tidak masalah pada titik ini, karena membalik arah dalam kode hanya akan membalik putaran motor.
- Koneksi Kontrol: Hubungkan pin 1 (1,2EN) ke pin Arduino 9. Ini adalah pin "enable", yang bertindak sebagai sakelar utama untuk motor. Hubungkan pin 2 (1A) ke pin Arduino 10, dan pin 7 (2A) ke pin Arduino 11. Ini adalah pin input yang mengendalikan arah dan kecepatan motor.
Penjelasan Kode
Kode yang disediakan terstruktur dengan baik dan mudah dimodifikasi. Kunci untuk menyesuaikan proyek ini terletak pada beberapa variabel sederhana dan panggilan fungsi di bagian atas sketsa. (dalam video pada 07:05)
// Kontrol motor DC
#define P1A 10 // definisikan pin 10 sebagai P1A
#define P2A 11 // definisikan pin 11 sebagai P2A
#define EN12 9 // definisikan pin 9 sebagai enable 1,2EN
const int speedStep =15;
const int speedDelay = 1000;// penundaan antara kenaikan kecepatan
#define P1A, P2A, EN12: Baris-baris ini mendefinisikan pin Arduino mana yang terhubung ke pin input L293D. Jika Anda menggunakan pin yang berbeda dalam pengkabelan Anda, Anda akan mengubah angka di sini. Misalnya, jika Anda menghubungkan EN12 ke pin 6, Anda akan mengubah#define EN12 9menjadi#define EN12 6.const int speedStep = 15;: Variabel ini mengontrol kenaikan perubahan kecepatan motor dalam loop demonstrasi pertama. Nilai yang lebih kecil (misalnya, 5) akan membuat motor berakselerasi lebih halus, sedangkan nilai yang lebih besar (misalnya, 50) akan menyebabkan kecepatan melonjak lebih mendadak.const int speedDelay = 1000;: Ini mengatur penundaan dalam milidetik antara setiap langkah kecepatan. Digabungkan denganspeedStep, ini menentukan seberapa cepat motor naik dari nol ke kecepatan penuh. Nilai 1000 berarti ada jeda satu detik antara setiap perubahan kecepatan.
Inti dari proyek ini adalah fungsi khusus L293D(). Fungsi ini menyederhanakan logika kontrol, memungkinkan Anda mengatur arah motor, kecepatan, dan status hidup/mati dengan satu baris kode. Berikut cara menggunakannya:
L293D('L', 255, 1); // Putar berlawanan arah jarum jam dengan kecepatan penuh
L293D('R', 127, 1); // Putar searah jarum jam dengan setengah kecepatan
L293D('L', 0, 0); // Hentikan motor
- Argumen pertama (Arah): Satu karakter,
'L'atau'R', yang mengatur arah motor. - Argumen kedua (Kecepatan): Bilangan bulat dari 0 hingga 255 yang mengatur kecepatan motor menggunakan PWM. 0 berarti berhenti, dan 255 adalah kecepatan penuh.
- Argumen ketiga (Enable): Bilangan bulat,
1untuk menjalankan motor atau0untuk menghentikannya.
Demonstrasi Proyek Langsung
Dalam video, Anda dapat melihat proyek ini beraksi. Motor mulai dari keadaan diam dan secara bertahap meningkatkan kecepatannya dalam langkah-langkah, menunjukkan kontrol PWM. Serial Monitor menampilkan status dan kecepatan saat ini. Anda juga akan melihat bentuk gelombang pada osiloskop, yang secara visual menunjukkan siklus kerja sinyal PWM yang meningkat seiring motor bertambah cepat. Ini adalah cara yang bagus untuk memahami cara kerja PWM—ia dengan cepat menyalakan dan mematikan daya, dan proporsi waktu "nyala" (siklus kerja) menentukan tegangan rata-rata dan dengan demikian kecepatan motor. (dalam video pada 11:07)
Contoh kode kedua menunjukkan aplikasi yang lebih praktis. Ini menjalankan motor dengan kecepatan penuh dalam satu arah, menghentikannya, menjalankannya dengan setengah kecepatan, dan kemudian menjalankannya dengan lambat dalam arah yang berlawanan. Ini menunjukkan bagaimana Anda dapat menggunakan fungsi L293D() untuk membuat urutan gerakan yang kompleks untuk proyek Anda.
Bab
- [00:00] Pendahuluan dan Gambaran Proyek
- [00:30] Memahami Driver Motor L293D
- [01:16] Konfigurasi Pin dan Spesifikasi L293D
- [04:40] Menghubungkan L293D ke Arduino dan Motor
- [07:05] Penjelasan Kode dan Kustomisasi
- [11:07] Demonstrasi Langsung Kontrol Kecepatan dan Arah
- [12:30] Melihat Bentuk Gelombang PWM pada Osiloskop
/*
* This is the Arduino code to control the speed of a motor using an L293D DC motor driver.
Watch instructions for this video: https://youtu.be/akQoGNUzhHI
// Written for Robojax.com video
* Code is available at http://robojax.com/learn/arduino
*
// Written by Ahmad S. for Robojax.com on
// August 11, 2018 at 13:23 in Ajax, Ontario, Canada
// This code is AS IS without warranty. You may share it if you keep this note with the code.
*/
// DC motor control
#define P1A 10 // define pin 10 as P1A
#define P2A 11 // define pin 11 as P2A
#define EN12 9 // define pin 9 as the 1,2EN enable
const int speedStep =15;
const int speedDelay = 1000;// delay between speed increment
void setup() {
// L293 Motor Control Code by Robojax.com 20180811
Serial.begin(9600);// setup Serial Monitor to display information
pinMode(P1A, OUTPUT);// define pin as OUTPUT for P1A
pinMode(P2A, OUTPUT);// define pin as OUTPUT for P2A
pinMode(EN12, OUTPUT);// define pin as OUTPUT for 1,2EN
Serial.println("Robojax");
Serial.println("L293D Motor Speed Control");
// L293 Motor Control Code by Robojax.com 20180811
}
void loop() {
// L293D Motor Control Code by Robojax.com 20180811
for(int speed=0; speed<=255; speed +=speedStep)
{
L293D('L',speed, 0);//
delay(speedDelay);// delay between each step
}
delay(50);// 50 millisecond delay
// L293D Motor Control Code by Robojax.com 20180810
}//loop end
/*
* L293D(char dir,int spd, int en)
* dir is a character: 'L' for clockwise direction
* or 'R' for counter-clockwise direction
* en is an integer: 1 to rotate, 0 to stop
* spd is the speed value from 0 to 255
*/
void L293D(char dir,int spd, int en)
{
if(dir =='L')
{
if(en ==0){
Serial.println("CW Motor Stopped");
}else{
Serial.print("Rotating CW: ");
Serial.println(spd);//print actual speed value
}
digitalWrite(EN12 ,en);// Enable 1A and 2A
analogWrite(P1A,spd);// send PWM with spd value to P1A
digitalWrite(P2A,LOW);// LOW signal to P2A
}else{
if(en ==0){
Serial.println("CCW Motor Stopped");
}else{
Serial.print("Rotating CCW: ");
Serial.println(spd);//print actual speed value
}
digitalWrite(EN12 ,en);// Disable 1A and 2A
digitalWrite(P1A,LOW);// Keep this pin LOW
analogWrite(P2A,spd);// send PWM with spd value to P2A
}
}//L293D end
++
/*
* This is the Arduino code to control the speed of a motor using an L293D DC motor driver.
* This code will control the motor with different directions and speed.
Watch instructions for this video: https://youtu.be/akQoGNUzhHI
// Written for Robojax.com video
* Code is available at http://robojax.com/learn/arduino
*
// Written by Ahmad Shamshiri for Robojax.com on
// August 11, 2018 at 13:23 in Ajax, Ontario, Canada.
// This code is AS IS without warranty. You may share it if you keep this note with the code.
*/
// DC motor control
#define P1A 10 // define pin 10 as P1A
#define P2A 11 // define pin 11 as P2A
#define EN12 9 // define pin 9 as the 1,2EN enable
const int speedStep =15;
const int speedDelay = 1000;// delay between speed increment
void setup() {
// L293 Motor Control Code by Robojax.com 20180811
Serial.begin(9600);// setup Serial Monitor to display information
pinMode(P1A, OUTPUT);// define pin as OUTPUT for P1A
pinMode(P2A, OUTPUT);// define pin as OUTPUT for P2A
pinMode(EN12, OUTPUT);// define pin as OUTPUT for 1,2EN
Serial.println("Robojax");
Serial.println("L293D Motor Speed Control");
// L293 Motor Control Code by Robojax.com 20180811
}
void loop() {
// L293D Motor Control Code by Robojax.com 20180811
L293D('L',255, 1);// maximum speed to the LEFT
delay(3000);// wait for 3 seconds
L293D('L',255, 0);// stop motor
delay(2000);// wait for 2 seconds
L293D('L',127, 1);// half speed to the LEFT
delay(3000);// wait for 3 seconds
L293D('L',255, 0);// stop motor
delay(2000);// wait for 2 seconds
L293D('R',90, 1);// slow to the RIGHT
delay(3000);// wait for 3 seconds
L293D('L',255, 0);// stop motor
delay(2000);// wait for 2 seconds
// L293D Motor Control Code by Robojax.com 20180810
}//loop end
/*
* L293D(char dir,int spd, int en)
* dir is a character: 'L' for clockwise (CW) direction
* or 'R' for counter-clockwise (CCW) direction.
* en is an integer: 1 to rotate, 0 to stop.
* spd is the speed value from 0 to 255.
*/
void L293D(char dir,int spd, int en)
{
if(dir =='L')
{
if(en ==0){
Serial.println("CW Motor Stopped");
}else{
Serial.print("Rotating CW: ");
Serial.println(spd);//print actual speed value
}
digitalWrite(EN12 ,en);// Enable 1A and 2A
analogWrite(P1A,spd);// send PWM with spd value to P1A
digitalWrite(P2A,LOW);// LOW signal to P2A
}else{
if(en ==0){
Serial.println("CCW Motor Stopped");
}else{
Serial.print("Rotating CCW: ");
Serial.println(spd);//print actual speed value
}
digitalWrite(EN12 ,en);//enable 1A and 2A
digitalWrite(P1A,LOW);// Keep it LOW P1A
analogWrite(P2A,spd);// send PWM with spd value to P2A
}
}//L293D end
Hal-hal yang mungkin Anda butuhkan
-
AmazonPurchase L293D motor driver ICamzn.to
-
eBay
-
eBay
-
AliExpressPurchase an L293D chip from Amazon or AliExpresss.click.aliexpress.com
Sumber daya & referensi
-
Eksternal
Berkas📁
Lembar Data (pdf)
-
L293d_Quadruple_half_bridge_datasheet
l293d_Quadruple_half_bridge_datasheet.pdf0.34 MB -
L293d datasheet
L293d_datasheet.pdf0.34 MB