Motor servo merupakan salah satu jenis aktuator yang banyak digunakan dalam proyek elektronika, robotika, sistem otomasi, hingga perangkat kendali presisi. Berbeda dengan motor DC biasa yang berputar secara terus-menerus, motor servo dirancang untuk bergerak dan mempertahankan posisi pada sudut tertentu dengan tingkat akurasi yang tinggi.
Pada tutorial ini, Anda akan mempelajari cara menggunakan motor servo dengan Arduino, mulai dari memahami prinsip kerjanya, menghubungkan rangkaian dengan benar, mengendalikan posisi sudut servo, hingga mengatur kecepatan pergerakan servo menggunakan program Arduino. Selain itu, tutorial ini juga membahas pentingnya penggunaan sumber daya eksternal untuk servo torsi tinggi agar board Arduino tetap aman dan bekerja secara stabil.
Perangkat Keras yang Dibutuhkan
- Arduino Uno R3
- Kabel USB
- Motor Servo
- Kabel Jumper
Mengenal Motor Servo
Motor servo adalah perangkat elektromekanis yang mampu menggerakkan porosnya ke sudut tertentu sesuai perintah yang diberikan oleh mikrokontroler. Pada umumnya, servo standar memiliki rentang pergerakan antara 0° hingga 180°, meskipun beberapa tipe servo tertentu dapat memiliki rentang sudut yang berbeda. Karena kemampuannya dalam mengontrol posisi secara presisi, motor servo sering digunakan pada berbagai aplikasi seperti lengan robot, robot berkaki, sistem kemudi kendaraan RC, pintu otomatis, kamera pan-tilt, dan sistem aktuator mekanis. Keunggulan utama servo dibandingkan motor DC biasa adalah kemampuannya mempertahankan posisi sudut yang telah ditentukan tanpa memerlukan sensor tambahan.
Pinout Motor Servo
Sebagian besar motor servo memiliki tiga kabel utama dengan fungsi sebagai berikut:
1. Pin VCC
Biasanya berwarna merah. Pin ini digunakan untuk menyuplai tegangan ke motor servo dan umumnya dihubungkan ke sumber tegangan 5V.
2. Pin GND
Biasanya berwarna hitam atau cokelat. Pin ini berfungsi sebagai ground dan harus dihubungkan ke GND Arduino atau sumber daya eksternal.
3. Pin Sinyal
Biasanya berwarna kuning, oranye, atau putih. Pin ini menerima sinyal kontrol PWM dari Arduino untuk menentukan posisi sudut servo.
Cara Kerja Motor Servo
Motor servo bekerja berdasarkan sinyal PWM (Pulse Width Modulation) yang dikirimkan oleh mikrokontroler. Setelah pin VCC dan GND terhubung ke sumber daya, posisi servo ditentukan oleh lebar pulsa PWM yang diterima pada pin sinyal. Secara sederhana, pulsa minimum akan menggerakkan servo ke sekitar 0° dan pulsa maksimum akan menggerakkan servo ke sekitar 180°, dan pulsa di antara keduanya akan menghasilkan posisi sudut tertentu secara proporsional. Setiap jenis servo memiliki spesifikasi PWM yang sedikit berbeda. Namun, library Servo.h yang disediakan Arduino telah menangani seluruh konfigurasi tersebut secara otomatis sehingga pengguna tidak perlu menghitung parameter PWM secara manual. Dengan kata lain, Anda cukup menentukan sudut yang diinginkan dan library akan menghasilkan sinyal PWM yang sesuai.
Baca juga: Arduino dan Limit Switch - Cara Mengontrol Motor DC Menggunakan Driver L298N
Arduino dan Motor Servo
Arduino menyediakan beberapa pin yang mampu menghasilkan sinyal kontrol untuk motor servo. Dengan bantuan library Servo, pengendalian posisi servo menjadi sangat sederhana. Pengguna hanya perlu menghubungkan pin sinyal servo ke salah satu pin digital Arduino, kemudian mengatur sudut yang diinginkan melalui program.
Wiring Diagram Arduino dan Motor Servo
Saat mencari referensi di internet, Anda mungkin menemukan diagram yang menghubungkan pin VCC servo langsung ke pin 5V Arduino. Meskipun metode tersebut dapat bekerja pada beberapa servo kecil, cara ini sebenarnya kurang direkomendasikan terutama untuk servo yang memiliki konsumsi arus cukup besar. Ketika servo bergerak atau menahan beban, arus yang dibutuhkan dapat meningkat secara signifikan. Jika seluruh daya diambil langsung dari Arduino, kondisi ini berpotensi menyebabkan Arduino restart secara tiba-tiba, tegangan menjadi tidak stabil, komunikasi serial terganggu, dan kerusakan regulator daya Arduino.
Menggunakan Sumber Daya Eksternal
Untuk menjaga kestabilan sistem, sangat disarankan menggunakan catu daya eksternal sebagai sumber daya servo. Dalam konfigurasi ini, VCC servo terhubung ke sumber daya eksternal, GND servo terhubung ke GND sumber daya eksternal, dan pin sinyal servo tetap terhubung ke Arduino.
Penting: Pastikan GND sumber daya eksternal dan GND Arduino saling terhubung. Langkah ini wajib dilakukan agar sinyal kontrol dari Arduino dapat dikenali dengan benar oleh motor servo. Tanpa koneksi ground bersama (common ground), servo mungkin tidak merespons atau bergerak secara tidak normal.
Cara Memprogram Motor Servo dengan Arduino
Arduino menyediakan library bawaan bernama Servo.h yang mempermudah proses pengendalian motor servo. Berikut langkah-langkah dasar penggunaannya.
1. Menambahkan Library Servo
Pertama, sertakan library Servo ke dalam program:
#include <Servo.h>
Library ini sudah tersedia secara bawaan pada Arduino IDE sehingga biasanya tidak perlu diinstal secara terpisah.
2. Membuat Objek Servo
Selanjutnya, buat objek servo:
Servo myServo;
Objek ini akan digunakan untuk mengontrol motor servo melalui program. Jika menggunakan lebih dari satu servo, Anda cukup membuat beberapa objek tambahan:
Servo myServo1;
Servo myServo2;
3. Menentukan Pin Kontrol Servo
Hubungkan pin sinyal servo ke salah satu pin digital Arduino, kemudian daftarkan pin tersebut menggunakan fungsi attach(). Sebagai contoh, jika servo terhubung ke pin 9:
myServo.attach(9);
4. Mengatur Posisi Sudut Servo
Setelah servo terhubung ke pin Arduino, gunakan fungsi write() untuk menentukan posisi sudut yang diinginkan.
Contoh:
myServo.write(90);
Perintah tersebut akan menggerakkan servo menuju posisi 90 derajat. Rentang sudut yang umum digunakan adalah 0°, 90°, dan 180°. Namun servo juga dapat diarahkan ke sudut lain di antaranya sesuai kebutuhan aplikasi.
Ringkasan Fungsi Penting pada Library Servo
Dengan fungsi-fungsi tersebut, Anda dapat mengendalikan posisi servo secara mudah tanpa harus memahami detail sinyal PWM yang bekerja di belakang layar.
Kode Program Arduino untuk Mengontrol Motor Servo
Setelah memahami cara kerja motor servo dan penggunaan dasar library Servo, langkah berikutnya adalah mencoba menggerakkan servo menggunakan program Arduino. Pada contoh berikut, servo akan bergerak secara perlahan dari posisi 0° ke 180°, kemudian kembali lagi dari 180° ke 0°. Pergerakan ini akan terus diulang selama Arduino menyala. Program ini sangat cocok digunakan untuk memahami cara kerja dasar motor servo sebelum mengembangkan proyek yang lebih kompleks.
Kode Program
#include <Servo.h>
Servo servo; // create servo object to control a servo
void setup() {
servo.attach(9); // attaches the servo on pin 9 to the servo object
servo.write(0); // rotate slowly servo to 0 degrees immediately
}
void loop() {
for (int pos = 0; pos <= 180; pos += 1) { // rotate slowly from 0 degrees to 180 degrees, one by one degree
servo.write(pos); // control servo to go to position in variable 'pos'
delay(10); // waits 10ms for the servo to reach the position
}
for (int pos = 180; pos >= 0; pos -= 1) { // rotate from 180 degrees to 0 degrees, one by one degree
servo.write(pos); // control servo to go to position in variable 'pos'
delay(10); // waits 10ms for the servo to reach the position
}
}
Penjelasan Program
Program diawali dengan menyertakan library Servo:
#include <Servo.h>
Library ini menyediakan berbagai fungsi yang diperlukan untuk mengendalikan motor servo tanpa harus membuat sinyal PWM secara manual.
Membuat Objek Servo
Selanjutnya dibuat sebuah objek servo:
Servo servo;
Objek ini digunakan untuk mengirimkan perintah ke motor servo.
Menghubungkan Servo ke Pin Arduino
Pada fungsi setup(), servo dihubungkan ke pin digital 9 menggunakan:
servo.attach(9);
Pin 9 dipilih sebagai jalur kontrol untuk mengirimkan sinyal ke motor servo.
Mengatur Posisi Awal Servo
Sebelum program utama berjalan, servo diarahkan ke posisi awal 0 derajat:
servo.write(0);
Dengan demikian, servo akan selalu memulai pergerakannya dari posisi yang sama setiap kali Arduino dinyalakan.
Menggerakkan Servo dari 0° ke 180°
Bagian berikut digunakan untuk menggerakkan servo secara bertahap menuju posisi maksimum:
for (int pos = 0; pos <= 180; pos += 1)
Variabel pos akan bertambah satu derajat setiap kali perulangan dijalankan.
Kemudian nilai tersebut dikirim ke servo:
servo.write(pos);
Karena sudut bertambah sedikit demi sedikit, servo akan bergerak secara halus dari 0° hingga 180°.
Untuk memberikan waktu kepada servo mencapai posisi yang ditentukan, digunakan:
delay(10);
Penundaan selama 10 milidetik ini membuat pergerakan servo terlihat lebih lembut.
Menggerakkan Servo dari 180° ke 0°
Setelah mencapai posisi maksimum, servo akan bergerak kembali ke posisi awal menggunakan perulangan kedua:
for (int pos = 180; pos >= 0; pos -= 1)
Pada perulangan ini nilai sudut dikurangi satu per satu hingga mencapai 0°. Perintah berikut mengatur posisi servo sesuai nilai variabel pos:
servo.write(pos);
Akibatnya servo akan bergerak kembali menuju posisi awal secara bertahap.
Cara Kerja Program
Secara keseluruhan, alur kerja program adalah sebagai berikut:
1. Servo diatur ke posisi awal 0°.
2. Servo bergerak perlahan menuju 180°.
3. Setelah mencapai 180°, servo bergerak kembali menuju 0°.
4. Proses tersebut diulang terus-menerus.
Karena perubahan sudut dilakukan satu derajat setiap langkah, gerakan servo terlihat lebih halus dibandingkan berpindah langsung ke sudut tertentu.
Langkah Pengujian
1. Hubungkan motor servo ke Arduino sesuai diagram pengkabelan.
2. Sambungkan Arduino ke komputer menggunakan kabel USB.
3. Buka Arduino IDE.
4. Pilih board dan port yang sesuai.
5. Salin kode program ke editor Arduino IDE.
6. Klik tombol Upload.
7. Tunggu hingga proses upload selesai.
Jika seluruh rangkaian sudah benar, Anda akan melihat servo bergerak perlahan dari 0° ke 180°, berhenti sesaat selama proses perpindahan sudut, bergerak kembali dari 180° ke 0°, dan mengulangi siklus tersebut secara terus-menerus.
Mengubah Kecepatan Pergerakan Servo
Kecepatan pergerakan servo pada program ini dipengaruhi oleh nilai delay. Sebagai contoh, delay(10). Jika nilainya diperbesar menjadi delay(20) servo akan bergerak lebih lambat. Sebaliknya, jika nilainya diperkecil menjadi delay(5) servo akan bergerak lebih cepat. Namun penggunaan delay() memiliki kelemahan karena akan menghentikan sementara seluruh program selama waktu penundaan berlangsung. Untuk aplikasi yang lebih kompleks, disarankan menggunakan kombinasi fungsi millis() dan map() agar kecepatan servo dapat diatur tanpa menghambat proses lain yang berjalan pada Arduino.
Cara Mengatur Kecepatan Motor Servo dengan Arduino
Pada contoh sebelumnya, kecepatan pergerakan servo dikendalikan menggunakan fungsi delay(). Meskipun cara tersebut sederhana dan mudah dipahami, metode ini memiliki keterbatasan karena bersifat blocking, yaitu menghentikan sementara eksekusi program selama waktu tertentu. Pada proyek yang lebih kompleks, seperti robotika, IoT, atau sistem otomasi yang harus menjalankan banyak tugas sekaligus, penggunaan delay() dapat menyebabkan sistem menjadi kurang responsif. Sebagai alternatif, kita dapat memanfaatkan kombinasi fungsi millis() dan map() untuk mengontrol kecepatan pergerakan servo secara lebih efisien tanpa mengganggu proses lainnya.
Keuntungan Menggunakan millis()
- Program tetap dapat menjalankan tugas lain secara bersamaan.
- Tidak menghambat pembacaan sensor.
- Cocok untuk aplikasi multitasking sederhana.
- Pergerakan servo menjadi lebih halus dan terukur.
- Mudah diintegrasikan dengan proyek yang lebih kompleks.
Kode Program
#include <Servo.h>
Servo myServo;
unsigned long MOVING_TIME = 3000; // moving time is 3 seconds
unsigned long moveStartTime;
int startAngle = 30; // 30°
int stopAngle = 90; // 90°
void setup() {
myServo.attach(9);
moveStartTime = millis(); // start moving
// TODO: other code
}
void loop() {
unsigned long progress = millis() - moveStartTime;
if (progress <= MOVING_TIME) {
long angle = map(progress, 0, MOVING_TIME, startAngle, stopAngle);
myServo.write(angle);
}
// TODO: other code
}
Penjelasan Program
Program ini menggerakkan servo dari sudut 30° menuju 90° selama 3 detik. Berbeda dengan contoh sebelumnya, program tidak menggunakan delay(). Sebagai gantinya, posisi servo dihitung berdasarkan waktu yang telah berlalu sejak pergerakan dimulai.
Menentukan Durasi Pergerakan
Baris berikut digunakan untuk menentukan lama waktu perpindahan servo:
unsigned long MOVING_TIME = 3000;
Nilai 3000 menunjukkan bahwa servo membutuhkan waktu 3000 milidetik atau 3 detik untuk berpindah dari sudut awal ke sudut tujuan. Jika ingin memperlambat pergerakan servo, Anda dapat meningkatkan nilainya.
Contoh:
unsigned long MOVING_TIME = 5000;
Artinya servo akan bergerak selama 5 detik.
Menentukan Sudut Awal dan Sudut Tujuan
Bagian berikut digunakan untuk menentukan posisi awal dan posisi akhir servo:
int startAngle = 30;
int stopAngle = 90;
Dalam contoh ini:
- Servo memulai gerakan dari posisi 30°.
- Servo berhenti pada posisi 90°.
Nilai tersebut dapat disesuaikan sesuai kebutuhan proyek.
Sebagai contoh:
int startAngle = 0;
int stopAngle = 180;
akan membuat servo bergerak dari posisi minimum menuju posisi maksimum.
Menyimpan Waktu Mulai
Saat Arduino dinyalakan, program menyimpan waktu awal menggunakan:
moveStartTime = millis();
Fungsi millis() mengembalikan jumlah milidetik sejak Arduino mulai berjalan. Nilai tersebut kemudian digunakan sebagai acuan untuk menghitung progres pergerakan servo.
Menghitung Waktu yang Telah Berlalu
Di dalam fungsi loop(), program menghitung waktu yang sudah berjalan:
unsigned long progress = millis() - moveStartTime;
Variabel progress akan terus bertambah seiring waktu.
Sebagai contoh:
Nilai variabel progress akan terus meningkat mengikuti lamanya waktu program berjalan. Sebagai contoh, setelah 500 ms nilai progress menjadi 500, setelah 1000 ms menjadi 1000, setelah 2000 ms menjadi 2000, dan setelah 3000 ms menjadi 3000. Nilai yang terus bertambah inilah yang kemudian digunakan untuk menghitung dan menentukan posisi servo secara bertahap sehingga pergerakannya menjadi lebih halus. Nilai inilah yang digunakan untuk menentukan posisi servo secara bertahap.
Menggunakan Fungsi map()
Bagian terpenting dari program ini adalah:
long angle = map(progress, 0, MOVING_TIME, startAngle, stopAngle);
Fungsi map() digunakan untuk mengubah rentang nilai waktu menjadi rentang sudut servo.
Format fungsi:
map(nilai, dariMin, dariMax, keMin, keMax)
Pada contoh di atas, nilai waktu bergerak dari 0 hingga 3000 ms dan sudut berubah dari 30° hingga 90°.
Jadi, ketika nilai progress masih 0 ms, posisi servo berada pada sudut 30°. Setelah 750 ms, servo bergerak ke 45°. Ketika mencapai 1500 ms, sudut servo menjadi 60°, kemudian bertambah menjadi 75° pada 2250 ms. Setelah 3000 ms, servo mencapai posisi akhir pada sudut 90°. Perubahan sudut ini terjadi secara bertahap sehingga gerakan servo terlihat lebih halus dan alami.
Menggerakkan Servo
Setelah sudut dihitung menggunakan fungsi map(), nilai tersebut dikirim ke servo:
myServo.write(angle);
Perintah ini akan memperbarui posisi servo secara terus-menerus sesuai progres waktu yang sedang berlangsung.
Cara Kerja Program
1. Arduino menyimpan waktu awal saat sistem dinyalakan.
2. Program menghitung waktu yang telah berlalu.
3. Fungsi map() mengubah waktu tersebut menjadi nilai sudut.
4. Servo bergerak sedikit demi sedikit menuju posisi target.
5. Setelah waktu yang ditentukan tercapai, servo berhenti pada sudut akhir.
Metode ini menghasilkan pergerakan yang lebih halus dibandingkan perpindahan sudut secara langsung.
Baca juga: Arduino dan MG996R - Cara Mengontrol Motor Servo Torsi Tinggi dengan Arduino
Dalam praktik, hasil dan kendala yang ditemui bisa berbeda tergantung perangkat, konfigurasi, versi library, dan sistem yang digunakan.
- Diskusi umum dan tanya jawab praktik: https://t.me/edukasielektronika
- Kendala spesifik dan kasus tertentu: http://bit.ly/Chatarduino



0 on: "Arduino dan Motor Servo - Panduan Lengkap Mengontrol Posisi Servo dengan Arduino"