← Part.6【Node-RED入門-6】モノを検知した位置でKeiganMotorを停止する

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

今回の内容

今回はPart.6の内容を応用し、ループ停止後にモノが離れるとループを再開する設定をします。

また、ノード同士をつなぐワイヤーが見づらくなった際の視認性を改善するリンクの設定も解説します。

1.リンクを設定する
2.[delay]ノードを設定する
3.[change]ノードを設定する
4.[switch]ノードを設定する 
4.[complete]ノードを設定する
5.実際にKeiganMotorを動かす

※今回はPart.6のノードを使用しますので、前回のノードを読み込んで配置しておいてください。
ノードの読込み方法は【こちら】

リンクを設定する

↑点線のワイヤーがリンクを設定した状態 クリックして拡大表示

リンクを設定すると、ワイヤーを使用せずにノードの情報を伝えることができます。
リンクの設定には、[link out]ノードと[link in]ノードの2種類を必ず使用します。

link out

前のノードの情報を[link in]ノードへ伝えます。

link in

[link out]から受け取った情報を次のノードへ伝えます。

[link out],[link in]ノードを配置する

まずは同じフローを2つ用意し、片方は途中でワイヤーを削除します。
(このノードは実行しませんので、好きなノードを配置してください)

1.パレットの共通にある[link out],[link in]ノードを1つずつ配置
2.情報を受け取るノードに[link out]ノードを接続
3.情報を伝えるノードに[link in]ノードを接続

以上で[link out],[link in]ノードの配置が完了しました。
(ノードの名前は自由に設定してください)

※今回は[link out]にlink out.1、[link in]に link in.1の名前を設定しています

プロパティを設定する

[link out]ノードをダブルクリックするとすべてのタブに配置された[link in]ノードの一覧が表示されます。
[link out]ノードは複数の[link in]ノードに情報を伝えることができますので、伝えたい[link in]ノードを任意の数選択して完了をクリックしてください。
[link in]ノードをダブルクリックすると、すべてのタブに配置された[link out]ノードの一覧が表示されます。
プロパティを設定する場合は[link out],[link in]ノードのどちらを選択しても問題ありません。

リンクの設定を確認する

以上でリンクの設定は完了です。
ノードは繋がっていないように見えますが、[link out],[link in]ノードのどちらかをクリックすると点線のワイヤーが表示されます。

クリックして拡大表示
[link out],[link in]ノードのメリットはノード自体にリンク先(またはリンク前)の情報が含まれているという点です。

1つのノードを複数のノードに接続したい場合、通常は1つずつワイヤーを接続する必要がありますが、[link out],[link in]ノードを設定した場合はそのノードをコピーするだけで簡単にノード同士を接続することができます。
↑ノードをワイヤーで接続する手間がかからない

[delay]ノードを設定する

前回のPart.6では、フォトセンサーがモノを発見するとマットブラックのターンテーブルが少し遅れて停止する現象が発生しました。(以下図参照)

↑白と黒の停止が同時ではない


これは[delay]ノードの待機している間次のノードに情報を伝えない仕様によるものです。

[delay]ノードのメリット・デメリット

[delay]ノードのメリットはKeiganMotorの回転を時間管理できることです。
時計回りに3秒回転、反時計回りに2秒回転といった動作を指示する場合、[delay]ノードで簡単に指示できます。 [delay]ノードのデメリットは時間が経つまで次のノードへ指示が伝わらないことです。
フォトセンサーからモノが離れると再びループする…という設定は、フォトセンサーがモノを見失った際の情報をきっかけに動作します。

モノを発見する⇔モノが離れるを短期間に繰り返すと、情報が連続して伝えられ重複処理が発生し、正常に動作しなくなる場合があります。

[delay]ノードを細分化して配置する

対策として、[delay]ノードで1秒待機するのではなく[delay]ノードで0.25秒待機を4回繰り返すという細分化する方法があります。

1秒間他の指示を伝えないのではなく、0.25秒(250ms)ごとに指示を受け付けるタイミングを設定することで誤動作を最小限に抑えることができます。
以下図を参照し、前回のPart.6で設定したループ部分のフローを、以下の通り細分化してください。

※[switch]ノードの設定はすべて同じ(flow.sensor)です

↑前回のループ部分のフロー クリックして拡大表示
↑ 0.25秒(250ms)ごとに細分化したフロー クリックして拡大表示
↑ リンクを表示した状態 クリックして拡大表示

これで0.25秒(250ms)ごとにflow.sensorの値を判断してモーターを停止させる設定ができました。

※0.1秒、0.01秒など細かい設定も可能ですが、その分フローが複雑になります。
起こりうる不具合とのバランスを考慮して細分化してください。

[change]ノードを設定する

ループ処理は、複数の[switch]ノードと[change]ノードを組み合わせて設定します。
そのため、[switch]ノードの判定基準となるflow.の名前と数値を[change]ノードで指定します。

1.フォトセンサーがモノを発見したかどうか
 →flow.sensorが0か1か
2.モーターが停止したかどうか
 →flow.finishが0か1か
3.フォトセンサーがモノを見失ったかどうか
 →flow.restartが0か1か

flow.sensorは、Part.6で設定済みです。

flow.finishは、モーター停止用フローの最後に設定します。
後述しますが、[change]ノードを2種類並べて配置し、最初をflow.finishに0を代入する設定にし、次をflow.finishに1を代入する設定にしてください。
(一度0を代入してから1を代入する設定)

flow.restartは、フォトセンサーが離れた際に1を代入する設定にします。
(ループ再開はflow.restartに1が代入されたタイミングで判定)
ループ再開時にはこの値を再びリセットするよう、別の[change]ノードでflow.restartに0を代入する設定を用意しておいてください。

↑設定状態 クリックで拡大表示

※一番下の[flow.restartに”0″を代入]ノードはこの後接続します。

[switch]ノード設定する

flow.の数値を参照し、モーター停止を継続するか、しないかを設定します。
まずは以下図を参考に[switch]ノード~[モーター許可]ノードを配置し、その後接続してください。

[switch]ノードは先ほどflow.sensorで設定したものを[ctrl]+[c]でコピーし使用してください。
クリックして拡大表示
[switch]ノードのプロパティを開きflow.sensorをflow.restartに変更して作業完了です。

[complete]ノードを設定する

今回新たに使用する[complete]ノードについて解説します。

complete

他のノードの処理完了をきっかけに指示を実行します。

今回はフォトセンサーからモノが離れた際に処理する[flow.restartに”1″を代入]ノードの処理完了をきっかけに、ループを再開するよう設定します。

1.パレットの共通にある[complete]ノードを配置。
2.モーター停止を継続するか、しないかの項目にある [switch]ノードの前に[complete]ノードを配置し接続。
3.[complete]ノードをダブルクリックしノードを選択をクリック。
4.[flow.restartに"1"を代入] ノードをクリックし完了。
[complete]ノードは複数のノードをチェックでき、チェックしたノードのいずれかのノードが処理完了すれば実行されます。

例えば、複数の箇所にフォトセンサーを設置し、いずれかのフォトセンサーが反応すれば特定の処理を行う…といった設定も可能です。
※[complete]ノードは[link out],[link in]ノードと違い、他のタブのノードは指定できません

KeiganMotorを動かす

以上で準備が完了したので、実際にKeiganMotorを動かします。
タイムスタンプをクリックし、KeiganMotorが以下のように動けば成功です。

使用事例

前回のPartで絶対位置を使用した理由は、今回のループ動作のためでした。
フォトセンサーが止まる(モノを発見する)位置は一定ではないため、相対位置で設定した場合はフォトセンサーが止まった位置を基準に段々とズレていきます。

絶対位置を使用すると、どの位置でフォトセンサーが止まっても指定した範囲内で動きがループします。

今回の事例を応用すると監視カメラ等も簡単に自作できますので、是非色々な用途にKeiganPiをご活用ください。

KeiganPi スターターキット

今回使用したノード

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


次回予告

次回はカメラプラットフォームキットを物理ボタンで動かす設定をします。
次回も是非ご覧ください。

KM-1U カメラプラットホームキット

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