8. pyboard を USB マウスとして動作させる

pyboard は USB デバイスであり、デフォルトの USB フラッシュドライブの代わりにマウスとして機能するように設定できます。

これを行うには、最初に boot.py ファイルを編集して、USB 構成を変更する必要があります。まだ boot.py を一度も編集してない場合は、次のような内容になっています:

# boot.py -- run on boot-up
# can run arbitrary Python, but best to keep it minimal

import pyb
#pyb.main('main.py') # main script to run after this one
#pyb.usb_mode('VCP+MSC') # act as a serial and a storage device
#pyb.usb_mode('VCP+HID') # act as a serial device and a mouse

マウスモードを有効にするには、ファイルの最後の行のコメントを外して、次のようにします:

pyb.usb_mode('VCP+HID') # act as a serial device and a mouse

すでに boot.py ファイルを変更していた場合、動作させるのに必要な最小限のコードは次のとおりです:

import pyb
pyb.usb_mode('VCP+HID')

これは、起動時に VCP (仮想COMポート、すなわちシリアルポート)および HID (Human Interface Device、ここではマウス) USB デバイスとして構成するように pyboard に指示します。

pyboard ドライブを取り出し/アンマウントし、RST スイッチを使用してリセットします。これで PC は pyboard をマウスとして検出するはずです!

8.1. 手動でマウスイベントを送信する

py マウスに何かをさせるには、マウスイベントを PC に送る必要があります。最初に REPL プロンプトを使って手動で行います。シリアルプログラムを使用して pyboard に接続し、次のように入力します:

>>> hid = pyb.USB_HID()
>>> hid.send((0, 10, 0, 0))

あなたのマウスは10ピクセル右に移動するはずです! 上のコマンドでは、ボタンステータス、x、y、スクロールの4つの情報を送信しています。数字 10 は、マウスが x 方向に 10 ピクセル移動することを PC に伝えています。

マウスを左右に振動させてみましょう:

>>> import math
>>> def osc(n, d):
...   for i in range(n):
...     hid.send((0, int(20 * math.sin(i / 10)), 0, 0))
...     pyb.delay(d)
...
>>> osc(100, 50)

関数 osc 第1引数は送信するマウスイベントの数であり、第2引数はイベント間の遅延(ミリ秒単位)です。違う値に変えて遊んでみてください。

練習問題: マウスを円状に回してください。

8.2. 加速度センサーでマウス操作する

今度は、加速度センサーを使って、マウスを pyboard の角度に基づいて移動させます。次のコードは、REPL プロンプトで直接入力することも、main.pyファイルに入れることもできます。ここでは、セーフモードに入る方法を学習するために main.py にコードを入れることにします。

現時点では、pyboard がシリアル USB デバイスと HID (マウス)として動作しています。したがって、ファイルシステムにアクセスして main.py ファイルを編集することはできません。

また、 boot.py も編集できないので、HID モードから抜け出して、USB ドライブが使える通常のモードに戻ることもできません...

これを回避するには セーフモード に入る必要があります。これは [セーフモードのチュートリアル](tut-reset)に説明されていますが、ここでも手順を示しておきます:

  1. USR スイッチを押し続けます。
  2. USR を押しながら、RST スイッチを押して放します。
  3. その後、LED が緑からオレンジ、緑+オレンジへ、そして元に戻るということを繰り返します。
  4. オレンジの LED だけが点灯 するまで USR を押し続け、USR スイッチを放します。
  5. オレンジの LED はすばやく4回点滅してから消灯します。
  6. これでセーフモードになりました。

セーフモードでは boot.pymain.py ファイルは実行されないので、pyboard はデフォルト設定で起動します。つまり、ファイルシステムにアクセスできるようになり(USBドライブが表示されます)、 main.py を編集できます。(main.py の編集を終えてから HID モードに戻したいので、boot.py はそのままの状態にしておきます。)

main.py に次のコードを書き込みます:

import pyb

switch = pyb.Switch()
accel = pyb.Accel()
hid = pyb.USB_HID()

while not switch():
    hid.send((0, accel.x(), accel.y(), 0))
    pyb.delay(20)

ファイルを保存し、pyboard ドライブの取り出し/アンマウントを行い、RST スイッチを使ってリセットします。これでマウスとして機能し、ボードの角度によってマウスが動きます。それを試してみて、さらにマウスを静かにできるかを確かめてください!

マウスの動きを止めるには、USR スイッチを押します。

y軸は反転していることに気づくでしょう。これは簡単に修正できます: 上記のコードの hid.send() のy座標の前にマイナス記号を付けるだけです。

8.3. pyboardを通常の状態に戻す

pyboard をそのままにしておくと、USB に繋ぐたびにマウスのように振る舞います。おそらくは通常の状態に戻したいと思うでしょう。これを行うには、最初にセーフモードに入り(上記参照)、 boot.py ファイルを編集する必要があります。boot.py ファイルの VCP+HID 設定の行をコメントアウト(該当行の先頭に # を置きます)。それは次のようになります:

#pyb.usb_mode('VCP+HID') # act as a serial device and a mouse

ファイルを保存し、ドライブの取り出し/アンマウント、および pyboard のリセットを行います。これで通常の動作モードに戻ります。