Arduino

Oyunda Vurunca Geri Tepen Mouse!

Featured Video Play Icon

Oyunların, özellikle de online oyunların nasıl bir girdap olduğunu çoğumuz biliriz. “Oyna” tuşuna bir kere bastığımızda saatler bir anda dakikalara dönüşür, hele bir de FPS oyunlarında heyecan hep tavandır. Geçtiğimiz günlerde “Teenenggr” YouTube kanalının paylaştığı videoyu görünce oyun deneyiminin birkaç satır kod ve birkaç motorla nasıl bir seviyeye gelebileceğini görmüş oldum. Bu içerikte bu videodan referans alarak yaptığım ve oyun deneyimini birkaç kat arttırmayı hedeflediğim projenin detaylarını bulacaksınız.

Teenenggr kanalındaki proje donanım tarafında solenoid motorlar, Arduino ve rölelerden oluşuyor. Kanalın yalnızca bu videosunun değil başka videolarının da ana kahramanı solenoid motorlar. İlgili videonun ve kanalın linkini aşağıda bulabilirsiniz.

Teenenggr YouTube kanalı: www.youtube.com/c/Teenenggr
Referans aldığım videonun linki: www.youtube.com/watch?v=y1iglyGr_iY

Mouse Silahı Yapımı

Bizim projemizin başrol oyuncusu da solenoid motor. Solenoid motorlar itme-çekme işlemleri için kullanılan ve oldukça basit bir yapıya sahip motorlardır. İçerisindeki bobin üzerinden geçen akımın oluşturduğu manyetik alan vasıtasıyla motor tek yönde hareket eder ve enerji kesildikten sonra eski konumuna döner. Oyunda ateş ettiğim sırada silah üzerindeki geri tepme etkisini hissedebilmek için bu motorları kullandım. “Geri tepme” hissiyatını yakalamak için kesinlikle biçilmiş kaftan.

Solenoid Motorlar

**Solenoid motorun yapısını ve çalışma şeklini daha iyi anlamak için internet üzerindeki el yapımı solenoid motor videolarını inceleyebilirsiniz.

Proje Malzemeleri:

Kullanılan Malzemeler

** Devreyi Arduino üzerine shield gibi takmak için de delikli pertinaks ve erkek headerlar kullandım. Bununla beraber motorları beslemek için 12V bir güç kaynağından faydalandım.

Bunların dışında şase baskısı için kullandığım malzemeler: Creality Ender 3 Pro ve PLA Filament

Devre üzerinde röle ve motorlar dışında tıklama şiddetine bağlı olarak çalışacak 7 adet de LED bulunuyor. Donanım tarafında kullanılan tüm elemanları ve devreyi aşağıdaki bağlantı şemasından inceleyebilirsiniz.

Proje Bağlantı Şeması

Proje en temel haliyle bilgisayar üzerinden mouse tıklamasının Arduino’ya gönderilmesi ve gelen veriye bağlı olarak röle yardımıyla motorun sürülmesi işlemlerinden oluşuyor. Mouse tıklamalarının yakalanması için oldukça basit bir Python kodundan istifade ettim. Kodun yaptığı iş en temel haliyle tıklama algılandığında/algılanmadığında Arduino’yu seri port vasıtasıyla durumdan haberdar etmek. Kod kısmı ile ilgili detayları ve kod dosyalarını aşağıdaki başlıklar altında bulabilirsiniz.

Python Kodu

Bu proje için kullandığım kodun yaptığı iş mouse tıklamalarını Arduino’ya seri port üzerinden göndermek. Python kodu üzerinde geliştirme yapmak isteyen arkadaşların iki kütüphanenin kurulumunu yapması gerekecektir. Bunlardan ilki kodda seri port iletişimi sağlamak için kullanılan “pyserial” kütüphanesi; diğeri ise mouse tıklamalarını algılamak için kullanılan “pywin32” kütüphanesi. Kurulumlarla uğraşmadan kodu .exe ile doğrudan çalıştırmak isterseniz bu başlık altındaki son paragrafa atlayabilirsiniz.

Kütüphane kurulumlarını PiP (Preferred Installer Program) ile kolaylıkla yapabilirsiniz. Kısaca PiP üçüncü parti kütüphaneleri bilgisayarımıza kurmamızı sağlayan yardımcı bir paket yöneticisidir. Python kurulumunu yaparken çıkan kutucuklardan “Add Python to PATH” kutucuğunu seçerek kurulumu tamamlarsanız PiP komutlarını komut istemi(cmd) üzerinden çalıştırabilirsiniz. PiP ve PiP kurulumu ile ilgili daha detaylı bir yazıyı aşağıda bulabilirsiniz.

Aşağıdaki linki kullanarak Python kurulumu yaparken bu kutucuğu seçerek devam edin

Python kurulumu için: https://www.python.org/
PiP ile ilgili detaylı bir yazı: https://cengturkey.com/2019/01/python-icin-pip-nasil-yuklenir/

PiP kurulumunun ardından yapmanız gereken tek şey komut istemini açarak “pip install” ve kurmak istediğiniz PyPI paketini yazmak. Bizim kodumuz için gerekli komutlar:

pip install pyserial
pip install pywin32

Üstteki komutları komut istemine(cmd) yazdıktan ve paket kurulumunu tamamladıktan sonra kodu çalıştırabilir ve kodun üzerinde oynayabilirsiniz. Python kodunu aşağıda bulabilirsiniz.

import pywintypes
import win32api
import time
import serial

state_left = win32api.GetKeyState(0x01)  # Left button down
state_right = win32api.GetKeyState(0x02)  # Right button down

port = input("Bağlı COM portu girin: ")
ser = serial.Serial(port, 9600, timeout=.1)

while True:
    a = win32api.GetKeyState(0x01)
    #b = win32api.GetKeyState(0x02)

    if a != state_left:  # Button state changed
        state_left = a
        while a < 0:
            print('Left Button Pressed')
            a = win32api.GetKeyState(0x01)
            ser.write(bytes("1", 'utf-8'))
            time.sleep(0.1)
    else:
        ser.write(bytes("2", 'utf-8'))
        time.sleep(0.01)

Eğer işin bu kısmı ile uğraşmak istemiyorsanız yazının en altında paylaştığım github linkine gidebilirsiniz. Ardından bu linkte bulabileceğiniz "mouse_click.rar" dosyası içindeki ‘dist’ klasöründe bulunan “mouse_click.exe”yi hiçbir kurulum yapmadan çalıştırabilirsiniz. Açılan konsol ekranına öncelikle Arduino’nun bağlı olduğu portu yazmanız gerekecektir (COMx şeklinde). Arduinonun bağlı olduğu portu “Aygıt Yöneticisi” üzerinden görebilirsiniz. Çalışan programın yaptığı iş seri porta sol tıklama yapıldığı durumlarda ‘1’; yapılmadığı durumlarda ise ‘2’ göndermektir.

COM Portu "COMx" formatında girmeyi unutmayın.

NOT: Kodda “win32api” kullanıldığından kod yalnızca Windows işletim sistemi ile çalışmaktadır. Benzer işlevde bir kodu “win32api” kullanmadan “mouse” kütüphanesi ile de yazabilirsiniz.

Arduino Kodu

Arduino tarafında yapılan iş seri port üzerinden gelen tıklama bilgisine göre röleyi tetiklemek ve LEDleri kontrol etmek. Seri porttan ‘1’ gelmesi durumunda röle tetiklenerek motor çalışıyor. Gelen tıklamalara bağlı olarak LEDleri sürmek için ise “counter” isminde bir değişken kullandım. Counter değeri her tıklama geldiğinde artıyor; tıklama gelmediği durumlarda da azalıyor. Devre üzerindeki 7 LED de “counter”ın değerine göre yanıyor. Bu sayede vumetrelerde ses şiddetine bağlı gerçekleşen LED animasyonuna benzer bir etkiyi oyundaki ateş şiddetine göre elde etmiş oldum.

Arduino kodunu aşağıda bulabilirsiniz.

#define RELAY 10
#define DELAY 50 // motor çalışma süresi

const int LEDs[7] = {3,4,5,6,7,8,9};
unsigned int counter = 0;


void setup() {
  Serial.begin(9600);

  for(int i=0; i<7; i++){
    pinMode(LEDs[i], OUTPUT);
  }

  pinMode(RELAY,OUTPUT);

}

void loop() {
  digitalWrite(RELAY,LOW);
  LEDs_On(counter);

}

void serialEvent(){
  char inChar = (char)Serial.read(); //Porttan gelen veriyi oku
  if (inChar == '1')                 //Mouse'a tıklandıysa
  {
    digitalWrite(RELAY, HIGH);
    delay(DELAY);                   //Motor çalışma süresi
    counter++;
  }
  else if (inChar == '2')           //Mouse'a tıklanmıyorsa
  {
    if (counter >0) counter--;
  }
}

void LEDs_On(int c)
{
  if (c>6)                          //Tüm LED'led   *******
  {
    for(int i=0;i<7;i++)
      digitalWrite(LEDs[i],HIGH);
  }
  else if (c>4)                     //5 LED         -*****-
  {
    digitalWrite(LEDs[0], LOW);
    digitalWrite(LEDs[6], LOW);
    for(int i=0;i<5;i++)
      digitalWrite(LEDs[i+1], HIGH);
  }
  else if (c>2)                     //3 LED          --***--
  {
    for(int i=0;i<7;i++) 
      digitalWrite(LEDs[i],LOW);

    digitalWrite(LEDs[2],HIGH);
    digitalWrite(LEDs[3],HIGH);
    digitalWrite(LEDs[4],HIGH);
  }
  else if (c>0)                      //1 LED          ---*---
  {
    for(int i=0; i<7; i++)         
      digitalWrite(LEDs[i],LOW);

    digitalWrite(LEDs[3], HIGH);
  }
  else
  {
    for(int i=0; i<7; i++)          // LED'ler Kapalı -------
      digitalWrite(LEDs[i],LOW);
  }
}

Motorlar için Şase Tasarımı

Motorları bir arada tutmak ve estetik bir yapı elde etmek için bir şase tasarlayarak 3B yazıcıdan bastırdım. Tasarım dosyasını aşağıdaki github linkinde bulabilirsiniz. Fusion 360 kullanımı ile ilgili videoma buraya tıklayarak ulaşabilirsiniz.

Projede kullanılan kodlar ve tasarım dosyasının bulunduğu Github linki için tıklayın.

Montaj Sonrası Farenin Son Hali

Şasenin iki tarafına ikişer motoru bağladıktan ve motorların devre ile bağlantısını yaptıktan sonra projeyi tamamlamış oldum. Projenin test kısmını videodan izleyebilirsiniz. Bu projenin nasıl geliştirilebileceği ile ilgili fikirlerinizi bekliyorum. Yorumlarınızı videonun altında veya aşağıdaki yorumlar kısmında paylaşabilirsiniz. Bir sonraki projede görüşünceye dek, hoşça kalın 🙂

Similar Posts

4 thoughts on “Oyunda Vurunca Geri Tepen Mouse!
    1. Merhaba, mouse tıklarını bir şekilde yakalayabilmek gerekiyor, Python aracılığı ile bunu yapmak en kolay yol. Yazılımsal bir yol dışında fare üzerindeki donanımsal bir oynamayla da ‘tık’ tespiti yapılabilir belki ama bu şekliyle daha kolay olacaktır.

Leave a Reply

Your email address will not be published.