マクロ搭載型キーボードを自作してみよう! その3

RaspberryPi
ジェームズ
ジェームズ

それではプログラムを書いていきましょう

Makoto
Makoto

わーい

ジェームズ
ジェームズ

少し長いですがこのような形でどうでしょうか?
モードごとにキーが入れ替わるので
キーごとにマクロを設定しています。

from board import *
import board
import os
import time
import busio
import usb_hid
import rotaryio
import digitalio
import microcontroller
import adafruit_ssd1306

from digitalio import DigitalInOut, Pull
from board import *
from adafruit_hid.keyboard import Keyboard
from adafruit_hid.mouse import Mouse
from adafruit_hid.keycode import Keycode
from adafruit_hid.consumer_control import ConsumerControl
from adafruit_hid.consumer_control_code import ConsumerControlCode

led0 = board.GP7
led1 = board.GP8
led2 = board.GP9

led0 = digitalio.DigitalInOut(led0)
led1 = digitalio.DigitalInOut(led1)
led2 = digitalio.DigitalInOut(led2)

led0.direction = digitalio.Direction.OUTPUT
led1.direction = digitalio.Direction.OUTPUT
led2.direction = digitalio.Direction.OUTPUT

CLK_PIN = board.GP2
DT_PIN = board.GP3
SW_PIN = board.GP4
clk_last = None
count = 0
totalMode = 3
currentMode = 0
pressTime = 0

SW1_PIN  = board.GP28
SW2_PIN  = board.GP20
SW3_PIN  = board.GP17
SW4_PIN  = board.GP14
SW5_PIN  = board.GP27
SW6_PIN  = board.GP21
SW7_PIN  = board.GP18
SW8_PIN  = board.GP15
SW9_PIN  = board.GP26
SW10_PIN = board.GP22
SW11_PIN = board.GP19
SW12_PIN = board.GP16

cc = ConsumerControl(usb_hid.devices)
mouse = Mouse(usb_hid.devices)
keyboard = Keyboard(usb_hid.devices)
key = 0

fs_stat = os.statvfs('/')

i2c = busio.I2C(GP1, GP0)

display = adafruit_ssd1306.SSD1306_I2C(128, 64, i2c, addr=0x3c)
print('start')
t0 = time.monotonic()
one = 'ALT'
two = 'NONE'
three = [ 'Zoom','Volume','Scroll']


enc = rotaryio.IncrementalEncoder(CLK_PIN, DT_PIN)
last_position = 0

sw = digitalio.DigitalInOut(SW_PIN)
sw.direction = digitalio.Direction.INPUT
sw.pull = digitalio.Pull.UP

sw1 = digitalio.DigitalInOut(SW1_PIN)
sw1.direction = digitalio.Direction.INPUT
sw1.pull = digitalio.Pull.UP

sw2 = digitalio.DigitalInOut(SW2_PIN)
sw2.direction = digitalio.Direction.INPUT
sw2.pull = digitalio.Pull.UP

sw3 = digitalio.DigitalInOut(SW3_PIN)
sw3.direction = digitalio.Direction.INPUT
sw3.pull = digitalio.Pull.UP

sw4 = digitalio.DigitalInOut(SW4_PIN)
sw4.direction = digitalio.Direction.INPUT
sw4.pull = digitalio.Pull.UP

sw5 = digitalio.DigitalInOut(SW5_PIN)
sw5.direction = digitalio.Direction.INPUT
sw5.pull = digitalio.Pull.UP

sw6 = digitalio.DigitalInOut(SW6_PIN)
sw6.direction = digitalio.Direction.INPUT
sw6.pull = digitalio.Pull.UP

sw7 = digitalio.DigitalInOut(SW7_PIN)
sw7.direction = digitalio.Direction.INPUT
sw7.pull = digitalio.Pull.UP

sw8 = digitalio.DigitalInOut(SW8_PIN)
sw8.direction = digitalio.Direction.INPUT
sw8.pull = digitalio.Pull.UP

sw9 = digitalio.DigitalInOut(SW9_PIN)
sw9.direction = digitalio.Direction.INPUT
sw9.pull = digitalio.Pull.UP

sw10 = digitalio.DigitalInOut(SW10_PIN)
sw10.direction = digitalio.Direction.INPUT
sw10.pull = digitalio.Pull.UP

sw11 = digitalio.DigitalInOut(SW11_PIN)
sw11.direction = digitalio.Direction.INPUT
sw11.pull = digitalio.Pull.UP

sw12 = digitalio.DigitalInOut(SW12_PIN)
sw12.direction = digitalio.Direction.INPUT
sw12.pull = digitalio.Pull.UP


def led():
    if (currentMode == 0):
        led2.value = False
        led0.value = True
        
    elif (currentMode == 1):
         led0.value = False
         led1.value = True
        
    elif (currentMode == 2):
         led1.value = False
         led2.value = True

def millis():
    return time.monotonic() * 1000

def ccw():
    print("反時計回り")
    
    if (currentMode == 0): # 画面縮小
        keyboard.press(Keycode.CONTROL)
        mouse.move(wheel=-1)
        keyboard.release(Keycode.CONTROL)
        
    elif(currentMode == 1):   # ボリューム下げる
        cc.send(ConsumerControlCode.VOLUME_DECREMENT)
        
    elif(currentMode ==2):    # 水平スクロール右
        keyboard.press(Keycode.SHIFT)
        mouse.move(wheel=-1)
        keyboard.release(Keycode.SHIFT)
        
def cw():
    print("時計回り")
    global three
    
    if (currentMode == 0):     # 画面拡大
        keyboard.press(Keycode.CONTROL)              
        mouse.move(wheel=1)
        keyboard.release(Keycode.CONTROL)
        
    elif(currentMode == 1):     # ボリューム上げる
        cc.send(ConsumerControlCode.VOLUME_INCREMENT)
        
    elif(currentMode ==2):     # 水平スクロール左
        keyboard.press(Keycode.SHIFT)
        mouse.move(wheel=1)
        keyboard.release(Keycode.SHIFT)

def sw1f():
    global one
    global two
    if (currentMode == 0):     # ALT
        keyboard.press(Keycode.ALT)   
        keyboard.press(Keycode.F1)           
        keyboard.release_all()         
        one = 'MODE:ALT'
        two = 'Key:F1'
        
    elif(currentMode == 1):     # Ctrl
        keyboard.press(Keycode.LEFT_CONTROL)   
        keyboard.press(Keycode.F1)           
        keyboard.release_all()        
        one = 'MODE:Ctrl'
        two = 'Key:F1'
        
    elif(currentMode ==2):     # Skype Mute ON/OFF
        keyboard.press(Keycode.LEFT_CONTROL)
        keyboard.press(Keycode.M)
        keyboard.release_all()
        one = 'MODE:Skype'
        two = 'Key:Mute ON/OFF'

def sw2f():
    global one
    global two
    if (currentMode == 0):     # ALT
        keyboard.press(Keycode.ALT)   
        keyboard.press(Keycode.F2)           
        keyboard.release_all()    
        one = 'MODE:ALT'
        two = 'Key:F2'
        
    elif(currentMode == 1):     # Ctrl
        keyboard.press(Keycode.LEFT_CONTROL)   
        keyboard.press(Keycode.F2)           
        keyboard.release_all()    
        one = 'MODE:Ctrl'
        two = 'Key:F2'
        
    elif(currentMode ==2):     # Skype Movie ON/OFF
        keyboard.press(Keycode.SHIFT)
        keyboard.press(Keycode.LEFT_CONTROL)
        keyboard.press(Keycode.K)
        keyboard.release_all()
        one = 'MODE:Skype'
        two = 'Key:Movie ON/OFF'

def sw3f():
    global one
    global two
    if (currentMode == 0):     # ALT
        keyboard.press(Keycode.ALT)   
        keyboard.press(Keycode.F3)           
        keyboard.release_all()    
        one = 'MODE:ALT'
        two = 'Key:F3'
        
    elif(currentMode == 1):     # Ctrl
        keyboard.press(Keycode.LEFT_CONTROL)   
        keyboard.press(Keycode.F3)           
        keyboard.release_all()    
        one = 'MODE:Ctrl'
        two = 'Key:F3'
        
    elif(currentMode ==2):     # スナップショット
        keyboard.press(Keycode.SHIFT)
        keyboard.press(Keycode.S)
        keyboard.release_all()
        one = 'MODE:Skype'
        two = 'Key:SnapShot'
    
def sw4f():
    global one
    global two
    if (currentMode == 0):     # ALT
        keyboard.press(Keycode.ALT)   
        keyboard.press(Keycode.F4)           
        keyboard.release_all()    
        one = 'MODE:ALT'
        two = 'Key:F4'
        
    elif(currentMode == 1):     # Ctrl
        keyboard.press(Keycode.LEFT_CONTROL)   
        keyboard.press(Keycode.F4)           
        keyboard.release_all()    
        one = 'MODE:Ctrl'
        two = 'Key:F4'
        
    elif(currentMode ==2):     # ファイル送信
        keyboard.press(Keycode.LEFT_CONTROL)
        keyboard.press(Keycode.SHIFT)
        keyboard.press(Keycode.F)
        keyboard.release_all()    
        one = 'MODE:Skype'
        two = 'Key:Send File'

def sw5f():
    global one
    global two
    if (currentMode == 0):     # ALT
        keyboard.press(Keycode.ALT)   
        keyboard.press(Keycode.F5)           
        keyboard.release_all()
        one = 'MODE:ALT'
        two = 'Key:F5'
        
    elif(currentMode == 1):     # Ctrl
        keyboard.press(Keycode.LEFT_CONTROL)   
        keyboard.press(Keycode.F5)           
        keyboard.release_all()
        one = 'MODE:Ctrl'
        two = 'Key:F5'
        
    elif(currentMode ==2):     # DISCORD MUTE
        keyboard.press(Keycode.LEFT_CONTROL)
        keyboard.press(Keycode.SHIFT)
        keyboard.press(Keycode.M)
        keyboard.release_all()
        one = 'MODE:DisCord'
        two = 'Key:Mute ON/OFF'
        
def sw6f():
    global one
    global two
    if (currentMode == 0):     # ALT
        keyboard.press(Keycode.ALT)   
        keyboard.press(Keycode.F6)           
        keyboard.release_all()
        one = 'MODE:ALT'
        two = 'Key:F6'
        
    elif(currentMode == 1):     # Ctrl
        keyboard.press(Keycode.LEFT_CONTROL)   
        keyboard.press(Keycode.F6)           
        keyboard.release_all()
        one = 'MODE:Ctrl'
        two = 'Key:F6'
        
    elif(currentMode ==2):     # 未読チャンネルを切り替えます
        keyboard.press(Keycode.ALT)
        keyboard.press(Keycode.SHIFT)
        keyboard.press(Keycode.UP_ARROW)
        keyboard.release_all()
        one = 'MODE:DisCord'
        two = 'Unread Channel'
        
def sw7f():
    global one
    global two
    if (currentMode == 0):     # ALT
        keyboard.press(Keycode.ALT)   
        keyboard.press(Keycode.F7)           
        keyboard.release_all()
        one = 'MODE:ALT'
        two = 'Key:F7'
        
    elif(currentMode == 1):     # Ctrl
        keyboard.press(Keycode.LEFT_CONTROL)   
        keyboard.press(Keycode.F7)           
        keyboard.release_all()
        one = 'MODE:Ctrl'
        two = 'Key:F7'
        
    elif(currentMode ==2):     # DISCORD 未読チャンネルを切り替えます
        keyboard.press(Keycode.ALT)
        keyboard.press(Keycode.SHIFT)
        keyboard.press(Keycode.DOWN_ARROW)
        keyboard.release_all()
        one = 'MODE:DisCord'
        two = 'Unread Channel'
        
def sw8f():
    global one
    global two
    if (currentMode == 0):     # ALT
        keyboard.press(Keycode.ALT)   
        keyboard.press(Keycode.F8)           
        keyboard.release_all()
        one = 'MODE:ALT'
        two = 'Key:F8'
        
    elif(currentMode == 1):     # Ctrl
        keyboard.press(Keycode.LEFT_CONTROL)   
        keyboard.press(Keycode.F8)           
        keyboard.release_all()
        one = 'MODE:Ctrl'
        two = 'Key:F8'
        
    elif(currentMode ==2):     # 一番古い未読メッセージ
        keyboard.press(Keycode.SHIFT)
        keyboard.press(Keycode.PAGE_UP)
        keyboard.release_all()
        one = 'MODE:DisCord'
        two = 'Unread Massage'
        
def sw9f():
    global one
    global two
    if (currentMode == 0):     # ALT
        keyboard.press(Keycode.ALT)   
        keyboard.press(Keycode.F9)           
        keyboard.release_all()
        one = 'MODE:ALT'
        two = 'Key:F9'
        
    elif(currentMode == 1):     # Ctrl
        keyboard.press(Keycode.LEFT_CONTROL)   
        keyboard.press(Keycode.F9)           
        keyboard.release_all()
        one = 'MODE:Ctrl'
        two = 'Key:F9'
        
    elif(currentMode ==2):     # Windows ショートカット 1
        keyboard.press(Keycode.WINDOWS)
        keyboard.press(Keycode.ONE)
        keyboard.release_all()
        one = 'MODE:Windows'
        two = 'Short Cut 1'
        
def sw10f():
    global one
    global two
    if (currentMode == 0):     # ALT
        keyboard.press(Keycode.ALT)   
        keyboard.press(Keycode.F10)           
        keyboard.release_all()
        one = 'MODE:ALT'
        two = 'Key:F10'
        
    elif(currentMode == 1):     # Ctrl
        keyboard.press(Keycode.LEFT_CONTROL)   
        keyboard.press(Keycode.F10)           
        keyboard.release_all()
        one = 'MODE:Ctrl'
        two = 'Key:F10'
        
    elif(currentMode ==2):     # Windows ショートカット 2
        keyboard.press(Keycode.WINDOWS)
        keyboard.press(Keycode.TWO)
        keyboard.release_all()
        one = 'MODE:Windows'
        two = 'Short Cut 2'
        
def sw11f():
    global one
    global two
    if (currentMode == 0):     # ALT
        keyboard.press(Keycode.ALT)   
        keyboard.press(Keycode.F11)           
        keyboard.release_all()
        one = 'MODE:ALT'
        two = 'Key:F11'
        
    elif(currentMode == 1):     # Ctrl
        keyboard.press(Keycode.LEFT_CONTROL)   
        keyboard.press(Keycode.F11)           
        keyboard.release_all()
        one = 'MODE:Ctrl'
        two = 'Key:F11'
        
    elif(currentMode ==2):     # Windows ショートカット 3
        keyboard.press(Keycode.WINDOWS)
        keyboard.press(Keycode.THREE)
        keyboard.release_all()
        one = 'MODE:Windows'
        two = 'Short Cut 3'
        
def sw12f():
    global one
    global two
    if (currentMode == 0):     # ALT
        keyboard.press(Keycode.ALT)   
        keyboard.press(Keycode.F12)           
        keyboard.release_all()
        one = 'MODE:ALT'
        two = 'Key:F12'
        
    elif(currentMode == 1):     # Ctrl
        keyboard.press(Keycode.LEFT_CONTROL)   
        keyboard.press(Keycode.F12)           
        keyboard.release_all()
        one = 'MODE:Ctrl'
        two = 'Key:F12'
        
    elif(currentMode ==2):     # Windows ショートカット 4
        keyboard.press(Keycode.WINDOWS)
        keyboard.press(Keycode.FOUR)
        keyboard.release_all()
        one = 'MODE:Windows'
        two = 'Short Cut 4'
              
         
def long_press():
    #スリープ: Ctrl+Shift+Alt+End
    keyboard.press(Keycode.CONTROL, Keycode.SHIFT,Keycode.ALT,Keycode.END)
    keyboard.release_all()

def displayTxT():
    display.fill(0)
    txt = 'Key Pro system!'
    display.text(txt, 5, 10, 1)
    txt = 'CPU Temp is ' + str(round(microcontroller.cpu.temperature,1)) + 'C'
    display.text(txt, 5, 20, 1)
    txt = one
    display.text(txt, 5, 30, 1)
    txt = two
    display.text(txt, 5, 40, 1)
    txt = 'Rotaly = ' + three[currentMode]
    display.text(txt, 5, 50, 1)
    display.show()

while(1):
    
    led()
    position = enc.position     
    keylist = [sw1.value,
           sw2.value,
           sw3.value,
           sw4.value,
           sw5.value,
           sw6.value,
           sw7.value,
           sw8.value,
           sw9.value,
           sw10.value,
           sw11.value,
           sw12.value]
    
    if  position != last_position:
        print(position)
        print(last_position)
        displayTxT()
        if(last_position < position): cw() else: ccw() last_position = position if False in keylist: print(keylist.index(False) + 1) key = keylist.index(False) + 1 globals()['sw'+str(key)+'f']() displayTxT() continue if (sw.value == 0): pressTime = millis() longPress = False while(sw.value == 0): if(millis() - pressTime > 1000 and not longPress):
            print("longPress")
            longPress = True
            long_press()               

        if (not longPress):
            currentMode += 1
            currentMode %= totalMode
            print("Mode: " + str(currentMode))
        
        displayTxT()
Makoto
Makoto

def sw2fとかの中身を好きに変えればいいんだよね?

ジェームズ
ジェームズ

そうです。
使いたいキーはここを見るとわかりやすいですよ

Makoto
Makoto

おおー
マウス操作も行けるんだね!
自作トラックボールとかも作れそう>ω<

ジェームズ
ジェームズ

そうですねトラックボール付きのキーボードとか夢がありますね

Makoto
Makoto

わーいいなー!
つくってみたい!

コメント

Ads Blocker Image Powered by Code Help Pro

広告ブロックを検知しました!

広告ブロック解除をお願い致します!

このサイトは広告収入だけで成り立っているため

ご協力をお願い致します!

タイトルとURLをコピーしました