ArduinoEğitim

Arduino ve Joystick ile Servo Motor Kontrolü – 2

Servo Motor ve Joystick – Bölüm 2

Daha önceki yazımızda servo motorların çalışma prensibini ele almıştık. Bu bölümde ise Joystick – Servo Motor – Arduino üçlüsünü bir araya getirerek, analog kontrol mantığını daha yakından inceleyeceğiz.


Joystick Nedir?

Joystick (Türkçede “eğlence çubuğu” veya “yönetim kolu” olarak da bilinir), mekanik hareketleri elektriksel sinyallere dönüştüren bir kontrol elemanıdır. Günümüzde oldukça yaygın olsa da, joystick’in geçmişi bilgisayar tarihinin erken dönemlerine kadar uzanır.

Eskiden Commodore 64 veya VIC-20 gibi ev tipi bilgisayarlar satın alındığında yanında joystick de alınırdı. Hatta joystick’ler, bilgisayar faresinden (mouse) bile önce yaygın olarak kullanılmıştır. Endüstriyel alanda ise joystick kullanımı çok daha eskiye dayanır; vinç sistemlerinden gemi kontrol mekanizmalarına kadar geniş bir kullanım alanı vardır. Günümüzde bazı büyük feribotlarda dümen yerine joystick kullanıldığına bile rastlanmaktadır.


Joystick Türleri

Joystick’ler genel olarak iki gruba ayrılır:

1. Dijital Joystick

  • 4 yön (yukarı, aşağı, sağ, sol)
  • 1 adet buton (ateşleme)
  • Toplamda 5 temel giriş

Bu tip joystick’ler eski bilgisayarlarda ve oyun konsollarında yaygındı.

2. Analog Joystick

  • X ve Y eksenlerinde hassas hareket algılar
  • Sürekli veri üretir (sadece yön değil, miktar da ölçülür)
  • Günümüzde Arduino ve robotik projelerde kullanılan tiptir

Bizim bu projede kullanacağımız joystick türü analog joystick’tir.


Analog Joystick Çalışma Mantığı

Analog joystick aslında oldukça basit bir prensiple çalışır. İçerisinde:

  • 2 adet potansiyometre (ayarlı direnç) bulunur
    • Biri X ekseni (sağ-sol hareket)
    • Diğeri Y ekseni (yukarı-aşağı hareket)

Bu potansiyometreler mekanik olarak birbirine bağlıdır. Joystick hareket ettirildiğinde:

  • X ve Y yönlerine bağlı olarak direnç değerleri değişir
  • Bu değişim, voltaj değişimine dönüşür

Voltaj Üretimi Nasıl Olur?

Potansiyometrelerin uçları şu şekilde bağlanır:

  • Bir uç → +5V
  • Diğer uç → GND (0V)
  • Orta uç (wiper) → çıkış sinyali

Bu durumda:

  • Joystick ortadayken → yaklaşık 2.5V
  • Bir yöne itilince → 5V’a yaklaşır
  • Ters yöne itilince → 0V’a yaklaşır

Yani joystick pozisyonu ile voltaj arasında doğrudan bir ilişki vardır.


Arduino ile Veri Okuma

Joystick’ten gelen bu analog voltaj değerleri, Arduino’nun ADC (Analog-Dijital Çevirici) pinleri tarafından okunur.

Arduino:

  • 0V → 0
  • 5V → 1023

şeklinde bir dijital değere çevirir.

Bu sayede joystick’in konumu sayısal olarak elde edilir ve servo motor gibi çıkış elemanları kontrol edilebilir.


Servo Motor ile İlişkilendirme

Servo motorlar belirli açılar arasında hareket edebilen hassas motorlardır (genellikle 0°–180°).

Joystick’ten gelen değerler:

  • X ekseni → servo açısına dönüştürülebilir
  • Örneğin:
    • 0 → 0°
    • 512 → 90°
    • 1023 → 180°

Bu sayede joystick’i hareket ettirdikçe servo motor aynı oranda hareket eder.

arduino-ve-joystick-ile-servo-motor-kontrolu-bolum-2-gorsel-001

Ancak günümüzde kullanılan joystick potansiyometreleri özel olarak üretilmektedir ve sadece sağdaki şekilde görüldüğü gibi bir dirençli bölge oluşturulur. Böylece hareketimiz +5V ve 0V arasında bir değer alır. Dolayısı ile Arduino AD değeri 0 ila 1023 arası bir değer verecektir. Joystick normal halinde orta pozisyonda olacağı için alacağımız değerler yaklaşık 512 civarı olmasını bekleyebiliriz. Tabii burada içindeki direnç değerlerinin toleransları, direncin fiziksel montajı ve lineer yapısı burada farklılık gösterebilir. Bu durumu test etmek için burada bağlantısı yer alan ve aşağıda görülen joystick pimlerini Arduino’ya bağlıyoruz.

GND Arduino GND ye, 5V Arduino 5V’ta Rx çıkışı Arduino AD0 girişine, Ry çıkışını Arduino AD1 girişine bağlıyoruz. Joystickerde daha önce bahsettiğim buton SW bağlantısı bulunur onu da test için dijital pin 2 ye bağlayalım.

arduino-ve-joystick-ile-servo-motor-kontrolu-bolum-2-gorsel-002

Şimdi Arduino IDE aşağıdaki kısa programı yazalım.

// Arduino pin numaraları

const int SW_pin  = 2; // dijital pin 2 ye SW bağladık

const int X_pin  = 0; // analog pin 0 Rx e bağladık

const int Y_pin = 1; // analog pin 1 Ry ye bağladık

 

void setup()  {

  PinMode(SW_pin, input);         // Dijital pini giriş olarak tanımladık

  digitalWrite(SW_pin, HIGH);  // buton basılı değil iken “1” yap

   Serial.begin(115200);                // seriel çıktı hazırlığı

}

 

void loop() {

   Serial.print(“Buton:      “);

   Serial.print(digitalRead(SW_pin));      // buton durumu

   Serial.print(\n);            // alt satıra geç

   Serial.print(X-düzlem:  “;

   Serial.print(analogRead(X_pin));         // x değerini oku ve yaz

   Serial.print(\n);

   Serial.print(Y-düzlem: ”);

   Serial.print(analogRead(Y_pin));         // y değerini oku ve yaz

   Serial.print(\n\n);                                      // alt satıra geç ve bir satır boşluk ver

   delay(250);                                                    //1/4 saniye bekle            

}

Kod yazımından sonra test ettiğimizde Joysticki oynatınca bize seriport terminal ekranında okunan değerleri verecektir.  Bir önceki yazımda Servo motorlarına değinmiştik. Bu bağlantıların devamı olarak aşağıdaki bağlantıyı yapıp Programlamamıza bakalım. Servoları ayrı bir güç kaynağından beslememizin sebebi, daha önceki yazımda da belirttiğim gibi 2 servonun yük bindirildiği zaman çekeceği akım Arduino’nun besleyebileceği akımdan yüksek olabilir.

arduino-ve-joystick-ile-servo-motor-kontrolu-bolum-2-gorsel-003

Bu bağlantı yapıldıktan sonra aşağıdaki program ile test edelim.

#include <Servo.h>

 Servo servo1, servo2;       // servoyu kontrol için yeni bir servo objesi yarat

 const int X_pin  = 0; // analog pin 0 Rx e bağladık

 const int Y_pin = 1; // analog pin 1 Ry ye bağladık

 int poz1 = 0;                        // servo1 pozisyonunu kontrol için değişken deklarasyonu

 int poz2 =0;

 int x_deger = 0;                  // x ve y analog değerler 

 int y_deger = 0;

 void setup()

{

  servo1.attach(9);  // servo kontrol pimi arduinonun 9’uncu pimine bağlıyoruz

  servo2.attach(8); // 2.servo pimini de arduinonun 8’inci pimine bağlıyoruz  

}

void loop()

{

   x_deger = analogRead(X_pin); // analog değerler 0-1023 arası servoya yazılacak

   y_deger = analogRead(Y_pin); // değer 0-180 arası burada “map”komutunu kullanacağız

   poz1 = map(x_deger, 0, 1023, 0,180);

   poz2 = map(y_deger, 0,1023, 0,180);

   servo1.write(poz1);            // Servoya pimine bu pozisyonu yazıyoruz

   servo2.write(poz2);           // Servoya pimine bu pozisyonu yazıyoruz

    delay(50);                            // yine servonun bunu gerçekleştirmesi için zaman veriyoruz.

}

Map fonksiyonu 5 parametre alıyor ve bunlar negatif değerler de olabiliyor. Sentaksı şu şekilde

map(long map_edilecek_değer, long gelen_min, long gelen_max, long cikan_min, long cikan_max)

Hani yukarıda bahsetmiştik toleranslar vs. yine yukarıdaki test programı ile Joystick değerleri farklı olabilir örneğin bir joystickte aldığımız en düşük değer 95 en yüksek değer de 997 olabilir. Servo en düşük değer i 10, en yüksek değeri de 175 olabilir map fonksiyonuna bu değerler yazıldığında tam kontrol sağlanacaktır.

Map kullanılmadan örneğin poz1 için map satıraları nasıl yazılırdı hemen formülü verelim 🙂

poz1=((x_değer – giriş_min)*(cikis_max-cikis_min)/(giriş_max-giris_min))+cikis_min;

Buna göre poz1=((x_deger-0)*(180-0)/(1023-0))+0; gerçekten 0 alıyorsak ve sıfırları kaldırırsak

poz1 = (x_deger*180)/1023;

Son olarak, Joystick ile DC motor kontrolü de yapmak mümkün ancak bunun için PWM kontrollü H-Bridge motor sürücü kullanmak gerekir. H-bridge sürücünün avantajı, motoru hem ileri hem geri çevirebilmesi için gereklidir. Örnek olarak https://www.direnc.net/tb6612fng-dc-ve-step-motor-surucu-modulu adresindeki kart kullanılabilir. Bu konuyu başka bir yazımıza bırakalım.

Arduino, Joystick ve SG90 ürünlerini aşağıdaki linklerden temin edebilirsiniz:

Arduino Uno R3 SMD Model için buraya tıklayınız.

Arduino Uno R3 DIP Model için buraya tıklayınız.

SG90 9G Servo Motor için buraya tıklayınız.

Arduino XY 2 Eksenli Joystick için buraya tıklayınız.

 

Murat Tanatar

İlgili Makaleler

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

Başa dön tuşu