Motor servo adalah komponen yang membuat proyek Arduino terasa "hidup". Dia bisa berhenti di sudut tertentu dan bertahan di sana — beda dengan motor DC biasa yang cuma bisa berputar terus. Karena itu servo dipakai di hampir semua proyek yang butuh gerakan terukur: palang pintu otomatis, lengan robot, tutup tempat sampah, sampai kemudi mobil RC.
Tutorial ini membahas cara kerja servo, penyambungan yang benar, kode dasar sampai kontrol lewat potensiometer, dan satu masalah yang hampir pasti Anda temui: servo yang bergetar atau membuat Arduino restart sendiri.
Cara Kerja Motor Servo
Di dalam servo ada tiga bagian: motor DC kecil, susunan gigi (gearbox) untuk memperbesar torsi, dan sebuah potensiometer yang membaca posisi poros saat ini. Rangkaian kontrol di dalamnya terus membandingkan posisi aktual dengan posisi yang diperintahkan, lalu memutar motor sampai keduanya sama.
Perintah posisi dikirim lewat sinyal PWM dengan periode 20 milidetik. Yang menentukan sudut adalah lamanya pulsa positif:
| Lebar pulsa | Posisi poros |
|---|---|
| 1 ms | 0 derajat |
| 1,5 ms | 90 derajat (tengah) |
| 2 ms | 180 derajat |
Kabar baiknya, Anda tidak perlu menghitung pulsa ini sendiri. Library Servo bawaan Arduino IDE sudah mengurusnya — Anda cukup menyebut sudut yang diinginkan.
Jenis Servo yang Umum Dipakai
- SG90 — servo mikro warna biru, torsi sekitar 1,8 kg·cm, berat 9 gram. Paling murah dan paling sering dipakai pemula. Cocok untuk beban ringan seperti tutup kotak atau palang dari stik es krim.
- MG90S — bentuknya sama dengan SG90 tapi gigi dalamnya logam, bukan plastik. Lebih tahan untuk pemakaian berulang.
- MG996R — servo besar, torsi sampai 10 kg·cm. Butuh arus jauh lebih besar dan wajib memakai catu daya terpisah.
- Servo continuous (360 derajat) — bentuk fisiknya mirip, tapi perintah sudut diartikan sebagai kecepatan dan arah putaran, bukan posisi. Jangan tertukar saat membeli.
Skema Penyambungan
Servo punya tiga kabel dengan warna yang cukup baku:
Satu servo SG90 tanpa beban masih aman disuplai langsung dari pin 5V Arduino. Tapi begitu Anda memasang dua servo atau memberi beban, hentikan kebiasaan itu — penjelasannya ada di bagian troubleshooting di bawah.
Kode Dasar: Menyapu 0 sampai 180 Derajat
#include <Servo.h>
Servo servoku;
void setup() {
servoku.attach(9); // pin sinyal servo di pin 9
}
void loop() {
// bergerak maju 0 -> 180
for (int sudut = 0; sudut <= 180; sudut++) {
servoku.write(sudut);
delay(15);
}
// kembali 180 -> 0
for (int sudut = 180; sudut >= 0; sudut--) {
servoku.write(sudut);
delay(15);
}
}
delay(15) di dalam loop bukan hiasan. Servo butuh waktu untuk benar-benar sampai ke sudut yang diminta. Kalau delay-nya dihapus, Arduino mengirim 180 perintah dalam sekejap dan servo hanya akan tersentak ke posisi akhir tanpa gerakan halus.
Mengatur Servo dengan Potensiometer
Ini contoh yang lebih berguna: posisi servo mengikuti putaran potensiometer. Pasang potensiometer dengan kaki tengah ke A0, dua kaki lainnya ke 5V dan GND.
#include <Servo.h>
Servo servoku;
int nilaiPot;
int sudut;
void setup() {
servoku.attach(9);
Serial.begin(9600);
}
void loop() {
nilaiPot = analogRead(A0); // hasil 0 - 1023
sudut = map(nilaiPot, 0, 1023, 0, 180); // ubah jadi 0 - 180
servoku.write(sudut);
Serial.print("Pot: ");
Serial.print(nilaiPot);
Serial.print(" Sudut: ");
Serial.println(sudut);
delay(20);
}
Fungsi map() adalah kunci di sini. Dia mengubah rentang satu skala ke skala lain. Pembacaan analog Arduino selalu 0–1023 (lihat pembahasan lengkapnya di artikel membaca tegangan analog), sementara servo butuh 0–180. Satu baris map() menjembatani keduanya.
Menggerakkan Servo Tanpa Menghentikan Program
Masalah dengan delay(): selama delay berjalan, Arduino tidak bisa melakukan apa pun. Kalau proyek Anda juga harus membaca sensor atau tombol, gerakan servo akan membuat semuanya tersendat.
Solusinya memakai millis() sebagai pengganti delay:
#include <Servo.h>
Servo servoku;
int sudut = 0;
int arah = 1;
unsigned long waktuTerakhir = 0;
const int jeda = 15;
void setup() {
servoku.attach(9);
pinMode(2, INPUT_PULLUP); // tombol tetap responsif
}
void loop() {
if (millis() - waktuTerakhir >= jeda) {
waktuTerakhir = millis();
sudut += arah;
if (sudut >= 180 || sudut <= 0) arah = -arah;
servoku.write(sudut);
}
// bagian ini tetap jalan tanpa menunggu servo
if (digitalRead(2) == LOW) {
// aksi tombol di sini
}
}
Pola millis() ini adalah salah satu keterampilan terpenting di Arduino. Begitu Anda terbiasa, hampir semua proyek multi-tugas jadi mudah.
Masalah yang Sering Terjadi
Servo bergetar terus dan Arduino tiba-tiba restart
Ini keluhan nomor satu, dan penyebabnya hampir selalu sama: arus tidak cukup. Saat servo mulai bergerak atau menahan beban, arus tariknya bisa melonjak ratusan miliampere. Regulator di Arduino Uno tidak sanggup, tegangan turun sesaat, dan mikrokontroler ikut reset.
Solusinya:
- Beri servo catu daya sendiri — baterai 4x AA atau adaptor 5V/2A.
- Sambungkan GND catu daya eksternal ke GND Arduino. Ini wajib. Tanpa ground bersama, sinyal PWM tidak punya acuan tegangan dan servo akan berperilaku acak. Banyak yang lupa langkah ini lalu bingung kenapa tetap tidak jalan.
- Tambahkan kapasitor elektrolit 470µF–1000µF di jalur daya servo untuk meredam lonjakan arus.
Servo mendengung padahal diam
Servo sedang berusaha mempertahankan posisi tapi ada beban yang melawan, atau sudut yang diminta melewati batas mekanisnya. Coba batasi rentang ke 10–170 derajat, bukan 0–180. Kalau tetap mendengung, panggil servoku.detach() saat posisi sudah tercapai untuk mematikan sinyal.
Pin 9 dan 10 tidak bisa PWM lagi
Library Servo di Arduino Uno memakai Timer1, yang juga dipakai oleh pin 9 dan 10 untuk analogWrite(). Jadi begitu library Servo aktif, kedua pin itu kehilangan fungsi PWM biasa. Kalau butuh PWM untuk LED atau motor lain, pakai pin 3, 5, 6, atau 11.
Servo hanya berputar sedikit
Kemungkinan Anda membeli servo continuous rotation. Cek kembali tipenya. Bisa juga giginya sudah aus — gejalanya poros berputar bebas tanpa perlawanan.
Langkah Selanjutnya
Servo baru benar-benar berguna kalau digabung dengan sensor. Beberapa kombinasi yang bisa langsung dicoba:
- Gabungkan dengan sensor ultrasonik untuk membuat palang pintu yang membuka otomatis saat ada objek mendekat.
- Gabungkan dengan sensor PIR supaya servo bergerak saat mendeteksi gerakan manusia.
- Tampilkan sudut servo secara real-time memakai LCD supaya tidak perlu Serial Monitor.
Kalau Anda belum punya servo fisiknya, semua kode di atas bisa diuji lebih dulu lewat simulasi Proteus.
Punya servo yang perilakunya aneh? Tulis di komentar — sebutkan tipe servonya, sumber dayanya dari mana, dan apakah ground-nya sudah disatukan. Tiga informasi itu biasanya cukup untuk menemukan penyebabnya.
0 Komentar
Berkomentarlah dengan sopan dan menggunakan bahasa yang semestinya.