この記事では、右利きの方に配慮し「左手デバイス」という表現は最低限使用しておりません。「マクロパッド」と「左手デバイス」は同じモノです。
はじめに
こんにちは、@Log_ignoreです。
この世の中には、日頃の生活をちょっとだけ便利にするモノがあったりしますよね。
その一つが、「マクロパッド(片手デバイス)」です。
アリエク探索をしていると安くて怪しいものがたくさん...
安心安全Amazonを見ていればお高いものもぎょうさん。
しがない中学生には3000円など大金なんです。
と、半ば諦めつつネットの大海に潜っていると...
Raspberry Pi Picoでマクロパッドが自作できるらしい!
ガジェット好きの私にはたまらない話です。
電子工作ができるし実用性もある!やるしかないですよ。
私が見つけたのはこの記事でした。@ysk1025さん、ありがとう。
この記事にも元記事があるらしいのでそれを貼っておきます。(英語なので注意)
この記事は上2つとほぼ同じ、上2つとの違いは写真があるかないかぐらいです。
(#1は知識編ということで説明がメインなので写真は少ないです。)
分かりやすそうな方を読んでいただいて。
最後に留意点です。
この計画は記事の制作と同時進行で進んでいるため、更新が不定期になります。
そもそもRaspberry Piって?
Raspberry Piとは、学校でのIT教育の推進を目的として活動している、
イギリスの団体「Raspberry Pi財団」が開発しているコンピューターシリーズです。
略して「ラズパイ」と呼ばれることもあります。
一般的にRaspberry Piと言うと、Raspberry Pi Zeroから5までの
「シングルボードコンピューター」を指すことが多く、
これらは独自開発のLinuxディストリビューションである
「Raspberry Pi OS」が公式にサポートされています。
また、Raspberry Pi OS以外にも、UbuntuやKali Linux、
Linux MintなどのLinuxディストリビューションを動かすこともできます。
その一方で、今回で使用する「Raspberry Pi Pico」シリーズは、
上のラズパイとは異なり、マイコン(マイクロコントローラー)に分類されます。
Picoシリーズには、Pico、Pico 2、無線通信に対応したPico W、
Pico 2 Wの4種類があります。
PicoシリーズではLinuxなどのOSは動作しませんが、
GPIOを直接扱えるため、電子工作や自作デバイスに非常に向いています。
※販売店(スイッチサイエンスなど)では、GPIOピンにあらかじめ
ヘッダが取り付けられた「Pico H」「Pico WH」「Pico 2 H」
「Pico 2 WH」なども販売されています。
#1で使用するもの
・Raspberry Pi Pico(1)
・USB micro B to A 変換ケーブル(PCとPicoの接続用、データ通信対応のもの)
そういやPicoなら家に在庫あったよな〜って探したらPico WHが出てきました。
無線機能もヘッダも今回いらないんですよね。
逆にヘッダあったら筐体に収まらないかもしれない。
(しかも中のコードを見るに過去の自分がマウスジグラー化してたっぽいです)
新しくPicoを調達するかは検討します。
PicoはWとか2とか2Wとかでもいいですがオーバースペックなのは変わりません。
間違ってZeroを買わないことだけには注意してくださいね。
Picoのセットアップ
CircuitPythonの導入
Picoをマクロパッドとして動作させるにはCircuitPythonを使用します。
CircuitPython公式サイトから用意したマイコンを選択してダウンロードします。
Picoをあらかじめ挿しておくと操作が楽です。
Picoをパソコンに挿すときは「BOOTSEL」ボタンを押しながら挿してください。
うまく行けば、「RPI-RP2」というストレージデバイスとして認識されます。
指は離してOKです。
うまくいかなかった場合、ケーブルがデータ通信に対応しているか、BOOTSELを
押しながらPCに挿したか、USBはしっかり入っているかなど確認してみてください。
話をCircuitPythonの導入に戻しましょう。
僕はとりあえず試用ということでWHを流用したので「Pico W」を選択しました。
ここで注意しないといけないことが一つ。
「JAPANESE」ではなく「ENGLISH (US)」をダウンロードしてください。
JAPANESEだとなぜか動かないようです。
UF2ファイルをダウンロードするディレクトリですが、RPI-RP2の直下でOKです。
うまく完了すれば、「CIRCUITPY」という名前のストレージとして再認識されます。
CircuitPythonの導入はこれで完了です。
CircuitPythonとは
と、ここまでCircuitPythonの導入について述べてきましたが、
そもそもCircuitPythonとは何なのか、なぜCircuitPythonなのかを解説します。
CircuitPythonは、adafruit Industriesが開発した、Pythonの仲間です。
皆さんご存知Pythonは、構文が簡単で初心者でも読みやすいことから
プログラミングの入門におすすめされます。
中でもCircuitPythonを使うと、PCにHID(ヒューマンインターフェースデバイス)
として認識されるため、PicoをUSBキーボードとして使用することが可能です。
(つまり、「CircuitPythonにHIDライブラリが組み込まれている」ということ)
Githubからカスタムコードを追加する
英語の方の記事を制作されていた方が、GithubにPicoをマクロパッド化するための
カスタムコードをあげられていました。本当にありがたいです。
zipをダウンロードしてください。ほんの少し作業をするのでPCに入れてください。
ダウンロードできたら解凍して、中の「lib」と「code.py」をPicoに入れて上書き。
code.pyは上書きしなくてもいいですが上書きすればサンプルコードとなります。
上書き後のcode.py(サンプルコードがこちらです。)
import time
import usb_hid
from adafruit_hid.keycode import Keycode
from adafruit_hid.keyboard import Keyboard
import board
import digitalio
btn1_pin = board.GP9
btn2_pin = board.GP8
btn3_pin = board.GP7
btn4_pin = board.GP19
btn5_pin = board.GP20
btn6_pin = board.GP21
btn1 = digitalio.DigitalInOut(btn1_pin)
btn1.direction = digitalio.Direction.INPUT
btn1.pull = digitalio.Pull.DOWN
btn2 = digitalio.DigitalInOut(btn2_pin)
btn2.direction = digitalio.Direction.INPUT
btn2.pull = digitalio.Pull.DOWN
btn3 = digitalio.DigitalInOut(btn3_pin)
btn3.direction = digitalio.Direction.INPUT
btn3.pull = digitalio.Pull.DOWN
btn4 = digitalio.DigitalInOut(btn4_pin)
btn4.direction = digitalio.Direction.INPUT
btn4.pull = digitalio.Pull.DOWN
btn5 = digitalio.DigitalInOut(btn5_pin)
btn5.direction = digitalio.Direction.INPUT
btn5.pull = digitalio.Pull.DOWN
btn6 = digitalio.DigitalInOut(btn6_pin)
btn6.direction = digitalio.Direction.INPUT
btn6.pull = digitalio.Pull.DOWN
keyboard = Keyboard(usb_hid.devices)
while True:
if btn1.value:
keyboard.send(Keycode.CONTROL, Keycode.F7)
time.sleep(0.1)
if btn2.value:
keyboard.send(Keycode.CONTROL, Keycode.F8)
time.sleep(0.1)
if btn3.value:
keyboard.send(Keycode.CONTROL, Keycode.F9)
time.sleep(0.1)
if btn4.value:
keyboard.send(Keycode.CONTROL, Keycode.F10)
time.sleep(0.1)
if btn5.value:
keyboard.send(Keycode.CONTROL, Keycode.F11)
time.sleep(0.1)
if btn6.value:
keyboard.send(Keycode.CONTROL, Keycode.F12)
time.sleep(0.1)
time.sleep(0.1)
わかりやすいですね。僕でも80%は読めました。
(僕みたいな)初心者向けに解説をしておくと、
・1から6行目で必要なライブラリをインポート(読み込み)しておく
・9から14行目でbtn(ボタン)と結びついているGPIOを定義しておく
・16から39行目でプルダウン抵抗を有効にしておく
・43行目から最後までで各ボタンと結びついているキーショートカットを決める
ということをしています。
ここで注意しなければならないのは、「GP」と「GPIO」の違いです。
公式のデータシートを見ればわかるのですが、GPIOの番号とGPの番号は
違っており、対応していません。Picoの裏面を見れば確認できます。
配線をするときに間違えやすいポイントだと思います。
気をつけてください。
デフォルトではbtn1から6にそれぞれ
Ctrl+F7、Ctrl+F8、Ctrl+F9、Ctrl+F10、Ctrl+F11、Ctrl+F12が
割り当てられています。
私はこのように再設定しました。
while True:
if btn1.value:
keyboard.send(Keycode.CONTROL, Keycode.S)
time.sleep(0.05) # Save
if btn2.value:
keyboard.send(Keycode.CONTROL, Keycode.Z)
time.sleep(0.1) # Undo
if btn3.value:
keyboard.send(Keycode.CONTROL, Keycode.C)
time.sleep(0.1) # Copy
if btn4.value:
keyboard.send(Keycode.CONTROL, Keycode.V)
time.sleep(0.1) # Paste
if btn5.value:
keyboard.send(Keycode.CONTROL, Keycode.SHIFT, Keycode.Z)
time.sleep(0.1) # Redo
if btn6.value:
keyboard.send(Keycode.ALT, Keycode.TAB)
time.sleep(0.1) # Task Switch
time.sleep(0.02)
あまり私はイラストや動画編集など専門分野を設けていないのでネットサーフィンや
こういった記事の作成などに汎用するショートカットを割り当てました。
btn1から順に、
Ctrl+S(保存)、Ctrl+Z(アンドゥ)、Ctrl+C(コピー)、Ctrl+V(ペースト)、
Ctrl+Shift+Z(リドゥ)、alt+tab(タスクスイッチャ)です。
UndoとRedoがやっぱりこんがらがりやすいですよね。
Ctrl+Z(Undo)とCtrl+Shift+Z(Redo)の違い
Ctrl+Zは「直前の操作を戻す」、Ctrl+Shift+Zは「戻した操作をやり直す」です。
なので、Ctrl+Z(Undo)をしなければCtrl+Shift+Z(Redo)はできません。
つまり、「基本はUndoで済むけど戻しすぎちゃったときにRedo」ということです。
次回予告
唐突ですが今回はここで終了となります。
次回の公開日は未定です。(2025/12/22現在)
次回は
・家に転がっていたブレッドボードでテスト回路を組んでみる
・家に転がっt(以下略)タクトスイッチでテストしてみる
・家にk(以下略)配線でテスt(以下略)
の予定です。皆さんからの応援はモチベと創作意欲に貢献します。
応援していてください。楽しみに待っていてください。では、ごきげんよう。

