Joystick modülü, kullanımı en kolay modüldür ve projelerinize daha fazla esneklik katar. Bir çok mikrodenetleyici ile kullanılabilir ama biz Arduino kullanıyoruz. Analog Joystickler analog değerleri döndürür. Bunlar temelde potansiyometrelerdir. Bu değerler 0 ile 1023 arasında değişmektedir. Joystick dinlenme konumunda olduğunda analog değer 512 olacaktır. Arduino analog pinleri verileri yatay ve dikey pinlerden okuyacak ve butonu okumak için dijital pin kullanılacaktır. . Joystick modülünün 5 pimi vardır ve bunlar
Besleme gerilimi (VCC)
Zemin
X tuşu (Yatay tuş).
Y tuşu (Dikey Tuş)
Joystick aşağıya basılarak etkinleştirilebilen bir "seçmek için basın" basma düğmesi de vardır. Bunlar, modülünüzü nereden satın aldığınıza bağlı olarak farklı olabilir. Kullandığımız joystick analogdur ve basit yönlü joysticklerden daha doğru okumalar sağlar.
Joystick modülünün arduino ile bağlantısı
Bağlantı şeması çok kolaydır. Arduino 5 v'yi joystick'in VCC'sine bağlayın. Sonra A0 ve A1'i joystick'in VER ve HOR'una bağlayın. Son olarak, Arduino'nun 2. pinini joystick'in SEL'e ve Arduino'nun GND'sini joystick'in GND'sine bağlayın.
Arduino Joystick
A0 -------VER
A1 ------- KOR
Pin2 ------- SEL
GND ------- GND
Arduino ile joystick arayüzünün kodu
// Oyun çubuğu modülü kodu
int x_key = A1 ; // initializing A1 for storing the joystick’s x key value
int y_key = A0 ; // initializing A0 for storing the joystick’s y key value
int Push_Button= 2 ; // initializing digital pin 2 for joystick’s press to select button
int Horizontal_Position = 0 ; // Declaring a variable for storing the value
int y_Position = 0 ; // Declaring a variable for storing the value
int button_State = 0 ; // Declaring a variable for storing the value
void setup ( ) {
Serial.begin ( 9600 ) ; // initializing serial communications at 9600 bps:
pinMode ( x_key, INPUT ) ; // Selecting Arduino analog A1 pin as input
pinMode ( y_key, INPUT ) ; // Selecting Arduino analog A0 pin as input
pinMode (Push_Button, INPUT_PULLUP ) ; // This will activate pull-up resistor on the push-button pin
// If you have Arduino version previous to Arduino 1.0.1, then use these commands for activating pull-up resistor.
// pinMode ( button_Pin , INPUT ) ;
// digitalWrite ( button_Pin , HIGH ) ;
}
void loop ( ) {
Horizontal_Position = analogRead ( x_key ) ; // Reading the value from A1 and storing in Horizontal_Position
y_Position = analogRead ( y_key ) ; // Reading the value from A0 and storing in y_Position
button_State = digitalRead ( Push_Button) ; // Reading the digital pin 2 is high or low
Serial.print ( " Value of X key is " ) ; // Printing “ Value of X key is ” on the disply
Serial.print ( Horizontal_Position ) ; // Printing value of x key on the display
Serial.print ( " | Value of Y key is " ) ; // Printing “ Value of Y key is ” on the screen
Serial.print ( y_Position ) ; // Printing value of y key on the display
Serial.print ( " | Button State is " ) ; // Printing “ Button state ” on the display
Serial.println ( button_State ) ; // Printing the button is high or low on the display
delay ( 1000 ) ; // This will add delay between readings
}
İki servo motorlu Arduino kullanarak joystick tabanlı servo motor kontrolü
joystick tabanlı servo motor kontrol devre şeması ve gerçek uygulama yukarıda ve aşağıda gösterilmiştir.Şimdi joystick modülü yardımıyla iki servo motoru nasıl kontrol edebileceğimizi göreceğiz. İki adet servo motor kullanıyoruz. Joystick modülünün x ekseni ile bir servo motor kontrol edilebilmekte, diğer servo motor ise joystick modülünün y ekseni ile kontrol edilmektedir. Bu örnekte, bir joystick kullanarak 2 servo motoru kontrol edeceğiz. Bu örnek, oyun denetleyicileri ve elektronik oyuncak arabalar gibi birçok projede kullanılmaktadır.
Joystick ile servo motor kontrolü için gerekli bileşenler
Gerekli bileşenler aşağıdaki gibidir
2 servo
Oyun kolu
Arduino uno (herhangi birini kullanabilirsiniz)
Breadboard
Servo motorun üç bağlantısı vardır.
Pozitif
Olumsuz
Sinyal
Bağlantılar çok daha kolay. Servoları ve kumanda çubuğunu şekilde gösterildiği gibi bağlayın.
Joystick tabanlı servo motor kontrol kodu
Bu kod için önce servo kütüphanesini indirmeniz gerekecek.
// Controlling 2 Servos Using a Joystick.
#include < Servo.h > // including the library of servo motor
int First_Signal_Pin = 6 ; // initializing pin 6 for first servo
int Second_Signal_Pin = 7 ; // initializing pin 7 for first servo
int Horizontal_Joystick_Pin = A0 ; // initializing A0 for horizontal movement
int Vertical_Joystick_Pin = A1 ; // initializing A1 for vertical movement
// initializing the min and max values for horizontal and vertical movement
int Horizontal_Min = 0 ;
int Horizontal_Max = 180 ;
int Vertical_Min = 0 ;
int Vertical_Max = 180 ;
Servo First_Servo ;
Servo Second_Servo ;
// Declaring variables for storing values
int Horizontal_Value ;
int Horizontal_Servo_Value ;
int Vertical_Value ;
int Vertical_Servo_Value ;
void setup ( )
{
First_Servo.attach ( First_Signal_Pin ) ; // Enabling pin 6 for first servo
Second_Servo.attach ( Second_Signal_Pin ) ; // Enabling pin 7 for first servo
}
void loop ( )
{
Horizontal_Value = analogRead ( Horizonta_Joystick_Pin ) ; // Reading the value from A0
Vertical_Value = analogRead ( Vertical_Joystick_Pin ) ; // Reading the value from A1
// Mapping the values for horizontal and vertical movement of joystick.
Horizontal_Servo_Value = map ( Horizontal_Value, 0 , 1023, ServoH_Min , ServoH_Max ) ;
Vertical_Servo_Value = map ( Vertical_Value, 0, 1023, ServoH_Min , ServoH_Max ) ;
// Moving the servos
First_Servo.write ( Horizontal_Servo_Value ) ;
Second_Servo.write ( Vertical_Servo_Value ) ;
delay ( 2000 ) ; // Delay of 2 seconds
}
Gördüğünüz gibi arduino ve servo motor kontrol kodu ve devre şeması ile joystick'i Arduino uno R3 kullanarak kullanmak çok kolaydır.
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.
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ı
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.
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ü Pinout
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.
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.
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 numbersconstint SW_pin = 8; // digital pin connected to switch outputconstint X_pin = 0; // analog pin connected to X outputconstint Y_pin = 1; // analog pin connected to Y outputvoidsetup() {
pinMode(SW_pin, INPUT);
digitalWrite(SW_pin, HIGH);
Serial.begin(9600);
}
voidloop() {
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.
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 numbersconstint SW_pin = 8; // digital pin connected to switch outputconstint X_pin = 0; // analog pin connected to X outputconstint 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.
In loop()fonksiyonu: Biz sadece kullanılarak GB pin değerini okumak digitalRead()fonksiyonu, VRX & VRY kullanarak pimi analogRead()seri monitörde ve ekranı.
İş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.
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 voidsetup()
{
Serial.begin(9600) ; // Open the serial portpinMode(8,INPUT) ; // Configure Pin 2 as inputdigitalWrite(8,HIGH);
}
voidloop()
{
// 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 A0int y; // variable holding the value from A1int b; // variable holding the value from digital pin 2
PFont f; // define the font variable
String portName;
String val;
voidsetup()
{
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-aliasingtextFont ( f, 16 ) ; // size 16px
}
// drawing loopvoiddraw()
{
fill(0) ; // set the fill color to blackclear() ; // clean the screenfill(255) ; // set the fill color to whiteif (b == 1) // check if the button is pressed
{
// draw a larger circle with specified coordinatesellipse(x/2,y/2, 50, 50);
}
else
{
// we draw a circle with a certain coordinatesellipse(x/2,y/2, 25, 25);
}
// we display datatext("AnalogX="+(1023-x)+" AnalogY="+(1023-y),10,20);
}
// data support from the serial portvoidserialEvent( 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 readingint[] 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 A0int y; // variable holding the value from A1int 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-aliasingtextFont ( 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 blackclear() ; // clean the screenfill(255) ; // set the fill color to whiteif (b == 1) // check if the button is pressed
{
// draw a larger circle with specified coordinatesellipse(x/2,y/2, 50, 50);
}
else
{
// we draw a circle with a certain coordinatesellipse(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 datatext("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.
voidserialEvent( 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 readingint[] 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.
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.