粕烏の工房 Kas_garasu’s blog

モノづくりに魅了されたもの 日記や趣味の投稿をしてます

自作左手デバイス完成!(/・ω・)/

こんにちは 

粕烏です(/・ω・)/

 

最近、FPSでキャラクターを自由に動かしたくて自作左手デバイスを作っていました

いや~キーボード系を作るのは初めてだったので作るのに時間がかかっちゃいました

まずキーマトリックスってなんだよってところからですからね(--〆)

 

というわけでまず作成した自作左手デバイスです

akizukidenshi.com

という構成です

 

求めた要素としては

PCゲー移動するためのWASDを入力する用のジョイスティック

タルコフというゲームをしたいので25個ぐらいのキー

で結果的にはキーがそんなに必要じゃないので16個になりました

 

作り方としては

 

まずパパっとCADでキーの位置を作って

 

3Dプリンターで印刷(このとき、手元を見ないでスイッチを押せるようにキーの間隔を開けた設計にしてますが、絶妙に押しにくかったので後で変更してます)

 

良い感じの位置が見つかったら

 

 

全体のパーツを作成して

 

 

組立

 

裏側は手配線で配線

ここでは下のサイトを参考にさせてもらいました

blog.ikejima.org

そしたら制御用の基盤を作成

自分はピンのすぐ横に配線しました

使ったピンは右側の3.3Ⅴから下のピン

ジョイスティックについてはこのサイトを参考にさせていただきました

otoku-pc.com

このサイトの通り5Vは3.3Vにつないだ方が安定しました

ラズパイPICOの入力電圧が3.3Vなのが影響しているんですかね

確かに5Vを入力しちゃうと限度を超えちゃいます

ということはこのジョイスティックは入出力が5VのArudino仕様で書かれるぽいです

 

最後にプログラムを作成

使ったのは自分でコードが作れそうなCircuitPythonにしました

KMK firmwareを使うことも考えたのですがジョイスティックを使う方法の記事がなく解らなかったのでやめました

これが参考にしたサイトです

untitled-note.com

ただ肝心なコードに関しては、良い感じのものが見つからなかったのでこんな感じに自作しました(自作なので甘いところがあるかもしれませんが見逃してください(/ω\))

#ライブラリ
import board, digitalio, analogio,usb_hid
from adafruit_hid.keyboard import Keyboard
from adafruit_hid.keyboard import Keycode

# キーマップ
matrix_keys = [['1', 'B', 'ctrl', 'E'],
               ['2', 'sp', 'shit', 'Q'],
               ['3', 'T', 'F', 'Alt'],
               ['4', 'O', 'Tab', 'Z']]

# ピンの設定
r1 = digitalio.DigitalInOut(board.GP25)
r1.direction = digitalio.Direction.OUTPUT
r2 = digitalio.DigitalInOut(board.GP24)
r2.direction = digitalio.Direction.OUTPUT
r3 = digitalio.DigitalInOut(board.GP23)
r3.direction = digitalio.Direction.OUTPUT
r4 = digitalio.DigitalInOut(board.GP22)
r4.direction = digitalio.Direction.OUTPUT

c1 = digitalio.DigitalInOut(board.GP20)
c1.switch_to_input(pull=digitalio.Pull.DOWN)
c2 = digitalio.DigitalInOut(board.GP19)
c2.switch_to_input(pull=digitalio.Pull.DOWN)
c3 = digitalio.DigitalInOut(board.GP18)
c3.switch_to_input(pull=digitalio.Pull.DOWN)
c4 = digitalio.DigitalInOut(board.GP17)
c4.switch_to_input(pull=digitalio.Pull.DOWN)

xAxis = analogio.AnalogIn(board.A3)
yAxis = analogio.AnalogIn(board.A2)
button = digitalio.DigitalInOut(board.GP27)
button.switch_to_input(pull=digitalio.Pull.UP)

# キーボードのオブジェクトの作成
keyboard = Keyboard(usb_hid.devices)

#ピンを配列に格納
col_pins =
row_pins =

row_pins.append(r1)
row_pins.append(r2)
row_pins.append(r3)
row_pins.append(r4)

col_pins.append(c1)
col_pins.append(c2)
col_pins.append(c3)
col_pins.append(c4)


#ジョイステック関数
def scanjoystick():
    if xAxis.value < 27000 :
        keyboard.press(Keycode.S)
    else:
        keyboard.release(Keycode.S)

    if xAxis.value > 38000 :
        keyboard.press(Keycode.W)
    else:
        keyboard.release(Keycode.W)
       
    if yAxis.value < 27000 :
        keyboard.press(Keycode.A)
    else:
        keyboard.release(Keycode.A)

    if yAxis.value > 38000 :
        keyboard.press(Keycode.D)
    else:
        keyboard.release(Keycode.D)

    if button.value == False :
        keyboard.press(Keycode.V)
    else:
        keyboard.release(Keycode.V)

#キー関数
def scankeys():
    for row in range(4):
        for col in range(4):
            row_pins[row].value = True
            key_press = None
           
            if col_pins[col].value == True:
                key_press = matrix_keys[row][col]
                if key_press == '1':
                    keyboard.press(Keycode.ONE)
               
                if key_press == '2':
                    keyboard.press(Keycode.TWO)

                if key_press == '3':
                    keyboard.press(Keycode.THREE)

                if key_press == '4':
                    keyboard.press(Keycode.FOUR)

                if key_press == 'B':
                    keyboard.press(Keycode.B)

                if key_press == 'sp':
                    keyboard.press(Keycode.SPACE)

                if key_press == 'T':
                    keyboard.press(Keycode.T)

                if key_press == 'O':
                    keyboard.press(Keycode.O)

                if key_press == 'shit':
                    keyboard.press(Keycode.LEFT_SHIFT)

                if key_press == 'ctrl':
                    keyboard.press(Keycode.LEFT_CONTROL)

                if key_press == 'F':
                    keyboard.press(Keycode.F)                                                                                                                      

                if key_press == 'Tab':
                    keyboard.press(Keycode.TAB)

                if key_press == 'E':
                    keyboard.press(Keycode.E)

                if key_press == 'Q':
                    keyboard.press(Keycode.Q)


                if key_press == 'Alt':
                    keyboard.press(Keycode.LEFT_ALT)

                if key_press == 'Z':
                    keyboard.press(Keycode.Z)
               

            else:
                key_press = matrix_keys[row][col]
                if key_press == '1':
                    keyboard.release(Keycode.ONE)
               
                if key_press == '2':
                    keyboard.release(Keycode.TWO)

                if key_press == '3':
                    keyboard.release(Keycode.THREE)

                if key_press == '4':
                    keyboard.release(Keycode.FOUR)

                if key_press == 'B':
                    keyboard.release(Keycode.B)

                if key_press == 'sp':
                    keyboard.release(Keycode.SPACE)

                if key_press == 'T':
                    keyboard.release(Keycode.T)

                if key_press == 'O':
                    keyboard.release(Keycode.O)

                if key_press == 'shit':
                    keyboard.release(Keycode.LEFT_SHIFT)

                if key_press == 'ctrl':
                    keyboard.release(Keycode.LEFT_CONTROL)

                if key_press == 'F':
                    keyboard.release(Keycode.F)

                if key_press == 'Tab':
                    keyboard.release(Keycode.TAB)

                if key_press == 'E':
                    keyboard.release(Keycode.E)

                if key_press == 'Q':
                    keyboard.release(Keycode.Q)

                if key_press == 'Alt':
                    keyboard.release(Keycode.LEFT_ALT)

                if key_press == 'Z':
                    keyboard.release(Keycode.Z)

        row_pins[row].value = False

#本文
while True:
    scanjoystick()
    scankeys()

adafruit_hidにはキーボードの押すコードにsend()とpress()・release()の二つを使う2種類の方法があるのですが

 

send()はコードごとに押して離すを一回行う

 

というもので、長押しを検出できないのでpress()・release()を使っています

 

これでいい感じの自作左手デバイスが作れました(*´ω`*)

今はこれを使って快適に遊んでいます(/・ω・)/

 

今回は長くなってしまったのでこの辺で

ではまた~