Tutorial Arduino – Servo

Ide Dasar

Kali ini kita akan mencoba untuk menggunakan servo dengan Arduino. Servo yang akan digunakan adalah servo mikro yang banyak dijual pada toko hobi atau bisa juga di sini.

Di dalam servo terdapat gearbox yang kecil (untuk membuat gerakan yang lebih bertenaga) dan rangkaian elektronik (untuk memudahkan pengaturan). Sebuah servo standard dapat diatur posisinya dari 0 sampai dengan 180 derajat. Pengaturan posisi diatur menggunakan timed pulse, antara 1.25 milliseconds (0 derajat) dan 1.75 milliseconds (180 derajat) 1.5 milliseconds untuk 90 derajat). Waktu yang digunakan ini bervariasi dari tiap manufaktur servo. Apabila pulse yang digunakan dikirim setiap 25-50 milliseconds maka servo akan bergerak dengan sangat halus. Salah satu kelebihan Arduino adalah disediakannya software library yang memungkinkan untuk menggerakkan beberapa servo dengan kode yang sederhana.

Rangkaian

Komponen yang diperlukan:

  • 1 buah servo mikro
  • Kabel jumper

Skema rangkaian dapat dilihat pada gambar berikut:

Skema rangkaian Servo dengan Arduino

Berikut ini adalah gambar simulasi penempatan komponen dan board Arduino. Gambar simulasi ini menggunakan software Fritzing yang bisa didapat di sini.

Servo connection using Arduino

Kode Pemrograman

Di bawah ini adalah kode pemrograman yang digunakan untuk menggerakkan servo. Tidak perlu mengetiknya karena sudah tersedia pada software Arduino. Klik menu File > Examples > Servo > Sweep.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
// Sweep
// by BARRAGAN <http://barraganstudio.com>
// This example code is in the public domain.

#include <Servo.h>

Servo myservo;  // create servo object to control a servo
                // a maximum of eight servo objects can be created

int pos = 0;    // variable to store the servo position

void setup()
{
  myservo.attach(9);  // attaches the servo on pin 9 to the servo object
}

void loop()
{
  for(pos = 0; pos < 180; pos += 1)  // goes from 0 degrees to 180 degrees
  {                                  // in steps of 1 degree
    myservo.write(pos);              // tell servo to go to position in variable 'pos'
    delay(15);                       // waits 15ms for the servo to reach the position
  }
  for(pos = 180; pos>=1; pos-=1)     // goes from 180 degrees to 0 degrees
  {
    myservo.write(pos);              // tell servo to go to position in variable 'pos'
    delay(15);                       // waits 15ms for the servo to reach the position
  }
}

Membuat Perubahan

  • Membuat timing sendiri

Menggunakan library servo yang sudah disediakan oleh Arduino memang sangat memudahkan untuk menggerakkan servo. Tetapi kadang kita perlu mengetahui cara memprogram sesuatu secara mandiri. Contoh dibawah ini adalah cara mengatur pulse yang digunakan untuk menggerakkan servo secara langsung (tanpa library servo). Dengan cara ini kita dapat menggerakkan servo pada 20 pin yang tersedia pada Arduino (pin digital & analog). Tetapi anda perlu merubah beberapa baris kode agar dapat mengoptimalkan hasilnya. Berikut ini adalah kode dasar yang akan dipergunakan.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
int servoPin = 9;
int pulseTime;

void setup()
{
  Serial.begin(9600);
  pinMode(servoPin,OUTPUT);
}

void loop()
{
  pulseTime = 2100; //(the number of microseconds
                    //to pause for (1500 90 degrees
                    // 900 0 degrees 2100 180 degrees)
  digitalWrite(servoPin, HIGH);
  delayMicroseconds(pulseTime);
  digitalWrite(servoPin, LOW);
  delay(25);
}

Upload dan coba lihat hasilnya. Servo akan bergerak ke arah 180 derajat. Timing 2100 microseconds akan membuat servo bergerak ke arah 180 derajat. Tapi seperti sudah diutarakan pada awal tutorial ini, timing tiap servo berbeda antara manufaktur. Jadi anda harus menemukan timing yang sesuai untuk servo yang anda gunakan karena bisa jadi timing 2100 microseconds belum membuat servo bergerak mencapai 180 derajat. Untuk mencoba menemukan timing yang sesuai dengan servo yang anda pakai, gunakan kode program dibawah ini yang merupakan variasi dari kode sebelumnya.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
int servoPin = 9;
int pulseTime;

void setup()
{
  Serial.begin(9600);
  pinMode(servoPin,OUTPUT);
}

void loop()
{
  for(pulseTime = 900; pulseTime <= 2100; pulseTime += 50) {
    Serial.println(pulseTime);
    digitalWrite(servoPin, HIGH);
    delayMicroseconds(pulseTime);
    digitalWrite(servoPin, LOW);
    delay(25);
  }
  for(pulseTime = 2100; pulseTime >= 900; pulseTime -= 50) {
    Serial.println(pulseTime);
    digitalWrite(servoPin, HIGH);
    delayMicroseconds(pulseTime);
    digitalWrite(servoPin, LOW);
    delay(25);
  }
}

Upload dan coba lihat kembali hasilnya. Servo akan bergerak ke 180 derajat dan 0 derajat berulang-ulang seperti pada program Sweep tadi. Tetapi hasilnya mungkin kurang maksimal, sudut 180 derajat dan 0 derajat-nya masih belum maksimal. Artinya servo sebenarnya belum menyentuh sudut 180 derajat atau 0 derajat. Coba rubah angka pada pulseTime, untuk yg 900 coba diperkecil dan untuk yang 2100 coba diperbesar. Anda harus menemukan angka pulseTime yang pada angka tersebut servo sudah pada posisi maksimumnya (servo tidak bergerak lagi, mencapai sudut 180/0 derajat). Pada mikro servo yang saya gunakan, kebetulan angkanya ditemukan pada posisi 600 dan 2650, sehingga programnya menjadi seperti ini.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
int servoPin = 9;
int pulseTime;

void setup()
{
  Serial.begin(9600);
  pinMode(servoPin,OUTPUT);
}

void loop()
{
  for(pulseTime = 600; pulseTime <= 2650; pulseTime += 50) {
    Serial.println(pulseTime);
    digitalWrite(servoPin, HIGH);
    delayMicroseconds(pulseTime);
    digitalWrite(servoPin, LOW);
    delay(25);
  }
  for(pulseTime = 2650; pulseTime >= 600; pulseTime -= 50) {
    Serial.println(pulseTime);
    digitalWrite(servoPin, HIGH);
    delayMicroseconds(pulseTime);
    digitalWrite(servoPin, LOW);
    delay(25);
  }
}

Silahkan bereksperimen sampai menemukan angka yang sesuai. Agar mempermudah melihat angka pulseTime, coba gunakan Serial Monitor (Menu: Tools > Serial Monitor). Seperti terlihat pada tampilan berikut ini. Dan agar angka pulseTime yang digunakan tidak bergerak terlalu cepat, ganti kode delay(25); menjadi delay(500);.

Tampilan Serial Monitor pada saat program dijalankan

Setelah anda mengerti dan memahami cara menggerakkan servo menggunakan Arduino, cobalah praktekkan untuk menggerakkan sesuatu, misalnya menggerakkan kepala dari mainan boneka yang sudah tidak dipergunakan lagi. Atau gunakan untuk membuka atau menutup sesuatu. Gunakan daya kreasi anda!

Selamat bereksperimen!

You may also like...

18 Responses

  1. Dedy says:

    mantap, ini yg aku cari. mohon email info harga servo dan kontrolernya serta aksesoris yg diperlukan untuk berlatih menggunakan servo spt diatas.

  2. ferry says:

    Mau tanya mas,,ini kan disetingnya sesuai keinginan,kalo cara setingnya sesuai sm sensor bagaimana ya?
    contoh: saya pasang sensor ultrasonik,jika sensor menangkap tinggi debit air meningkat,maka ia akan perintahkan servo untuk berputar untuk membuka pintu irigasi. mohon di reply yaa

    • Aditya says:

      sudah nemu solusinya pak?kalau belum bisa share ko…..kontak email saya aja..trims

      • Zerfani Yulias says:

        Solusi apa ya? Seperti contoh-nya Mas Ferry di atas? Sebenarnya yang seperti itu tidak susah.
        Algoritmanya kurang lebih seperti ini:
        1. Sensor membaca ketinggian air
        2. Apabila tinggi air melebihi batas aman, gerakkan servo untuk membukan pintu irigasi
        3. Apabila tinggi air masih dalam batas aman, kembali ke step 1.

        Dari algoritma tersebut silahkan dibuat kode programnya. Kalau masih bingung, mulai bagian per bagian dulu. Kuasai kode program untuk menggerakkan servo.
        Kemudian kuasai juga kode program untuk membaca sensor yang dibutuhkan (misalnya ultrasonic). Setelah itu baru gabungkan keduanya menggunakan algoritma tadi.
        Silahkan dicoba!

  3. alfian says:

    pak, cara nya mengecek lebar pulsa maksimal dan minimal bagaimana yah, supaya pas sudut maksimal dan minimal nya?

    • Zerfani Yulias says:

      Mesti sambil dicoba, karena tidak semua servo memiliki lebar pulsa yang sama, sekalipun tipe dan mereknya sama.

  4. alfian says:

    pak, untuk memastikan lebar pulsa maksimal dan minimal bagaimana caranya yah ?agar sudut di dapat sudut 0 dan 180.
    itu yangdigunakan PWM 8 bit atau 16 bit ya pak ?
    terimakasih

    • Zerfani Yulias says:

      Untuk lebar pulsa, silahkan cek jawaban di comment sebelumnya.
      Untuk berapa bi PWM yang digunakan, silahkan baca spesifikasi board yang dipakai, misalnya yang Arduino Uno, spesifikasinya ada di link ini.

  5. firmansyah says:

    maaf pak sebelumnya, saya mau nanya, berarti ga perlu ada tambahan rangkaian motor driver?

  6. Didi says:

    Bagaimana jika servo dengan mikrokontroler arduino ini dapat dikendalikan melalui PC (interface)? Mohon pencerahannya Pak.

  7. khadafy says:

    Pak saya baru belajar arduino setelah saya coba praktekan dan sudah memasang saya bingung harus menekan tomabol apa di keyboard sehingga servo bisa bergerak mohon solusinya..???

  8. Laras says:

    Pak, saya sudah mencoba menggunakan program example dan menyambungkan servo ke pin yang benar. Tapi servo tetap tidak berputar. Kenapa ya?

  9. abdul karim says:

    ass. pak saya mau kontrol servo menggunakan RFID untuk kodingannya bagaimana ya? terimakasih:)

  10. anonim says:

    Pak gimana cara setting servo dengan sensor

  11. rama says:

    Pak sketch untuk setting sensor agar servo berjalan

  12. albert says:

    mas mau minta kode sama carax biar bisa gabungin servo sama IR kitx

  13. yogi says:

    Arduino: 1.6.1 (Windows XP), Board: “Arduino Uno”

    Sketch uses 2,564 bytes (7%) of program storage space. Maximum is 32,256 bytes.

    Global variables use 56 bytes (2%) of dynamic memory, leaving 1,992 bytes for local variables. Maximum is 2,048 bytes.

    avrdude: stk500_recv(): programmer is not responding

    avrdude: stk500_getsync() attempt 1 of 10: not in sync: resp=0x60

    avrdude: stk500_recv(): programmer is not responding

    avrdude: stk500_getsync() attempt 2 of 10: not in sync: resp=0x60

    avrdude: stk500_recv(): programmer is not responding

    avrdude: stk500_getsync() attempt 3 of 10: not in sync: resp=0x60

    avrdude: stk500_recv(): programmer is not responding

    avrdude: stk500_getsync() attempt 4 of 10: not in sync: resp=0x60

    avrdude: stk500_recv(): programmer is not responding

    avrdude: stk500_getsync() attempt 5 of 10: not in sync: resp=0x60

    avrdude: stk500_recv(): programmer is not responding

    avrdude: stk500_getsync() attempt 6 of 10: not in sync: resp=0x60

    avrdude: stk500_recv(): programmer is not responding

    avrdude: stk500_getsync() attempt 7 of 10: not in sync: resp=0x60

    avrdude: stk500_recv(): programmer is not responding

    avrdude: stk500_getsync() attempt 8 of 10: not in sync: resp=0x60

    avrdude: stk500_recv(): programmer is not responding

    avrdude: stk500_getsync() attempt 9 of 10: not in sync: resp=0x60

    avrdude: stk500_recv(): programmer is not responding

    avrdude: stk500_getsync() attempt 10 of 10: not in sync: resp=0x60

    Problem uploading to board. See http://www.arduino.cc/en/Guide/Troubleshooting#upload for suggestions.

    This report would have more information with
    “Show verbose output during compilation”
    enabled in File > Preferences.
    knpa ya ?

  14. lutfi says:

    Mau tanya mas,,ini kan disetingnya sesuai keinginan,kalo cara setingnya sesuai sm sensor ping bagaimana ya?
    jadi keadaannya jika jarak kurang dari yang ditentukan dia berputar CW
    dan jika jarak lebih dari yang ditentukan dia akan CCW

    mohon solusinya mas
    terimakasih

Leave a Reply

Your email address will not be published. Required fields are marked *

Facebook