Modul Servo Robotika

Modul Hands-On Robotika: Motor Servo untuk Pemula

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).

LevelPraktikKonsep baruEstimasi
1Servo ke 0, 90, 180 derajatLibrary Servo, write()20 menit
2Sweep halusPerulangan for20 menit
3PotensiometerInput analog, map()30 menit
4Tombol dan SerialInput digital, komunikasi serial40 menit
5Dua servo dan radarMenggabungkan sensor dan aktuator60 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.

KomponenJumlahDipakai diKeterangan
Arduino Uno (atau kompatibel) + kabel USB1SemuaWajib
Servo SG90 (atau MG90S)1Praktik 1-4Wajib
Servo SG90 kedua1Praktik 5Untuk lengan mini
Kabel jumper male-male10-15SemuaWajib
Breadboard1Praktik 3 ke atasWajib
Potensiometer 10 kΩ1Praktik 3Wajib
Tombol push button2Praktik 4Wajib
Sensor ultrasonik HC-SR041Praktik 5Untuk radar mini
Baterai 4xAA (6 V) atau power supply 5 V 2 A1Praktik 5Untuk dua servo atau lebih

Software: Arduino IDE (versi 2.x), library Servo (sudah bawaan, tidak perlu instal tambahan).

Aturan keselamatan dasar
  • 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 kabelFungsiSambung ke
Cokelat (kadang hitam)GNDGND Arduino
MerahDaya +5 V5V Arduino
Oranye (kadang kuning)SinyalPin digital, misalnya 9

Sinyal PWM

Servo membaca pulsa yang dikirim berulang setiap 20 ms (50 kali per detik). Lebar pulsanya menentukan sudut:

Lebar pulsaSudut
1 ms0 derajat
1,5 ms90 derajat
2 ms180 derajat

Anda tidak perlu membuat pulsa ini sendiri. Library Servo mengerjakannya: cukup tulis servo.write(90) dan library mengatur lebar pulsanya.

Catatan penting soal arus. Satu servo SG90 yang bergerak ringan menarik sekitar 100 sampai 250 mA, dan bisa lebih dari 500 mA saat tertahan beban. Port USB komputer biasanya aman untuk satu servo kecil. Untuk dua servo atau lebih, pakai catu daya terpisah (praktik 5), karena tarikan arus yang berlebih membuat Arduino reset sendiri.

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 servoPin Arduino Uno
CokelatGND
Merah5V
OranyePin 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:

  1. Rangkai sesuai tabel, lalu sambungkan USB.
  2. Pilih board Arduino Uno dan port yang benar di menu Tools.
  3. Unggah kode. Servo harus bergerak 0, 90, 180 lalu mengulang.
  4. 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 delay diganti 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 delayPerkiraan waktu satu sapuanPengamatan Anda
5 ms0,9 detik
15 ms2,7 detik
30 ms5,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):

KomponenKaki / kabelPin Arduino Uno
PotensiometerKaki kiri5V
PotensiometerKaki tengah (wiper)A0
PotensiometerKaki kananGND
ServoOranyePin 9
ServoMerah dan cokelat5V 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:

  1. Putar knob pelan-pelan; servo harus mengikuti dengan halus.
  2. Ubah map menjadi map(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):

KomponenSambung ke
Tombol kiriPin 2 dan GND
Tombol kananPin 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.

Daya untuk dua servo atau lebih. Jangan ambil daya servo dari pin 5V Arduino. Pakai baterai 4xAA (6 V) atau adaptor 5 V 2 A untuk servo, dan hubungkan GND catu daya servo ke GND Arduino. Tanpa GND bersama, sinyal servo tidak terbaca benar. Kabel sinyal tetap ke pin Arduino.

Bagian A: dua servo, dua potensiometer

KomponenSambung 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-SR04Sambung ke
VCC5V Arduino
GNDGND
TrigPin 7
EchoPin 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.

GejalaPenyebab umumSolusi
Servo tidak bergerak sama sekaliKabel sinyal salah pin atau longgarCek pin di attach() sama dengan kabel oranye
Servo tidak bergerak sama sekaliMerah dan cokelat tertukarCabut daya, periksa warna kabel
Servo bergetar atau berdengungDaya kurang kuat atau servo menahan bebanPakai catu daya terpisah, kurangi beban
Servo bergetar di posisi diamPembacaan potensiometer bergoyangTambah delay(15), atau rata-ratakan beberapa bacaan
Arduino reset sendiri saat servo bergerakTarikan arus melebihi kemampuan USBCatu daya terpisah + GND bersama
Servo bergerak acakGND catu daya servo tidak tersambung ke GND ArduinoHubungkan kedua GND
Servo tidak mencapai 0 atau 180 penuhServo murah punya rentang sedikit berbedaCoba write(5) dan write(175), atau pakai writeMicroseconds()
Servo terasa panasMendorong melawan batas mekanikKurangi rentang sudut, jangan paksa ke ujung
Upload gagalBoard atau port salahCek 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 analogRead dan map)
  • 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):

KemampuanPraktik
Menyebutkan fungsi tiga kabel servoTeori
Menulis kode untuk menggerakkan servo ke sudut tertentu1
Membuat gerakan menyapu dengan for2
Memakai analogRead dan map3
Memakai INPUT_PULLUP dan constrain4
Menyambung catu daya terpisah dengan GND bersama5

Langkah belajar berikutnya:

  • Pelajari millis() agar gerak servo tidak memblokir program lain (pengganti delay)
  • 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

Post a Comment

0 Comments