2022/11/04頃のレビューです。
Raspberry Pi Zero は USB OTG(On-The-Go) に対応しており、キーボード、マウス、ストレージ、ゲームパッドのなどのUSBデバイス機器を作成が出来ます。
この機能を使用してマクロキーボードを作れたらいいなと思い試してみました。
本当は Raspberry Pi Zero 2 W で試せたら良かったのですが、在庫がなくて購入出来ないということ、既に運用している Raspberry Pi Zero WH があるので、こちらに機能追加することにしました。
★2023-05-17追記
SDカードの不良のため、システムを再インストールすることになりました。
手順に不足分があったので追記しました。
先人に感謝。基本は組み合わせで出来そう。
あくまで、スキルや知識があれば作れるよ!っていう記事です。
出来ない方は素直に既製品(マクロキーボード、マウスジグラー等)を購入しましょう。
マクロキーボードを作るにあたり、手順を簡単に書くと下記のような感じ。
- Raspberry Pi の OS セットアップ準備(MicroSD書き込み、WIFI設定など)
- USBデバイス認識させるためのスクリプト配置+3,4の準備
- キー操作・マウス操作の設定
- ボタン(インターフェース)の実装
基礎的なことなので、ここでは1の詳細は省きます。今回は既にOS設定構築済みのものを流用しています。
なお、構築に当たり調べても情報が少ないことは書きますが、調べて情報が多い一般的な箇所は省きます。あくまでここはレビューサイトなので。
2.USBデバイス認識させるためのスクリプト配置
以下の参考サイトの「USB On-the-Go機能を用いたUSBマウス・キーボードのエミュレーション」項目に沿って設定を行い、init_usb.shを流用する。(nodejs、npm等は後でインストールする)
参考サイト:https://roy-n-roy.nyan-co.page/Raspberry%20Pi/WebConsole/
下記を追加、リブート
# vi /boot/config.txt
dtoverlay=dwc2
# echo "dwc2" >> /etc/modules
# echo "libcomposite" >> /etc/modules
# reboot
シェルは以下に配置、rc.localに追記して起動時に実行させるようにする。
# vi /root/init_usb.sh # 参考サイトの内容をコピペする。
# vi /etc/rc.local
# USB Device Setting
/root/init_usb.sh
chmod 777 /dev/hidg0
chmod 777 /dev/hidg1
/dev/hidg0はキーボード、/dev/hidg1はマウスとして認識させる。
Pi の USB ポート(電源側ではない)にUSBケーブルを挿して、Windows PC に接続します。
データ通信用のUSBケーブルで接続すれば、キーボードデバイスとマウスデバイスとして認識されるようになります。
以降の3,4ではデバイス認識状態でないと制御コードを送る際にエラーが出ます。
充電専用のUSBケーブルの場合、ここで躓くことになります。ご注意ください。
3,4の準備
今回は物理ボタンではなく仮想ボタン・・・WEBブラウザ上でのボタンでタップ動作させるものを作ります。
Node-REDでHTTPのAPIを作り、Piのローカル上にnginxのWEBサーバーを立ててボタン表示とボタンタップ時にAPIを実行する処理を実装します。
Node-REDを構築するに当たり、Node.jsの更新が必要になってきます。
aptでインストール出来たら楽なのですが、最新バージョンの提供が行われていません。
Raspberry Pi Zero だけではなく、ARMv6系は皆同じ状況だと思う。
下記サイトを参考にカスタムソース機能を活用する
参考サイト:https://zenn.dev/mactkg/articles/5adc624787666c
下記で nodejs、npm、nを一度にインストールする。nodejs等はオフィシャルのものが一旦入ります。
$ sudo apt install git
$ curl -fsSL https://raw.githubusercontent.com/tj/n/master/bin/n | bash -s lts
nがうまく入らない場合、必要であれば下記を実施。
$ sudo npm install n -g
その後、アンオフィシャルのものに切り替えます。
$ vi ~/.bashrc
export N_NODE_MIRROR=https://unofficial-builds.nodejs.org/download/release/ # 追加
export N_PREFIX="$HOME/.n"; [[ :$PATH: == *":$N_PREFIX/bin:"* ]] || PATH+=":$N_PREFIX/bin" # Added by n-install (see http://git.io/n-install-repo).
$ . ~/.bashrc
$ n lts
無事にインストール出来たことを確認します。
$ node -v
v18.16.0
続いて Node-RED をインストールします。
こちらは公式サイトに記載の通りに作業します。
$ bash <(curl -sL https://raw.githubusercontent.com/node-red/linux-installers/master/deb/update-nodejs-and-nodered)
インストール途中で sudo npm と行っている箇所があります。
インストールログを見ると以下のエラーが出ている。
sudo: npm: command not found
一般ユーザーで Node.js をインストールしてる場合、一般ユーザーの環境変数が sudo の スーパーユーザーに切り替わり、スーパーユーザー用の環境変数で動作するため npm のパスが認識出来なくなる。そのため npm が無いって怒られる。
sudo 側の環境変数に一般ユーザー側にインストールした Node.js のパスを追加してあげないとインストールが正常終了しなかった。
$ sudo vi /etc/sudoers
Defaults secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/
sbin:/bin"
↓
Defaults secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/
sbin:/bin:/home/pi/.n/bin"
再び一般ユーザーで Node.js をインストールする。
問題がなければ、「Install Node-RED core」の部分にバージョンが常時される。
Node-RED が起動出来るか確認する。たら設定ファイルを変更する。
$ node-red-pi --max-old-space-size=256
[info] Started flows と表示されたあたりで CTRL+C を押して抜ける。
設定ファイルを変更する。ラズパイのIPアドレスに変更する。
$ vi ~/.node-red/settings.js
//uiHost: "127.0.0.1",
↓
uiHost: "192.168.x.x,
OS起動時に自動起動する設定を施す。こちらも公式サイト通り。
nodered.service が起動しない場合、root側で node-red-pi と node のパスが見えるようになっていないと起動しないので注意。
「/usr/bin/node-red-pi」と「/usr/bin/node」が無いようなので下記コマンドを実行した。
$ sudo ln -s "$(which node-red-pi)" /usr/bin/node-red-pi
$ sudo ln -s "$(which node)" /usr/bin/node
$ sudo systemctl enable nodered.service
$ sudo systemctl start nodered.service
$ sudo systemctl status nodered.service
● nodered.service - Node-RED graphical event wiring tool
Loaded: loaded (/lib/systemd/system/nodered.service; enabled; vendor preset: enabled)
Active: active (running) since Wed 2023-05-17 15:12:55 JST; 8s ago
Docs: http://nodered.org/docs/hardware/raspberrypi.html
Main PID: 3558 (node)
Tasks: 7 (limit: 414)
CPU: 7.744s
CGroup: /system.slice/nodered.service
mq3558 node --max_old_space_size=256 /home/pizerowh1/n/lib/node_modules/node-red/bin/../red.js
May 17 15:12:55 pizerowh2 systemd[1]: Started Node-RED graphical event wiring tool.
3.キー操作・マウス操作の設定
主に①キー操作用のpythonスクリプトの作成、②マウスジグラー用のshellスクリプトの作成、③Node-RED側の設定をする。
①キー操作用のpythonスクリプトの作成
pythonスクリプトでは以下サイトを参考に「Py_Keyboard.HID」を使用した。
参考サイト:https://qiita.com/zaburo/items/ea185925a46877a6ad26
Raspberry Pi OS(32bit) Lite版を使用しているため、下記操作が必要だった。
$ sudo apt-get -y install python3-dev
$ sudo apt-get -y install python3-pip
$ pip3 install Py-Keyboard
pythonスクリプトで文字入力したい文字列を引数として受け取り、/dev/hidg0デバイスへ制御コードを送る。
エンターキーやタブキーなどの特殊キーはpressというメソッドを使わないとならないため、press用のスクリプトも用意した。
通常文字と特殊キーをNode-RED側で判別して、呼び出すスクリプトを変えてあげるように対応。
下記のようなコマンド引数で入力文字を動的に渡してあげて動作するかを事前に確認しておく。
$ /usr/bin/python3 ./hid_keyborad_press.py ENTER
②マウスジグラー用のshellスクリプトの作成
マウスジグラー用のshellスクリプトの作成は試行錯誤だった。
単純にOSコマンドとして以下を実行するだけ。
$ echo -ne "\x1\0\x10\0\0\0\0\0\0\0" > /dev/hidg1 && sleep 1 && echo -ne "\x1\0\xF0\xFF\0\0\0\0\0\0" > /dev/hidg1 && sleep 1 && echo -ne "\x1\0\0\0\0\0\0\0\0\0" > /dev/hidg1
init_usb.shを取得したサイトの情報を参考にして制御コードのフォーマットに沿って設定しただけ。
行っていることはこんな感じで1サイクルしている。
マウスを右に移動→1秒待機→マウスを左に移動→一秒待機→念のため初期化
shellスクリプトを実行するたけで上記操作が行われる。
Node-RED側で15秒毎にshellスクリプトを実行するようにする。
マウスジグラーなので、ON/OFF機能をつけなければならない。
こちらもNode-RED側で対応する。
③Node-RED側の設定をする。
キーボード用とマウス用のフローを作成する。
キー操作した後に1秒待つなどの特殊操作も対応している。
※後日、HTTPヘッダ追加のため色々と変更しているため下記はあくまでサンプル例。
マウスジグラーなので単純にON/OFF機能として稼働する。
稼働時は15秒毎にマウスが動くようになっている。
※後日、10~20秒となるようにランダムで変わる仕様に変更している。こちらもあくまでサンプル例。
4.ボタン(インターフェース)の実装
主にWEBサーバーの構築・及びWEBページで表示する画面レイアウトとボタン実行時のAPIを読み出すところの実装。
当初 Node.js を使って WEBサーバーの構築をしていましたが、実装中にAjax通信で CORS(Cross-origin resource sharing)エラー出てトラブルが発生。
HTTPステータスコードが200でサーバー側は問題無さそうなのに、ブラウザのデバッグコンソールに警告が表示されて気持ち悪い。
原因がわからず nginx を入れて使用することにしました。でも解消されない。
どうやら構築した Node.js や nginx 上でエラーが出ていたわけではなく、Node-RED上でHTTPヘッダーを返していないためのエラーでした。
「http response」に以下のヘッダを追加した。
Access-Control-Allow-Origin http://{node-red address}:1880
Access-Control-Allow-Methods POST, GET, OPTIONS
Access-Control-Allow-Headers Origin, Authorization, Accept
Access-Control-Allow-Credentials true
Access-Control-Expose-Headers Content-Transfer-Encoding
ひとまず nginx のままにして完成させた。
表示画面は以下のような感じ。カラフルな場所をタップすることで動作する。
自分で作ってるからカスタマイズ出来るのが強みだよね
先人の頭良い方が色々と情報を出していたり、モジュールを提供して頂けているので比較的簡単?に作成することが出来た。
WEB画面上のボタンだと低スペックだったり使い古したタブレットでも役にたってくれるので、非常に良い。(その分バッテリー等の電力は消費しますが・・・)
こちらのタブレットを使って運用していこうかなと思います。
とりあえず、問題なく動作している模様。
マウスジグラーも特に問題は無さそう。
タブレットの省電力モードをどのように調整しようかという方が課題になっている。
常駐アプリが多くなったせいか、Raspberry Pi Zero WHの発熱が少々高くなっている気がする。
もともとヒートシンクをつけているから問題ないと思うが、夏場は様子を見る必要がありそう。
★2023-05-17追記
なぜか作成した翌年のGW付近(2023-05頃)でSDカード不良が出てOS不安定状態になった。
夏場はこれから・・・。
-
購入金額
1,600円
-
購入日
2019年頃
-
購入場所
Amazon
ZIGSOWにログインするとコメントやこのアイテムを持っているユーザー全員に質問できます。