🍓 Node-RED Pi Sense HATノード ガイド

このガイドでは、Node-REDのPi Sense HATノードについて、初心者の方でも理解できるように詳しく説明します。

⚠️ ハードウェア要件(必ずお読みください)

📚 1. Pi Sense HATノードとは?

Raspberry Pi Sense HATは、Raspberry Piに接続できる多機能センサーボードです。 Pi Sense HATノードを使うと、このボードのセンサーデータを読み取ったり、LEDディスプレイを制御したりできます。

📡 センサー読み取り(入力ノード)

モーション 加速度計・ジャイロ・磁力計

環境 温度・湿度・気圧

ジョイスティック 5方向入力

💡 LED制御(出力ノード)

8×8マトリックス 64個のフルカラーLED

ピクセル単位・テキストスクロール・回転・反転に対応

📦 ノードの構成

rpi-sensehat in Debug

Inject rpi-sensehat out

このパッケージは2種類のノードで構成されています:

⚙️ 2. 設定項目一覧

rpi-sensehat in(入力ノード)

設定項目 説明 デフォルト
モーションイベント 加速度計、ジャイロスコープ、磁力計、方位計からのデータを取得する 有効(チェックあり)
環境イベント 温度、湿度、気圧センサーからのデータを取得する 有効(チェックあり)
ジョイスティックイベント ジョイスティック(UP/DOWN/LEFT/RIGHT/ENTER)の操作を検出する 有効(チェックあり)
名前 ノードの表示名 空("Sense HAT" と表示)

rpi-sensehat out(出力ノード)

設定項目 説明 デフォルト
名前 ノードの表示名 空("Sense HAT" と表示)

💡 ポイント: rpi-sensehat out は設定項目が名前のみです。LEDへの出力内容はすべて msg.payload で制御します。

📤 3. 入力ノードの出力データ

rpi-sensehat in は、各イベントが発生するたびにメッセージを出力します。msg.topic でイベントの種類を判別できます。

モーションイベント topic: "motion"

約10回/秒の頻度で送信されます。msg.payload に以下のデータが含まれます:

プロパティ 内容 単位
acceleration.x/y/z 加速度計(X/Y/Z軸) G(重力加速度)
gyroscope.x/y/z ジャイロスコープ(X/Y/Z軸) ラジアン/秒
orientation.roll/pitch/yaw 向き角度(ロール/ピッチ/ヨー)
compass 磁方位
// msg.payloadの例(モーションイベント) { "acceleration": { "x": 0.01, "y": -0.02, "z": 1.00 }, "gyroscope": { "x": 0.001, "y": 0.002, "z": -0.001 }, "orientation": { "roll": 2.1, "pitch": -1.5, "yaw": 180.3 }, "compass": 180.3 }

環境イベント topic: "environment"

約1回/秒の頻度で送信されます。msg.payload に以下のデータが含まれます:

プロパティ 内容 単位
temperature 温度(Sense HAT基板上の温度センサーのため、CPUの熱影響を受ける場合あり)
humidity 湿度 %
pressure 気圧 ミリバール(hPa)
// msg.payloadの例(環境イベント) { "temperature": 32.5, "humidity": 45.2, "pressure": 1013.25 }

⚠️ 温度精度について: Sense HATの温度センサーはRaspberry PiのCPUに近いため、実際の室温より5〜10℃高く表示されることがあります。補正が必要な場合は msg.payload.temperature - 5 のように差し引いて使用してください。

ジョイスティックイベント topic: "joystick"

ジョイスティックの操作時に送信されます。msg.payload に以下のデータが含まれます:

プロパティ 内容
key 押されたキーの方向 "UP" / "DOWN" / "LEFT" / "RIGHT" / "ENTER"
state キーの状態 0 = 解放、1 = 押下、2 = 保持(長押し)
// msg.payloadの例(ジョイスティックイベント) { "key": "ENTER", "state": 1 }

📥 4. 出力ノードへの入力コマンド

rpi-sensehat out は msg.payload に文字列でコマンドを送ることで、8×8 LEDマトリックスを制御します。

💡 ピクセル設定

形式: x,y,色

書式 内容
x,y,色 指定座標のピクセルを点灯(x/y: 0〜7) 3,3,red
*,y,色 指定行の全ピクセルを点灯 *,0,blue
x-x,y-y,色 指定範囲のピクセルを点灯 0-3,0-3,green
x,y,off 指定座標のピクセルを消灯 3,3,off

色の指定方法:

🔄 回転・反転

コマンド 内容
R0 / R90 / R180 / R270 ディスプレイを指定角度で回転
FH 水平方向に反転(左右反転)
FV 垂直方向に反転(上下反転)

📝 テキストスクロール

msg.payload に通常の文字列を送ると、8×8 LEDに自動スクロール表示されます。

プロパティ 内容 デフォルト
msg.payload スクロール表示するテキスト -
msg.color テキストの色 white
msg.background 背景色 off(消灯)
msg.speed スクロール速度(1〜10) 3

🔆 明るさ調整

コマンド 内容
D0 LEDの明るさを低く設定(暗い環境向け)
D1 LEDの明るさを高く設定(通常)

🎯 5. 実用的な使用パターン

📥 サンプルフローのインポート方法:

  1. 下のサンプルフローJSONをコピー
  2. Node-REDエディタで メニュー → 読み込み を選択
  3. JSONをペーストして「読み込み」をクリック

⚠️ このノードはRaspberry Pi + Sense HATがある環境のみで実際に動作します。

パターン1: センサーデータの読み取りと確認

Sense HATの全センサーデータをデバッグパネルで確認する基本パターンです。

📋 サンプルフロー(クリックで展開)

全センサーデータをデバッグパネルに表示します

[ { "id": "tab_sensehat_01", "type": "tab", "label": "Sense HAT センサー読み取り", "disabled": false, "info": "", "env": [] }, { "id": "sensehat_in_01", "type": "rpi-sensehat in", "z": "tab_sensehat_01", "name": "Sense HAT 入力", "motion": true, "env": true, "stick": true, "x": 160, "y": 200, "wires": [["debug_all_01"]] }, { "id": "debug_all_01", "type": "debug", "z": "tab_sensehat_01", "name": "センサーデータ確認", "active": true, "tosidebar": true, "console": false, "tostatus": false, "complete": "true", "targetType": "full", "statusVal": "", "statusType": "auto", "x": 400, "y": 200, "wires": [] } ]

パターン2: 環境データのみ取得してLEDに温度表示

環境センサーのデータを取得し、温度に応じてLEDの色を変えるパターンです。

📋 サンプルフロー(クリックで展開)

温度が30℃以上なら赤、25℃以上なら橙、それ以外は青でLEDを点灯します

[ { "id": "tab_sensehat_02", "type": "tab", "label": "Sense HAT 温度表示", "disabled": false, "info": "", "env": [] }, { "id": "sensehat_in_02", "type": "rpi-sensehat in", "z": "tab_sensehat_02", "name": "環境センサー", "motion": false, "env": true, "stick": false, "x": 160, "y": 200, "wires": [["func_temp_color_02"]] }, { "id": "func_temp_color_02", "type": "function", "z": "tab_sensehat_02", "name": "温度→LED色変換", "func": "if (msg.topic !== 'environment') return null;\nvar temp = msg.payload.temperature;\nvar color;\nif (temp >= 30) {\n color = 'red';\n} else if (temp >= 25) {\n color = 'orange';\n} else {\n color = 'blue';\n}\nmsg.payload = '*,*,' + color;\nreturn msg;", "outputs": 1, "timeout": 0, "noerr": 0, "initialize": "", "finalize": "", "libs": [], "x": 360, "y": 200, "wires": [["sensehat_out_02"]] }, { "id": "sensehat_out_02", "type": "rpi-sensehat out", "z": "tab_sensehat_02", "name": "LED表示", "x": 560, "y": 200, "wires": [] } ]

パターン3: ジョイスティックでLEDを制御

ジョイスティックの操作に応じてLEDにメッセージをスクロール表示するパターンです。

📋 サンプルフロー(クリックで展開)

ENTERキーを押すと "Hello!" をスクロール表示します

[ { "id": "tab_sensehat_03", "type": "tab", "label": "Sense HAT ジョイスティック制御", "disabled": false, "info": "", "env": [] }, { "id": "sensehat_in_03", "type": "rpi-sensehat in", "z": "tab_sensehat_03", "name": "ジョイスティック入力", "motion": false, "env": false, "stick": true, "x": 160, "y": 200, "wires": [["switch_03"]] }, { "id": "switch_03", "type": "switch", "z": "tab_sensehat_03", "name": "ENTER押下のみ通過", "property": "payload.key", "propertyType": "msg", "rules": [ { "t": "eq", "v": "ENTER", "vt": "str" } ], "checkall": "true", "repair": false, "outputs": 1, "x": 360, "y": 200, "wires": [["func_scroll_03"]] }, { "id": "func_scroll_03", "type": "function", "z": "tab_sensehat_03", "name": "スクロールメッセージ設定", "func": "if (msg.payload.state !== 1) return null;\nmsg.payload = 'Hello!';\nmsg.color = 'yellow';\nmsg.speed = 5;\nreturn msg;", "outputs": 1, "timeout": 0, "noerr": 0, "initialize": "", "finalize": "", "libs": [], "x": 580, "y": 200, "wires": [["sensehat_out_03"]] }, { "id": "sensehat_out_03", "type": "rpi-sensehat out", "z": "tab_sensehat_03", "name": "LEDスクロール", "x": 800, "y": 200, "wires": [] } ]

パターン4: LED全面制御とテキスト表示

InjectノードからLEDの各種コントロールコマンドを手動で送信するパターンです。

📋 サンプルフロー(クリックで展開)

各種コマンドの動作確認に使用できます

[ { "id": "tab_sensehat_04", "type": "tab", "label": "Sense HAT LED制御コマンド", "disabled": false, "info": "", "env": [] }, { "id": "inject_scroll_04", "type": "inject", "z": "tab_sensehat_04", "name": "テキストスクロール", "props": [ {"p": "payload"}, {"p": "color", "v": "cyan", "vt": "str"}, {"p": "speed", "v": "5", "vt": "num"} ], "repeat": "", "crontab": "", "once": false, "onceDelay": 0.1, "topic": "", "payload": "Hello Node-RED!", "payloadType": "str", "x": 160, "y": 120, "wires": [["sensehat_out_04"]] }, { "id": "inject_pixel_04", "type": "inject", "z": "tab_sensehat_04", "name": "中心ピクセル赤点灯", "props": [{"p": "payload"}], "repeat": "", "crontab": "", "once": false, "onceDelay": 0.1, "topic": "", "payload": "3,3,red", "payloadType": "str", "x": 170, "y": 180, "wires": [["sensehat_out_04"]] }, { "id": "inject_alloff_04", "type": "inject", "z": "tab_sensehat_04", "name": "全消灯", "props": [{"p": "payload"}], "repeat": "", "crontab": "", "once": false, "onceDelay": 0.1, "topic": "", "payload": "*,*,off", "payloadType": "str", "x": 130, "y": 240, "wires": [["sensehat_out_04"]] }, { "id": "inject_rotate_04", "type": "inject", "z": "tab_sensehat_04", "name": "90度回転", "props": [{"p": "payload"}], "repeat": "", "crontab": "", "once": false, "onceDelay": 0.1, "topic": "", "payload": "R90", "payloadType": "str", "x": 130, "y": 300, "wires": [["sensehat_out_04"]] }, { "id": "inject_bright_04", "type": "inject", "z": "tab_sensehat_04", "name": "明るさ低", "props": [{"p": "payload"}], "repeat": "", "crontab": "", "once": false, "onceDelay": 0.1, "topic": "", "payload": "D0", "payloadType": "str", "x": 130, "y": 360, "wires": [["sensehat_out_04"]] }, { "id": "sensehat_out_04", "type": "rpi-sensehat out", "z": "tab_sensehat_04", "name": "LED制御", "x": 420, "y": 240, "wires": [] } ]

📝 6. 演習問題

演習1: センサーデータのフィルタリング 初級

課題: rpi-sensehat in から来るメッセージをtopicで振り分け、環境データのみデバッグに表示するフローを作成してください。

✅ 成功の条件:

ヒント: SwitchノードでSwitchの条件を msg.topic == "environment" にします。

📋 解答フロー(クリックで展開)
[ { "id": "tab_ex1", "type": "tab", "label": "演習1: 環境データフィルタ", "disabled": false, "info": "", "env": [] }, { "id": "sensehat_in_ex1", "type": "rpi-sensehat in", "z": "tab_ex1", "name": "Sense HAT", "motion": true, "env": true, "stick": true, "x": 160, "y": 200, "wires": [["switch_ex1"]] }, { "id": "switch_ex1", "type": "switch", "z": "tab_ex1", "name": "環境データのみ通過", "property": "topic", "propertyType": "msg", "rules": [ { "t": "eq", "v": "environment", "vt": "str" } ], "checkall": "true", "repair": false, "outputs": 1, "x": 370, "y": 200, "wires": [["debug_ex1"]] }, { "id": "debug_ex1", "type": "debug", "z": "tab_ex1", "name": "環境データ", "active": true, "tosidebar": true, "console": false, "tostatus": false, "complete": "payload", "targetType": "msg", "statusVal": "", "statusType": "auto", "x": 570, "y": 200, "wires": [] } ]

演習2: ジョイスティックでLED色変更 中級

課題: ジョイスティックの各方向(UP/DOWN/LEFT/RIGHT)に対応した色でLED全面を点灯させるフローを作成してください。

✅ 成功の条件:

ヒント: Switchノードで msg.payload.key の値(UP/DOWN/LEFT/RIGHT)ごとに出力を分岐し、各Changeノードで msg.payload*,*,色 に設定します。

📋 解答フロー(クリックで展開)
[ { "id": "tab_ex2", "type": "tab", "label": "演習2: ジョイスティックLED色変更", "disabled": false, "info": "", "env": [] }, { "id": "sensehat_in_ex2", "type": "rpi-sensehat in", "z": "tab_ex2", "name": "ジョイスティック入力", "motion": false, "env": false, "stick": true, "x": 100, "y": 400, "wires": [["switch_ex2"]] }, { "id": "switch_ex2", "type": "switch", "z": "tab_ex2", "name": "payload.key?", "property": "payload.key", "propertyType": "msg", "rules": [ {"t": "eq", "v": "UP", "vt": "str"}, {"t": "eq", "v": "DOWN", "vt": "str"}, {"t": "eq", "v": "LEFT", "vt": "str"}, {"t": "eq", "v": "RIGHT", "vt": "str"} ], "checkall": "false", "repair": false, "outputs": 4, "x": 310, "y": 400, "wires": [["change_up_ex2"], ["change_down_ex2"], ["change_left_ex2"], ["change_right_ex2"]] }, { "id": "change_up_ex2", "type": "change", "z": "tab_ex2", "name": "UP: red", "rules": [{"t": "set", "p": "payload", "pt": "msg", "to": "*,*,red", "tot": "str"}], "action": "", "property": "", "from": "", "to": "", "reg": false, "x": 500, "y": 340, "wires": [["junction_ex2"]] }, { "id": "change_down_ex2", "type": "change", "z": "tab_ex2", "name": "DOWN: blue", "rules": [{"t": "set", "p": "payload", "pt": "msg", "to": "*,*,blue", "tot": "str"}], "action": "", "property": "", "from": "", "to": "", "reg": false, "x": 510, "y": 380, "wires": [["junction_ex2"]] }, { "id": "change_left_ex2", "type": "change", "z": "tab_ex2", "name": "LEFT: green", "rules": [{"t": "set", "p": "payload", "pt": "msg", "to": "*,*,green", "tot": "str"}], "action": "", "property": "", "from": "", "to": "", "reg": false, "x": 510, "y": 420, "wires": [["junction_ex2"]] }, { "id": "change_right_ex2", "type": "change", "z": "tab_ex2", "name": "RIGHT: yellow", "rules": [{"t": "set", "p": "payload", "pt": "msg", "to": "*,*,yellow", "tot": "str"}], "action": "", "property": "", "from": "", "to": "", "reg": false, "x": 520, "y": 460, "wires": [["junction_ex2"]] }, { "id": "junction_ex2", "type": "junction", "z": "tab_ex2", "x": 660, "y": 400, "wires": [["sensehat_out_ex2"]] }, { "id": "sensehat_out_ex2", "type": "rpi-sensehat out", "z": "tab_ex2", "name": "LED全面表示", "x": 770, "y": 400, "wires": [] } ]

演習3: 傾き検知アラート 上級

課題: モーションセンサーの傾き(orientation)を監視し、Sense HATが水平から30度以上傾いたときにLEDを点灯させるフローを作成してください。元に戻したら3秒後に自動消灯します。

✅ 成功の条件:

💡 なぜ傾きを使うのか: orientation.roll(左右の傾き)と orientation.pitch(前後の傾き)は、ボードを手で傾けるだけで確実に大きく変化します。実際に手に持って試してみましょう。

ヒント:

📋 解答フロー(クリックで展開)
[ { "id": "tab_ex3", "type": "tab", "label": "演習3: 傾き検知アラート", "disabled": false, "info": "", "env": [] }, { "id": "sensehat_in_ex3", "type": "rpi-sensehat in", "z": "tab_ex3", "name": "モーションセンサー", "motion": true, "env": false, "stick": false, "x": 160, "y": 200, "wires": [["func_tilt_ex3"]] }, { "id": "func_tilt_ex3", "type": "function", "z": "tab_ex3", "name": "傾き検知", "func": "if (msg.topic !== 'motion') return null;\nvar roll = Math.abs(msg.payload.orientation.roll);\nvar pitch = Math.abs(msg.payload.orientation.pitch);\nif (roll > 30 || pitch > 30) {\n msg.payload = '*,*,orange';\n return msg;\n}\nreturn null;", "outputs": 1, "timeout": 0, "noerr": 0, "initialize": "", "finalize": "", "libs": [], "x": 370, "y": 200, "wires": [["trigger_ex3"]] }, { "id": "trigger_ex3", "type": "trigger", "z": "tab_ex3", "name": "戻してから3秒で消灯", "op1": "", "op2": "*,*,off", "op1type": "pay", "op2type": "str", "duration": "3", "extend": true, "overrideDelay": false, "units": "s", "reset": "", "bytopic": "all", "topic": "topic", "outputs": 1, "x": 590, "y": 200, "wires": [["sensehat_out_ex3"]] }, { "id": "sensehat_out_ex3", "type": "rpi-sensehat out", "z": "tab_ex3", "name": "LEDアラート", "x": 800, "y": 200, "wires": [] } ]

🔧 7. トラブルシューティング

症状 原因 解決方法
ノードが「赤いエラー」状態になる Raspberry Pi以外の環境で実行している Raspberry Pi上のNode-REDで実行してください
ノードが起動しない / Sense HATが応答しない Sense HATが正しく接続されていない 電源を切ってから再接続し、sudo apt install sense-hat を実行
温度が実際より高く表示される CPUの熱がSense HATの温度センサーに影響している Functionノードで補正値を引く(例: temp - 5
モーションデータが多すぎる 約10回/秒で送信されるため過負荷になることがある Switchノードやフローコンテキストを使い、一定間隔でのみ処理する
LEDにコマンドが効かない msg.payload の書式が間違っている 座標は x,y,色(スペースなし)、色はHTML色名かHEXで指定

📖 8. まとめ

💡 Pi Sense HATノードのポイント:

🔗 参考リンク

🏠 ホームへ