5 Haziran 2017 Pazartesi

Arduino - Joystick ile Servo Motor Sürme

    Bu yazımda joystick kullanımından bahsetmek istiyorum sizlere. Kullanımı oldukça basit. Kullanacağım modül siyah kartlı  KY-023 joystick modülü. Üzerinde 2 adet potansiyometre ve de 1 adet buton var. 5V ile çalışıyor.

    Ben uygulamayı LCD Keypad Shield ile yaptığım için fritzingde hem LCD'siz hem LCD li olanı çizmek istedim.





    Modülden bahsetmek gerekirse, modülün 5 adet pini var. GND ve 5V pinlerinin dışında, VRx pini var ki bu pin X düzlemindeki konumunu , VRy pini Y düzlemindeki konumunu bize gösterecek. SW pini ile de buton durumunu okuyacağız.




    Uygulamayı açısal konumunu X ve Y düzlemindeki konuma göre alan iki servo motor ve buton durumuna göre yanıp sönen led ile yapacağız. 

    SW pinini arduinoya direkt bağladım o yüzden basılı olduğunda "0" basılı olmadığında "1" değeri döndürecek. Siz isterseniz pull-down direnci ile girebilirsiniz.

Kodlar;



 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
#include <LiquidCrystal.h>
#include <Servo.h>
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);

Servo servo_x,servo_y; // 2 Adet Servo Motoru Tanımlıyoruz

#define xPin A3 // VRx Pin
#define yPin A2 // VRy Pin
#define butonPin A1 // SW Pin
#define led 1 

int x_angle=0; // Okunacak X Konum Değeri
int y_angle=0; // Okunacak Y Konum Değeri
int xPos = 0; //  Okunan X değerine göre servo_x'in Açısı
int yPos = 0; //  Okunan Y değerine göre servo_y'nin Açısı
int butonDurum = 0; 

void setup() {

pinMode(butonPin, INPUT_PULLUP);
pinMode(led,OUTPUT);
lcd.begin(16, 2);
servo_x.attach(3); 
servo_y.attach(2);
 
} 
void loop()
{
  lcd.clear();  
  xPos = analogRead(xPin); // X konumunu okuduk
  yPos = analogRead(yPin); // Y Konumunu okuduk
  butonDurum = digitalRead(butonPin); // Buton durumunu okuduk

  if(butonDurum==0)
  {
    digitalWrite(led,HIGH);    // Buton basılı ise yanacak
  }  
  else
   {
    digitalWrite(led,LOW);  // Buton basılı değil ise sönecek
   }  

/*
   Okunan X ve Y konumunun ADC değerini (0-1023) 0-180 aralığına indirgedik. 
   Servo Motoru okunan 0-1023 değerine göre 0-180 derece arasında konuma almasını sağlayacağız.
   map komutunun başına (int) ibaresi girdik çünkü servo.write() komutu integer değerle çalışır.
   Float değer olursa integer bir sayıya çevirmiş olduk.
 */
  x_angle=(int)map(xPos,0,1023,0,180); 
  y_angle=(int)map(yPos,0,1023,0,180);

  lcd.print("X: ");
  lcd.print(x_angle); // X açısını LCD'de yazdırdık
  lcd.setCursor(0,1);
  lcd.print("Y: ");
  lcd.print(y_angle); // Y açısını LCD'de yazdırdık
  lcd.print("  Button:");
  lcd.print(butonDurum); // Buton durumunu LCD'de yazdırdık.
 
  servo_x.write(x_angle);    // Servoyu sürdük
  servo_y.write(y_angle);    // Servoyu sürdük
   
  delay(125);
}


Uygulamamızın videosu;





Hiç yorum yok:

Yorum Gönder