Cara Kerja 2-Axis Joystick & Antarmuka dengan Arduino + Processing #12

Cara Kerja 2-Axis Joystick & Antarmuka dengan Arduino + Processing #12

Cara Kerja 2-Axis Joystick & Antarmuka dengan Arduino + Processing


Saat mendengar kata Thumb Joystick, hal pertama yang terlintas dalam pikiran adalah konsol game. Mereka terutama digunakan untuk bermain game, meskipun di DIY Electronics, ada banyak hal menyenangkan yang dapat Anda lakukan dengannya. Seperti mengendalikan robot / penjelajah, mengendalikan pergerakan kamera.

Joystick ini sangat mirip dengan joystick 'analog' pada pengontrol PS2 (PlayStation 2). Ini adalah joystick pegas yang memusatkan diri sendiri, artinya saat Anda melepaskan joystick, ia akan berada di tengah. Ini juga berisi kenop / tutup tipe cangkir yang nyaman yang memberi kesan jempol.


Tujuan dari joystick adalah untuk mengkomunikasikan gerakan dalam 2D ​​(2-sumbu) ke Arduino. Ini dicapai dengan menampung dua potensiometer 10K independen (satu per sumbu). Potensiometer ini digunakan sebagai pembagi tegangan ganda yang dapat disesuaikan, menyediakan input analog 2-Axis dalam bentuk tongkat kontrol.

Potensiometer adalah dua kotak biru di sisi joystick. Jika Anda menggerakkan joystick sambil mengamati poros tengah dari setiap potensiometer, Anda akan melihat bahwa setiap potensiometer mengambil gerakan hanya dalam satu arah. Kami akan membahas cara kerjanya, nanti.


Joystick ini juga berisi sakelar yang aktif saat Anda menekan tutupnya. Saklar adalah kotak hitam kecil di bagian belakang joystick. Jika Anda menekan tutupnya, Anda dapat melihat tuas menekan kepala sakelar. Tuas bekerja tidak peduli posisi joystick.

Bagaimana modul joystick ibu jari 2 sumbu PS2 bekerja?

Ide dasar dari sebuah joystick adalah untuk menerjemahkan posisi tongkat pada dua sumbu - sumbu X (kiri ke kanan) dan sumbu Y (atas dan bawah) menjadi informasi elektronik yang dapat diproses oleh Arduino. Ini bisa sedikit rumit, tetapi berkat desain joystick yang terdiri dari dua potensiometer dan Mekanisme Gimbal.

Mekanisme Gimbal


Saat Anda memutar joystick, pegangan ibu jari menggerakkan batang sempit yang berada di dua poros berlubang yang dapat diputar (Gimbal). Salah satu poros memungkinkan gerakan pada sumbu X (kiri dan kanan) sedangkan poros lainnya memungkinkan gerakan pada sumbu Y (atas dan bawah). Memiringkan tongkat ke depan dan ke belakang akan memutar poros sumbu Y dari sisi ke sisi. Memiringkannya dari kiri ke kanan akan memutar poros sumbu X. Saat Anda menggerakkan tongkat secara diagonal, ini akan memutar kedua poros.


Potensiometer dihubungkan ke setiap poros joystick yang mengartikan posisi batang sebagai pembacaan analog. Memindahkan poros berlubang memutar lengan kontak potensiometer. Dengan kata lain, jika Anda mendorong tongkat sepenuhnya ke depan, itu akan memutar lengan kontak potensiometer ke salah satu ujung trek, dan jika Anda menariknya kembali ke arah Anda, itu akan memutar lengan kontak ke arah lain.

Membaca nilai analog dari Joystick

Untuk membaca posisi fisik joystick, kita perlu mengukur perubahan resistansi potensiometer. Perubahan ini dapat dibaca oleh pin analog Arduino menggunakan ADC.

Karena board Arduino memiliki resolusi ADC 10 bit, nilai pada setiap saluran analog (sumbu) dapat bervariasi dari 0 hingga 1023. Jadi, jika tongkat digerakkan pada sumbu X dari satu ujung ke ujung lainnya, nilai X akan berubah dari 0 hingga 1023 dan hal serupa terjadi jika digerakkan sepanjang sumbu Y. Ketika joystick tetap di posisi tengah nilainya sekitar 512.

Grafik di bawah ini menunjukkan arah X dan Y dan juga memberikan indikasi bagaimana output akan merespons saat joystick didorong ke berbagai arah.


Untuk menggunakan joystick ibu jari ini, Anda perlu memahami arah mana yang X dan arah mana Y. Anda juga perlu menguraikan arah yang mendorongnya baik ke arah X atau Y.

Pinout Modul Joystick Jempol

Mari kita lihat pinout modul PS2 2-axis Thumb Joystick.


GND adalah Pin Ground yang kita hubungkan pin GND pada Arduino.

VCC memasok daya untuk modul tersebut. Anda dapat menghubungkannya ke output 5V dari Arduino Anda.

VRx memberikan pembacaan joystick dalam arah horizontal (koordinat X) yaitu seberapa jauh joystick didorong ke kiri dan ke kanan.

VRy memberikan pembacaan joystick dalam arah vertikal (koordinat Y) yaitu seberapa jauh joystick didorong ke atas dan ke bawah.

SW adalah keluaran dari tombol tekan. Biasanya terbuka, artinya pembacaan digital dari pin SW akan TINGGI. Ketika tombol ditekan, itu akan terhubung ke GND, memberikan output LOW.

Pengkabelan - Menghubungkan Modul Joystick Thumb ke Arduino UNO

Sekarang kita tahu segalanya tentang modul, sekarang saatnya menggunakannya!

Seperti yang kita ketahui, untuk menentukan koordinat X dan Y dari joystick, kita perlu menghubungkan kedua keluaran analog dari joystick ke pin analog pada Arduino. Untuk papan Arduino kami, kami menghubungkan VRx ke pin analog A0 dari Arduino dan VRy ke pin analog A1 dari Arduino.

Untuk membaca apakah kenop joystick telah ditekan, kami menghubungkan pin SW joystick ke pin digital D8 Arduino.

Selain itu, joystick hanya membutuhkan tenaga. Pin VCC-nya

Untuk membaca apakah kenop joystick telah ditekan, kami menghubungkan pin SW joystick ke pin digital D8 Arduino.

Selain itu, joystick hanya membutuhkan power. Pin VCC-nya terhubung ke terminal 5V Arduino dan pin GND-nya terhubung ke terminal GND Arduino.


Itu dia. Sekarang Anda siap untuk menunjukkan keahlian manipulasi Joystick Anda.

Kode Arduino

Programnya sangat sederhana. Kami akan membaca pengukuran dari dua input analog dan satu input digital. Kemudian kita akan menampilkan hasilnya di monitor serial.

// 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);
}

Jika semuanya baik-baik saja, Anda akan melihat output di bawah ini pada monitor serial.


Penjelasan Kode:

Sketsa dimulai dengan menginisialisasi koneksi modul Joystick di Arduino. Pin SW dihubungkan ke Arduino Pin # 8 sedangkan pin VRx dan VRy dihubungkan ke pin Analog # 0 dan # 1.

// 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

Dalam fungsi setup(): Kami menginisialisasi pin SW sebagai input dan menjaganya tetap HIGH. Ini karena selama pin SW HIGH, kita tahu bahwa tombol tidak ditekan. Kami juga memulai komunikasi serial.

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

Fungsi In loop(): Kita hanya membaca nilai pin SW menggunakan fungsi digitalRead(), pin VRx & VRy menggunakan analogRead()dan ditampilkan pada monitor serial.

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);

Animasi Gerakan Joystick Dalam Memproses IDE

Mari buat proyek Arduino singkat untuk mendemonstrasikan bagaimana modul Joystick 2-Sumbu sederhana dapat digunakan untuk mengontrol animasi dalam Processing IDE. Pertama kita akan memprogram Arduino kita untuk mengeluarkan nilai sumbu x, sumbu y dan status tombol pada port serial. Kami akan menerima nilai-nilai ini yang berasal dari port serial di Processing IDE. Nilai-nilai ini kemudian dapat digunakan untuk menganimasikan posisi joystick. Bagus! Baik?


Seperti inilah tampilan keluarannya.

Tentu saja proyek ini dapat diperluas ke karakter animasi, proyek pengawasan atau pengendalian kendaraan tak berawak.

Kode Arduino

Untuk memulainya, kita perlu memprogram Arduino untuk mengeluarkan nilai sumbu x, sumbu y, dan status tombol pada port serial. Programnya hampir sama seperti di atas kecuali nilai yang kami cetak pada monitor serial dipisahkan dengan koma. Mengapa dipisahkan dengan koma? Karena ini adalah format populer untuk mentransfer data dari satu aplikasi ke aplikasi lainnya. Dalam Processing IDE kita dapat membagi nilai yang masuk dengan karakter 'koma' dan mendapatkan kembali data kita.

Unggah sketsa berikut ke Arduino Anda.

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);	
}

Kode Pengolahan

Setelah program diunggah ke Arduino, kita dapat mulai menganimasikan posisi Joystick di Processing IDE. Jaga agar Arduino Anda tetap terhubung dan Jalankan kode Pemrosesan berikut.

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];

  }
}

Penjelasan Kode:

Mari kita lakukan perincian singkat. Pertama kita perlu mengimpor perpustakaan serial untuk membaca nilai yang masuk pada port serial.

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

Selanjutnya, variabel yang menahan nilai status sumbu x, sumbu y & tombol dideklarasikan.

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;

Dalam fungsi Setup, kita perlu membuat jendela dengan ukuran 512 × 512 untuk menampilkan animasi kita. Selanjutnya, kami membuka port serial yang tersedia dengan melewatkan parameter Serial.list()[0]. Jika ini tidak berhasil untuk Anda, ubah ke port yang terhubung dengan Arduino. Kita juga perlu membuat font untuk menunjukkan nilai kita di jendela bersama dengan animasinya.

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

Pada fungsi draw, pada awalnya background jendela diisi dengan warna hitam. Kemudian kami memilih warna putih untuk menggambar lingkaran kecil yang mewakili posisi joystick. Sekarang, tergantung pada status tombol kita menggambar lingkaran kecil atau besar menggunakan pernyataan if.

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);
  }

Selanjutnya, kami mencetak nilai sumbu x dan sumbu y di sudut kiri atas jendela.

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

serialEvent(Serial myPort) adalah fungsi kustom yang membaca string pada port serial hingga karakter baris baru muncul. String tersebut kemudian dipisahkan dengan karakter 'koma' dan ditetapkan ke variabel masing-masing.

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];

  }
}

Masalah dengan Analog Joystick

Ada beberapa masalah kecil tapi penting dengan sistem joystick analog.

  • Pertama-tama, proses konversi analog-ke-digital yang kasar tidak terlalu akurat, karena sistem tidak memiliki pengonversi analog-ke-digital yang sebenarnya. Ini agak mengganggu sensitivitas joystick.
  • Kedua, mikrokontroler harus mendedikasikan banyak daya pemrosesan untuk secara teratur "mengumpulkan" sistem joystick untuk menentukan posisi tongkat. Ini membutuhkan banyak daya dari operasi lain.


Post a Comment

Previous Post Next Post

Contact Form