【GW自由研究】Raspberry Pi Picoをスマートなキーパッドにする

作ったもの

github.com

目標

私は普段からテンキーにマクロを割り当ててゲームやプログラミングをしています。しかしどのキーにどのマクロが割り当てられているかわからなくなることもありました。 そこで目を付けたのがStream deckです。 ボタンには任意の画像が表示できるため、視認性が高く、まさに私の問題を解決しそうです。 しかし、多少高い(最近出たStream Deck Neoという機種は1.4万円する)のでGWの自由研究として似たものを作ろうと目標を立てました。

パーツ選定

今回の製作はマイコンボードとタッチディスプレイがあれば実現可能そうです。

今回はPCとUSBで接続してUSB Deviceとして動作するマイコンボードであれば問題ないはずです。 簡単な電子工作ではESP32シリーズが使われることが多いと思います。が、今回は手元にあるRaspberry pi picoを利用しようと思います。 ESP32に比べPico Wでなければ通信機能がない、SRAM容量が小さいなど問題はありますが、今回の製作ではあまり問題にならないと判断し採用しました。

ディスプレイは安価に手に入る適当なものを用意しました。

https://www.aliexpress.com/item/32985467436.html

3.5インチ TFT LCD, 480 x 320でStream deck程度の大きさなはずです。

設計

参考にしているStream deckではUSB HIDを利用してPCとマイコン間で通信しています。そのため今回の製作でも同様に通信するようにします。 また、購入したLCDはSPI接続なので、今回は以下のように接続します。

flowchart LR
  subgraph Display
    direction TB
    LCD
    Touch
  end

  PC <-->|USB HID| R[Raspberry Pi Pico] <-->|SPI| Display;

具体的な配線は以下のようになります。

ソフト

環境構築

Raspberry Pi Picoはpico-sdkというSDKを利用してC++によるプログラムの作成を行うことができます。 しかし、pico-sdkは事前準備が多く環境構築が大変なので、arduino-picoを利用します。 また簡単化のためにPlatform IO IDEを利用します。 docs.platformio.org

ライブラリ

arduino-picoにはAdafruit TinyUSB ArduinoというUSB HIDを簡単に利用するためのライブラリが同梱されているためこれを利用します。

github.com

また、LCDの表示にはTFT_eSPIを利用します。

github.com

またUSB HIDはホスト(PC)からの要求にすぐに応答しないとタイムアウトし、通信できなくなることがあります。そのためcore0はUSB HID、core1はTFT LCD(SPI)という風に処理を分離します。 USB HIDの通信内容はStream deckをnodejsを使って操作するライブラリを参考にしました。

github.com

このライブラリはホスト(PC)からデバイス(Stream deck)を操作するものなので、逆のことを行うUSB HIDデバイスを作成すれば互換のあるデバイスを作成できるはずです。

ハード

回路

今回はできる限りコンパクトにしようと考えていたのでLCDの基盤に直接Raspberry Pi Picoをはんだ付けします。 Raspberry Pi PicoのGNDと底面のねじ固定用(?)ホールの位置の塗装を以下のように削り、はんだ付けしました。 また配線は上記の通りに配線します。今回はUEW線0.12mmを主に利用しました。ただしこのLCDは最大で90mA利用すると書いているので、電流量が大きいと思われる部分にはAWG30のワイヤを利用しています。

ケース

ケースは3Dプリンタを用いて作成します。 Stream deck Neoのように角度を変更できると便利だと思ったので角度を変更できるスタンドを製作しました。

3Dプリンタは素材を積層する仕組みなので、隙間があると脱落したり印刷が失敗する可能性が大きくなります。そのため隙間を埋めるためのサポートが必要です。 隙間が広くサポートが多くなったり、隙間が狭く、積層した素材同士がくっついてしまうと可動部が動かなくなることもあるので注意が必要です。今回はノズルサイズである0.4mmを基準に隙間を作成しました。

完成

今後やりたいこと

USB以外のインターフェースの追加

2台のPCでディスプレイ/マウス/キーボードを共有するためにKVMスイッチを利用しています。ただし切り替えはボタンを押さなければならないので不便です。 これを今回製作したものにつなげてUSB HIDを通じて切り替えられるようにしたい。

LCDの大型化、高速化

今回はStreamdeckと同じサイズであろう3.5インチを採用しましたが、少し小さいように感じます。Stream deck plusに応用できそうな5インチにすれば完ぺきだったかもしれません。 LCDとの接続にはSPIを利用していますが、やはり少し画面の更新が遅いです。8bit pallalel, 16bit pallalelのようにさらに高速に更新できるインターフェースもあるので考慮するべきでした。

エンコーダーの対応

Streamdeck plusにはエンコーダーがあり、音量操作などが行えるようです。便利そう。 エンコーダーはGPIO割り込みを利用しないと、奇妙な動作になりやすいです。とはいえLCD SPIとUSBに加えてエンコーダーの割り込みが入ると少しめんどくさそうなので今回は実装しませんでした。

おわりに

モノはGW中に完成したものの、この記事はGW後に殴り書きしました。(さぼってただけ)

ソフトやケースのstlなどは記事上部のGitHubにあるので気になる方はそちらを参照ください。