Trinket M0でWebブラウズを便利にする

y-sni.hatenablog.com

ハードウェアは前回と同じで, キーボードのふりをしてボタン操作でブラウザバック・上下スクロールができるようにします。

学び

ブラウザバックには0.2秒ほどスリープを入れないと戻りすぎた。 逆に上下スクロールは0.1秒毎にポーリングしないと遅すぎた。

懺悔

何も考えていないコピペだらけのクソコードでごめんなさい

参考

adafruit_hid.keycode — Adafruit HID Library 1.0 documentation

コード

from adafruit_hid.keyboard import Keyboard
from adafruit_hid.keycode import Keycode
from adafruit_hid.keyboard_layout_us import KeyboardLayoutUS
import board
import digitalio
import time

back = digitalio.DigitalInOut(board.D0)
back.direction = digitalio.Direction.INPUT
back.pull = digitalio.Pull.UP

up = digitalio.DigitalInOut(board.D4)
up.direction = digitalio.Direction.INPUT
up.pull = digitalio.Pull.UP

down = digitalio.DigitalInOut(board.D2)
down.direction = digitalio.Direction.INPUT
down.pull = digitalio.Pull.UP

kbd = Keyboard()
layout = KeyboardLayoutUS(kbd)

led = digitalio.DigitalInOut(board.D13)
led.direction = digitalio.Direction.OUTPUT

print("Waiting for button presses")

while True:
    if not back.value:
        print("back")
        led.value = True
        kbd.press(Keycode.ALT, Keycode.LEFT_ARROW)
        time.sleep(0.1)
        kbd.release_all()
        led.value = False
        time.sleep(0.2)
    
    if not up.value:
        print("up")
        led.value = True
        kbd.press(Keycode.UP_ARROW)
        kbd.release_all()
        led.value = False
    
    if not down.value:
        print("down")
        led.value = True
        kbd.press(Keycode.DOWN_ARROW)
        kbd.release_all()
        led.value = False
        
    time.sleep(0.1)

Trinket M0 でマウスを作る

正直, 購入事例が少なくてバグの解決策を見つけづらいことからTrinket M0を買ったことを後悔している。 (まあ後でProMicroを買うからええやろ)

コードの内容

上下(vertical)と左右(horizontal)それぞれ1ボタンで, リバースボタンが押されていないとき右上に, リバースボタンが押されると左下に移動する。

気づいたこと

正しいmain.pyが書き込まれているときは仕様通りに書き込みに応じて新しいmain.pyファイルが実行されるが, 誤ったmain.pyファイルを書き込んだ後はいくら書き換えても実行されない。エラーメッセージも表示されない。リセットボタンを押すしかない。

誤ったmain.pyファイルを書き込んだあとは, Blinkなどの確実に動くファイル(ライブラリを要求しないものがおすすめ)を書き込んでリセットボタンを押すと, 再度誤ったファイルを書き込んだときにエラーが表示されるようになる。

常にエラーメッセージが表示されるようになると嬉しいなあ。

コード

from adafruit_hid.mouse import Mouse
import board
import digitalio
import time

m = Mouse()

v = digitalio.DigitalInOut(board.D0)
h = digitalio.DigitalInOut(board.D4)
r = digitalio.DigitalInOut(board.D2)

buttons = [v, h, r]

for button in buttons:
    button.direction = digitalio.Direction.INPUT
    button.pull = digitalio.Pull.UP

print("Waiting for button presses")

while True:
    if not v.value:
        if r.value:
            print("UP")
            m.move(y=-10)
        else:
            print("DOWN")
            m.move(y=10)
    if not h.value:
        if r.value:
            print("RIGHT")
            m.move(x=+10)
        else:
            print("LEFT")
            m.move(x=-10)
    time.sleep(0.02)

マイコン(Adafruit Trinket M0)を買った

ずっとPythonでやってる。

顛末

キーボードを自作したくてパーツについて調べていたらProMicroに行き着き, キーボード自作は断念したもののマイコンを使いたくて仕方がなくなったのでマイコンを買った

感想

  • めっちゃ小さい
  • もうピンを付けずにそのまま圧電スピーカーをハンダ付けしてオルゴールにしたらええんちゃうかという気分
  • microUSBコネクタの抜き差しが怖い
  • 組み込まないならArduinoのほうが良さそう
    • 抜き差しで負荷がかからないUSB-Bを使っている
    • ブレッドボードに挿すよりも基板にメスコネクタが生えていたほうが配線楽だよね
    • GPIOの数が多い
  • 配線に気を使う
  • 3V(コイン電池)では動かない。基板の印刷には4〜6Vと書いてある

躓いた点と解決策

ブートローダーモードから出れない

ブートローダーを更新するためにリセットボタンをダブルクリックしてブートローダーモードにしたら, USBを挿し直そうとリセットボタンを押そうとブートローダーモードから出られなくなった。

Lastly, reload your code from Arduino or MakeCode or flash the latest CircuitPython core.

と書かれているとおり, Releases · adafruit/circuitpython · GitHub からCircuitPythonの実行環境(?)をダウンロードしてインストールしなおすと元通りPythonの実行環境になる。

コンソールを見れない

screen /dev/tty*しても terminated するだけで何も表示されない。sudoする必要があった。

ライブラリがない

CircuitPython PWM | Adafruit Trinket M0 | Adafruit Learning System にある simpleio を使った作例を試そうとしても, main.py を書いただけでは実行できない。

About CircuitPython Libraries | Adafruit Trinket M0 | Adafruit Learning System に書かれているとおり, lib/ にライブラリファイルを置く必要がある。デモプログラムに使用されているキーボード関係のライブラリは最初から入っている。

まとめ

  • ちゃんとドキュメントを読もう
  • ソフトウェア系の問題しか書いてないな

価値とは

1万5000円のキーボードが提供する価値は1万5000円のパソコンでは提供できない。

5000円のキーボードが提供する価値は5000円の傘では提供できない。

レッドブル2本(380円)が提供する価値は380円の牛丼では提供できない。

それぞれまた逆も然り。

別の事象と比較することは無意味である。

共通尺度としての価格なのだろうけど。

Magicforce smart 49key を使ってみて

他のキーボードを使うと困る点

  • fが-にならない
  • Tabの位置にCapsLockがある
  • BackSpaceの位置に\がある

キーボードの配列は統一しましょう

セルフ店舗いろいろ

動機

自分でカウンターに食事を取りに行くのは独特な経験なので, 東松のやで店員が運ぶようにするにはどうしたらいいのか考えたが, 現行方式では呼び出し番号と席番が紐付いていないため, ブロードキャストなしには配送できない。

セルフ方式いろいろ

マクドナルド

みんな大好きマクドナルド。

カウンターで購入後, 横で少し待つと出てくる。長時間待つことになる場合は番号札を渡され, 店員が番号をブロードキャストしながら配送する。

バーガーキング(フードコート内店舗を除く)も同じ。

フードコート

みんな大好き大型商業施設。

カウンターで購入すると音が鳴る番号札を渡され, 呼び出し音が鳴ると取りに行く。 セルフ松のやに近いね。

いきなりステーキ

みんな大好き格安ステーキ。

店員がいろいろするからセルフ方式とは言わなそう。

席に案内された後で, 席番を記した札を持って会計に向かう。 購入内容と席番が紐付いているから店員がブロードキャストなしに配送できる。

まとめ

フードコートに慣れた家族客には現行方式でも問題にならなそう。

ストライクの倒し方

知見

  • いわおとし/ストーンエッジゴローニャ1体とかえんほうしゃのブースター5体で倒せる
  • バンギラスはあくタイプだから相性が悪い
  • シザークロスは回避が難しいから, 1ゲージのオーバーヒートは向かない。かえんほうしゃのほうが強い。
  • ゴローニャが倒されるたびにげんきのかたまりで回復するやつをしようとしたが, 退場→再入場に40秒かかるので現実的でない。
    • ふつうに6体全部で戦ったほうがダメージがでかそう