Raspberry Pi 400 キーボードに Node-RED をインストールしてキーイベントを取得するメモ
この記事は Node-RED Advent Calendar 2021 の 1 日目の記事です。いよいよ、 Node-RED アドベントカレンダーはじまりましたね!よろしくお願いします!
Raspberry Pi 400 キーボードに Node-RED をインストールしてキーイベントを取得するメモです。
Raspberry Pi Desktop (Recommended) はインストール済み
こちら記事で Raspberry Pi 400 キーボード に Raspberry Pi Desktop (Recommended) はインストール済みです。
Node-RED のインストール
https://www.1ft-seabass.jp/memo/2021/02/09/nodered-install-raspberry-pi-desktop-recommended/
自分のこちらの記事を参考に、SSHで入って、
bash <(curl -sL https://raw.githubusercontent.com/node-red/linux-installers/master/deb/update-nodejs-and-nodered)
Raspberry Piで実行するこのコマンドを実行します。

y で進みます。

インストールがはじまります。

インストールが完了しました!
Node-RED を起動
node-red
ためしに、Node-RED を起動します。

起動しました。
この Raspberry Pi 400 キーボードの IP に :1880 をつけてアクセスします。

Node-RED の起動でき、初期表示のヘルプも確認できました!
自動起動も設定

Raspberry Piで実行する にある「起動時に自動起動する」も対応して Node-RED のセットアップしました。
対話的な設定ファイル作成ツール node-red admin init コマンドでログインユーザー・ログインパスワードを設定
※この段落は 2021/12/01 20:48 に加筆しています
こちらの記事を投稿したのち、日本の Node-RED コミュニティで「Raspberry Pi で Node-RED を使うときは、かなり深いところまで操作できてしまうので、ログインユーザー・ログインパスワードを設定したほうがいいよ」といったアドバイスをいただけたので、話的な設定ファイル作成ツール node-red admin init でログインユーザー・ログインパスワードを設定してみます。
node-red admin init コマンドは Node-RED バージョン 2 移行で使えるようになった、対話的な設定ファイル作成ツールです。バージョン 1 までは setting.js を慎重にいじらないといけなかったところが、対応しやすくなりました。
ということで、SSH で入って以下のコマンドを実行します。
node-red admin init
こちらを実行します。
Node-RED Settings File initialisation
=====================================
This tool will help you create a Node-RED settings file.
? Settings file ‣ /home/pi/.node-red/settings.js
このように表示されるので、今回は /home/pi/.node-red/settings.js のままなので Enter キーで進みます。
? That file already exists. Are you sure you want to overwrite it? …
▸ Yes
No
設定を上書きしますか?と聞かれるので、 Yes を上下キーで選択して Enter キーで進みます。
User Security
=============
? Do you want to setup user security? …
▸ Yes
No
ユーザーセキュリティをしたいですか?と聞かれるので、こちらは Yes を上下キーで選択して Enter キーで進みます。
? Username ‣
こちらにログインするユーザー名を入力し Enter キーで進みます。
? Password ‣
こちらにログインするパスワードを入力し Enter キーで進みます。
? User permissions …
▸ full access
read-only access
User permissions は初めのユーザーなので full access を上下キーで選択して Enter キーで進みます。
? Add another user? …
Yes
▸ No
他にユーザーを作るか聞かれるので No を上下キーで選択して Enter キーで進みます。
Projects
========
The Projects feature allows you to version control your flow using a local git repository.
? Do you want to enable the Projects feature? …
Yes
▸ No
プロジェクト機能は今回は使わないので No を上下キーで選択して Enter キーで進みます。
Flow File settings
==================
? Enter a name for your flows file ‣ flows.json
こちらはデフォルトの設定で flow.json をまま Enter キーで進みます。
? Provide a passphrase to encrypt your credentials file ‣
Enter キーで進みます。
Editor settings
===============
? Select a theme for the editor. To use any theme other than "default", you will need to install @node-red-contrib-themes/theme-collection in your Node-RED user directory. …
▸ default
dark
midnight-red
oled
solarized-dark
solarized-light
Editor settings は今回はデフォルトのエディタテーマでよいので default を上下キーで選択して Enter キーで進みます。
? Select the text editor component to use in the Node-RED Editor …
▸ ace (default)
monaco (new for 2.0)
テキストエディタのコンポーネントがどれか聞かれるので 今回はデフォルトの ace を上下キーで選択して Enter キーで進みます。
Node settings
=============
? Allow Function nodes to load external modules? (functionExternalModules) …
▸ Yes
No
Function ノードで 外部モジュールのロードを許可するか聞かれるので Yes を上下キーで選択して Enter キーで進みます。
Settings file written to /home/pi/.node-red/settings.js
が出れば完了です。
sudo systemctl restart nodered.service
で再起動してログインを試してみましょう。
より詳しい設定が気になる方は、アドバイスいただいた utaani さんの記事の Raspberry PiにおけるNode-REDの活用について にプロジェクト機能の設定であったり、各項目のより細かな紹介があるのでぜひご覧ください。
キーボードイベント取得
デフォルトで入っている node-red-node-pi-gpio (node) - Node-RED の rpi-keyboard を使ってキーボードイベント取得します。

パレットのこちらです。

このようなシンプルなフローです。
[
{
"id": "53fa9e2ad981402f",
"type": "rpi-keyboard",
"z": "6d50a7a9c100c8c1",
"name": "",
"x": 240,
"y": 180,
"wires": [
[
"ee495a73a02943c6"
]
]
},
{
"id": "ee495a73a02943c6",
"type": "debug",
"z": "6d50a7a9c100c8c1",
"name": "",
"active": true,
"tosidebar": true,
"console": false,
"tostatus": false,
"complete": "false",
"statusVal": "",
"statusType": "auto",
"x": 480,
"y": 180,
"wires": []
}
]
このフローの JSON です。

キーボードのキーをじゃかじゃか押してみます!

無事イベントを取得できました。2つ繰り返しているのはキーを押す keydown と キーを離した keyup を取得しているからです。ちなみに、押し続けている repeat もとれます。
デプロイ時に Error stopping node: Close timed outが出るけど大丈夫な模様

何かフローを編集し、再度デプロイする時に Error stopping node: Close timed outが出ますが、問題なくデプロイされるようです。
おそらくキーイベントをずっと監視する処理って、結構きつくループまわしている気がするので、うまくクローズしないのかもしれませんね。
このキーコードは日本語 106 キーコード順に近い?

どうも、今回返ってくるキーコード。たとえば A を押しても 30 が返ってくる感じで、 A を押すと 65 が返ってくるような JavaScript のキーコードとは違うようです。
[JavaScript] キーコードの一覧 – コピペで使える JavaScript逆引きリファレンス
なので、キーコードを元に押された文字キーは、どれなのかというのは、独自で組む必要がありそうです。
キーボードの種類を知りたい/106、109キーボードとは?/英語、日本語キ...
これを見る限りは、日本語 106 キーコード順に類似している気がするので、今度時間があったら、地道に変換リストを作ってみます!