いろいろ至らない部分があるが、ほかにやりたいことがあるので、こちらはいったん終了。
作業メモだけ残す。
配線:
ボタン1~10をGNDと、GP0,GP1,GP2,GP3,GP4,GP28,GP27,GP26,GP5,GP6に接続
ロータリーエンコーダ1を、GP17,GND,GP16に接続。
ロータリーエンコーダ2を、GP19,GND,GP18に接続。
SSD1302の、GND,VCC,SCL,SDAを、GND,3.3V,GP15,GP14に接続。
ライブラリファイル配置。
PIのボタンを押しながらPCに接続する。
PIのドライブにflash_nuke.uf2をコピーしてストレージを初期化。
PIのドライブにadafruit-circuitpython-raspberry_pi_pico2-ja-9.2.3.uf2をコピーしてcircuitpy環境にする。
adafruit-circuitpython-bundle-py-20250201\examples\framebuf\font5x8.bin をcircuitpyドライブ直下にコピー。
adafruit-circuitpython-bundle-py-20250201\libの
adafruit_framebuf.mpy,adafruit_ssd1306.mpy,adafruit_hid/をcircuitpyのlibフォルダにコピー。
pico_MicroPython_misakifont-main.zip\pico_MicroPython_misakifont-main\の
misakifontフォルダをcircuitpyのlibフォルダにコピー。
mode.iniをcircuitpyドライブ直下に作成。内容は0の1バイトのみ。
circuitpyドライブ直下のboot.pyを以下の内容に差し替える。
import os
import storage
import board
import digitalio
switch = digitalio.DigitalInOut(board.GP6)
switch.direction = digitalio.Direction.INPUT
switch.pull = digitalio.Pull.UP
if switch.value:
#NormalMode
storage.disable_usb_drive()
usb_cdc.disable()
else :
#Maintenance
pass
circuitpyドライブ直下のcode.pyを以下の内容に差し替える。
import digitalio
import busio
import adafruit_ssd1306
import time
import usb_hid
import json
from board import *
from adafruit_hid.keyboard import Keyboard
from adafruit_hid.keyboard import Keycode
from adafruit_hid.keyboard_layout_us import KeyboardLayoutUS
from adafruit_hid.consumer_control import ConsumerControl
from adafruit_hid.consumer_control_code import ConsumerControlCode
from adafruit_hid.mouse import Mouse
from misakifont import MisakiFont
i2c = busio.I2C(GP15, GP14)
display = adafruit_ssd1306.SSD1306_I2C(128, 64, i2c, addr=0x3C)
mode=0
try:
with open('mode.ini', 'r') as file:
mode=int(file.read())
with open('mode.ini', 'w') as file:
file.write("{}".format(mode))
except Exception as e:
display.text("MAINTENANCE MODE", 16, 30, True, font_name="font5x8.bin", size=1)
display.show()
# raise e
cc = ConsumerControl(usb_hid.devices)
keyboard = Keyboard(usb_hid.devices)
layout=KeyboardLayoutUS(keyboard)
mouse = Mouse(usb_hid.devices)
s1 = digitalio.DigitalInOut(GP17)
s1.direction = digitalio.Direction.INPUT
s1.pull = digitalio.Pull.UP
s2 = digitalio.DigitalInOut(GP16)
s2.direction = digitalio.Direction.INPUT
s2.pull = digitalio.Pull.UP
n_s1=o_s1=s1.value
n_s2=o_s2=s2.value
s3 = digitalio.DigitalInOut(GP19)
s3.direction = digitalio.Direction.INPUT
s3.pull = digitalio.Pull.UP
s4 = digitalio.DigitalInOut(GP18)
s4.direction = digitalio.Direction.INPUT
s4.pull = digitalio.Pull.UP
n_s3=o_s3=s3.value
n_s4=o_s4=s4.value
mf = MisakiFont()
sw=[]
n_sws=[True,True,True,True,True,True,True,True,True,True]
o_sws=[True,True,True,True,True,True,True,True,True,True]
isDisplay=False
def show_bitmap(x,y,fd):
for row in range(0,7):
for col in range(0,7):
display.pixel(x+col,y+row,1 if (0x80>>col) & fd[row] else 0)
def DisplayMenu(menuNo):
global isDisplay,strs,i2c,display
i2c.deinit()
i2c = busio.I2C(GP15, GP14)
display = adafruit_ssd1306.SSD1306_I2C(128, 64, i2c, addr=0x3C)
display.fill(0) # 表示内容消去
y=1
for str in strs[menuNo]:
i=0
for c in str:
d = mf.font(ord(c))
show_bitmap(i,y,d)
i+=8
y+=10
display.show()
isDisplay=True
strs=(
("――モード1 スタンダード――",
"1.コピー 2.カット", #Ctrl+C,Ctrl+X
"3.はりつけ4.すべてせんたく", #Ctrl+V,Ctrl+A
"5.やり直し6.再実行", #Ctrl+Z,Ctrl+Y
"7.デスク 8.ウィンドウ閉じる", #Win+D,Ctrl+W
"上ボリューム下Ctrl+ホイール",),
("――モード2 YouTube――",
"1.停止再生 2.ミュート", #k,m
"3.10秒進む4.10秒もどる", #l,j
"5.前フレーム 6.次フレーム", #.,,
"7.全画面8.小ウィンドウ", #f,i
"上.ボリューム 下.明るさ",),
("――モード3 Winキー ――",
"1.ゲームバー 2.文字起こし", #G,H
"3.設定画面 4.Winロック", #I,L
"5.画面設定6.クリップりれき", #P,V
"7.拡大表示 8.縮小表示", #+,-
"上マウス左右 下マウス上下",),
("――モード4 メッセージ送信 ――",
"1.Hello 2.Bye",
"3.OK 4.NG",
"5.login 6.logout",
"7.prev 8.next",
"上マウス左右 下マウス上下",),
)
#command 1:kbd.press&release,2:cc.press&release,3:layout.write,4:Mouse.X,5:Mouse.Y,6:MouseWheel,7:Ctrl+MouseWheel,8:MenuChange,9:MenuDisplayOn/OFF
btn_cmds=((
(1,(Keycode.LEFT_CONTROL,Keycode.C,)),(1,(Keycode.LEFT_CONTROL,Keycode.X,)),
(1,(Keycode.LEFT_CONTROL,Keycode.V,)),(1,(Keycode.LEFT_CONTROL,Keycode.A,)),
(1,(Keycode.LEFT_CONTROL,Keycode.Z,)),(1,(Keycode.LEFT_CONTROL,Keycode.Y,)),
(1,(Keycode.WINDOWS,Keycode.D,)),(1,(Keycode.LEFT_CONTROL,Keycode.W,)),
(8,),(9,)),
(
(1,(Keycode.K,)),(1,(Keycode.M,)),(1,(Keycode.L,)),(1,(Keycode.J,)),
(1,(Keycode.PERIOD,)),(1,(Keycode.COMMA,)),(1,(Keycode.F,)),(1,(Keycode.I,)),
(8,),(9,)),
(
(1,(Keycode.WINDOWS,Keycode.G,)),(1,(Keycode.WINDOWS,Keycode.H,)),(1,(Keycode.WINDOWS,Keycode.I,)),(1,(Keycode.WINDOWS,Keycode.L,)),
(1,(Keycode.WINDOWS,Keycode.P,)),(1,(Keycode.WINDOWS,Keycode.V,)),(1,(Keycode.WINDOWS,Keycode.KEYPAD_PLUS,)),(1,(Keycode.WINDOWS,Keycode.KEYPAD_MINUS,)),
(8,),(9,)),
(
(3,"Hello"),(3,"Bye"),(3,"OK"),(3,"NG"),(3,"login"),(3,"logout"),(3,"prev"),(3,"next"),(8,),(9,))
)
#1:NormalWheel,2:Ctrl+Wheel,3:Volume,4:Brightness,5:MouseX,6:MouseY
rotally_cmds=((3,2),(3,4),(5,6),(5,6))
def buttonAction(button):
global mode
global isDisplay
global btn_cmds
global display
global keyboard,cc,layout
if btn_cmds[mode][button][0] == 1:
keyboard.press(*(btn_cmds[mode][button][1]))
keyboard.release(*(btn_cmds[mode][button][1]))
elif btn_cmds[mode][button][0] == 2:
cc.press(*(btn_cmds[mode][button][1]))
cc.release(*(btn_cmds[mode][button][1]))
elif btn_cmds[mode][button][0] == 3:
layout.write(btn_cmds[mode][button][1])
elif btn_cmds[mode][button][0] == 8:
mode= (mode +1 )%4
DisplayMenu(mode)
with open('mode.ini', 'w') as file:
file.write("{}".format(mode))
elif btn_cmds[mode][button][0] == 9:
if isDisplay :
display.fill(0)
display.show()
isDisplay=False
else :
DisplayMenu(mode)
#1:NormalWheel,2:Ctrl+Wheel,3:Volume,4:Brightness,5:MouseX,6:MouseY
def rotallyAction(kind,direction):
global mode
global rotally_cmds
global keyboard,cc,mouse
if rotally_cmds[mode][kind] == 1:
mouse.move(0,0,direction)
elif rotally_cmds[mode][kind] == 2:
keyboard.press(Keycode.LEFT_CONTROL)
mouse.move(0,0,direction)
keyboard.release(Keycode.LEFT_CONTROL)
elif rotally_cmds[mode][kind] == 3:
if direction > 0 :
cc.send(ConsumerControlCode.VOLUME_INCREMENT)
else :
cc.send(ConsumerControlCode.VOLUME_DECREMENT)
elif rotally_cmds[mode][kind] == 4:
if direction > 0 :
cc.send(ConsumerControlCode.BRIGHTNESS_INCREMENT)
else :
cc.send(ConsumerControlCode.BRIGHTNESS_DECREMENT)
elif rotally_cmds[mode][kind] == 5:
mouse.move(direction,0,0)
elif rotally_cmds[mode][kind] == 6:
mouse.move(0,direction,0)
for _gpio in GP0,GP1,GP2,GP3,GP4,GP28,GP27,GP26,GP5,GP6:
s = digitalio.DigitalInOut(_gpio)
s.direction = digitalio.Direction.INPUT
s.pull = digitalio.Pull.UP
sw.append(s)
try:
while True:
nn_s1 , nn_s2= s1.value , s2.value
if (nn_s1 != n_s1 or nn_s2 != n_s2) :
n_s1,n_s2 =nn_s1,nn_s2
elif(n_s1 != o_s1 or n_s2 != o_s2) :
if n_s1 ^ o_s2 == 0 :
rotallyAction(0,1)
else:
rotallyAction(0,-1)
o_s1,o_s2=n_s1,n_s2
nn_s3 , nn_s4= s3.value , s4.value
if (nn_s3 != n_s3 or nn_s4 != n_s4) :
n_s3,n_s4 =nn_s3,nn_s4
elif(n_s3 != o_s3 or n_s4 != o_s4) :
if n_s3 ^ o_s4 == 0 :
rotallyAction(1,1)
else:
rotallyAction(1,-1)
o_s3,o_s4=n_s3,n_s4
for i in range(10):
n_sws[i] = sw[i].value
if ((o_sws[i]==True) and (n_sws[i]==False)):
buttonAction(i)
o_sws[i]=n_sws[i]
time.sleep(0.0002)
except KeyboardInterrupt:
# raise
pass
except Exception as e:
pass
2025年3月1日土曜日
picoのHIDデバイス化備忘録
登録:
コメントの投稿 (Atom)
0 件のコメント:
コメントを投稿