Kod Ara

Ders 86: Potansiyometre kullanarak servo motorun konumunu kontrol etme

Ders 86: Potansiyometre kullanarak servo motorun konumunu kontrol etme

Bir basit düğmeyi çevirdiğinizi ve mekanik bir kolun her hareketinizi hassas bir şekilde takip ettiğini hayal edin. Bir potansiyometreyi bir servo motorla birleştirmenin büyüsü budur. Robojax tarafından hazırlanan Arduino Adım Adım Kursu'nun bir parçası olan bu proje, elektronikte temel ve son derece kullanışlı bir kavramı gösterir: analog bir girdiyi hassas fiziksel harekete dönüştürmek. Bir potansiyometreden değişken bir voltajı nasıl okuyacağınızı, bu değeri bir açı aralığına nasıl eşleyeceğinizi ve bir servo motoru tam o konuma dönmesi için nasıl komuta edeceğinizi öğreneceksiniz. Bu, manuel kontrolün otomasyonla buluştuğu sezgisel ve etkileşimli projeler oluşturmanız için bir kapıdır.

Bu becerinin uygulamaları geniş ve pratiktir. İşte size ilham verecek birkaç fikir:

  • Robot Kol Kontrolü: Hassas al-ve-bırak işlemleri için bir robot kolun her eklemini manuel olarak konumlandırmak üzere bir potansiyometre kullanın.
  • Kamera Pan ve Tilt Sistemi: Zaman atlamalı çekimler veya gözetim için, bir kadranı çevirerek yumuşak bir şekilde pan ve tilt yapan uzaktan kumandalı bir kamera montajı kurun.
  • Analog Gösterge Kopyası: Sensör verilerine dayalı olarak hareket eden fiziksel bir gösterge paneli (hız göstergesi veya sıcaklık kadranı gibi) oluşturun; potansiyometre manuel geçersiz kılma veya kalibrasyon aracı olarak işlev görsün.
  • Etkileşimli Sanat Enstalasyonları: İzleyici girdisine tepki veren kinetik heykeller oluşturun; bir kadranı çevirmek hareketli parçaların konumunu değiştirir.
  • Model Araç Direksiyonu: Bir model arabanın veya teknenin direksiyon açısını uzaktan kontrol edin; dijital düğmelerden daha sezgisel ve analog bir his sağlar.

Bu kılavuz, Robojax tarafından hazırlanan Ders 86: Potansiyometre kullanarak servo motorun konumunu kontrol etme video eğitimine (videoda 00:00'da) dayanmaktadır. Kablolamayı anlamaktan her şeyi çalıştıran kodu açıklamaya kadar tüm süreçte size yol gösterir. Başlayalım.

Donanım ve Bileşenler

Bu projeyi takip etmek için aşağıdaki bileşenlere ihtiyacınız olacak:

  • Bir Arduino kartı (örn. Uno, Nano)
  • Standart bir servo motor (örn. SG90 veya MG996R)
  • Bir potansiyometre (değişken direnç, genellikle 10kΩ)
  • Jumper kablolar
  • Bir breadboard (isteğe bağlı, daha kolay bağlantılar için)

Kablolamayı Anlama

Bu projenin kablolaması basittir. Anahtar, hem servo hem de potansiyometre için doğru güç ve sinyal bağlantılarını sağlamaktır. Servo güç tüketen bir cihazdır, bu nedenle gücünü doğrudan Arduino'nun 5V pininden alır. Potansiyometre bir voltaj bölücü görevi görür ve konumunu belirlemek için sileceğindeki (orta pin) voltajı okuruz. (videoda 01:05'te)

Bu projenin kullandığı akıllıca bir numara, potansiyometreye güç sağlamak için dijital bir pinde ek bir 5V kaynağı oluşturmaktır; çünkü bazı Arduino kartlarında yalnızca bir adet özel 5V pini bulunur. Bu, kodda bir dijital pini (pin 8) HIGH olarak ayarlayarak yapılır ve bu da 5V çıkışı sağlar. (videoda 00:39'da)

İşte videoda bahsedilen bağlantı şeması:

Potansiyometreli servo motor için Arduino kablolaması
Potansiyometreli servo motor için Arduino kablolaması

Bağlantıları adım adım inceleyelim:

  • Servo Motor:
    • Güç (Kırmızı kablo) → Arduino 5V pini
    • Toprak (Kahverengi/Siyah kablo) → Arduino GND pini
    • Sinyal (Turuncu/Sarı kablo) → Arduino pini 3 (PWM destekli bir pin)
  • Potansiyometre:
    • Sol Pin → Arduino GND pini
    • Orta Pin (Silecek) → Arduino analog pini A0
    • Sağ Pin → Arduino pini 8 (kodda VCC2 olarak tanımlanmıştır)

Kod Açıklaması

Bu projenin kodu zarif bir şekilde basittir. Potansiyometreyi okumak ve servoyu kontrol etmek için birkaç temel Arduino fonksiyonundan yararlanır. Kendi projeleriniz için ayarlayabileceğiniz kullanıcı tarafından yapılandırılabilir kısımlara odaklanalım. (videoda 03:00'te)

Taslağın en üstünde pinleri tanımlayacak ve servo nesnesini oluşturacaksınız. Bunlar, kablolamanıza göre değiştireceğiniz birincil değişkenlerdir:

#include <Servo.h>

Servo myservo;  // bir servoyu kontrol etmek için servo nesnesi oluştur

int potpin = A0;  // potansiyometreyi bağlamak için kullanılan analog pin
int servoPin = 3; // servo için dijital bir pin (PWM'li) tanımla. Yalnızca pin 3, 5, 6, 9, 10, 11 kullanılabilir
int VCC2 = 8;// potansiyometre için ek VCC tanımla
int val;    // analog pinden değeri okumak için değişken

Her bir parçanın ne yaptığı şöyledir:

  • Servo myservo;: Bu satır, belirli servo motorumuzu kontrol etmek için kullanacağımız myservo adında bir nesne oluşturur. Yeniden adlandırabilirsiniz, ancak kodun ilerleyen kısımlarında aynı adı kullanmanız gerekir.
  • int potpin = A0;: Bu, potansiyometrenin sileceğinin bağlı olduğu analog pini tanımlar. Kabloyu farklı bir analog pine taşırsanız bu numarayı güncellemelisiniz.
  • int servoPin = 3;: Bu, servonun sinyal kablosu için dijital pini ayarlar. PWM destekli bir pin kullanmak çok önemlidir (genellikle kartta '~' ile işaretlenir). Yorum, çoğu Arduino için geçerli pinleri listeler.
  • int VCC2 = 8;: Bu, potansiyometre için ikincil 5V kaynağı olarak kullandığımız pindir. Birden fazla 5V pini olan bir kartınız varsa doğrudan bağlayabilir ve kodun bu kısmını kaldırabilirsiniz.

setup() fonksiyonunda kod, servo motoru başlatır ve ek güç pinini ayarlar. myservo.attach(servoPin) fonksiyonu, Arduino'ya servo motorun sinyal kablosunun hangi pine bağlı olduğunu söylediği için çok önemlidir.

void setup() {
  Serial.begin(9600);          //  seri haberleşmeyi başlat
  myservo.attach(servoPin);  // servo nesnesine pin 3'teki servoyu bağlar

  pinMode(VCC2, OUTPUT);// pin 8'i çıkış olarak ayarla
  digitalWrite(VCC2, HIGH);// pin 8'i HIGH yap, böylece 5V pini gibi çalışır
}

Ana mantık loop() fonksiyonundadır. Potansiyometrenin değerini okur, bunu bir açıya ölçekler ve servoya hareket etmesini söyler. Buradaki iki kritik fonksiyon analogRead() ve map()'tir. (videoda 04:27'de)

void loop() {
  val = analogRead(potpin);            // potansiyometrenin değerini okur (0 ile 1023 arasında bir değer)
  val = map(val, 0, 1023, 0, 180);     // servo ile kullanmak için ölçekler (0 ile 180 arasında bir değer)
  myservo.write(val);                  // ölçeklenen değere göre servo konumunu ayarlar
  Serial.print(val);
  Serial.println();
  delay(50);                           // servonun oraya gitmesini bekler
}

İşte nasıl çalıştığı:

  • analogRead(potpin): Bu fonksiyon potansiyometrenin sürgüsündeki voltajı okur ve 0 (0V) ile 1023 (5V) arasında bir değer döndürür.
  • map(val, 0, 1023, 0, 180): Bu, tüm projenin anahtarıdır. Potansiyometreden gelen ham değeri (0 ile 1023) orantılı olarak bir servo açısına (0 ile 180 derece) dönüştürür. Örneğin, potansiyometre 511 (yaklaşık yarısı) okursa, map() fonksiyonu 90 döndürür ve servoyu merkez konumuna hareket ettirir.
  • myservo.write(val): Bu fonksiyon hesaplanan açıyı (artık val içinde saklanan) alır ve servoya o konuma dönmesini söyler.
  • delay(50): Bu, her döngünün sonuna küçük bir duraklama ekler. Güncelleme hızını kontrol eder. Daha büyük bir gecikme (200ms gibi) servonun adım adım hareket etmesini sağlarken, daha küçük bir gecikme (50ms gibi) hareketi çok pürüzsüz yapar. Tepki hızını değiştirmek için bunu ayarlayabilirsiniz. (videoda 07:26'da)

Canlı Proje Gösterimi

Videoda projeyi çalışırken görebilirsiniz. Potansiyometre düğmesi çevrildikçe, servo motorun kolu konumunu orantılı olarak takip eder. Seri monitör, haritalamanın doğru çalıştığını doğrulayan mevcut açıyı yazdırır. Potansiyometre minimum konumundayken, servo 0 derecededir. Düğmeyi maksimuma çevirdiğinizde, servo 180 dereceye pürüzsüz bir şekilde döner. (videoda 06:33'te)

Bu gerçek zamanlı geri bildirim döngüsü, analog bir sensörün dijital bir aktüatörle kusursuz entegrasyonunu göstererek duyarlı ve sezgisel bir kontrol sistemi oluşturur.

Bölümler

  • [00:00] Giriş ve Proje Genel Bakışı
  • [01:05] Şematik ve Bağlantı Şeması
  • [02:07] Fiziksel Bağlantı Gösterimi
  • [03:00] Kod Açıklaması
  • [06:33] Canlı Gösterim ve Test
  • [07:26] Servo Tepki Hızını Ayarlama

Görseller

Arduino wiring or servo motor with pot
Arduino wiring or servo motor with pot
SG90_servo_motor-1
SG90_servo_motor-1
SG90_servo_motor-0
SG90_servo_motor-0
892-Lesson 86: Controlling a servo position using a potentiometer (variable resistor)
Dil: C++
/*
 * Lesson 88: Controlling Servo motor a with Potentiometer
 * 📚⬇️ Download and resource page https://robojax.com/RJT763
 watch full video tutroial: https://www.youtube.com/watch?v=ntRW77mNFFk
 
 Controlling a servo position using a potentiometer (variable resistor)
 by Michal Rinott <http://people.interaction-ivrea.it/m.rinott>

 modified on 8 Nov 2013
 by Scott Fitzgerald
 http://www.arduino.cc/en/Tutorial/Knob

 Update by Ahmad Shamshiri on Jan 01, 2019  in Ajax, Ontario, Canada


*/

#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

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
}

void loop() {
  
  val = analogRead(potpin);            // reads the value of the potentiometer (value between 0 and 1023)
  val = map(val, 0, 1023, 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();
  delay(50);                           // waits for the servo to get there
}
 

İhtiyacın olabileceğini düşünüyor

Kaynaklar ve referanslar

Dosyalar📁

Diğer dosyalar