Robotik Kodlama

Robotik Kodlama
Ana Sayfa

İLGİNİZİ ÇEKEBİLECEK LİNKLER :

24 Nisan 2021 Cumartesi

2 Eksenli Joystick Nasıl Çalışır ve Arduino + İşleme

 

2 Eksenli Joystick Nasıl Çalışır ve Arduino + İşleme

Donanıma Genel Bakış

Bu, PS2 (PlayStation 2) denetleyicilerindeki 'analog' oyun çubuklarına çok benzeyen bir kumanda koludur. Bu, kendi kendine merkezlenen yaylı bir joysticktir, yani joystick'i bıraktığınızda kendisini ortalayacaktır. Aynı zamanda baş parmak hissi veren rahat bir fincan tipi düğme / başlık içerir.


Joystick'in amacı, hareketi 2 boyutlu (2 eksenli) bir Arduino ile iletmektir. Bu, iki bağımsız 10K potansiyometre (eksen başına bir) barındırarak elde edilir. Bu potansiyometreler, kontrol çubuğu biçiminde 2 Eksenli analog giriş sağlayan çift ayarlanabilir voltaj bölücüler olarak kullanılır.

Potansiyometreler, joystick'in yanlarındaki iki mavi kutudur. Her bir potansiyometrenin merkez şaftını izlerken kumanda kolunu hareket ettirirseniz, potansiyometrelerin her birinin yalnızca bir yönde hareket algıladığını görürsünüz. Aslında nasıl çalıştıklarını biraz sonra tartışacağız.


Bu kumanda kolu ayrıca, kapağı aşağı doğru bastırdığınızda etkinleşen bir anahtar içerir. Anahtar, kumanda çubuğunun arkasındaki küçük siyah kutudur. Başlığı aşağı bastırırsanız, anahtarın başını aşağı doğru iten bir kol görebilirsiniz. Kol, kumanda kolu hangi konumda olursa olsun çalışır.

PS2 2 eksenli başparmak kumanda kolu modülü nasıl çalışır?

Bir joystick'in temel fikri, ç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. Bu biraz zor olabilir, ancak iki potansiyometre ve bir Gimbal Mekanizmasından oluşan kumanda kolunun tasarımı sayesinde .

Gimbal Mekanizması

2 Eksenli Joystick Çalışan Gimbal Mekanizması










Kumanda kolunu döndürdüğünüzde, başparmak kolu iki dönebilir yarıklı şafta (Gimbal) oturan dar bir çubuğu hareket ettirir. Millerden 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 eğmek, Y ekseni milini bir yandan diğer yana döndürür. Soldan sağa eğildiğinde, X ekseni şaftını döndürür. Çubuğu çapraz olarak hareket ettirdiğinizde, her iki şaftı da döndürür.

Joystick Modülünde Çalışan Potansiyometre









Her bir kumanda kolu miline, çubuğun konumunu analog okumalar olarak yorumlayan bir potansiyometre bağlanır. Yarıklı millerin hareket ettirilmesi, potansiyometrenin kontak kolunu döndürür. Başka bir deyişle, çubuğu sonuna kadar iterseniz, potansiyometre temas kolunu rayın bir ucuna çevirir ve kendinize doğru geri çekerseniz, temas kolunu diğer yöne çevirir.

Joystick'ten analog değerleri okuma

Joystick'in 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 ile okunabilir.

Arduino kartının 10 bitlik ADC çözünürlüğü olduğundan, her analog kanaldaki (eksen) değerler 0 ila 1023 arasında değişebilir. Dolayısıyla, çubuk X ekseni üzerinde bir uçtan diğerine hareket ettirilirse, X değerleri değişecektir. 0'dan 1023'e kadar ve benzer bir şey Y ekseni boyunca hareket ettirildiğinde gerçekleşir. Joystick merkez konumunda 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ğini gösterir.



Bu başparmak kumanda kolunu kullanmak için, hangi yönün X ve hangi yönün Y olduğunu anlamak isteyeceksiniz. Ayrıca, X veya Y yönünde itildiği yönü de çözmeniz gerekecek.

Başparmak Joystick Modülü PinoutPinout PS2 Joystick Modülü

GND Arduino üzerindeki GND pinini bağladığımız Ground Pin'tir.

VCCmodül için güç sağlar. Arduino'nuzdan 5V çıkışa bağlayabilirsiniz.

VRx joystick'in yatay yönde (X koordinatı), yani joystick'in sola ve sağa ne kadar itildiğini gösterir.

VRy joystick'in dikey yönde (Y koordinatı), yani joystick'in ne kadar yukarı ve aşağı itildiğini gösterir.

SWbutonun çıktısıdır. Normalde açıktır, yani SW pininden gelen dijital okuma YÜKSEK olacaktır. Düğmeye basıldığında, GND'ye bağlanarak DÜŞÜK çıkış verir.



Kablolama - Başparmak Joystick Modülünü Arduino UNO'ya Bağlama

Artık modül hakkında her şeyi bildiğimize göre, onları kullanmaya başlama zamanı!

Bildiğimiz gibi joystick'in X ve Y koordinatlarını belirlemek için her iki analog çıkışı da joystick'ten Arduino'daki analog pinlere bağlamamız gerekiyor. Arduino kartımız için, VRx'i Arduino'nun analog pin A0'a ve VRy'yi Arduino'nun analog pin A1'e bağlarız.

Joystick düğmesine basılıp basılmadığını okumak için, joystick'in SW pinini Arduino'nun dijital pin D8'ine bağlarız.Bunun dışında, joystick'in sadece güce ihtiyacı var. VCC pini Arduino'nun 5V terminaline ve GND pini Arduino'nun GND terminaline bağlanır.PS2 2 eksenli Joystick Modülü ile Arduino Kablolama Fritzing Bağlantıları
Arduino UNO ile PS2 2 eksenli Joystick Modülü Kablolama

Bu kadar. Artık Joystick manipülasyon becerilerinizi göstermeye hazırsınız.

Arduino Kodu

Program çok basit. Ölçümü iki analog girişten ve bir dijital girişten okuyacağız. Ardından sonucu seri monitörde göstereceğ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, aşağıdaki çıktıyı seri monitörde görmelisiniz.

PS2 Joystick Modülü Seri pencerede Arduino Sketch Çıkışı
Seri Monitör Üzerindeki Kumanda Kolu Modülü Çıkışı
Kod Açıklaması :

Çizim, Joystick modülünün Arduino üzerindeki bağlantılarını başlatarak başlar. SW pini Arduino Pin # 8'e bağlıyken VRx ve VRy pinleri Analog pin # 0 ve # 1'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

In setup()fonksiyonu: Biz girdi olarak GB pimini başlatmak ve YÜKSEK saklayın. Bunun nedeni, SW pimi YÜKSEK olduğu sürece düğmeye basılmadığını biliyoruz. Ayrıca seri iletişimi de başlatıyoruz.

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

In loop()fonksiyonu: Biz sadece kullanılarak GB pin değerini okumak digitalRead()fonksiyonu, VRX & VRY kullanarak pimi analogRead()seri monitörde ve ekranı.

  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 Projesi

IDE İşlemede Joystick Hareketlerini Canlandırma

İşleme IDE'de animasyonları kontrol etmek için basit bir 2 Eksenli Joystick modülünün nasıl kullanılabileceğini göstermek için hızlı bir Arduino projesi oluşturalım. Öncelikle Arduino'muzu x ekseni, y ekseni ve düğme durumu değerlerini seri port üzerinde yayınlayacak şekilde programlayacağız. IDE İşleminde seri porttan gelen bu değerleri alacağız. Bu değerler daha sonra oyun çubuğu konumunu canlandırmak için kullanılabilir. Harika! Sağ?

Çıktı böyle görünüyor.

Arduino Projesi - IDE'yi Önceden Hazırlarken Animasyon Joystick'i
Precessing IDE'de joystick hareket animasyonu
Elbette bu proje karakterleri canlandırmak, gözetleme projeleri yapmak veya insansız araçları kontrol etmek için genişletilebilir.

Arduino Kodu

Başlangıç ​​olarak, Arduino'muzu seri port üzerinde x ekseni, y ekseni ve düğme durumu değerlerini kullanacak şekilde programlamamız gerekir. Program, seri monitörde yazdırdığımız değerler virgülle ayrılmış olması dışında yukarıdakiyle tamamen aynıdır Neden virgülle ayrılmış? Çünkü bu, bir uygulamadan diğerine veri aktarımı için popüler bir formattır. IDE işlenirken, gelen değerleri 'virgül' karakterine bölebilir ve verilerimizi geri alabiliriz.

Aşağıdaki çizimi 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);	
}

Kodu

Program Arduino'ya yüklendikten sonra, İşleme IDE'de Joystick konumunu canlandırmaya başlayabiliriz. Arduino'nuzu takılı tutun ve İşleme 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 arıza yapalım. Öncelikle seri porttan gelen değerleri okumak için seri kütüphaneyi içe aktarmamız gerekiyor.

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

Daha sonra, x ekseni, y ekseni ve düğme durumu değerlerini tutan 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. Daha sonra, parametreyi geçerek kullanılabilir bir seri port açıyoruz Serial.list()[0]Bu sizin için işe yaramazsa, Arduino'nun bağlı olduğu bağlantı noktasına değiştirin. Değerlerimizi pencerede animasyonla birlikte göstermek için bir yazı tipi oluşturmamız gerekiyor.

  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 ö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 çizeriz.

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ğerlerini yazdırıyoruz.

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

Yeni serialEvent(Serial myPort)satır karakteri görünene kadar diziyi seri bağlantı noktasında 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 Oyun Çubukları ile ilgili sorun

Analog joystick sistemiyle ilgili birkaç küçük ama önemli sorun var.

  • Her şeyden önce, sistem gerçek bir analogdan dijitale dönüştürücüye sahip olmadığından, kaba analogdan dijitale dönüştürme süreci çok doğru değildir. Bu, joystick'in hassasiyetini bir şekilde tehlikeye atar.
  • İkincisi, mikro denetleyici, çubuğun konumunu belirlemek için joystick sistemini düzenli olarak "sorgulamak" için çok fazla işlem gücü ayırmalıdır. Bu, diğer işlemlerden çok fazla güç alır.

ANA SAYFAYA DÖN

Bahadır ÖZGEN
Electronic Robotic Coding Research and Development 1975 - ∞
Learn Forever
If you want, let's learn together...
https://roboticcode2020.blogspot.com/
bahadirozgen1975@gmail.com
facebook    robotic.code
instagram    @roboticcode


Sayfalarımı ziyaret ettiğiniz için teşekkür ederim.Bu sitede mevcut olan içerikler kendi oluşturduğum projeler yazı,resim ve videolardan oluşmaktadır.İçerik oluşturmak çok uzun sürdüğü için bazı projelerde yurtdışı kaynaklardan faydalandım.Buradaki amacım ticari değildir.Kaynağı belli olan ve bizim kaynağına ulaşabildiğimiz materyal (yazı, fotoğraf, resim, video v.b.) için ilgili konularda fotoğraflarda logo varsa v.b. not olarak gösterilecektir.Sitemizde yayınlanan tüm içerik, bizim tarafımızdan ve internet üzerinden youtube, facebook ve blog gibi paylaşıma sunulmuş kaynak sitelerden alındığı için, sitemiz yasal yükümlülüğe tabi tutulamaz. Sitemizde telif haklarının size ait olduğu bir içerik varsa ve bunu kaldırmamızı isterseniz, iletişim sayfamızdan bizimle iletişime geçtiğiniz takdirde içerik yayından kaldırılacaktır.Bu konu ve modüller ile uğraşarak, ileride çok güzel makine ve elektronik aletler yapabilirsiniz.

Hiç yorum yok:

Yorum Gönder

Yorum yazdığınız ve üye olduğunuz için Size teşekkür ederim.Burada olduğunuza göre hepimizin ilgi alanı Elektronik ve Programlama sonsuz bir dünyadayız.Hepimize Başarılar...

Not: Yalnızca bu blogun üyesi yorum gönderebilir.