やりたいこと
仕事さぼっているのがばれないように、人が近づいたらゲーム画面をコマンドプロンプト等(なんとなく黒くてそれっぽい画面)に切り替えられるようにする
必要要素
- 人が近づいたことを検知する
- コマンドプロンプト画面でゲーム画面を隠す
実装方針
人が近づいたことを検知する
何かのセンサーで人が近づいたことを検知すればOK。手持ちセンサーでそこそこの距離を測れる超音波距離センサー(HC-SR04)があったのでそいつを利用。角度は15度とほぼ正面しか測れないけどとりあえずこいつで。
コマンドプロンプト画面でゲーム画面を隠す
キーボード入力をマイコン(Raspberry Pi PICO)で自動化する。ライブラリを使ったら簡単にできるらしいできた。
実装技術
Circuit PythonだとAdafruitのライブラリで超音波距離センサーとキーボード入力もそろっていたのでCircuit Pythonを使った。
開発環境(エディタ?)
最初はVS Codeで開発しようとしたけどPICO開発用のPICO-goが新しいVSCodeだと使えないのでメジャーどころのThonnyにした。
なお、こちらにあるようにVSCodeのバージョンを1.65.2に落としたら動くはず。(いったんうごいていたけど油断していたらVSCodeのバージョンアップ走っていて使えなくなっていたので面倒になった。)
また、こちらにあるようにForkされたPico-goをビルドしてもよい模様。
実装
Circuit Pythonのインストール
公式からダウンロードしてインストール。(参考)
コマンドプロンプト画面でゲーム画面を隠す
(ライブラリのインストール説明の都合でコマンドプロントから説明)
こちらを参考にHIDのライブラリをインストール。
Windowsでコマンドプロンプトを全画面起動するキー操作は以下。ついでになにかそれっぽい情報を出すためにDir結果も表示(実際に打つとわかりやすい)
- Windowsボタン(プログラムの検索画面を開く)
- “cmd”キー入力後 Enter (コマンドプロンプト起動)
- “dir” キー入力後Enter(Dir実行。ぱっとみそれっぽい情報を表示するため。)
- Alt押しながらEnter(コマンドプロンプト全画面か)
Windowsの反応時間を見なくてはいけないかもしれないのでちょいちょいスリープを入れているけど待ちが必要かはわからない。
なお、キーボードの種類指定できるけど日本語はなさげなので必要なら自分で書くか探さないといけない。
人が近づいたことを検知する
こちらからadafruit_hcsr04ライブラリをインストール。HIDの時と同じようにPICOのlibディレクトリにいれればよい。(adafruit_hcsr04.pyで最低限動くはず)
ハードとしてはPICOとhcsr04をジャンパーでつなぐ。
GP5とGP6はプログラムでGPIOピンなら任意指定に変更可能。ピンの役割はこちら
PICO | HCSR04 |
VBUS | vcc |
GND | gnd |
GP5 | trig |
GP6 | echo |
以下で値はとれる
import adafruit_hcsr04
sonar = adafruit_hcsr04.HCSR04(trigger_pin=board.GP5, echo_pin=board.GP6)
distance = sonar.distance
取り急ぎプログラムべたばり
何個もコマンドプロンプト立ち上げたり荒いけど使いながら調整する。プログラムもおもむろに書き直す。(HIDの試験用だったのでこのまま解体されるかもかも)
import microcontroller
import usb_hid
from adafruit_hid.keyboard import Keyboard
from adafruit_hid.keyboard_layout_us import KeyboardLayoutUS
from adafruit_hid.keycode import Keycode
import time
import board
import adafruit_hcsr04
keyboard = Keyboard(usb_hid.devices)
layout = KeyboardLayoutUS(keyboard)
sonar = adafruit_hcsr04.HCSR04(trigger_pin=board.GP5, echo_pin=board.GP6)
time.sleep(1)
while True:
try:
distance = sonar.distance
if distance < 150:
print('かくせ')
keyboard.send(Keycode.WINDOWS)
time.sleep(0.2)
layout.write('cmd')
time.sleep(0.1)
keyboard.send(Keycode.ENTER)
time.sleep(0.2)
layout.write('dir\n')
time.sleep(0.2)
keyboard.send(Keycode.ALT,Keycode.ENTER)
else:
print("OK")
except RuntimeError:
print("Retrying!")
time.sleep(2)