Manufaktur industri
Industri Internet of Things | bahan industri | Pemeliharaan dan Perbaikan Peralatan | Pemrograman industri |
home  MfgRobots >> Manufaktur industri >  >> Manufacturing Technology >> Proses manufaktur

Cara Mengontrol Motor Servo dengan Arduino – Panduan Lengkap

Dalam tutorial ini kita akan mempelajari cara kerja motor servo dan cara mengontrol motor servo dengan Arduino . Motor servo sangat populer dan banyak digunakan di banyak proyek Arduino karena mudah digunakan dan memberikan kontrol posisi yang bagus.

Servo adalah pilihan tepat untuk proyek robotika, otomatisasi, model RC, dan sebagainya. Saya telah menggunakannya di banyak proyek Arduino saya dan Anda dapat melihat beberapa di antaranya di sini:

  • Lengan Robot Arduino DIY dengan Kontrol Ponsel Cerdas
  • Robot Semut Semut Arduino
  • RC Hovercraft berbasis Arduino DIY
  • Robot SCARA | Cara Membuat Robot Berbasis Arduino Sendiri
  • DIY Mars Perseverance Rover Replica – Proyek berbasis Arduino

Anda dapat menonton video berikut atau membaca tutorial tertulis di bawah ini. Ini mencakup beberapa contoh cara menggunakan motor servo dengan Arduino, diagram pengkabelan dan kode. Selain itu, terdapat panduan cara mengontrol beberapa motor servo dengan Arduino menggunakan driver PCA9685 PWM.

Apa itu Motor Servo?

Motor servo adalah sistem loop tertutup yang menggunakan umpan balik posisi untuk mengontrol gerakan dan posisi akhirnya. Ada banyak jenis motor servo dan fitur utamanya adalah kemampuannya untuk mengontrol posisi porosnya dengan tepat.

Pada motor servo tipe industri, sensor umpan balik posisi biasanya merupakan encoder presisi tinggi, sedangkan pada servo RC atau hobi yang lebih kecil, sensor posisi biasanya berupa potensiometer sederhana. Posisi sebenarnya yang ditangkap oleh perangkat ini diumpankan kembali ke detektor kesalahan yang dibandingkan dengan posisi target. Kemudian sesuai dengan kesalahan, pengontrol mengoreksi posisi motor yang sebenarnya agar sesuai dengan posisi target.

Dalam tutorial ini kita akan melihat detail motor servo hobi. Kami akan menjelaskan cara kerja servo ini dan cara mengontrolnya menggunakan Arduino.

Servo hobi adalah aktuator berukuran kecil yang digunakan untuk mengendalikan mobil mainan RC, kapal, pesawat terbang, dll. Servo juga digunakan oleh mahasiswa teknik untuk membuat prototipe dalam robotika, membuat lengan robot, robot yang terinspirasi secara biologis, robot humanoid, dan sebagainya.

Bagaimana Motor Servo Bekerja?

Ada empat komponen utama di dalam servo hobi, motor DC, gearbox, potensiometer, dan rangkaian kontrol. Motor DC memiliki kecepatan tinggi dan torsi rendah, tetapi gearbox mengurangi kecepatan hingga sekitar 60 RPM dan pada saat yang sama meningkatkan torsi.

Potensiometer dipasang pada final gear atau poros keluaran, sehingga saat motor berputar potensiometer juga berputar, sehingga menghasilkan tegangan yang berhubungan dengan sudut mutlak poros keluaran. Pada rangkaian kontrol, tegangan potensiometer ini dibandingkan dengan tegangan yang berasal dari saluran sinyal. Jika diperlukan, pengontrol mengaktifkan H-Bridge terintegrasi yang memungkinkan motor berputar ke kedua arah hingga kedua sinyal mencapai perbedaan nol.

Sebuah motor servo dikendalikan dengan mengirimkan serangkaian pulsa melalui jalur sinyal. Frekuensi sinyal kontrol harus 50Hz atau pulsa harus terjadi setiap 20ms. Lebar pulsa menentukan posisi sudut servo dan jenis servo ini biasanya dapat berputar 180 derajat (mereka memiliki batas perjalanan fisik).

Umumnya pulsa dengan durasi 1ms sesuai dengan posisi 0 derajat, durasi 1,5ms hingga 90 derajat dan 2ms hingga 180 derajat. Padahal durasi minimum dan maksimum pulsa terkadang bisa berbeda-beda di setiap merek yang berbeda dan bisa 0,5 md untuk 0 derajat dan 2,5 md untuk posisi 180 derajat.

Servo RC / Hobi Populer untuk Proyek Arduino

Ada banyak model dan produsen RC atau hobi yang berbeda. Pertimbangan utama saat memilih motor servo adalah torsi, tegangan operasi, penarikan arus, dan ukurannya.

Berikut adalah dua model servo paling populer di kalangan pembuat, SG90 Micro Servo dan MG996R.

Servo Mikro SG90 spesifikasi teknis:

Stall Torque 1.2kg·cm @4.8V, 1.6kg·cm @6V,
Tegangan Operasi 3.5 – 6V
Tidak Ada Arus Beban 100mA
Arus Macet 650mA
Kecepatan Maks 60 derajat dalam 0,12 detik
Berat 9g

Servo MG996R spesifikasi teknis:

Stall Torque 11kg.cm @4.8v, 13kg.cm @6V
Tegangan Operasi 4.8 – 7.2V
Tidak Ada Arus Beban 220mA @4.8V, 250mA @6V
Arus Macet 650mA
Kecepatan Maks 60 derajat dalam 0,20 detik
Berat 55g

Kontrol Motor Servo Arduino

Mari kita coba hal di atas dan membuat contoh praktis untuk mengendalikan servo hobi menggunakan Arduino. Saya akan menggunakan MG996R yang merupakan servo torsi tinggi yang menampilkan roda gigi logam dengan torsi terhenti 10 kg-cm. Torsi tinggi datang dengan harga dan itulah arus stall dari servo yaitu 2.5A. Arus yang berjalan adalah dari 500mA hingga 900mA dan tegangan pengoperasian dari 4,8 hingga 7,2V.

Peringkat saat ini menunjukkan bahwa kita tidak dapat langsung menghubungkan servo ini ke Arduino, tetapi kita harus menggunakan catu daya terpisah untuk itu.

Diagram Sirkuit

Berikut diagram sirkuit untuk contoh ini.

Kita hanya perlu menghubungkan pin kontrol servo ke pin digital papan Arduino, menghubungkan Ground dan kabel positif ke catu daya 5V eksternal, dan juga menghubungkan ground Arduino ke ground servo.

Jika kita menggunakan servo hobi yang lebih kecil, Servo Mikro S90, mungkin untuk menyalakannya langsung dari pin Arduino 5V.

Servo Mikro S90 memiliki konsumsi arus yang lebih rendah, sekitar 100-200mA arus tanpa beban, tetapi arus terhenti sekitar 500-700mA. Di sisi lain, pin Arduino 5V hanya dapat menghasilkan sekitar 500mA jika diberi daya melalui USB, atau hingga 1A di daya melalui konektor barel.

Meskipun mungkin untuk menjalankan motor servo 9g ini langsung ke Arduino, untuk pekerjaan yang lebih stabil, saya sarankan untuk selalu menggunakan catu daya eksternal untuk mereka.

Anda bisa mendapatkan komponen yang diperlukan untuk contoh ini dari tautan di bawah:

  • Motor Servo MG996R ………………………….
  • atau S90 Micro Servo ………..………………………
  • Papan Arduino ……………………………………….
  • Supply Listrik DC 5V 2A …………………..…..

Kode Arduino Kontrol Motor Servo

Sekarang mari kita lihat kode Arduino untuk mengendalikan motor servo. Kodenya sangat sederhana. Kita hanya perlu menentukan pin yang terhubung dengan servo, mendefinisikan pin tersebut sebagai output, dan pada bagian loop menghasilkan pulsa dengan durasi dan frekuensi tertentu seperti yang telah dijelaskan sebelumnya.

/*
     Servo Motor Control - 50Hz Pulse Train Generator
           by Dejan, https://howtomechatronics.com
*/

#define servoPin 9

void setup() {
  pinMode(servoPin, OUTPUT);
}

void loop() {
   // A pulse each 20ms
    digitalWrite(servoPin, HIGH);
    delayMicroseconds(1450); // Duration of the pusle in microseconds
    digitalWrite(servoPin, LOW);
    delayMicroseconds(18550); // 20ms - duration of the pusle
    // Pulses duration: 600 - 0deg; 1450 - 90deg; 2300 - 180deg
}Code language: Arduino (arduino)

Setelah beberapa pengujian, saya mendapatkan nilai berikut untuk durasi pulsa yang bekerja dengan servo saya. Pulsa dengan durasi 0,6 md sesuai dengan posisi 0 derajat, 1,45 md hingga 90 derajat, dan 2,3 md hingga 180 derajat.

Saya menghubungkan multimeter secara seri dengan servo untuk memeriksa penarikan saat ini. Penarikan arus maksimum yang saya perhatikan adalah hingga 0,63A saat terhenti. Itu karena ini bukan servo TowerPro MG996R asli, tetapi replika yang lebih murah, yang jelas memiliki kinerja yang lebih buruk.

Namun demikian, mari kita lihat cara yang lebih mudah untuk mengontrol servos menggunakan Arduino. Itu menggunakan perpustakaan servo Arduino.

/*
     Servo Motor Control using the Arduino Servo Library
           by Dejan, https://howtomechatronics.com
*/

#include <Servo.h>

Servo myservo;  // create servo object to control a servo

void setup() {
  myservo.attach(9,600,2300);  // (pin, min, max)
}

void loop() {
  myservo.write(0);  // tell servo to go to a particular angle
  delay(1000);
  
  myservo.write(90);              
  delay(500); 
  
  myservo.write(135);              
  delay(500);
  
  myservo.write(180);              
  delay(1500);                     
}Code language: Arduino (arduino)

Di sini kita hanya perlu memasukkan perpustakaan, menentukan objek servo, dan menggunakan fungsi attach() menentukan pin yang terhubung dengan servo serta menentukan nilai minimum dan maksimum dari durasi pulsa. Kemudian menggunakan fungsi write() kita cukup mengatur posisi servo dari 0 hingga 180 derajat.

Mengontrol Beberapa Motor Servo dengan Arduino

Pustaka servo Arduino mendukung pengontrolan hingga 12 servo secara bersamaan dengan sebagian besar papan Arduino, dan 48 servo menggunakan papan Arduino Mega. Selain itu, mengontrol beberapa motor servo dengan Arduino semudah mengontrol satu motor saja.

Berikut adalah contoh kode untuk mengontrol beberapa servo:

/*
     Controlling multiple servo motors with Arduino
     by Dejan, https://howtomechatronics.com
*/

#include <Servo.h>

Servo servo1;
Servo servo2;
Servo servo3;
Servo servo4;
Servo servo5;

void setup() {
  servo1.attach(8);
  servo2.attach(9);
  servo3.attach(10);
  servo4.attach(11);
  servo5.attach(12);
}

void loop() {
  // move all servos to position 0
  servo1.write(0);
  servo2.write(0);
  servo3.write(0);
  servo4.write(0);
  servo5.write(0);
  delay(2000);

  // move all servos to position 90
  servo1.write(90);
  servo2.write(90);
  servo3.write(90);
  servo4.write(90);
  servo5.write(90);
  delay(2000);

  // move all servos to position 180
  servo1.write(180);
  servo2.write(180);
  servo3.write(180);
  servo4.write(180);
  servo5.write(180);
  delay(2000);
}Code language: Arduino (arduino)

Jadi, kita hanya perlu membuat objek dari kelas Servo untuk setiap motor servo, dan menentukan pin Arduino mana yang terhubung. Tentu saja, kita dapat mengatur servo apa saja untuk dipindahkan ke posisi apa pun, kapan pun.

Sebagai contoh, Anda juga dapat memeriksa proyek Robot Ant Hexapod Arduino saya di mana saya menggunakan papan Arduino MEGA untuk mengontrol 22 motor servo.

Driver Arduino dan PCA9685 PWM/ Servo

Ada juga cara lain untuk mengontrol servos dengan Arduino, dan itu menggunakan driver servo PCA9685. Ini adalah 16-Channel 12-bit PWM dan driver servo yang berkomunikasi dengan Arduino menggunakan bus I2C. Ini memiliki jam bawaan sehingga dapat menjalankan 16 servos secara bebas, atau secara independen dari Arduino.

Yang lebih keren lagi, kami dapat melakukan daisy-chain hingga 62 driver ini dalam satu bus I2C. Jadi secara teoritis kita dapat mengontrol hingga 992 servos hanya dengan menggunakan dua pin I2C dari papan Arduino. 6 pin pilih alamat digunakan untuk mengatur alamat I2C yang berbeda untuk setiap driver tambahan. Kita hanya perlu menghubungkan bantalan solder sesuai tabel ini.

Berikut skema rangkaiannya dan sekali lagi kita dapat melihat bahwa kita memerlukan catu daya terpisah untuk servos.

Anda bisa mendapatkan komponen yang diperlukan untuk contoh ini dari tautan di bawah:

  • Motor Servo MG996R ………………………….
  • Driver Servo PWM PCA9685  ……………….
  • Papan Arduino ……………………………………….
  • Supply Listrik DC 5V 6A …………………..…..

Sekarang mari kita lihat kode Arduino. Untuk mengontrol driver servo ini kita akan menggunakan library PCA9685 yang dapat diunduh dari GitHub.

Kode Arduino dan PCA9685

/*
     Servo Motor Control using Arduino and PCA9685 Driver
           by Dejan, https://howtomechatronics.com
           
     Library: https://github.com/NachtRaveVL/PCA9685-Arduino
*/

#include <Wire.h>
#include "PCA9685.h"

PCA9685 driver;

// PCA9685 outputs = 12-bit = 4096 steps
// 2.5% of 20ms = 0.5ms ; 12.5% of 20ms = 2.5ms
// 2.5% of 4096 = 102 steps; 12.5% of 4096 = 512 steps
PCA9685_ServoEvaluator pwmServo(102, 470); // (-90deg, +90deg)

// Second Servo
// PCA9685_ServoEvaluator pwmServo2(102, 310, 505); // (0deg, 90deg, 180deg)


void setup() {
  Wire.begin();                 // Wire must be started first
  Wire.setClock(400000);        // Supported baud rates are 100kHz, 400kHz, and 1000kHz
  driver.resetDevices();        // Software resets all PCA9685 devices on Wire line

  driver.init(B000000);         // Address pins A5-A0 set to B000000
  driver.setPWMFrequency(50);   // Set frequency to 50Hz
}
void loop() {
  driver.setChannelPWM(0, pwmServo.pwmForAngle(-90));
  delay(1000);
  driver.setChannelPWM(0, pwmServo.pwmForAngle(0));
  delay(1000);
  driver.setChannelPWM(0, pwmServo.pwmForAngle(90));
  delay(1000);
}Code language: Arduino (arduino)

Jadi pertama-tama kita perlu memasukkan perpustakaan dan mendefinisikan objek PCA9685. Kemudian menggunakan instance Servo_Evaluator, tentukan durasi pulsa atau output PWM driver. Perhatikan bahwa outputnya adalah 12-bit, atau itu adalah resolusi 4096 langkah. Jadi durasi pulsa minimum posisi 0.5ms atau 0 derajat akan sesuai dengan 102 langkah, dan durasi pulsa maksimum posisi 2.5ms atau 180 derajat ke 512 langkah. Tetapi seperti yang dijelaskan sebelumnya nilai-nilai ini harus disesuaikan dengan motor servo Anda. Saya memiliki nilai dari 102 hingga 470 yang sesuai dengan posisi 0 hingga 180 derajat.

Di bagian setup kita perlu menentukan clock rate I2C, mengatur alamat driver dan mengatur frekuensi ke 50Hz.

Di bagian loop, menggunakan setChannelPWM() dan pwmForAngle() fungsinya kita cukup mengatur servo ke sudut yang diinginkan.

Saya menghubungkan servo kedua ke pengemudi, dan seperti yang saya harapkan, posisinya tidak sama dengan yang pertama, dan itu karena servos yang saya gunakan adalah salinan murah dan tidak begitu dapat diandalkan. Namun, ini bukan masalah besar karena menggunakan Servo_Evaluator Misalnya kita dapat mengatur pengaturan output yang berbeda untuk setiap servo. Kita juga bisa mengatur posisi 90 derajat jika tidak tepat di tengah. Dengan cara itu semua servo akan bekerja sama dan memposisikan pada sudut yang tepat.

Mengendalikan banyak servos dengan Arduino dan driver PCA9685

Kita akan melihat satu contoh lagi dan itu mengendalikan banyak servos dengan beberapa driver PCA9685 yang dirantai.

Untuk itu kita perlu menghubungkan driver satu sama lain dan menghubungkan alamat yang sesuai pilih bantalan solder. Berikut skema rangkaiannya:

Mari kita lihat kode Arduino sekarang.

/*
     Servo Motor Control using Arduino and PCA9685 Driver
           by Dejan, https://howtomechatronics.com
           
     Library: https://github.com/NachtRaveVL/PCA9685-Arduino
*/

#include <Wire.h>
#include "PCA9685.h"

PCA9685 driver;

// PCA9685 outputs = 12-bit = 4096 steps
// 2.5% of 20ms = 0.5ms ; 12.5% of 20ms = 2.5ms
// 2.5% of 4096 = 102 steps; 12.5% of 4096 = 512 steps
PCA9685_ServoEvaluator pwmServo(102, 470); // (-90deg, +90deg)

// Second Servo
PCA9685_ServoEvaluator pwmServo2(102, 310, 505); // (0deg, 90deg, 180deg)


void setup() {
  Wire.begin();                 // Wire must be started first
  Wire.setClock(400000);        // Supported baud rates are 100kHz, 400kHz, and 1000kHz
  driver.resetDevices();        // Software resets all PCA9685 devices on Wire line

  driver.init(B000000);         // Address pins A5-A0 set to B000000
  driver.setPWMFrequency(50);   // Set frequency to 50Hz
}
void loop() {
  driver.setChannelPWM(0, pwmServo.pwmForAngle(-90));
  delay(1000);
  driver.setChannelPWM(0, pwmServo.pwmForAngle(0));
  delay(1000);
  driver.setChannelPWM(0, pwmServo.pwmForAngle(90));
  delay(1000);
}Code language: Arduino (arduino)

Jadi kita harus membuat objek PCA9685 terpisah untuk setiap driver, menentukan alamat untuk setiap driver serta mengatur frekuensi ke 50Hz. Sekarang cukup dengan menggunakan fungsi setChannelPWM() dan pwmForAngle() kita dapat mengatur servo apa pun pada driver mana pun untuk memposisikan sudut mana pun yang kita inginkan.

Pemecahan Masalah

Motor servo bergetar dan mengatur ulang papan Arduino saya

Ini adalah masalah umum dengan motor servo hobi ini, Servo Mikro SG90 dan MG996R. Alasan untuk ini adalah bahwa, seperti yang disebutkan sebelumnya, mereka dapat menarik arus dalam jumlah yang cukup besar ketika mereka dibebani. Hal ini dapat menyebabkan papan Arduino diatur ulang, terutama jika Anda memberi daya servo langsung dari pin Arduino 5V.

Untuk mengatasi masalah ini, Anda dapat menggunakan kapasitor di GND dan pin 5V. Ini akan bertindak sebagai kapasitor decouple yang akan memberikan arus tambahan ke sistem saat start up ketika motor DC mulai.

Motor servo tidak akan bergerak di seluruh rentang dari 0 hingga 180 derajat

Ini adalah masalah umum lainnya dengan servos hobi ini. Seperti yang kami jelaskan sebelumnya, lebar pulsa 1ms (0,5ms) sesuai dengan posisi 0 derajat, dan 2ms (2,5ms) hingga 180 derajat. Namun, nilai ini dapat bervariasi dari satu servo ke servo lainnya dan antara produsen yang berbeda.

Untuk mengatasi masalah ini, kita perlu menyesuaikan lebar pulsa yang kita kirim ke motor servo dengan Arduino. Untungnya, dengan menggunakan library Arduino Servo kita dapat dengan mudah mengatur nilai lebar pulsa di attach() fungsi.

lampirkan() fungsi dapat mengambil dua parameter tambahan, dan itu adalah lebar pulsa minimum dan maksimum dalam mikrodetik. Nilai defaultnya adalah 544 mikrodetik (0,544milidetik) untuk sudut minimum (0 derajat), dan 2400 mikrodetik (2,4ms). Jadi dengan menyesuaikan nilai-nilai ini, kita dapat menyempurnakan rentang momen servo.

  myservo.attach(9,600,2300);  // (pin, min, max)Code language: Arduino (arduino)

Dimensi dan Model 3D

Saya membuat model 3D dari dua motor servo paling populer, Servo Mikro SG90 dan motor servo MG996R. Anda dapat mengunduh memuatnya dari tautan di bawah ini.

Servo Mikro SG90

Model 3D:Unduh dari Thangs.

Dimensi:

Motor Servo MG996R

Model 3D Motor Servo MG996R:Unduh dari Thangs.

Dimensi:

Kesimpulan

Jadi, kami telah membahas hampir semua yang perlu kami ketahui tentang penggunaan motor servo dengan Arduino. Tentu saja, ada banyak sekali produsen dan model motor servo jenis hobi atau RC ini, dan masing-masing memiliki fitur uniknya sendiri yang mungkin berbeda dari yang kami jelaskan di atas.

Kemungkinan untuk membuat proyek robotika, otomatisasi, dan RC yang mengagumkan menggunakan motor tidak terbatas, namun memilih model yang tepat untuk aplikasi Anda sangatlah penting.

Saya harap Anda menikmati tutorial ini dan belajar sesuatu yang baru. Jangan ragu untuk mengajukan pertanyaan apa pun di bagian komentar di bawah, serta pastikan Anda memiliki Koleksi Proyek Arduino saya.

Pertanyaan Umum (FAQ)

Bagaimana cara menggunakan motor servo dengan Arduino?

Menggunakan motor servo dengan Arduino cukup mudah. Motor servo hanya memiliki 3 kabel, dua di antaranya adalah GND dan 5V untuk memberi daya, dan kabel ketiga adalah jalur kontrol yang menuju ke papan Arduino.

Dapatkah Arduino menjalankan motor servo?

Kami dapat menjalankan motor servo langsung dari Arduino, tetapi kami mungkin memiliki masalah daya. Jika motor servo menarik lebih dari 500mA arus, papan Arduino mungkin kehilangan daya dan reset. Sebaiknya selalu gunakan sumber daya terpisah untuk motor servo.

Berapa banyak motor servo yang dapat dikontrol oleh Arduino?

Menggunakan perpustakaan Arduino Servo kita dapat mengontrol hingga 12 motor servo dengan sebagian besar papan Arduino, dan hingga 48 motor servo dengan papan Arduino Mega. Tentu saja, kita perlu menggunakan sumber daya khusus untuk motor servo.


Proses manufaktur

  1. Kontrol Penerima Koin dengan Arduino
  2. Hambatan Menghindari Robot Dengan Motor Servo
  3. Arduino dengan Bluetooth untuk Mengontrol LED!
  4. Arduino Nano:Kontrol 2 Motor Stepper Dengan Joystick
  5. Mengontrol Motor Servo dengan Arduino dan MPU6050
  6. ThimbleKrox - Kontrol Mouse dengan Jari Anda
  7. Cara membuat musik dengan Arduino
  8. Cara Menggunakan NMEA-0183 dengan Arduino
  9. Cara Menyolder Aluminium – Panduan Lengkap
  10. Cara Kerja Kopling:Panduan Lengkap