Cari Kode

Pelajaran 91: Mengendalikan Motor Servo Menggunakan Potensiometer dan Menampilkan Sudut pada LCD

Pelajaran 91: Mengendalikan Motor Servo Menggunakan Potensiometer dan Menampilkan Sudut pada LCD

Dalam tutorial Arduino langsung ini, Anda akan belajar cara menggabungkan tiga komponen penting menjadi satu proyek yang berfungsi: motor servo, potensiometer, dan layar LCD I2C. Pada akhirnya, Anda akan dapat memutar kenop dan melihat lengan servo bergerak secara real-time sementara sudut yang tepat ditampilkan di layar. Proyek ini sangat cocok untuk membangun antarmuka fisik yang intuitif di mana Anda membutuhkan umpan balik visual dan penentuan posisi yang presisi.

Proyek ini menjembatani kesenjangan antara input analog dan output fisik. Potensiometer berfungsi sebagai kenop kontrol analog Anda, motor servo menerjemahkan posisi kenop tersebut menjadi sudut fisik (0 hingga 180 derajat), dan layar LCD memberikan konfirmasi visual langsung dari sudut saat ini. Pengaturan ini menjadi fondasi untuk banyak aplikasi praktis:

  • Membangun sendi lengan robot dengan kenop kontrol manual untuk penentuan posisi yang presisi
  • Membuat dudukan kamera pan-and-tilt di mana Anda mengontrol arah dengan kenop
  • Mengembangkan pengukur analog yang menampilkan nilai di layar untuk panel instrumen khusus
  • Membangun mekanisme kemudi kendaraan model yang dikendalikan jarak jauh dengan umpan balik visual

Komponen Perangkat Keras

Untuk membangun proyek ini, Anda akan membutuhkan komponen berikut:

  • Papan Arduino (Uno atau sejenisnya)
  • Motor servo (servo hobi standar 5V)
  • Potensiometer (10kΩ disarankan)
  • Layar LCD I2C (16x2 atau 20x4)
  • Papan breadboard dan kabel jumper

Panduan Pengkabelan

Proyek ini secara cerdas menggunakan dua pin digital cadangan pada Arduino untuk menyuplai daya 5V ke potensiometer dan LCD, menghindari kebutuhan rel daya tambahan di breadboard. Pin 8 dikonfigurasi sebagai output dan diatur HIGH untuk memberi daya pada potensiometer, sementara pin 4 melakukan hal yang sama untuk VCC LCD. Teknik ini berguna ketika Anda membutuhkan sumber 5V tambahan tanpa menambah perangkat keras.

Koneksi pengkabelan adalah sebagai berikut (dalam video pada 05:08):

  • Servo: Kabel sinyal ke pin digital 3, daya ke 5V, ground ke GND
  • Potensiometer: Pin tengah ke pin analog A0, satu pin luar ke pin 8 (VCC2), pin luar lainnya ke GND
  • LCD: VCC ke pin 4 (VCC3), GND ke GND, SDA ke A4, SCL ke A5

Penjelasan Kode

Kode untuk proyek ini dibangun di atas kontrol servo standar dengan menambahkan fungsionalitas tampilan LCD. Mari kita fokus pada elemen kunci yang dapat dikonfigurasi pengguna yang perlu Anda sesuaikan untuk pengaturan spesifik Anda.

Definisi Pin: Pin didefinisikan di bagian atas sketsa dan dapat diubah agar sesuai dengan pengkabelan Anda:


int potpin = A0;  // pin analog untuk potensiometer
int servoPin = 3; // pin PWM digital untuk servo (3, 5, 6, 9, 10, 11)
int VCC2 = 8;     // pin 5V tambahan untuk potensiometer
int VCC3 = 4;     // pin 5V tambahan untuk LCD

Konfigurasi LCD: Alamat I2C sangat penting dan harus sesuai dengan modul LCD spesifik Anda. Banyak modul menggunakan 0x27, tetapi kode ini menggunakan 0x3F. Anda mungkin perlu menjalankan sketsa pemindai I2C untuk menemukan alamat Anda:


LiquidCrystal_I2C lcd(0x3F, 16, 2);  // alamat, kolom, baris

Penyesuaian Resolusi Servo: Pembacaan analog dibagi dengan 5 untuk mengurangi fluktuasi. Anda dapat menyesuaikan nilai ini untuk menyeimbangkan stabilitas dengan resolusi. Pembagi yang lebih tinggi (seperti 10) memberikan pembacaan yang sangat stabil tetapi mengurangi jumlah posisi servo yang dapat Anda capai:


val = analogRead(potpin)/5;  // dibagi 5 untuk stabilitas

Penempatan Simbol Derajat: Kode ini mencakup logika untuk menempatkan simbol derajat (°) dengan benar di samping nilai sudut, baik itu angka satu, dua, atau tiga digit. Ini memastikan tampilan selalu terlihat bersih dan profesional.

Demonstrasi Proyek Langsung

Ketika Anda menyalakan proyek, LCD akan menampilkan "Servo with Pot." di baris pertama. Saat Anda memutar potensiometer, lengan servo akan berputar untuk mencocokkan posisi kenop, dan baris kedua LCD akan menampilkan sudut saat ini dengan simbol derajat. Monitor serial juga mengeluarkan nilai sudut untuk tujuan debugging (dalam video pada 05:36).

Satu hal yang akan Anda perhatikan adalah bahwa sudut yang ditampilkan mungkin sedikit berfluktuasi antara dua nilai. Ini karena pembacaan analog dari potensiometer tidak sepenuhnya stabil. Kode ini mengatasinya dengan membagi pembacaan mentah dengan 5, yang secara signifikan mengurangi fluktuasi sambil tetap menyediakan 180 posisi yang berbeda. Jika Anda menginginkan pembacaan yang benar-benar stabil, Anda dapat meningkatkan pembagi, tetapi Anda akan kehilangan beberapa presisi dalam penentuan posisi servo.

Bab

  • [00:00] Pengenalan proyek
  • [00:31] Gambaran pengkabelan dan kebutuhan daya
  • [01:05] Penjelasan kode bagian 1: Pengaturan LCD
  • [02:36] Penjelasan kode bagian 2: Inisialisasi LCD dan logika tampilan
  • [03:48] Penjelasan kode bagian 3: Penempatan simbol derajat
  • [05:08] Diagram pengkabelan lengkap dan koneksi
  • [05:36] Demonstrasi langsung dan pengujian
  • [06:14] Memperbaiki fluktuasi nilai dan menyesuaikan resolusi

Gambar

SG90 Mini Servo Motor
SG90 Mini Servo Motor
Arduino wiring for controlling Servo motor with Potentiometer
Arduino wiring for controlling Servo motor with Potentiometer
438-Lesson 91: Controlling a servo motor using a potentiometer and displaying the angle on an LCD
Bahasa: C++
/*
 Lesson 91
  * S05 Servo with Potentiometer and LCD1602-I2C
  * 
  Controlling a servo position using a potentiometer (variable resistor)
  by Michal Rinott <http://people.interaction-ivrea.it/m.rinott>
 
 Watch full instructions on YouTube https://youtu.be/E-H-4igygzA
  modified on 8 Nov 2013
  by Scott Fitzgerald
  http://www.arduino.cc/en/Tutorial/Knob
 
  Update by Ahmad Shamshiri on January 1, 2019 in Ajax, Ontario, Canada
 
 https://robojax.com?vid=robojax-servo-knob
 */
 
 #include <Servo.h>
 Servo myservo;  // create servo object to control a servo
 
 int potpin = A0;  // analog pin used to connect the potentiometer
 int servoPin = 3; // define a digital pin (with PWM) for servo. Can use only pin 3, 5, 6, 9, 10, 11
 int VCC2 = 8;// define extra VCC for potentiometer
 int val;    // variable to read the value from the analog pin
 
 #include <Wire.h> 
 #include <LiquidCrystal_I2C.h>
 
 // Set the LCD address to 0x27 for a 16 chars and 2 line display
 LiquidCrystal_I2C lcd(0x3F, 16, 2);
 int VCC3 = 4;// define extra VCC for LCD
 int degPos;// degree symbol position
 
 void setup() {
   //
   Serial.begin(9600);          //  setup serial
   myservo.attach(servoPin);  // attaches the servo on pin 3 to the servo object
 
   pinMode(VCC2, OUTPUT);// set pin 8 as output
   digitalWrite(VCC2, HIGH);// set pin 8 HIGH so it acts as 5V pin
 
   // lines bellow are for LCD
   pinMode(VCC3, OUTPUT);// set pin 4 as output
   digitalWrite(VCC3, HIGH);// set pin 4 HIGH so it acts as 5V pin  
   lcd.begin();  // initialize the LCD, 
   // Turn on the backlight and print a message.
   lcd.backlight();    
 }
 
 void loop() {
   
   val = analogRead(potpin)/5;            // reads the value of the potentiometer (value between 0 and 1023)
   val = map(val, 0, 1023/5, 0, 180);     // scale it to use it with the servo (value between 0 and 180)
   myservo.write(val);                  // sets the servo position according to the scaled value
   Serial.print(val);
   Serial.println();
 
   lcd.clear();
   lcd.print("Servo with Pot.");
   lcd.setCursor (0,1); // go to start of 2nd line
   lcd.print("Angle:");  
   lcd.setCursor (7,1); // go to 7 char of of 2nd line
   lcd.print(val);// print angle 
 
   if(val >99)
   {
     degPos =10;
   }else if(val >9)
   {
     degPos =9;
   }else
   {
     degPos =8;
   }
   lcd.setCursor (degPos,1); // go to 11 char of of 2nd line  
   lcd.print((char)223);// degree symbol
     
   delay(500);                           // waits for the servo to get there
 }

Hal-hal yang mungkin Anda butuhkan

Sumber daya & referensi

Berkas📁

File Fritzing

File lainnya