【完走賞ゲット-2】ボタン搭載小型デバイスで作る簡易ワンボタンキーボード（Maker Nano RP2040 を利用）

## はじめに
こちらは、[完走賞ゲットのため小ネタを毎日投稿しようとチャレンジする Advent Calendar 2022](https://qiita.com/advent-calendar/2022/youtoy) の 2日目の記事です。

2022年のアドベントカレンダーシーズン、その初日は、以下 2記事の公開から始まりましたが、2日目も 2記事公開です。
- [【Processing 2022】@yuruyurau さんの #つぶやきProcessing のプログラムを短縮されてない #p5js のプログラムにした結果と過程の話 - Qiita](https://qiita.com/youtoy/items/263f407021c4b3003365)
- [【完走賞ゲット-1】p5.js Web Editor で Google Fonts の絵文字の Webフォントを利用する - Qiita](https://qiita.com/youtoy/items/34920d8a49f45653d77a)

2日目に、本記事以外で「[KDDI Engineer&Designer の Advent Calendar 2022](https://qiita.com/advent-calendar/2022/engineer-designer)」にも以下の記事を書きました（こちらの内容は、事前に用意を進めていたものがあったのですが、担当日の前夜から「OpenAI の ChatGPT」の話が出てきて Twitter上などが賑わっていたので ネタを急遽、変えて書きました」）。

●【KDDI Engineer&Designer】AI にブラウザ用の JavaScript のプログラムをいくつか作ってもらった話 ⇒ OpenAI の ChatGPT で生成されたプログラムを少し解析もしてみる - Qiita
　https://qiita.com/youtoy/items/8eacb1af28ac18301b74

## 本編
### 概要
今回の記事の概要について、まずは説明します。

#### 前置き
今回の内容は、ボタン 1つの簡易ワンボタンキーボードを扱う話です。
具体的には、以下の「Maker Nano RP2040」を使った内容です。

●Ｍａｋｅｒ　Ｎａｎｏ　ＲＰ２０４０: マイコン関連 秋月電子通商-電子部品・ネット通販
　https://akizukidenshi.com/catalog/g/gM-17242/

https://twitter.com/youtoy/status/1588738235681083392

上のツイートの写真にうつっている、紫色の箱・デバイスのほうです。

#### RP2040 について
今回のデバイスの名前にもついている「RP2040」というのは、Raspberry Pi財団が独自に設計したマイコンです。「Raspberry Pi Pico」というデバイスの名前を聞いたことがある方がいらっしゃるかもしれないですが、それに搭載されています。

●「Raspberry Pi Pico」が発売、独自開発の40nmマイコン「RP2040」を搭載：組み込み開発ニュース - MONOist
　https://monoist.itmedia.co.jp/mn/articles/2101/22/news059.html

この「RP2040」は、いわゆる自作キーボード用に使える機能を持っています。少し補足すると、一般的なキーボードと同じ HIDクラスのデバイスとして動作します。

#### 以前行った内容
この方向の話について、以前、類似デバイスの「Maker Pi RP2040」を使った内容を Qiita の記事にしていたことがありました。

●Maker Pi RP2040 をキーボードとして認識させてキー入力（Raspberry Pi Pico と同じ RP2040 を搭載したデバイス） - Qiita
　https://qiita.com/youtoy/items/3ad628354a64015a9cea

この時に利用した「Maker Pi RP2040」は、外部モジュールをいろいろつけるにはコネクタなどが多くて良いですが、一方で、今回のような用途にはそれらコネクト等を含む全体のサイズが大きすぎるという状態でした（※ 前に書いた記事に掲載している動画の 1つを掲載）。

https://twitter.com/youtoy/status/1480913063230713856

#### Maker Nano RP2040
ずいぶん前に上記のようなことをやって、時間がかなり経過したある日、秋葉原の[秋月電子](https://akizukidenshi.com/catalog/)を訪れた際、Maker Nano RP2040 よりかなり小型の「Maker Nano RP2040」を見かけました。

サイズ感・内蔵している機能的に、「これは簡易ワンボタンキーボードに最適！！」と思い、今回の内容を試してみようと思いました。

入手先についてですが、自分が秋月電子で買った後に、スイッチサイエンスのオンラインショップでも入手ができるようになったようでした。
　●Maker Nano RP2040 — スイッチサイエンス
　　https://www.switch-science.com/products/8351

### Maker Nano RP2040 をキーボードとして動作させる
それでは、実際に Maker Nano RP2040 をキーボードとして動作させるための手順を進めていくことにします。

基本的には、上でも少し情報を出していた[Maker Pi RP2040 を使った記事](https://qiita.com/youtoy/items/3ad628354a64015a9cea)の内容を踏襲します。

- 開発に用いる環境・言語
   - 言語： [CircuitPython](https://circuitpython.org/)
   - 環境： [Thonny](https://thonny.org/)

#### セットアップ
PC と USBケーブルでつないだところ、PC側でキーボードを認識したような表示が出たり、USB接続のドライブとしても見えたりしたので、そのまま CircuitPython での開発ができそうでした。
ちなみに、デフォルトで書きこまれているプログラムがあるようで、起動時に某有名ゲームの BGM の一部が鳴ったりします（※ 著作権とか大丈夫なのだろうか...、という感じもするもの）。

そのまま開発をしても良さそうですが、今回、セットアップの手順も試してみる意図で、以前の記事でも参照した以下の Raspberry Pi Pico用の手順でセットアップを進めておこうと思います（※ 今回用いるデバイスは、Raspberry Pi Pico ではないですが）。

●Raspberry Pi Pico で MicroPython その6 CircuitPythonの書き込みと動作確認 – 砂町技研
　https://krr910183393.wordpress.com/2021/02/24/raspberry-pi-pico-circuitpython-setup/

試してみたところ、今回の Maker Nano RP2040 を使った場合も、以前の Maker Pi RP2040 を使った時と同様に、特に大きな問題もなく進められました。この手順を終えた状態だと、CircuitPython で作ったプログラムを書き込めるようになっていると思います。

なお上記の手順内では、[Pico Download](https://circuitpython.org/board/raspberry_pi_pico/) からファームウェアをダウンロードして利用する形でした。Pico用のページにはなっていますが、そこで指定されたファームウェアでも問題なく動作しました。どうやら、[Maker Nano RP2040 Download](https://circuitpython.org/board/cytron_maker_nano_rp2040/) のページもあるものの、[Pico Download](https://circuitpython.org/board/raspberry_pi_pico/) と同じファームウェアをダウンロードすることになるようです。

#### プログラムを書き込む：その1
上記のセットアップの中の LED を点滅させるプログラムを動かします。
1点注意が必要そうなのが、 `led = digitalio.DigitalInOut(GP25)` の部分です。

Maker Nano RP2040 のボード上の LED に割り当てられた番号に、25番が含まれていなそうでした。
そのため、 `digitalio.DigitalInOut()` で指定する番号に関しては、0〜9 や 16〜19 といった、Maker Nano RP2040 のボード上の LED が割り当てられている番号を指定してください。以下は、19番を指定した例です。

```python
import digitalio
from board import *
import time
led = digitalio.DigitalInOut(GP19)
led.direction = digitalio.Direction.OUTPUT
while True:
    led.value = True
    time.sleep(0.1)
    led.value = False
    time.sleep(0.1)
```

プログラムを実行して、指定した LED が点滅するのを確認してください。

#### プログラムを書き込む：その2
次に、キーボードとして動作させるプログラムを書きこみます。
次のプログラムには、Adafruit_CircuitPython_HID という以下のライブラリが必要です。
　●adafruit/Adafruit_CircuitPython_HID: USB Human Interface Device drivers.
　　https://github.com/adafruit/Adafruit_CircuitPython_HID

上記のリポジトリのデータをダウンロードし、「Adafruit_CircuitPython_HID/adafruit_hid」フォルダを、Maker Nano RP2040  の「lib」フォルダにコピーします。
それから、以下のプログラムを実行してください。

```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)
```

それでは、PC側で文字入力を行える状態にしてから、Maker Nano RP2040上の GP20 のボタンを押してみてください。PC側で「abc」という文字列が入力されたのが確認できたかと思います。

あとは、自由に入力するキーをカスタマイズしてしまってください。
[自分の前回の記事](https://qiita.com/youtoy/items/3ad628354a64015a9cea)だと、Zoom のショートカットキーを入力するという内容も試していたりします。

## おわりに
これで無事、Maker Nano RP2040 を簡易なワンボタンキーボードとして扱えるようになりました。