Başa dön

Arduino ile 2 Eksenli XY Joystick Kullanımı (PS2 Joystick)

Merhaba arkadaşlar, bu yazımızda sizlerle birlikte ps2 olarak bilinen 2 eksenli (2 axis) xy joystick yani ps2 joystick kullanımı arduino ile nasıl yapılır birlikte öğreneceğiz.

Joystick  kelimesini duyduğunuzda, akla ilk gelen oyun denetleyicileri. DIY Electronics’te, oyun oynamak için kullanılır, ancak onunla yapabileceğiniz çok eğlenceli şeyler vardır. Bir robotu / gezgini kontrol etmek, kameranın hareketini kontrol etmek gibi; bunlar buzdağının sadece görünen kısmı.

Joystick Çeşitleri için bağlantıya tıklayarak satın alabilirsiniz.

 

PS2 Joystick Kullanımı – Genel Bilgi

PS2 (PlayStation 2) denetleyicilerindeki ‘analog’ oyun çubuklarına çok benzer bir joystick modülüdür. Kendiliğinden merkezlenen yay destekli bir joystick, (yani joystick’i serbest bıraktığınızda kendini ortalar) ve başparmak çubuğu hissi veren rahat bir düğme / kapak içerir.

Xy joystick modülünün amacı, 2D (2 eksenli)hareketi Arduino’ya iletmektir. Bu, iki bağımsız 10K potansiyometre (her eksende bir tane) barındırarak elde edilir. Bu potansiyometreler, kontrol çubuğu formunda 2 Eksenli analog giriş sağlayan çift ayarlanabilir voltaj bölücüler olarak kullanılır.

Potansiyometreler, joystick’in yan tarafındaki iki mavi kutudur. Her bir potansiyometrenin merkez şaftını izlerken joystick’i hareket ettirirseniz, potansiyometrelerin her birinin sadece bir yönde hareket aldığını göreceksiniz. Biraz sonra nasıl çalıştıklarına bakacağız.

2 eksenli joystick ayrıca kapağı aşağı doğru bastırdığınızda etkinleşen bir anahtar içerir. Anahtar, joystick’in arkasındaki küçük siyah kutudur. Kapağı aşağı doğru iterseniz, anahtarın kafasını aşağı doğru iten bir kol görebilirsiniz. Kumanda kolu hangi konumda olursa olsun kol çalışır.

PS2 XY Joystick Modülü Nasıl Çalışır?

Bir joystick’in temel çalışma prensibi, çubuğun konumunu iki eksende – X ekseni (soldan sağa) ve Y ekseni (yukarı ve aşağı) bir Arduino’nun işleyebileceği elektronik bilgilere çevirmektir. Yapım şekli fikir olarak biraz zor olabilir, ancak iki potansiyometre ve bir Gimbal Mekanizmasından oluşan joystick tasarımı sayesinde çok kolay bir şekilde halledilmektedir.

Gimbal Mekanizması

Kumanda kolunu döndürdüğünüzde, başparmak tutamağı iki dönebilen yarıklı şaft (Gimbal) içine oturan dar bir çubuğu hareket ettirir. Şaftlardan biri X ekseninde (sol ve sağ) harekete izin verirken diğeri Y ekseninde (yukarı ve aşağı) harekete izin verir. Çubuğu ileri ve geri yatırmak Y ekseni milini bir yandan diğer yana döndürür. Soldan sağa doğru eğmek X ekseni milini döndürür. Çubuğu çapraz olarak hareket ettirdiğinizde, her iki mili de döndürür.

Çubuğun konumunu analog okumalar olarak yorumlayan her bir kumanda kolu şaftına bir potansiyometre bağlanır. Oluklu milleri hareket ettirmek, potansiyometrenin temas kolunu döndürür. Başka bir deyişle, çubuğu sonuna kadar iterseniz, potansiyometre temas kolunu parçanın bir ucuna çevirir ve kendinize doğru geri çekerseniz, temas kolunu diğer yöne çevirir.

Joystick’ten Analog Değerleri Okuma

Kumanda kolunun fiziksel konumunu okumak için, bir potansiyometrenin direncindeki değişikliği ölçmemiz gerekir. Bu değişiklik ADC kullanılarak bir Arduino analog pini tarafından okunabilir.

Arduino kartı 10 bitlik bir ADC çözünürlüğüne sahip olduğundan, her analog kanaldaki (eksen) değerler 0 ile 1023 arasında değişebilir. Bu nedenle, çubuk X ekseninde bir uçtan diğer uca hareket ettirilirse, X değerleri değişecektir. 0 ile 1023 arasında benzer bir değer hareketi de Y ekseni boyunca hareket ettirildiğinde gerçekleşir. Kumanda kolu orta konumda kaldığında değer 512 civarındadır.

Aşağıdaki grafik X ve Y yönlerini gösterir ve ayrıca joystick çeşitli yönlere itildiğinde çıkışların nasıl tepki vereceğine dair bilgi edinmenizi sağlar.

 

XY Joystick Modülü Pinout

PS2 2 eksenli Joystick modülünün pin çıkışına bakalım.

GND ; Arduino’ya GND pinini bağladığımız Toprak Pinidir.

VCC ; Modüle güç sağlar. Arduino’nuzdaki 5V çıkışa bağlayabilirsiniz.

VRx ; Kumanda kolunun yatay yönde (X koordinatı) okunmasını sağlar; yani kumanda kolunun ne kadar sola ve sağa itildiğini ölçer.

VRy ; Joystick’in dikey yönde okunmasını sağlar (Y koordinatı), yani joystick’in ne kadar yukarı ve aşağı itildiğini gösterir.

SW ; Basmalı düğmeden gelen çıktıdır. Normalde açıktır, yani SW pininden dijital okuma HIGH olacaktır. Düğmeye basıldığında GND‘ye bağlanarak LOW çıktı verir.

Kablolama – XY Joystick Modülünü Arduino UNO’ya Bağlama

Artık modül hakkındaki her şeyi bildiğimize göre kullanmanın zamanı geldi!

Bildiğimiz gibi, joystick’in X ve Y koordinatlarını belirlemek için, joystick’in her iki analog çıkışlarını Arduino’daki analog pinlere bağlamamız gerekir. Arduino kartımız için VRx‘i Arduino’nun A0 analog pinine ve VRy‘yi Arduino’nun A1 analog pinine bağlarız.

Joystick üzerindeki orta düğmenin basılı olup olmadığını okumak için kumanda kolunun SW pinini Arduino’nun dijital pin D8‘ine bağlarız.

Bunun dışında, joystick sadece güce ihtiyaç duyar. VCC pini Arduino’nun 5V terminaline ve GND pini Arduino’nun GND terminaline bağlanır.

Arduino UNO ile PS2 2 eksenli Joystick Modülü Kablolama işlemi bu kadar. Artık Joystick kullanımı becerilerinizi göstermeye hazırsınız.

Arduino Kodu

Program kullanımı çok basittir. Ölçümü iki analog giriş ve bir dijital girişten okuyacağız. Sonra sonucu ekran üzerinde göreceğiz.

// Arduino pin numbers
const int SW_pin = 8; // digital pin connected to switch output
const int X_pin = 0; // analog pin connected to X output
const int Y_pin = 1; // analog pin connected to Y output

void setup() {
  pinMode(SW_pin, INPUT);
  digitalWrite(SW_pin, HIGH);
  Serial.begin(9600);
}

void loop() {
  Serial.print("Switch:  ");
  Serial.print(digitalRead(SW_pin));
  Serial.print(" | ");
  Serial.print("X-axis: ");
  Serial.print(analogRead(X_pin));
  Serial.print(" | ");
  Serial.print("Y-axis: ");
  Serial.print(analogRead(Y_pin));
  Serial.println(" | ");
  delay(200);
}

Her şey yolundaysa, ekran üzerinde aşağıdaki görseli görmelisiniz.

Kod Açıklaması:

Kod, Arduino’daki Joystick modülünün bağlantılarını çalıştırarak başlar. VRx ve VRy pinleri Analog pin # 0 ve # 1‘e bağlıyken SW pin Arduino Pin # 8’e bağlanır.

// Arduino pin numbers
const int SW_pin = 8; // digital pin connected to switch output
const int X_pin = 0; // analog pin connected to X output
const int Y_pin = 1; // analog pin connected to Y output

<a class="fasc-button fasc-size-medium fasc-type-flat" style="background-color: #f2f2f2; color: #ff0000;">setup()</a> işlevinde: SW pinini giriş olarak başlatır ve HIGH tutarız. Bunun nedeni, SW pini HIGH olduğu sürece, düğmeye basılmadığını biliyoruz. Seri iletişimi de başlatıyoruz.

  pinMode(SW_pin, INPUT);
  digitalWrite(SW_pin, HIGH);
  Serial.begin(9600);

loop ()fonksiyonunda, sadece digitalRead () fonksiyonunu kullanarak SW  pininin değerini, analogRead () kullanarak VRx ve VRy pinini ve seri monitördeki görüntüyü okuruz.

  Serial.print("Switch:  ");
  Serial.print(digitalRead(SW_pin));
  Serial.print(" | ");
  Serial.print("X-axis: ");
  Serial.print(analogRead(X_pin));
  Serial.print(" | ");
  Serial.print("Y-axis: ");
  Serial.print(analogRead(Y_pin));
  Serial.println(" | ");
  delay(200);

Arduino Joystick Projesi

IDE İşlemede Joystick Hareketlerini Canlandırma

Basit bir 2 Eksenli Joystick Modülü‘nün arduino yazılımındaki animasyonları kontrol etmek için nasıl kullanılabileceğini göstermek için hızlı bir Arduino projesi oluşturalım. İlk önce Arduino’yu seri bağlantı noktasında X ekseni, Y ekseni ve düğme durumu değerlerini bölmek için programlayacağız. Seri monitörde yazdırdığımız değerlerin virgülle ayrılması dışında program aynıdır. Neden virgülle ayrılmış? Çünkü bu, bir uygulamadan diğerine veri aktarmak için ideal bir işarettir. IDE işlenirken gelen değerleri ‘virgül’ karakteriyle bölebilir ve verilerimizi geri alabiliriz.

Elbette bu proje, gözetim projelerini veya insansız araçları kontrol etmek için genişletilebilir.

 

Joystick Kullanımı – Arduino Kodu

Aşağıdaki kodu Arduino’nuza yükleyin.

int xValue = 0 ; // read value of the X axis  
int yValue = 0 ; // read value of the Y axis  
int bValue = 0 ; // value of the button reading 

void setup()  
{ 
  Serial.begin(9600) ; // Open the serial port
  pinMode(8,INPUT) ; // Configure Pin 2 as input
  digitalWrite(8,HIGH); 
} 

void loop() 
{ 
  // Read analog port values A0 and A1  
  xValue = analogRead(A0);  
  yValue = analogRead(A1);  

  // Read the logic value on pin 2  
  bValue = digitalRead(8);  

  // We display our data separated by a comma 
  Serial.print(xValue,DEC);
  Serial.print(",");
  Serial.print(yValue,DEC);
  Serial.print(",");
  Serial.print(!bValue);

  // We end with a newline character to facilitate subsequent analysis  
  Serial.print("\n");

  // Small delay before the next measurement  
  delay(10);  
}

İşleme Kodu

Program Arduino’ya yüklendikten sonra, Joystick konumunu canlandırmaya başlayabiliriz. Arduino’nuzu takılı tutun ve İşlem kodunu takip ederek çalıştırın.

import processing.serial.*; //import the Serial library
Serial myPort;

int x; // variable holding the value from A0
int y; // variable holding the value from A1
int b; // variable holding the value from digital pin 2
PFont f; // define the font variable
String portName;
String val;

void setup()
{
  size ( 512 , 512 ) ; // window size
  
  // we are opening the port
   myPort = new Serial(this, Serial.list()[0], 9600);
  myPort.bufferUntil('\n'); 
  
  // choose the font and size
  f = createFont("Arial", 16, true); // Arial, 16px, anti-aliasing
  textFont ( f, 16 ) ; // size 16px
}

// drawing loop
void draw()
{
  fill(0) ; // set the fill color to black
  clear() ; // clean the screen
  
  fill(255) ; // set the fill color to white
  
  if (b == 1) // check if the button is pressed
  {
    // draw a larger circle with specified coordinates
    ellipse(x/2,y/2, 50, 50);
  } 
  else
  {
    // we draw a circle with a certain coordinates
    ellipse(x/2,y/2, 25, 25);
  }
  
  // we display data
  text("AnalogX="+(1023-x)+" AnalogY="+(1023-y),10,20);
}


// data support from the serial port
void serialEvent( Serial myPort) 
{
  // read the data until the newline n appears
  val = myPort.readStringUntil('\n');
  
  if (val != null)
  {
        val = trim(val);
        
    // break up the decimal and new line reading
    int[] vals = int(splitTokens(val, ","));
    
    // we assign to variables
    x = vals[0];
    y = vals[1] ;
    b = vals[2];

  }
}

Kod Açıklaması:

Hızlı bir analiz yapalım. Öncelikle seri bağlantı noktasına gelen değerleri okumak için kitaplığı içe aktarmamız gerekir.

import processing.serial.*; //import the Serial library
Serial myPort;

Ardından, x ekseni, y ekseni ve düğme durumu değerlerini tutacak değişkenler bildirilir.

int x; // variable holding the value from A0
int y; // variable holding the value from A1
int b; // variable holding the value from digital pin 2
PFont f; // define the font variable
String portName;
String val;

Kurulum işlevinde, animasyonumuzu göstermek için 512 × 512 boyutunda bir pencere oluşturmamız gerekir. Ardından, Serial.list()[0] parametresini ileterek kullanılabilir bir seri bağlantı noktası açıyoruz. Bu sizin için işe yaramazsa, Arduino’nun bağlı olduğu bağlantı noktasını değiştirin. Animasyonla birlikte değerlerimizi pencerede göstermek için bir yazı tipi de oluşturmalıyız.

  size ( 512 , 512 ) ; // window size
  
  // we are opening the port
   myPort = new Serial(this, Serial.list()[0], 9600);
  myPort.bufferUntil('\n'); 
  
  // choose the font and size
  f = createFont("Arial", 16, true); // Arial, 16px, anti-aliasing
  textFont ( f, 16 ) ; // size 16px

Çizim fonksiyonunda, ilk önce pencerenin arka planı siyah renkle doldurulur. Ardından joystick’in konumunu temsil eden küçük bir daire çizmek için beyaz bir renk seçiyoruz. Şimdi, düğme durumuna bağlı olarak if ifadesini kullanarak küçük veya büyük bir daire çiziyoruz.

fill(0) ; // set the fill color to black
  clear() ; // clean the screen
  
  fill(255) ; // set the fill color to white
  
  if (b == 1) // check if the button is pressed
  {
    // draw a larger circle with specified coordinates
    ellipse(x/2,y/2, 50, 50);
  } 
  else
  {
    // we draw a circle with a certain coordinates
    ellipse(x/2,y/2, 25, 25);
  }


Ardından, pencerenin sol üst köşesine x ekseni ve y ekseni değerleri yazdırıyoruz.

  // we display data
  text("AnalogX="+(1023-x)+" AnalogY="+(1023-y),10,20);

 serialEvent(Serial myPort), yeni satır karakteri görünene kadar seri bağlantı noktasındaki dizeyi okuyan özel bir işlevdir. Dize daha sonra ‘virgül’ karakteriyle bölünür ve ilgili değişkenlere atanır.

void serialEvent( Serial myPort) 
{
  // read the data until the newline n appears
  val = myPort.readStringUntil('\n');
  
  if (val != null)
  {
        val = trim(val);
        
    // break up the decimal and new line reading
    int[] vals = int(splitTokens(val, ","));
    
    // we assign to variables
    x = vals[0];
    y = vals[1] ;
    b = vals[2];

  }
}

Analog Kumanda Kollarıyla İlgili Sorun

Analog joystick sistemiyle ilgili dijitale geçişte birkaç küçük ama önemli sorun çıkabilmektedir;

  • Her şeyden önce, sistemin gerçek bir analogdan dijitale dönüştürücüsü olmadığından ham analogdan dijitale dönüştürme işlemi çok doğru değildir. Bu, joystick’in hassasiyetini biraz etkileyebilir.
  • İkincisi, mikrodenetleyici, çubuğun konumunu belirlemek için joystick sistemini düzenli olarak denetler ve bu da çok fazla işlem gücü ayırmak, diğer işlemlerden çok fazla güç harcaması anlamına gelir.

 

Hepsi bu kadar. Umarım Arduino ile Joystick Kullanımı makalemizi beğenmiş ve yeni bir şeyler öğrenmişsinizdir.

Memnun kaldıysanız aşağıda bulunan “yukarı ok“a tıklayarak +1 puan verebilirsiniz.

Diğer Güncel Arduino Projeleri için BURAYA TIKLAYABİLİRSİNİZ.

Sizde Robotlara ve Maker’lığa Meraklıysanız Robotik Marketimiz ROBOCOMBO‘yu Ziyaret Edebilirsiniz.

 

Robot El Yapımı – İlginç Arduino Projeleri

Okuduğunuz İçin Teşekkürler.

Kaynak: lastminuteengineers.com/joystick-interfacing-arduino-processing/