←Part.11【Node-RED入門-11】KeiganPi に接続したUSBカメラで撮影する
→Part.13【Node-RED入門-13】KeiganPiでUSBスピーカーから音を出す

■全記事一覧→Node-REDまとめ

今回の内容

※LEDの変化を分かりやすくお伝えするため映像を暗くしています

今回は新たに momentノードusbcameraノード と組合せ、撮影した画像を上書きせず日付時刻ごとに保存する設定をします。

この設定により、定点カメラのような「同じ位置から写真を撮り続け、状況の変化を撮影する」といった使い方が可能となります。

また、KeiganMotorのLED設定を変更し、KeiganMotorの動作によってLEDの光り方を変えます。

1.usbcameraノードを確認する
1.momentノードを設定する
2.changeノードで関数を設定する
3.cmdLed機能を設定する
4.実際にKeiganMotorを動かす

前回のフローを使用しますので、事前に【こちら】からフローを読み込んでください。

usbcameraノードを確認する

まず usbcameraノード をダブルクリックしプロパティを開きます。
ノードによってはプロパティを開くと「ノードのヘルプ」に説明が記載されている場合があり、usbcameraノードの場合は以下の説明が確認できます。

【usbcameraノードの説明を一部抜粋】

You could override with msg.filename the filename
>あなたはmsg.filenameでファイル名を上書きできます。

上記説明から「 usbcameraノード で撮影した画像を保存する際、フロー上のmsg,filenameに情報があれば、その情報を文字列にしファイル名として保存できる」ということが分かります。

この機能を利用し「フローを実行する度にmsg.filenameに違う情報を与え、過去に保存した写真を上書きせず保存する設定」を行います。

momentノードを設定する

momentノード は、現在の時刻(年,月,日,時間)をmsg形式で出力することができます。
ノードパレット に存在しない場合、 ノードを追加 から「node-red-contrib-moment」を検索し追加してください。

momentノード の出力先をmsg.filenameにすることで、撮影した画像を日付時刻ごとに保存できるようになります。

現在時刻をmsg.filenameへ出力する

momentノード を設定するにあたり、1つ注意点があります。
momentノード の時刻は協定世界時(UTC)で取得され、日本の時間はこれより9時間進んだものが日本標準時(JST)として設定されています。

そのため、お住まいの国によって時間の誤差を修正する必要があります。

日本標準時(にほんひょうじゅんじ、英語: Japan Standard Time、略語JST)は、国立研究開発法人情報通信研究機構原子時計で生成・供給される協定世界時(UTC)を9時間東経135度分の時差)進めた時刻(すなわちUTC+9)をもって、日本における標準時としたものである。

wikipediaより

以下を参考に momentノード を設定してください。
※日本標準時(JST)の場合

changeノードを設定する

上記の momentノード だけで上書き保存を回避できますが、 changeノード を使用すると更に任意の文字列や別情報を追加して保存することができます。

計算式を入力する

changeノード のプロパティから JSONata 式を選択すると、計算式を使用して出力情報を設定できます。
今回は一例としてファイル名の最初に「image-」という文字列を追加してみますので、以下を参考に changeノード を設定してください。

「対象の値」に入力する計算式
'image-' & msg.filename

計算式は記号や文字列の組合せによって指示を出すことができます。
便利な反面、文字として入力したいものが計算式として別の指示になり、意図した情報が出力されない場合もあります。

その場合は文字の最初と最後にシングルクォーテーション()を配置して囲むことで「その範囲は文字列である」と区分けすることができます。

アンド(&)は前後の要素を組み合わせる記号です。
上記の計算式の場合、 image- という文字列と msg.filename の値を組み合わせるという指示になります。

これにより入力ポートから受け取ったmsg.filenameの前にimage-という文字列を追加し、それをmsg.filenameに上書きして出力する設定ができました。

実際に debugノード でmsg.filenameの出力情報を確認すると、 changeノード の前と後で情報が変わっていることが確認できます。

最後に usbcameraノード を以下の通り配置し、カメラのフロー設定は完了です。

cmdLed機能を設定する

続いて sequencerノードcmdLed 機能を利用し、KeiganMotorを動かしている間とカメラで撮影した際にLEDが変化するよう設定します。

【今回の設定】
1.KeiganMotorが動いている間:黄色点灯
2.KeiganMotorが止まっている間:白色点滅
3.usbcameraノードで画像を保存:赤色点灯→高速点滅

1.2は cmdLed 機能を利用しすぐに設定できますが、3は撮影開始~撮影~撮影完了で挙動を変更したいため、 delayノード を組み合わせます。

動いているとき、止まっているときの設定をする

以下を参考にして sequencerノード を配置し、黄色点灯と白色点滅を設定してください。

【黄色点灯】
LedState:LED_STATE_ON_SOLID 
red:255 green:255 blue:0

【白色点滅】
LedState:LED_STATE_ON_DIM
red:255 green:255 blue:255

上記設定後、link inノード , link outノード を基本操作の フロー と接続してください。(以下図参照。接続先を黄・赤でそれぞれ表示)

■黄着色:KeiganMotorが動いている間LEDが黄色点灯
■赤着色:KeiganMotorが止まっている間LEDが白色点滅

USBカメラ撮影時のLED設定をする

最後に、カメラ撮影時にLEDを赤に点滅させる設定をします。
使用するカメラによってボタンを押してから撮影完了までラグがありますので、今回はその動作に合わせて撮影開始[赤点灯]→撮影[赤高速点滅]→撮影終了[白点滅に戻る]となるようにします。

以下を参考に sequencerノードdelayノード を組み合わせてください。

実際にKeiganMotorを動かす

以下のキーを押し、それぞれ意図した動きになることを確認します。
正常に設定できていれば、撮影した画像も日付順に保存されています。

■←→↑↓  :設定速度で絶対位置へ移動
       (キーを離すとその場で停止)
        移動中は黄色点灯、停止時は白点滅 new
■Enter   :現在の位置を原点に設定
■Backspace  :原点の位置まで移動
■1,2,3    :それぞれ速度を20rpm,40rpm,60rpmに設定
■Space    :写真撮影しSDカード内に画像を保存(時刻毎) new
        撮影時はLEDが赤点灯→赤点滅  new
今回のフロー
保存された画像

※KeiganPiのフォルダはKeiganPi画面左下の「フォルダアイコン」をクリックして表示できます。

使用事例

changeノードswitchノード と組み合わせることで動作の回数を設定できます。
例えば「msg.countが5になるまで繰り返し、5になったら動作を止める」といった設定も可能です。

回数設定をすることで耐久試験や検査治具としても幅広い活用が可能になり、風景を同じ位置で時間指定して撮影する「定点観測カメラ」としても活用できます。

今回使用したノード

今回のブログで使用した ノード は以下から読み込みが可能です。
文字列を全て選択(3回クリック)し[ctrl]+[c]でコピーしてください。

ノードの読込み方法は【こちら】


次回予告

次回はスピーカーを接続し、動作ごとに音を鳴らす設定をします。
次回も是非ご覧ください。

→Part.13【Node-RED入門-13】KeiganPiでUSBスピーカーから音を出す

KeiganPiとは、Raspberry Pi(ラズパイ)にKeiganMotorの開発環境をインストールした製品です。