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ı:
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
myservoadı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
valiç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
/*
* 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
-
Amazon
-
Amazon
-
eBay
-
AliExpressPurchase SG90 servo motor 180 or 360 from AliExpresss.click.aliexpress.com
Kaynaklar ve referanslar
Dosyalar📁
Diğer dosyalar
-
SG90 Seroo motor veri sayfası
robojax-servo-SG90_datasheet.pdf0.12 MB