
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.

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.

Ş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.

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



