Oyunlar için Kendi Joystick’ini Yap!

19
6477
Joystick görselleri
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.  

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

Bu görsel boş bir alt niteliğe sahip; dosya adı Ekran-G%C3%B6r%C3%BCnt%C3%BCs%C3%BC-1-e1598287539130-1024x589.png



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

Bu görsel boş bir alt niteliğe sahip; dosya adı Ekran-G%C3%B6r%C3%BCnt%C3%BCs%C3%BC-2-e1598288116996-1024x543.png

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. 

Bu görsel boş bir alt niteliğe sahip; dosya adı Snap4Arduino_Firmata2-e1598289934658.png

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.  

Bu görsel boş bir alt niteliğe sahip; dosya adı Ekran-G%C3%B6r%C3%BCnt%C3%BCs%C3%BC-7-1024x576.png

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 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ıyordur.

# 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!!! 

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


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

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. 

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.  

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 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ıyordur. 

# 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!!! 

19 YORUMLAR

  1. Traceback (most recent call last):
    File “C:\Users\aaaa\Desktop\deneme.py”, line 3, in
    import pyautogui
    ModuleNotFoundError: No module named ‘pyautogui’
    böylebi hata aldım

    • pyautogui kütüphanesi yüklenmediği için böyle bir hata aldınız, bu sorunu Komut İstemi’ne pip3 install pyautogui yazaraktan çözebilirsiniz.

  2. Traceback (most recent call last):
    File “D:\Ardiuno Projeler\joystick.py”, line 3, in
    import pyfirmata, pyfirmata.util
    Modu_No moduleleNot named ‘pyfirmata’

    Bu hatanın neden olduğunu bilen var mı?

CEVAP VER

Lütfen yorumunuzu giriniz!
Lütfen isminizi buraya giriniz