Oyunlar için Kendi Joystick’ini Yap!

3
869
Yaptığımız projeden bir video.

Evde oyun oynayacakken bir Joystick’inizin olmadığını veya onun bozulduğunu mu fark ettiniz? Hadi bu soruna Arduino UNO ve Joystick Shield ile çözüm bulalım. 

Günümüzde birçok firma çeşitli modellerde Joystick’ler tasarlamakta ve pazarlamakta. Biz de Maker olarak neden kendi Joystick’imizi yapmayalım dedik. Arduino’nun bu tür projeler için geliştirdiği ve Arduino’yu bilgisayara klavye, mouse veya başka aygıtlar olarak tanıtmamıza olanak sağlayan Arduino Leonardo modeli var. Fakat neden ek bir ürün alıp elimizdeki Arduino UNO’yu değerlendirmeyelim diye düşündük sonunda bu çalışmayı yapmaya karar verdik ve Python üzerinden Firmata adlı bir protokol kullanarak Arduino UNO’muza da aynı işlevi kazandırmayı başardık.  

Yazımızda Neler Var:

  • Gerekli Malzemeler 
  • Python Nedir? 
  • Firmata Protokolü Nedir? 
  • PyFirmata Kütüphanesi Nedir? 
  • Pynput Kütüphanesi Nedir? 
  • Kendi Joystick’imizi Yapalım! 
     

Malzemeler:

Python Nedir? 

Hollanda’da yaşayan Guido Van Rossum tarafından 90’lı yıllarda geliştirilen bir programlama dilidir. Öğrenmesi oldukça kolay, modülerliği, okunabilirliği destekleyen, platform bağımsız nesne yönelimli yorumlanabilir bir script dilidir. Kolay olması ve işlevselliği sayesinde programlama alanlarında çok sık olarak tercih edilmektedir.  

Firmata Protokolü Nedir? 

Firmata, bilgisayardaki yazılımların mikrodenetleyicilerle iletişim kurması için geliştirilmiş bir protokoldür. Protokol, herhangi bir mikrodenetleyici ile kullanılabilir. Biz de bu sebeple çalışmamızda bu protokol üzerinden ilerleyeceğiz.  

PyFirmata  Kütüphanesi Nedir? 

PyFirmata, Firmata protokolü için geliştirilmiş bir Python kütüphanesidir. 

Pynput Kütüphanesi Nedir / Ne İşe Yarar? 

Pynput, Python kodunun diğer uygulamalarla olan etkileşimlerini otomatize etmek için fare ve klavyenin kontrol edilmesini sağlar. Kütüphane, kolayca kullanılabilecek şekilde tasarlanmıştır. 

Kendi Joystick’imizi Yapalım!

1) Python’u yüklüyoruz.

İlk aşamada Python’u resmi sitesinden indiriyoruz

blank

İnen dosyayı çalıştırıyor ve yüklüyoruz.

blank

2 ) Kütüphanelerimizi indiriyoruz. 

Komut İstemi’ni açıp gerekli kütüphaneleri yüklemek için aşağıdaki komudu yazıyoruz. 

pip3 install pynput pyfirmata  

3) Arduino’ya kodumuzu yüklüyoruz.

Şimdi Arduino’muzun Python ile haberleşmesini sağlayacak kodu yüklememiz gerekiyor. Bu koda ulaşmak için Arduino IDE uygulamasını başlatıp Örnekler>Firmata>Standart Firmata isimli dosyayı Arduino’muza yüklüyoruz. 

blank

4) Python kodumuzu hazırlayıp çalıştırıyoruz.

Şimdi Python ile beraber gelen IDLE uygulamasını çalıştırıp yeni bir dosya oluşturuyoruz ve aşağıdaki kodu yeni dosyamıza yapıştırıyoruz.  

blank

NOT: Ben kodu Asphalt 8 oyununa göre düzenledim. Siz kod üzerindeki yönlendirmeleri dikkate alarak oyunuz için gerekli tuşları modülde istediğiniz butonlara atayabilirsiniz. 

# -- coding: utf-8 -- 

import pyautogui 
import pyfirmata, pyfirmata.util 
import time 
from pynput.keyboard import Key, Controller 

keyboard = Controller() 

# Arduino UNO'nun takılı olduğu portu aşağıdaki '/dev/ttyUSB0' yazdığım yere yazınız. 

# NOT: Ben Linux işletim sistemi kullandığım için bende '/dev/ttyUSB0' şeklinde başlıyor. Windows için COM şeklinde başlıyorudur. 

# Portunuzu Arduino IDE uygulamasını açıp port kısmından bulabilirsiniz. 

board = pyfirmata.Arduino('/dev/ttyUSB0', baudrate=57600) 

iterator = pyfirmata.util.Iterator(board) 

iterator.start() 

# Joystick'lerin değerlerine göre klavyedeki uygun tuşlara basacak fonksiyonu tanımlıyoruz. 

# x değişkeni Joystick değerinin, y değişkeni Joystick'in yüksek değerinde (Joystick'in sağa yatık durumu veya yukarı yatık durumu), 

# z değeri Joystick'in düşük değerinde (Joystick'in sola yatık durumu veya aşağı yatık durumu) klavyede basılacak tuşun ayarlanmasını sağlar. 

def klavyekontroljoy(x,y,z): 

    if x > 70: 
        keyboard.press(f"{y}") 
        print(f"{y} tuşu basılı") 

    if x < 70: 
        keyboard.release(f"{y}") 

    if x < 30: 
        keyboard.press(f"{z}") 
        print(f"{z} tuşu basılı") 

    if x > 30: 
        keyboard.release(f"{z}") 

# Butonların değerlerine göre klavyedeki uygun tuşlara basacak fonksiyonu tanımlıyoruz. 

# x değişkeni Buton değerininin, y değişkeni Butonun yüksek değerinde (yani basıldığında) klavyede basılacak tuşun ayarlanmasını sağlar. 

def klavyekontrolbut(x,y): 
    if x == 0: 
        keyboard.press(f"{y}") 
        print(f"{y} tuşu basılı") 

    if x == 1: 
        keyboard.release(f"{y}") 

time.sleep(1) 

# Joystick'in x ekseni 
analog_x = board.get_pin('a:0:i') 
analog_x.enable_reporting() 


# Joystick'in y ekseni 
analog_y = board.get_pin('a:1:i') 
analog_y.enable_reporting() 

# A butonu 
button_a = board.get_pin('d:2:i') 
button_a.enable_reporting() 

# B butonu 
button_b = board.get_pin('d:3:i') 
button_b.enable_reporting() 

# C butonu 
button_c = board.get_pin('d:4:i') 
button_c.enable_reporting() 

# D butonu 
button_d = board.get_pin('d:5:i') 
button_d.enable_reporting() 

# E butonu 
button_e = board.get_pin('d:6:i') 
button_e.enable_reporting() 

# F butonu 
button_f = board.get_pin('d:7:i') 
button_f.enable_reporting() 


time.sleep(1) 
while True: 

    x = int(analog_x.read() * 100) 
    y = int(analog_y.read() * 100) 
    A = int(button_a.read()) 
    B = int(button_b.read()) 
    C = int(button_c.read()) 
    D = int(button_d.read()) 
    E = int(button_e.read()) 
    F = int(button_f.read()) 

    klavyekontroljoy(x,"d","a") 
    klavyekontroljoy(y,"w","s") 
    klavyekontrolbut(A,"f") 
    klavyekontrolbut(B,"b") 
    klavyekontrolbut(C,"v") 
    klavyekontrolbut(D,"r") 
    klavyekontrolbut(E,"C") 
    
#   F tuşu basıldığında döngüyü bitirerek,
#   Joystick'i devre dışı bırakacak komut.
    if F == 0: 
        break 

board.exit() 

Artık kodumuzu kaydedip çalıştırdıktan sonra Joystick’imiz hazır hale geliyor!!! 

3 Yorumlar

    • Selamlar,

      Evet, yapılabilir ama uyumluluk konusunda oldukça dikkat edilmelidir.

      İyi çalışmalar dileriz 🙂

CEVAP VER

Please enter your comment!
Please enter your name here