Arduino ve Joystick ile Servo Motor Kontrolü – 2

Servo Motor ve Joystick – Bölüm 2

Daha önceki yazım da servo motor için çalışma prensibini anlatmıştım. Bu yazımda Joystick – Servo motor ve Arduino kullanımı ile devam edeceğim.

Joystick – “eğlence çubuğu” –“yönetme kolu” yıllar önce ev tipi bilgisayarlar türemeye başladığında “mouse”’lardan bile önce ortaya çıktı. Eskiler hatırlar Commodore64 veya VIC20 alındığında yanında da bir joystick alınırdı. Bunların tarihi endüstriyel olarak daha eskilere dayanır.  Joystick denince iki tip akla gelir. Birinci tipi, 4 yöne ve birde “ateşleme” olarak 5 butonu olan tiplerdi. Daha sonra PC’ler yaygınlaşmaya ve oyunlarda daha hassas kontol istenmeye başlanması ile birlikte “multifonksiyon” kartlarına ikinci tip olan analog joystick fonksiyonları eklendi. Bu ikinci tip joystickler endüstriyel olarak biliniyordu ve vinçlerde kullanılıyordu. Hatta büyük feribotlarda bile dümen yerine joystick kullanıldığına şahit oldum.

Şimdi burada bizim ilgileneceğimiz bu ikinci tip analog joystick. Joystick basitçe mekanik bir düzlemsel hareketi  elektriksel bir değere dönüştürülmesi için kullanılır. Bunun için de 2 adet “ayarlı direnç” – potansiyometre  kullanılır. Birisi mekanik olarak “x” diğeri de “y” yönünde hareketi algılar. Bunlar mekanik olarak birbirine bağlı olduğu için x ve y yönünde hareket ettirildiğinde hareket ettirilen mesafeye orantılı olarak direnç değeri değişir.

Şimdi aşağıdaki şekilde görüldüğü gibi bu dirençlerin bir ucunu +5V diğer ucunu da 0V (GND) ye bağlarsak dirençlerin orta bacakları bize pozisyonla orantılı olarak bir voltaj değeri verecektir. Örneğin her iki direnç te orta pozisyonda ise dirençlerin orta bacaklarından yaklaşık 2,5V alacağız. Jostick’i bir yöne doğru itince yönüne bağlı olarak ya 5 volta doğru yükselecek ya da 0 Volta doğru gidecek.

Biz de bunu Arduinonun AD çeviricisine bağlarsak buradan bir dijital pozisyon verisi elde edebiliriz.

Tabii burada Joystick’in mekanik yapısına bağlı olarak sıradan bir potansiyometre  ile yapılmış ise +5Volt ve 0 volt skalasında kullanılmasına aşağıda soldaki şekilde görüldüğü gibi imkân yoktur.

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/tb6612-dual-motor-surucu-karti 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.