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) を入れるメモ

こちら記事で 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で実行するこのコマンドを実行します。

image

y で進みます。

image

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

image

インストールが完了しました!

Node-RED を起動

node-red

ためしに、Node-RED を起動します。

image

起動しました。

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

image

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

自動起動も設定

image

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 を使ってキーボードイベント取得します。

image

パレットのこちらです。

image

このようなシンプルなフローです。

[
    {
        "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 です。

image

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

image

無事イベントを取得できました。2つ繰り返しているのはキーを押す keydown と キーを離した keyup を取得しているからです。ちなみに、押し続けている repeat もとれます。

デプロイ時に Error stopping node: Close timed outが出るけど大丈夫な模様

image

何かフローを編集し、再度デプロイする時に Error stopping node: Close timed outが出ますが、問題なくデプロイされるようです。

おそらくキーイベントをずっと監視する処理って、結構きつくループまわしている気がするので、うまくクローズしないのかもしれませんね。

このキーコードは日本語 106 キーコード順に近い?

image

どうも、今回返ってくるキーコード。たとえば A を押しても 30 が返ってくる感じで、 A を押すと 65 が返ってくるような JavaScript のキーコードとは違うようです。

[JavaScript] キーコードの一覧 – コピペで使える JavaScript逆引きリファレンス

なので、キーコードを元に押された文字キーは、どれなのかというのは、独自で組む必要がありそうです。

キーボードの種類を知りたい/106、109キーボードとは?/英語、日本語キ…

これを見る限りは、日本語 106 キーコード順に類似している気がするので、今度時間があったら、地道に変換リストを作ってみます!