Cari Kode

Pelajaran 97-2: Mengendalikan Motor Servo Menggunakan Encoder Putar

Pelajaran 97-2: Mengendalikan Motor Servo Menggunakan Encoder Putar

Proyek ini menunjukkan cara membangun pengontrol motor servo presisi menggunakan encoder putar. Tidak seperti potensiometer, encoder putar berputar terus menerus, memungkinkan Anda melakukan penyesuaian halus atau perubahan multi-putaran cepat tanpa mengenai batas fisik. Ini menjadikannya pilihan yang sangat baik untuk aplikasi yang membutuhkan daya tahan tinggi dan kontrol presisi, seperti lengan robot, gimbal kamera, mekanisme pan-tilt, atau proyek DIY apa pun yang perlu mengatur posisi dengan kenop fisik.

 

Berikut adalah beberapa contoh praktis yang dapat Anda bangun dengan pengaturan ini:

  • Membuat panel kontrol manual untuk lengan robot untuk mengatur sudut sendi.
  • Membangun kepala pan-and-tilt presisi untuk kamera atau sensor.
  • Mengembangkan pengontrol katup atau peredam bermotor untuk otomatisasi rumah.
  • Membuat instalasi seni interaktif di mana memutar kenop menggerakkan elemen fisik.

Komponen Perangkat Keras

Untuk mengikuti panduan ini, Anda akan memerlukan bagian-bagian berikut. Encoder putar dapat berupa komponen telanjang atau modul dengan PCB yang mencakup resistor pull-up yang diperlukan. Diagram pengkabelan dalam video mencakup kedua versi.

  • Arduino Uno (atau papan serupa)
  • Encoder Putar (dengan atau tanpa PCB)
  • Motor Servo (standar atau roda gigi logam)
  • 3x Resistor (1kΩ hingga 100kΩ, hanya jika menggunakan encoder telanjang)
  • Layar LCD I2C (16x2)
  • Kabel Jumper dan Papan Roti (opsional)

Panduan Pengkabelan

rotary_encod_PCB-wiring_bb

Proyek ini melibatkan menghubungkan tiga komponen utama ke Arduino: encoder putar, motor servo, dan layar LCD opsional. Video menyediakan diagram terperinci untuk versi PCB dan versi dasar encoder. Koneksi inti diuraikan di bawah ini.

Encoder Putar: Encoder memiliki dua pin sinyal (sering disebut A dan B) dan pin sakelar tombol tekan. Untuk versi PCB, hubungkan dua pin sinyalnya ke pin Arduino 2 dan 3, dan pin sakelar ke pin 4. Pin daya dan ground terhubung ke 3.3V dan GND, masing-masing. Untuk encoder telanjang, Anda harus menambahkan resistor pull-up ke pin sinyal.

Motor Servo: Servo memiliki tiga kabel. Hubungkan kabel sinyal (sering kuning atau oranye) ke pin yang mendukung PWM di Arduino, yaitu pin 9 dalam kode. Hubungkan kabel daya (biasanya merah) ke pin 5V dan kabel ground (coklat atau hitam) ke GND. Untuk servo yang kuat, video merekomendasikan menggunakan catu daya eksternal 5V untuk menghindari kelebihan beban pada regulator tegangan Arduino, memastikan groundnya sama.

Layar LCD I2C: LCD menggunakan protokol I2C, yang hanya memerlukan dua koneksi data. Hubungkan pin SDA ke A4 Arduino dan pin SCL ke A5. Beri daya pada layar dengan 5V dan GND. Video juga menunjukkan metode alternatif untuk memberi daya dari header ICSP.

Penjelasan Kode

Kode dirancang agar mudah dikonfigurasi. Pengaturan utama didefinisikan di bagian atas sketsa, memungkinkan Anda menyesuaikan pin dan perilaku tanpa masuk ke logika. Berikut adalah variabel kunci yang mungkin ingin Anda ubah (dalam video pada 17:52).

const int SW_PIN = 4;
const int PIN_A =2;
const int PIN_B =3;

const int homePosition = 90; //posisi awal
const int stepValue = 5;
const int servoPin = 9;//harus pin yang diberi label dengan ~
  • PIN_A dan PIN_B: Ini mendefinisikan pin Arduino yang terhubung ke output encoder. Jika servo Anda bergerak dalam arah yang berlawanan dengan kenop Anda, Anda cukup menukar dua nilai ini (dalam video pada 17:32).
  • SW_PIN: Ini adalah pin untuk sakelar tombol tekan bawaan encoder. Menekannya akan mengirim servo ke homePosition yang ditentukan (dalam video pada 19:06).
  • homePosition: Ini adalah sudut (dalam derajat) yang akan dituju servo saat sakelar ditekan, dan juga posisi awal servo saat daya dinyalakan.
  • stepValue: Ini mengontrol seberapa sensitif kenop. Nilai 5 berarti sudut servo berubah sebesar 5 derajat untuk setiap detent yang Anda rasakan saat memutar encoder. Naikkan ini untuk gerakan lebih cepat atau turunkan untuk kontrol yang lebih halus (dalam video pada 20:39).
  • servoPin: Ini adalah pin kontrol untuk servo. Sangat penting untuk menggunakan pin yang mendukung PWM (modulasi lebar pulsa), yang ditunjukkan dengan simbol ~ di samping nomor pin di Arduino. Pin 9 adalah pilihan yang aman (dalam video pada 21:03).

Loop utama terus membaca posisi encoder. Ketika perubahan terdeteksi, ia membandingkan posisi baru dengan posisi lama untuk menentukan arah rotasi. Jika Anda memutarnya searah jarum jam, servoAngle ditingkatkan sebesar stepValue, dan jika berlawanan arah jarum jam, itu dikurangi. Kode mencakup pemeriksaan untuk memastikan sudut tetap dalam rentang valid 0 hingga 180 derajat untuk servo standar.

Tombol tekan encoder dibaca sebagai input digital. Saat ditekan, ia menarik pin ke rendah, memicu kode untuk mengatur ulang servoAngle ke homePosition yang Anda tentukan (dalam video pada 27:13). Jika Anda menggunakan versi kode dengan LCD, fungsi khusus menangani membersihkan dan memperbarui tampilan sudut di layar untuk mencegah teks ghosting (dalam video pada 27:56).

Demonstrasi Proyek Langsung

Dalam demonstrasi video, pengaturan ini ditunjukkan bekerja dengan servo standar dan servo bergigi logam. Saat kenop diputar, lengan servo mengikuti arah putaran, berhenti pada batas 0 dan 180 derajat. Responsnya langsung dan akurat. Video ini juga menunjukkan fungsi sakelar, di mana menekan kenop seketika mengembalikan servo ke posisi awalnya, yang bisa menjadi fitur yang sangat berguna untuk mengarahkan mekanisme ke posisi awal (dalam video pada 30:01).

Menggerakkan servo dari encoder dibahas dalam Pelajaran 97-1: Mendeteksi Putaran Encoder Rotary dan Menekan Sakelar.

Proyek terkait dari video ini

Bab

  • [00:01] Pengenalan Mengendalikan Servo dengan Encoder Rotary
  • [00:51] Menghubungkan Encoder Versi PCB
  • [06:55] Menghubungkan Encoder Polos dengan Resistor
  • [09:56] Menghubungkan Motor Servo dan LCD
  • [13:28] Menginstal Pustaka yang Diperlukan
  • [14:54] Menguji Kode Encoder Dasar
  • [17:52] Memodifikasi Kode untuk Servo dan Sakelar
  • [20:20] Penjelasan Kode untuk Kontrol Servo
  • [27:56] Menjelaskan Fungsi Tampilan LCD
  • [30:01] Demonstrasi Akhir dan Kesimpulan

Gambar

Rotary encoder PCB wiring breadboard
Rotary encoder PCB wiring breadboard
432-Lesson 97-2: Controlling Servo Motor using Rotary Encoder
Bahasa: C++
/* 
 *  Lesson 97-2: Controlling Servo Motor using Rotary Encoder 
Download and resource page https://robojax.com/RJT453
 *  
 *  Watch full details video: https://youtu.be/6xVLbNlmK-g
  This video is part of the Arduino Step by Step Course, which starts here: https://youtu.be/-6qSrDUA5a8
 

If you found this tutorial helpful, please support me so I can continue creating 
content like this. Make a donation using PayPal or a credit card: https://bit.ly/donate-robojax
  
 * This code is "AS IS" without warranty or liability. Free to be used as long as you keep this note intact.* 
 * This code has been downloaded from Robojax.com
    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.
 *  Updated by Ahmad Shamshiri on Jan 23, 2022
 *  Encoder Library - Basic Example
 * http://www.pjrc.com/teensy/td_libs_Encoder.html
 *
 * This example code is in the public domain.
 */
const int SW_PIN = 4;
const int PIN_A =2;
const int PIN_B =3;

#include <Encoder.h>

// Change these two numbers to the pins connected to your encoder.
//   Best Performance: both pins have interrupt capability
//   Good Performance: only the first pin has interrupt capability
//   Low Performance:  neither pin has interrupt capability
Encoder myEnc(PIN_A, PIN_B);
//   avoid using pins with LEDs attached

const int homePosition = 90; //initial position
const int stepValue = 5;
const int servoPin = 9;//must be a pin that that is labeled with ~
#include <Servo.h>

Servo myservo;  // create servo object to control a servo
int servoAngle =homePosition;

void setup() {
  Serial.begin(9600);
  pinMode(SW_PIN, INPUT);
  Serial.println("Basic Encoder Test:");
   myservo.attach(servoPin);  // attaches the servo on pin
   myservo.write(servoAngle);//move servo to initial position
}

long oldPosition  = -999;

void loop() {
  long newPosition = myEnc.read();
  if (newPosition != oldPosition) {

    if(newPosition >  oldPosition)
    {
    int newStep = abs(newPosition - oldPosition);
      Serial.print("Angle ");
      Serial.println(servoAngle);      
      servoAngle -= stepValue;
      if(servoAngle <0)
          servoAngle =0;      
      myservo.write(servoAngle);
    }

    if(newPosition <  oldPosition )
    {
    int newStep = abs(newPosition - oldPosition);
      Serial.print("Angle ");
      Serial.println(servoAngle);        
      servoAngle += stepValue;
      if(servoAngle >180)
          servoAngle =180;
      myservo.write(servoAngle);
    }
   oldPosition = newPosition;//remember the new position
  }

  if( digitalRead(SW_PIN) == LOW)
  {
    Serial.print("Home: ");
    Serial.println(homePosition);
    servoAngle =homePosition;
    myservo.write(servoAngle);
  
  }

//Watch full details video: https://youtu.be/6xVLbNlmK-g
  //delay(200);
}

Sumber daya & referensi

Berkas📁

Tidak ada file tersedia.