Maker Pi RP2040 をキーボードとして認識させてキー入力（Raspberry Pi Pico と同じ RP2040 を搭載したデバイス）

このツイートに書いている流れから、今回の内容を試しました。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">え、今さら？<br>と言われそうですが、Raspberry Pi Pico をキーボードやマウスとして認識させられる、という話をはっきり認識したのが本日。<br><br>自作キーボードという方向ではなく、特定のキー押下を外部からの制御でやる、という方向で調べていたりした中での話。</p>&mdash; you (@youtoy) <a href="https://twitter.com/youtoy/status/1480878111734796293?ref_src=twsrc%5Etfw">January 11, 2022</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

## 今回使ったデバイスについて

今回使ったデバイスの「Maker Pi RP2040」は、Raspberry Pi Pico と「RP2040　を搭載」という点が共通しているデバイスです。
そして、大きさは Raspberry Pi Pico よりかなり大きくなりますが、一方で複数の LED やボタン、各種コネクタ等を標準搭載していたりします。
![それぞれのデバイス.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/1d6613c2-65df-faa2-242f-2ab2c2ddb5b8.jpeg)

自分は、以下のスイッチサイエンスさんのオンラインサイトで購入をしていました。

●Maker Pi RP2040 - スイッチサイエンス
　https://www.switch-science.com/catalog/7285/

## 今回の内容の実行手順
### 利用する言語
今回、開発に利用できる言語がいくつかある中で「CircuitPython」を使いました。
選定理由は、いろいろ下調べをした中で参考にしようと思った以下の記事で、CircuitPython が使われていたためです。

●Raspberry Pi Picoをカスタムキーボード化して「くぁｗせｄｒｆｔｇｙふじこｌｐ」キーボード爆誕！ - uepon日々の備忘録
　https://uepon.hatenadiary.com/entry/2021/06/10/225800
●RaspberryPiPico【ラズパイピコ】でキーボード操作？？ | ホビーハッピーブログ
　https://www.hobbyhappyblog.jp/raspberrypipico-keyboard

それと、MicroPython も軽く試したりなどしてみたのですが、CircuitPython のほうがプログラムを書きかえて動作させる部分の手順がシンプルになりそう、というのも理由の 1つでした。

### 利用する開発環境
開発環境には以下の「Thonny」を使います。

●Thonny, Python IDE for beginners
　https://thonny.org/

### セットアップ
それでは、以下のページの手順を参考にしながら、開発に使うアプリの Thonny で CircuitPython によるプログラミングが行えるような準備をしていきます。

●Raspberry Pi Pico で MicroPython その6 CircuitPythonの書き込みと動作確認 – 砂町技研
　https://krr910183393.wordpress.com/2021/02/24/raspberry-pi-pico-%E3%81%A7-micropython-%E3%81%9D%E3%81%AE6-circuitpython%E3%81%AE%E6%9B%B8%E3%81%8D%E8%BE%BC%E3%81%BF%E3%81%A8%E5%8B%95%E4%BD%9C%E7%A2%BA%E8%AA%8D/

プログラムの書き込みができる状態まで進められたら、あとはプログラムを書くだけです。

### お試し1：「ABC」という連続したキー入力
最初に試してみたプログラムを以下に示します。

```python
import board
import digitalio
import time
import usb_hid
from adafruit_hid.keyboard import Keyboard
from adafruit_hid.keycode import Keycode

led = digitalio.DigitalInOut(board.GP26)
led.direction = digitalio.Direction.OUTPUT
button = digitalio.DigitalInOut(board.GP20)
button.switch_to_input(pull=digitalio.Pull.DOWN)

keyboard = Keyboard(usb_hid.devices)

while True:
    if button.value==0:
        led.value = True
        keyboard.send(Keycode.A)
        keyboard.send(Keycode.B)
        keyboard.send(Keycode.C)
        time.sleep(0.2)
    else:       
        led.value = False
    time.sleep(0.1)
```

上記のプログラムでは、参考にした記事でも登場していた、以下の「Adafruit_CircuitPython_HID」をライブラリとして用いています。
　●adafruit/Adafruit_CircuitPython_HID: USB Human Interface Device drivers.
　　https://github.com/adafruit/Adafruit_CircuitPython_HID

実装した内容を動かしてみた時の様子を、動画にしていますので掲載します。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">Maker Pi RP2040上にあるボタンを押したら、「abc」というキー入力が発生するようにしてみたもの。<br><br>「Raspberry Pi Pico がキーボード・マウスとして動作させられるなら、Maker Pi RP2040 も大丈夫だろう」と思ってやってみたものですが、<br>30行にも満たない CircuitPython のプログラムで無事に動作！ <a href="https://t.co/f1lRqcc0b3">pic.twitter.com/f1lRqcc0b3</a></p>&mdash; you (@youtoy) <a href="https://twitter.com/youtoy/status/1480892995272863744?ref_src=twsrc%5Etfw">January 11, 2022</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

これは普通の HIDデバイスとして認識されるので、iPad につないぐとそのままキー入力が実行できたりもします。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">「仕組み上、そうなるよね」と予想はできてたけど、試してみた動画（何か活用できたりするかな...）。<br><br>iPad の USB変換アダプタ経由で、Maker Pi RP2040 を接続して、キーボードのキー入力をさせてみた。 <a href="https://t.co/0NXN9MsvuJ">pic.twitter.com/0NXN9MsvuJ</a></p>&mdash; you (@youtoy) <a href="https://twitter.com/youtoy/status/1480913063230713856?ref_src=twsrc%5Etfw">January 11, 2022</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

### お試し2： Zoomアプリのショートカットキー操作を実行
次に試したのは、以下のツイートにのせている内容です。
Zoom のカメラの ON/OFF操作を、Maker Pi RP2040 のボード上にあるボタンを押した際に実行させています。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">Maker Pi RP2040 をキーボード（HIDデバイス）として認識させる件の続き（CircuitPython で adafruit/Adafruit_CircuitPython_HID を利用）。<br><br>デバイス上のプログラマブルボタンを押した時に、Zoom のカメラの ON/OFF操作に割り当てられてるショートカットキーが実行されるようにしてみた！ <a href="https://t.co/UBh9HnCPpG">pic.twitter.com/UBh9HnCPpG</a></p>&mdash; you (@youtoy) <a href="https://twitter.com/youtoy/status/1480940040071294977?ref_src=twsrc%5Etfw">January 11, 2022</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

内容はキー操作の部分を書きかえただけ、という感じになるので、プログラムと簡単な補足のみを掲載するのみにします。

```python
import board
import digitalio
import time

import usb_hid
from adafruit_hid.keyboard import Keyboard
from adafruit_hid.keycode import Keycode

led0 = digitalio.DigitalInOut(board.GP0)
led0.direction = digitalio.Direction.OUTPUT
led1 = digitalio.DigitalInOut(board.GP1)
led1.direction = digitalio.Direction.OUTPUT

button0 = digitalio.DigitalInOut(board.GP20)
button0.switch_to_input(pull=digitalio.Pull.DOWN)
button1 = digitalio.DigitalInOut(board.GP21)
button1.switch_to_input(pull=digitalio.Pull.DOWN)

keyboard = Keyboard(usb_hid.devices)

while True:
    if button0.value==0:
        led0.value = True
        keyboard.send(Keycode.ALT, Keycode.V)
        time.sleep(0.2)
    else:       
        led0.value = False
    if button1.value==0:
        led1.value = True
        keyboard.send(Keycode.COMMAND, Keycode.SHIFT, Keycode.V)
        time.sleep(0.2)
    else:       
        led1.value = False
    time.sleep(0.1)
```

上記で設定したキーの組み合わせや、そのキーのプログラムでの記載方法に関する参照情報は、以下のツイートにあるとおりです。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">このあたりを見れば良さそう、かな。<a href="https://t.co/TsylrmWPMH">https://t.co/TsylrmWPMH</a> <a href="https://t.co/xIBEUDAkrL">pic.twitter.com/xIBEUDAkrL</a></p>&mdash; you (@youtoy) <a href="https://twitter.com/youtoy/status/1480934316515688448?ref_src=twsrc%5Etfw">January 11, 2022</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

## その他
以下は、Maker Pi RP2040 を用いた開発に関する話題のメモです。

### USBドライブとして認識されないようにする
以下は、動作用のプログラムを書き込んだ後でも、デバイスが USBドライブとしても認識される、という機能を止めるための話です。

●CircuitPythonで作ったデバイスの普段使いに邪魔なUSBドライブを無効化する（ただし7.0.0から） - あっきぃ日誌
　https://akkiesoft.hatenablog.jp/entry/20210816/1629108171

### Androidアプリで CircuitPython
以下は Maker Pi RP2040 を使った開発を、Androidアプリで行った話になるようです。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">Maker Pi RP2040 + Android CircuitPython Editor動いた😍 <a href="https://t.co/F34JMAL01C">pic.twitter.com/F34JMAL01C</a></p>&mdash; robo8080 (@robo8080) <a href="https://twitter.com/robo8080/status/1420933197127307270?ref_src=twsrc%5Etfw">July 30, 2021</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

### 今回の内容をビジュアルプログラミングで実現
今回の内容を、ビジュアルプログラミングを用いて実現できるかもしれない、という話です。

以下、自分のツイートや記事へのリンクです。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">ビジュアルプログラミングで Raspberry Pi Pico が扱える「Piper Make」を使う話。<br>RP2040 を搭載という点で Pico と共通の Maker Pi RP2040 も使えてしまったぞ！<br><br>ボタン・複数の LED、Groveコネクタを標準搭載していて安価なデバイスなので、楽しいことがいろいろ手軽に試せそう！！ <a href="https://t.co/xUlaA88sPO">pic.twitter.com/xUlaA88sPO</a></p>&mdash; you (@youtoy) <a href="https://twitter.com/youtoy/status/1483070012844015619?ref_src=twsrc%5Etfw">January 17, 2022</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

●ビジュアルプログラミングで Raspberry Pi Pico が扱える「Piper Make」を軽く試した時のメモ（Maker Pi RP2040 でも試す） - Qiita
　https://qiita.com/youtoy/items/974e7004e20806d0aef5