この記事は Node-RED Advent Calendar 2021 の 1 日目の記事です。いよいよ、 Node-RED アドベントカレンダーはじまりましたね!よろしくお願いします!
Raspberry Pi 400 キーボードに Node-RED をインストールしてキーイベントを取得するメモです。
Raspberry Pi Desktop (Recommended) はインストール済み
Raspberry Pi 400 キーボード に Raspberry Pi Desktop (Recommended) を入れるメモ
こちら記事で Raspberry Pi 400 キーボード に Raspberry Pi Desktop (Recommended) はインストール済みです。
Node-RED のインストール
Raspberry Pi Desktop (Recommended) に Node-RED のインストールするメモ 2021年1月版
自分のこちらの記事を参考に、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 キーコード順に類似している気がするので、今度時間があったら、地道に変換リストを作ってみます!