← Part.5【Node-RED入門-5】フォトセンサーと連動してKeiganMotorを動かす
→ Part.7【Node-RED入門-7】モノが離れている間KeiganMotorを動かす
■全記事一覧→Node-REDまとめ
もくじ
今回の内容
今回はフォトセンサーをKeiganMotorに取り付けて操作し、モノを検知するとその位置でKeiganMotorを停止させる動きを設定します。
また、原点の設定についても解説します。
1.KeiganMotorの原点を設定する 2.KeiganMotorの動きを繰り返す 3.モノを検知するとKeiganMotorを止める 4.実際にKeiganMotorを動かす

センサーがモノを検知するとお互いのKeiganMotorが停止
(マットブラックは[delay]ノードによって少し遅れて停止)
KeiganMotorの原点を設定する
KeiganMotorの[sequencer]ノードの設定項目を見ると、相対位置・絶対位置という用語が出てきます。
原点を設定するにあたり、まずこの2種類の違いについて解説します。
1.相対位置と絶対位置の違い
相対位置
相対位置は、今の位置(現在位置)を基準にします。
例えば相対位置へ移動(-90°)という指示を与えた場合、KeiganMotorは以下図のように移動します。

絶対位置
絶対位置は、あらかじめ設定された原点からの距離を基準にします。
例えば絶対位置へ移動(-90°)という指示を与えた場合、原点から90°の位置まで移動します。

備考:CWとCCWについて
時計回り・反時計回りは、以下のような表現もされます。
■ 反時計回り countercrockwise(CCW) 角度で正(プラス値)を指定すると反時計回りに回転する ■ 時計回り clockwise(CW) 角度で負(マイナス値)を指定すると時計回りに回転する

2.原点を設定する
絶対位置を正しく機能させるために原点を設定します。
[Sequencer]ノードをコピーまたは新しく配置し、以下設定を行ってください。
1.[Sequencer]ノードのプロパティを開く。 2.動作タブからcmdPresetPositionを選択する。 3.Positionに0を入力。 4.名前を現在位置を原点に設定へ変更し完了。

Positionについて
今回のように0を入力すると、現在位置を原点に設定できます。
その他の位置を原点に設定する場合は任意の数値を入力してください。
これで原点の設定が完了しました。
KeiganMotorの動きを繰り返す
次に、フォトセンサーがモノを検知するまで動きをループする(繰り返す)設定をします。
1.ループするノードを配置する
[Sequencer]ノードをコピーまたは新しく配置し、以下設定を行ってください。
1.[Sequencer]ノードのプロパティを開く。 2.動作タブからcmdMoveToPositionDegを選択。 3.position_degを40,speed_rpmを90に設定。 4.手順2のノードを[ctrl]+[c]でコピーし貼り付け。 5.貼り付けしたノードのposition_degを 40 → -40 へ変更。 6.名前を絶対位置40°(90rpm)へ変更し完了。

その後、[現在位置を原点へ設定]ノードと[delay]ノードを配置し、以下のようにフローを作成します。
([delay]ノードは1秒に設定)
これでループする動きが設定できました。

2.ループを設定する
ループを設定する方法はとても簡単で、以下のようにループしたい部分をワイヤーで接続するだけです。

ノード同士をつなぐワイヤーが交差し少々見づらくなってしまいますが、こちらの解消方法はPart.7にて解説します。
モノを検知するとKeiganMotorを止める
1.フォトセンサーの設定をする
次にフォトセンサーの設定を行います。
Part.5で使用した設定を編集しますので、[PIN:↑10]ノードと[ONで実行]ノードをコピーして貼り付けしてください。

フォトセンサーがモノを検知した場合のみ動く設定を利用します。
2.ループを止める設定をする
一見、以下図のように2種類のフローを配置し、フォトセンサーが反応すればモーター停止(cmdDisable)となり、設定が完了するように思えます。

しかしこれではモーターが停止してもループする指示は止まっていません。
ループを止めるには、そのループ内に[モーター停止]ノードを配置し[switch]ノードで切り替える必要があります。
3.[change]ノードを設定する
フォトセンサーは状況によって0または1の情報を出力しますが、その情報は次のノードの設定によって情報が消える場合があります。
今回はループする・止める判断をする[switch]ノードまでフォトセンサーの情報を残したいので、その設定を[change]ノードで行います。
[change]ノードとは

このノードを使用し、フォトセンサーの情報を消えない別の情報へ変換します。
1.左のパレットにある機能から[change]ノードを配置する。 2.[change]ノードのプロパティを開き、ルールを以下の通り設定する。 値の代入 → flow.sensor 対象の値 → 文字列 → 0 3.名前を flow.sensorに"0"を代入へ変更し完了。 4.フォトセンサーの[モーター停止]ノードを[change]ノードへ変更。

ノードの解説
[change]ノードの変換できる情報はmsg. flow. global があり、それぞれ以下の特徴を持ちます。msg. そのノードだけに情報を与える。 flow. そのフロー(タブ)全体で共有する情報を与える。 global.他のフロー(タブ)も含んだ全体で共有する情報を与える。
今回はflow.sensorという名前を新たに作り、その中に0という文字情報を出力しました。(sensor部分は好きな文字を設定できます)
flow.の情報はそのフロー(タブ)全体で共有されます。
今回の場合、flow.sensorに新たな文字情報を入力したり削除しない限りその情報が残り続けます。
4.[switch]ノードで情報を参照する
[change]ノードの設定により、フォトセンサーがモノを検知した際の情報を flow.sensor に0の文字情報を出力する設定に変換できました。次は[switch]ノードをmsg.の情報からflow.の情報を確認するよう設定します。
1.[switch]ノードのプロパティを開き、ルールを以下の通り設定する。 プロパティ → flow.sensor 1列目 → == →文字列 → 0 2列目 → == →文字列 → 1
※[switch]ノードの設定は【こちら】
flow.sensorが0の場合はループを止める、1の場合はループする設定になりました。

5.ループする前に[change]ノードを新たに配置する
ここまでの設定で、ループする・止めるの判断はflow.sensorの値によって変わるようになりました。
flow.sensorの値が1の場合はループする設定のため、このフローの最初にその指示を設定します。
1.[change]ノードを新たに配置する。 2.[change]ノードのプロパティを開き、ルールを以下の通り設定する。 値の代入 → flow.sensor 対象の値 → 文字列 → 1 3.名前を flow.sensorに"1"を代入へ変更し完了。
このノードは1回だけ設定すればいいので、ループする動きの前に[change]ノードを配置します。

6.フローにノードを配置する
以上で、フォトセンサーがモノを検知すればKeiganMotorを停止させる準備が整いました。
今回はそれに加え、今までの内容を盛り込んだ以下のようなノードをしました。
1.[タイムスタンプ]ノードをクリックすると2種類のKeiganMotorが回転 2.フォトセンサーがモノを検知するとループを止めるの情報を発信 3.ループが終了すると2種類のKeiganMotorが停止

※マットホワイト側のKeiganMotorは、10秒経つと自動で停止するように設定
最後に忘れずデプロイしてください。
実際にKeiganMotorを動かす
[タイムスタンプ]ノードをクリックし、実際に指示した通りの動きをする事を確認してください。
使用事例
ループする動きは様々な用途で利用できます。
以下は実際にKeiganPiを用いたKeiganMotorの評価試験で、モーターの正転・逆転を繰り返す耐久試験の様子です。

ノードの設定を少し変更するだけで素早く・簡単に指示を変更できますので、複数の治具をKeiganPiとKeiganMotorだけで使い分けることができます。
[Sequencer]ノードの各項目において ■ distance_deg :回転方向 (プラス~°で反時計回り、マイナス~°で時計回り) 360°毎に1回転します。 ■ speed_rpm :回転速度 使用するKeiganMotorによって最大速度が異なります。 以下図を参照ください。 ※KeiganMotor KM-1Uの場合は0.0001~260rpm

今回使用したノード
今回のブログで使用したノードは以下から読み込みが可能です。
文字列を全て選択(3回クリック)し[ctrl]+[c]でコピーしてください。
ノードの読込み方法は【こちら】
次回予告
次回は今回の動きに加え、モノが離れるとKeiganMotorを動かす設定をします。
次回も是非ご覧ください。
> Part.7【Node-RED入門-7】モノが離れている間KeiganMotorを動かす

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