Modul Hands-On Robotika: Motor Servo untuk Pemula
Dari nol sampai bisa mengendalikan servo dengan Arduino dalam lima praktik bertahap.
Pengantar
Modul ini mengantar Anda dari nol sampai bisa mengendalikan servo dengan Arduino dalam lima praktik bertahap, sekitar 3 sampai 4 jam total. Setiap praktik berdiri sendiri, jadi Anda bisa berhenti kapan saja dan melanjutkan lain waktu.
Setelah modul ini Anda mampu:
- Menjelaskan cara kerja servo dan arti tiga kabelnya
- Merangkai servo ke Arduino dengan aman
- Menggerakkan servo ke sudut tertentu lewat kode
- Mengendalikan servo dengan potensiometer, tombol, dan Serial Monitor
- Menggabungkan servo dengan sensor untuk proyek mini (radar ultrasonik)
Prasyarat: belum perlu pengalaman robotika. Cukup tahu cara menginstal Arduino IDE dan mengunggah program ke papan. Jika belum pernah, jalankan contoh Blink dulu (File > Examples > 01.Basics > Blink).
| Level | Praktik | Konsep baru | Estimasi |
|---|---|---|---|
| 1 | Servo ke 0, 90, 180 derajat | Library Servo, write() | 20 menit |
| 2 | Sweep halus | Perulangan for | 20 menit |
| 3 | Potensiometer | Input analog, map() | 30 menit |
| 4 | Tombol dan Serial | Input digital, komunikasi serial | 40 menit |
| 5 | Dua servo dan radar | Menggabungkan sensor dan aktuator | 60 menit |
Alat dan bahan
Modul ini memakai satu papan Arduino Uno dan satu servo SG90, yang harganya terjangkau dan mudah dicari. Praktik 1 sampai 4 cukup dengan bagian bertanda "Wajib"; sisanya untuk praktik 5.
| Komponen | Jumlah | Dipakai di | Keterangan |
|---|---|---|---|
| Arduino Uno (atau kompatibel) + kabel USB | 1 | Semua | Wajib |
| Servo SG90 (atau MG90S) | 1 | Praktik 1-4 | Wajib |
| Servo SG90 kedua | 1 | Praktik 5 | Untuk lengan mini |
| Kabel jumper male-male | 10-15 | Semua | Wajib |
| Breadboard | 1 | Praktik 3 ke atas | Wajib |
| Potensiometer 10 kΩ | 1 | Praktik 3 | Wajib |
| Tombol push button | 2 | Praktik 4 | Wajib |
| Sensor ultrasonik HC-SR04 | 1 | Praktik 5 | Untuk radar mini |
| Baterai 4xAA (6 V) atau power supply 5 V 2 A | 1 | Praktik 5 | Untuk dua servo atau lebih |
Software: Arduino IDE (versi 2.x), library Servo (sudah bawaan, tidak perlu instal tambahan).
- Cabut USB sebelum mengubah rangkaian.
- Pastikan kabel merah (daya) tidak tertukar dengan kabel cokelat atau hitam (GND).
- Jangan memaksa horn servo diputar dengan tangan saat daya hidup, karena gigi plastiknya bisa rusak.
Dasar teori: cara kerja servo
Servo adalah motor kecil yang berhenti di sudut yang Anda perintahkan, bukan berputar terus. Di dalam casing ada motor DC, roda gigi, potensiometer penanda posisi, dan rangkaian kontrol yang terus membandingkan posisi sebenarnya dengan posisi yang diminta.
Tiga kabel servo SG90
| Warna kabel | Fungsi | Sambung ke |
|---|---|---|
| Cokelat (kadang hitam) | GND | GND Arduino |
| Merah | Daya +5 V | 5V Arduino |
| Oranye (kadang kuning) | Sinyal | Pin digital, misalnya 9 |
Sinyal PWM
Servo membaca pulsa yang dikirim berulang setiap 20 ms (50 kali per detik). Lebar pulsanya menentukan sudut:
| Lebar pulsa | Sudut |
|---|---|
| 1 ms | 0 derajat |
| 1,5 ms | 90 derajat |
| 2 ms | 180 derajat |
Anda tidak perlu membuat pulsa ini sendiri. Library Servo mengerjakannya: cukup tulis servo.write(90) dan library mengatur lebar pulsanya.
Istilah yang akan sering muncul:
- Horn: pelat plastik di poros servo tempat Anda memasang lengan
- Torsi: kekuatan putar; SG90 sekitar 1,8 kg·cm pada 4,8 V
- Deadband: selisih sudut sangat kecil yang diabaikan servo, penyebab umum servo bergetar halus
Praktik 1: servo ke 0, 90, dan 180 derajat
Tujuan: servo berpindah ke tiga posisi dan berhenti 1 detik di tiap posisi. Ini langkah paling sederhana, jadi pastikan berhasil dulu sebelum lanjut.
Rangkaian (cabut USB saat merangkai):
| Kabel servo | Pin Arduino Uno |
|---|---|
| Cokelat | GND |
| Merah | 5V |
| Oranye | Pin 9 |
Kode:
#include <Servo.h>
Servo servoku; // membuat objek servo
void setup() {
servoku.attach(9); // sinyal servo di pin 9
}
void loop() {
servoku.write(0); // ke 0 derajat
delay(1000);
servoku.write(90); // ke 90 derajat
delay(1000);
servoku.write(180); // ke 180 derajat
delay(1000);
}
Langkah kerja:
- Rangkai sesuai tabel, lalu sambungkan USB.
- Pilih board Arduino Uno dan port yang benar di menu Tools.
- Unggah kode. Servo harus bergerak 0, 90, 180 lalu mengulang.
- Ubah angka di
write()menjadi 45 dan 135, unggah ulang, dan amati hasilnya.
Cara memahami kodenya:
#include <Servo.h>memanggil library bawaan Arduino.attach(9)memberi tahu library pin mana yang mengirim sinyal ke servo.write(sudut)menerima angka 0 sampai 180.delay(1000)memberi servo waktu 1 detik untuk sampai ke posisi.
Pertanyaan cek pemahaman:
- Apa yang terjadi jika
delaydiganti 100? Mengapa servo mungkin tidak sempat sampai? - Bisakah servo dipasang ke pin 10? Apa yang harus diubah?
Praktik 2: sweep halus dengan perulangan
Tujuan: servo menyapu dari 0 ke 180 derajat dan kembali secara mulus, bukan melompat. Rangkaian sama persis dengan praktik 1, jadi tidak ada yang perlu dipindah.
Kode:
#include <Servo.h>
Servo servoku;
void setup() {
servoku.attach(9);
}
void loop() {
for (int sudut = 0; sudut <= 180; sudut++) {
servoku.write(sudut);
delay(15); // makin kecil = makin cepat
}
for (int sudut = 180; sudut >= 0; sudut--) {
servoku.write(sudut);
delay(15);
}
}
Cara kerjanya: perulangan for menaikkan sudut satu derajat setiap 15 ms, jadi satu sapuan 180 derajat memakan sekitar 2,7 detik. Loop kedua menurunkannya kembali.
Eksperimen (catat hasilnya):
| Nilai delay | Perkiraan waktu satu sapuan | Pengamatan Anda |
|---|---|---|
| 5 ms | 0,9 detik | |
| 15 ms | 2,7 detik | |
| 30 ms | 5,4 detik |
Batas praktisnya: di bawah sekitar 5 ms servo biasanya tidak sempat mengikuti dan geraknya tersendat.
Praktik 3: kontrol servo dengan potensiometer
Tujuan: memutar knob potensiometer dan servo mengikuti secara langsung. Ini pertama kalinya servo merespons input dari dunia nyata.
Rangkaian (tambahkan potensiometer ke breadboard; servo tetap seperti sebelumnya):
| Komponen | Kaki / kabel | Pin Arduino Uno |
|---|---|---|
| Potensiometer | Kaki kiri | 5V |
| Potensiometer | Kaki tengah (wiper) | A0 |
| Potensiometer | Kaki kanan | GND |
| Servo | Oranye | Pin 9 |
| Servo | Merah dan cokelat | 5V dan GND |
Kode:
#include <Servo.h>
Servo servoku;
const int pinPot = A0;
void setup() {
servoku.attach(9);
}
void loop() {
int nilai = analogRead(pinPot); // 0 sampai 1023
int sudut = map(nilai, 0, 1023, 0, 180); // ubah ke 0 sampai 180
servoku.write(sudut);
delay(15);
}
Konsep baru:
analogRead()membaca tegangan 0 sampai 5 V sebagai angka 0 sampai 1023.map(x, a, b, c, d)mengubah skala angka dari rentang a-b ke rentang c-d.delay(15)memberi servo waktu bergerak dan meredam getaran akibat pembacaan yang bergoyang.
Uji coba:
- Putar knob pelan-pelan; servo harus mengikuti dengan halus.
- Ubah
mapmenjadimap(nilai, 0, 1023, 30, 150)untuk membatasi gerak servo di 30 sampai 150 derajat. Pembatasan ini berguna agar lengan robot tidak menabrak bodinya sendiri.
- Servo mengikuti knob dari ujung ke ujung
- Rentang gerak berhasil dibatasi 30-150 derajat
Praktik 4: kontrol dengan tombol dan Serial Monitor
Tujuan: dua tombol menggeser servo ke kiri dan kanan 10 derajat per tekan, dan Serial Monitor menampilkan sudut saat ini. Anda juga belajar mengirim perintah dari komputer.
Rangkaian (potensiometer boleh dilepas):
| Komponen | Sambung ke |
|---|---|
| Tombol kiri | Pin 2 dan GND |
| Tombol kanan | Pin 3 dan GND |
| Servo (sinyal) | Pin 9 |
Tombol tidak butuh resistor eksternal karena kode memakai INPUT_PULLUP, resistor internal Arduino yang membuat pin bernilai HIGH saat tombol tidak ditekan dan LOW saat ditekan.
Kode bagian A: tombol
#include <Servo.h>
Servo servoku;
int sudut = 90;
void setup() {
pinMode(2, INPUT_PULLUP);
pinMode(3, INPUT_PULLUP);
servoku.attach(9);
servoku.write(sudut);
Serial.begin(9600);
}
void loop() {
if (digitalRead(2) == LOW) { // tombol kiri ditekan
sudut = constrain(sudut - 10, 0, 180);
servoku.write(sudut);
Serial.print("Sudut: ");
Serial.println(sudut);
delay(200); // jeda agar satu tekan = satu langkah
}
if (digitalRead(3) == LOW) { // tombol kanan ditekan
sudut = constrain(sudut + 10, 0, 180);
servoku.write(sudut);
Serial.print("Sudut: ");
Serial.println(sudut);
delay(200);
}
}
constrain(x, 0, 180) menjaga nilai tetap di antara 0 dan 180 sehingga sudut tidak pernah keluar batas.
Kode bagian B: perintah dari Serial Monitor
Ganti loop() dengan versi ini (bagian lain tetap). Buka Serial Monitor (9600 baud, ujung baris Newline), ketik angka 0 sampai 180, lalu tekan Enter.
void loop() {
if (Serial.available() > 0) {
int target = Serial.parseInt();
if (target >= 0 && target <= 180) {
servoku.write(target);
Serial.print("Servo ke ");
Serial.println(target);
}
}
}
Pertanyaan cek pemahaman:
- Mengapa ada
delay(200)di bagian A? Apa yang terjadi jika dihapus? - Mengapa nilai di luar 0-180 diabaikan di bagian B?
Praktik 5: dua servo dan radar ultrasonik mini
Tujuan: menggabungkan beberapa servo dan sensor. Bagian A mengendalikan dua servo dengan dua potensiometer (cikal bakal lengan robot). Bagian B membuat servo menyapu sambil sensor mengukur jarak, seperti radar sederhana.
Bagian A: dua servo, dua potensiometer
| Komponen | Sambung ke |
|---|---|
| Servo 1 (sinyal) | Pin 9 |
| Servo 2 (sinyal) | Pin 10 |
| Potensiometer 1 (wiper) | A0 |
| Potensiometer 2 (wiper) | A1 |
| Servo merah | + catu daya servo |
| Servo cokelat, GND Arduino | - catu daya servo |
#include <Servo.h>
Servo servo1;
Servo servo2;
void setup() {
servo1.attach(9);
servo2.attach(10);
}
void loop() {
servo1.write(map(analogRead(A0), 0, 1023, 0, 180));
servo2.write(map(analogRead(A1), 0, 1023, 0, 180));
delay(15);
}
Tempelkan potongan karton atau stik es krim pada horn servo 1 dan servo 2 untuk membentuk lengan dua sendi.
Bagian B: radar mini dengan HC-SR04
| Kaki HC-SR04 | Sambung ke |
|---|---|
| VCC | 5V Arduino |
| GND | GND |
| Trig | Pin 7 |
| Echo | Pin 6 |
| Servo (sinyal) | Pin 9 |
Pasang sensor di atas horn servo agar ikut berputar.
#include <Servo.h>
Servo radar;
const int pinTrig = 7;
const int pinEcho = 6;
long ukurJarak() {
digitalWrite(pinTrig, LOW);
delayMicroseconds(2);
digitalWrite(pinTrig, HIGH);
delayMicroseconds(10);
digitalWrite(pinTrig, LOW);
long durasi = pulseIn(pinEcho, HIGH, 30000); // batas waktu 30 ms
return durasi * 0.034 / 2; // hasil dalam cm
}
void setup() {
pinMode(pinTrig, OUTPUT);
pinMode(pinEcho, INPUT);
radar.attach(9);
Serial.begin(9600);
}
void loop() {
for (int sudut = 15; sudut <= 165; sudut += 5) {
radar.write(sudut);
delay(50);
Serial.print(sudut);
Serial.print(" derajat: ");
Serial.print(ukurJarak());
Serial.println(" cm");
}
for (int sudut = 165; sudut >= 15; sudut -= 5) {
radar.write(sudut);
delay(50);
}
}
Buka Serial Monitor, lalu letakkan benda di depan sensor pada berbagai sudut. Nilai jarak yang kecil menunjukkan arah benda. Hasil 0 cm berarti tidak ada pantulan yang terbaca dalam batas waktu.
- Dua servo bergerak independen dengan dua potensiometer
- Radar menampilkan jarak berbeda saat benda dipindah posisinya
Troubleshooting
Masalah servo hampir selalu berasal dari daya, kabel, atau GND yang tidak bersama. Periksa dalam urutan ini.
| Gejala | Penyebab umum | Solusi |
|---|---|---|
| Servo tidak bergerak sama sekali | Kabel sinyal salah pin atau longgar | Cek pin di attach() sama dengan kabel oranye |
| Servo tidak bergerak sama sekali | Merah dan cokelat tertukar | Cabut daya, periksa warna kabel |
| Servo bergetar atau berdengung | Daya kurang kuat atau servo menahan beban | Pakai catu daya terpisah, kurangi beban |
| Servo bergetar di posisi diam | Pembacaan potensiometer bergoyang | Tambah delay(15), atau rata-ratakan beberapa bacaan |
| Arduino reset sendiri saat servo bergerak | Tarikan arus melebihi kemampuan USB | Catu daya terpisah + GND bersama |
| Servo bergerak acak | GND catu daya servo tidak tersambung ke GND Arduino | Hubungkan kedua GND |
| Servo tidak mencapai 0 atau 180 penuh | Servo murah punya rentang sedikit berbeda | Coba write(5) dan write(175), atau pakai writeMicroseconds() |
| Servo terasa panas | Mendorong melawan batas mekanik | Kurangi rentang sudut, jangan paksa ke ujung |
| Upload gagal | Board atau port salah | Cek menu Tools > Board dan Port |
Kebiasaan debug yang efektif: ubah satu hal setiap kali, uji dengan kode paling sederhana (praktik 1), dan gunakan Serial.println() untuk melihat nilai yang sebenarnya dikirim ke servo.
Tantangan mandiri dan langkah berikutnya
Kerjakan tantangan berikut tanpa melihat contoh kode; kembali ke praktik terkait bila macet. Urutannya dari paling mudah.
- Pintu otomatis: servo membuka ke 90 derajat saat tombol ditekan, menutup kembali setelah 3 detik
- Kipas geleng: servo menyapu 45 sampai 135 derajat terus-menerus, kecepatan diatur potensiometer
- Penunjuk suhu atau cahaya: jarum di servo menunjukkan nilai sensor LDR (pakai
analogReaddanmap) - Penjaga jarak: servo menutup palang jika sensor ultrasonik mendeteksi benda lebih dekat dari 15 cm
- Lengan penjepit: tiga servo (putar, angkat, jepit) dikendalikan tiga potensiometer
Lembar evaluasi diri (beri tanda jika sudah bisa tanpa melihat contoh):
| Kemampuan | Praktik |
|---|---|
| Menyebutkan fungsi tiga kabel servo | Teori |
| Menulis kode untuk menggerakkan servo ke sudut tertentu | 1 |
Membuat gerakan menyapu dengan for | 2 |
Memakai analogRead dan map | 3 |
Memakai INPUT_PULLUP dan constrain | 4 |
| Menyambung catu daya terpisah dengan GND bersama | 5 |
Langkah belajar berikutnya:
- Pelajari
millis()agar gerak servo tidak memblokir program lain (penggantidelay) - Coba servo MG996R untuk beban lebih berat, dengan catu daya 5-6 V dan arus 2 A atau lebih
- Pakai driver PCA9685 untuk mengendalikan 16 servo lewat dua pin
- Bangun robot lengan 4-DOF, lalu tambahkan program gerak tersimpan (rekam dan putar ulang)
- Pelajari servo rotasi kontinu dan perbedaannya dengan servo posisi
0 Comments