第20回 Node-REDでLED制御 (2)

前回はInjectノードを使って手動でLEDを制御しました。今回はLEDを自動的に点滅制御(Lチカ)してみます。

目次

今回やること

今回の記事では、最初に緑色のLEDを1秒ごとにつけたり消したりする制御を行い、フローの作り方の理解を深めます。

LEDを自動点滅制御するフローは一つの正解があるわけではなく、いくつかのやり方があります。そこで、今回の記事では代表的な2つのフローを作成してLEDを自動点滅してみます。

LEDの点滅制御の方法がわかったら、フローを変更していろいろなパターンの点滅制御もしてみます。

今回の記事を通して、ノードの使い方の理解を深めましょう!

LEDの自動点滅制御

最初に基本的な点滅制御方法として、以下の2通りのフローを説明します。

  1. 前回のフローをそのまま利用して、Injectノードの設定変更のみで緑色LEDを自動点滅制御してみます。
  2. 新しいタイプのノードを追加して、緑色LEDを自動点滅制御してみます。

このように、同じ制御をする場合でもフローの実現方法は何通りかありますので、使用するノードの特徴や組み合わせ方を理解するようにしてみてください。

それでは、ラズベリーパイのNode-REDを起動して、ブラウザからNode-REDにアクセスしましょう。これから、前回のフローがそのままの状態になっている前提で説明を進めます。

1)前回のフローをそのまま利用して自動点滅

前回のフローは、Injectノードのボタンをクリックすると、LEDをつけたり消したりすることができました。

前回のフロー

Injectノードは、ボタンで制御する以外にも、定期的にメッセージを送る機能があります。具体的には以下の設定をすることが可能です。

設定 意味 設定例
指定した時間間隔 指定した時間間隔でメッセージを送信する 1秒間隔でメッセージを送信する
指定した日時で時間間隔 指定した曜日の指定した時刻の間、指定した時間間隔でメッセージを送信する 毎週金曜日の朝6:00〜6:10の間だけ、1分間隔でメッセージを送信する
指定した日時 指定した曜日の指定した時刻にメッセージを送信する 毎週土曜と日曜の午前10:00にメッセージを送信する

LEDを自動的に点滅制御するには、この設定の中の「指定した時間間隔」を使います。

それではこれから、Injectノードをどのように設定すればLEDを1秒ごとにつけたり消したりできるか考えていきましょう。

緑色LEDを1秒ごとにつけたり消したりするということは、以下のようにLEDを制御することになりますよね。

LED制御1

前回作成したフローには緑色LEDを「ONにするノード」と「OFFにするノード」があります。

上の図で「ONにする」という制御のみを抜き出してみると、以下のようになります。

LED制御2

つまり、「ONにするノード」はメッセージを2秒間隔で送信すればよいことがわかります。

また、「OFFにする」という制御のみを抜き出してみると、以下のようになります。つまり「ONにするノード」と同様に「OFFにするノード」もメッセージを2秒間隔で送信すればよいことがわかります。

LED制御3

この2つの制御をまとめると、「ONにするノード」と「OFFにするノード」のメッセージ送信タイミングを1秒ずらして以下のようにメッセージを送信すれば、LEDを1秒ごとに点滅制御することができるわけです。

LED制御4

ところで、1つのノードの制御を1秒ずらす、というのはどのようにすればよいのでしょうか。

実は、Injectノードには指定した時間間隔でメッセージを送る設定にした場合、フローが動作を開始してから(つまり、デプロイしてから)メッセージを定期送信するまでの待ち時間を指定することができます。この設定を使って以下のように設定すると緑色LEDが1秒間隔で点滅制御できるようになります。

LED制御5

以上をまとめると、「ONにするノード」と「OFFにするノード」は以下のよう設定すると、緑色LEDを1秒ごとに点滅制御することができます。

ノード 設定内容
ONにするノード フロー動作開始1秒後から、2秒間隔でメッセージを送信
OFFにするノード フロー動作開始2秒後から、2秒間隔でメッセージを送信

それでは、これから各ノードの設定をしていきましょう。

最初に「ONにするInjectノード」をダブルクリック(タブレット・スマホの場合はダブルタップ)して設定画面を表示します。

injectノード設定1

表示された設定画面の下の方に、メッセージ送信設定の項目があります。

injectノード設定2

一定時間間隔で繰返しメッセージを送信する場合は、「繰り返し」の設定から「指定した時間間隔」を選択します。

injectノード設定3

選択すると、メッセージ送信間隔が設定できるようになりますので、以下のように「2秒」を設定します。

injectノード設定4

また、動作開始1秒後にメッセージ送信を開始しますので、以下のようにチェックボックスをONにして、「1秒後」にメッセージ送信を開始するように設定します。

injectノード設定5

これで「ONにするノード」の設定は完了です!

設定が終わったら、右上の「完了」ボタンをクリックして設定画面を閉じます。ノードが更新されて、以下のように繰返し設定がされていることを意味するマークが表示されます。

injectノード設定6

次に、「OFFにするノード」をダブルクリックして設定画面を表示し、以下のように「動作開始2秒後に、2秒間隔でメッセージを送信」するように設定します。

injectノード設定7

これですべての設定が終わりました!

この状態でデプロイすると、緑色のLEDが1秒ごとに点滅を開始するはずです。

うまく動きましたか?もしうまく点滅しないようでしたら、もう一度ノードの設定を確認してみてください。

2)新しいノードを追加して自動点滅

次に、新しいノードを使ってLEDの点滅制御をしてみましょう。

ここで作成するフローは、先ほどのフローとは別のフローとして作成することにします。

このように、現在動作しているフローとは別のフローを作成したいケースも今後出てくると思います。そこで、現在のフローは削除することなく動作を停止して、別のフローを作成して動作させる方法を確認していきましょう。

現在のフローをよく見ると、上の方に「フロー1」というタイトルがついていますよね。

新規フロー1

フローはこのようにタブ形式になっていて、新たに別のタブを作成することにより「フロー1」とは別のフローを作成することが可能になっています。

これから新規タブを作成します。タブが2つになり、どっちがどのタブかわからなくなってしまいますので、最初に現在のタブの名前を変更しておきましょう。

最初に、「フロー1」タブ部分をダブルクリック(ダブルタップ)します。

新規フロー2

以下のように設定画面が表示されます。「フロー1」と書かれているところがタブの名前ですので、ここを「Injectによる点滅制御」に変更します。(他の名前に変更しても構いません。他の名前に変更した場合は、このあと「Injectによる点滅制御」でタブ名を説明しますので、読み替えてください)

新規フロー3

変更後、右上の「完了」ボタンをクリックすると、タブの名前が変更されます。

新規フロー4

次に、新しいフローを作成するために、新しいタブを作成します。

画面右上に新規タブを作成するための「+」ボタンがあります。

新規フロー5

このボタンをクリックすると新規のタブが作成されます。(タブの名前はデフォルトで「フロー2」などのように「フロー」+「数字」になります)

新規フロー6

ここまでの作業でタブは2つになりました。

ここでNode-REDの動作仕様で重要なポイントがあります。

このように複数のタブがある場合、すべてのタブのフローが同時に動作します。

これから、新しく作成したタブ(フロー2)で緑色LEDを1秒ごとに点滅制御するフローを作成します。

ただ、すでに「Injectによる点滅制御」タブで同じ制御が動作しています。そこで「Injectによる点滅制御」のフローを停止しておく必要があります。

フローの停止方法は以下の手順で行います。

Node-REDの画面右側に以下のようなフローに関する情報が表示されています。もし表示されていないようでしたら、以下の「 i 」マークのアイコンをクリックしてください。

新規フロー7

この領域には、フローに関する情報が表示されています。一番上には現在作成されているタブからリストされています。このリストの中から、動作を停止したいフローにマウスカーソルを合わせると、以下のように2種類のボタンが表示されます。

新規フロー8

左側の目のマークはタブの表示/非表示切り替えのボタン、右側の丸いマークはフローを停止するか動作するかの切り替えのボタンです。

「Injectによる点滅制御」タブのフローを停止しますので、一度右側の丸いマークをクリックしてください。クリックすると、以下のようにタブの文字と形状が変わり停止マークが表示されます。また、情報表示領域のフローの文字列もイタリック体になり、動作が停止していることを示すようになります。

新規フロー9

なお、間違って左側の表示/非表示切り替えのボタンを押してしまった場合はタブが消えてしまいます。その場合は以下のように画面右上の三角マークをクリックしてメニューを表示し、「すべてのフローを表示」を選択すると再度表示されます。

新規フロー10

ところで、フローを停止しても緑色LEDは点滅を続けていますよね。Node-REDでは、フローを変更した場合は必ずデプロイする必要があります。そこで、一度「デプロイ」ボタンをクリックしてください。緑色LEDの点滅が停止すればOKです。

それでは、新しいタブにフローを作成していきましょう。前回の記事と同様に、緑色LEDを制御するために「rpi – gpio out」ノードが必要です。

この「rpi – gpio out」ノードは、パレットから「rpi – gpio out」ノードを配置して、設定して、、、と作業すると大変ですので、前回作成したノードをコピペしてしまいましょう。

以下のように「Injectによる点滅制御」タブを開いて、「緑色LED」ノードをクリックします。クリックするとノードが選択状態になりますので、ここでキーボードのCtrl + C(Windows)、Command + C(macOS)を押します。(通常のコピーのショートカットキーです)

新規フロー作成1

次に、新規作成したタブを開き、キーボードのCtrl + V(Windows)、Command + V(macOS)を押します。キーを押すとマウスカーソルにノードがついてきますので、適当な場所でクリックして配置します。

以下のように「緑色LED」ノードが配置できればOKです。

新規フロー作成2

次に、Injectノードを以下のように配置します。

新規フロー作成3

このInjectノードからタイトル「payload」、値「1」のメッセージを2秒間隔で送信するように、以下のように設定します。

新規フロー作成4

次に、2つのノードを以下のように接続します。

新規フロー作成5

ここで、このフローの動作がどうなるか考えてみましょう。

Injectノードは2秒に1回、「1」のメッセージを「緑色LED」ノードに送信することになります。つまり、2秒に1回、「緑色LED」をONにしているわけです。

これってまったく意味がありませんよね…

そこで、これからノードを追加して緑色LEDが点滅するようなフローにします。最初に、これから作成するフローの考え方を説明します。

上のフローで、Injectノードは2秒に1回「1」のメッセージ、つまりLEDをONにするメッセージを送っています。

このフローに対して、以下のように「メッセージを受け取ったら1秒後に「0」のメッセージを『rpi – gpio out』ノードに送る」というフローを追加すれば、1秒ごとに点滅制御できるだろう、というアイデアです。

新規フロー作成6

このようなフローを作成するには、以下の機能を持つノードが必要になります。

  1. メッセージを受け取ってから一定時間経過後にメッセージを送る
  2. メッセージの内容を変える

それではこれから、それぞれの機能を実現するノードについて説明します。

メッセージを受け取ってから一定時間経過後にメッセージを送るノード

このような制御を実現するために「delay」ノードというものが用意されています。

新規フロー作成7

「delay」のノードとは、以下のようにメッセージを受け取ったら、一定時間待ったあと、受け取ったメッセージを送る、という機能になります。

新規フロー作成8

メッセージの内容を変える

delayノードは、受け取ったメッセージを一定時間経過後に「そのまま」送るという制御をします。

つまり以下のように、Injectノードから「1」のメッセージ(LEDをONにするメッセージ)を受け取ったあと、一定時間経過したら「1」のメッセージを送ります。

新規フロー作成9

緑色LEDをOFFにするには、「緑色LED」ノード(rpi – gpio outノード)に「0」を送る必要があります。つまり、delayノードから送られた「1」というメッセージを「0」に変更する必要があります。

このように、メッセージ内容を変更するためにに「change」ノードというものが用意されています。

新規フロー作成10

changeノードは、受け取ったメッセージを変更して送信します。

新規フロー作成11

つまり、以下のように「delay」ノードと「change」ノードを使用して、以下のように制御すれば、LEDをONにするメッセージとOFFにするメッセージが1秒ごとに送ることができるというわけです。

新規フロー作成12

それでは、フローを完成させましょう。

最初にパレットから「delay」ノードと「change」ノードを探して以下のように配置します。(検索機能を使うとすぐに見つかります)

新規フロー作成13

次は「delay」ノードの設定です。「delay」ノードをダブルクリックすると、以下のような設定画面が表示されます。メッセージを受け取ったら1秒後にそのメッセージを送信しますので、以下のように設定します。

新規フロー作成14

これでdelayノードの設定完了です。

次に「change」ノードの設定です。changeノードをダブルクリックして設定画面を表示します。changeノードはいくつかの機能がありますが、ここでは「値の代入」機能にして、「payload」メッセージの値を0に設定することにします。

新規フロー作成15

最後に、以下のようにノードを接続します。

新規フロー作成16

このように接続すると、各ノードは以下のような働きをすることになります。

ノード 働き
delayノード Injectノードからメッセージを受け取ったら、1秒後に受け取ったメッセージを送信する
changeノード delayノードからメッセージを受け取ったら、タイトルが「payload」で値が「0」のメッセージを送信する

これで、1秒間隔で緑色LEDが点滅を繰り返す制御が実現できます。

設定を確認したら、デプロイボタンをクリックしてください。うまく動作しましたか?

ミニチャレンジ課題

ノードとフローに慣れるために、以下のミニチャレンジ課題に挑戦してみてください。

ミニチャレンジ課題1

最初は点滅間隔の調整をしてみます。現在、緑色LEDを1秒間隔でON/OFFしています。この時間間隔を0.5秒に変更してみてください。

ミニチャレンジ課題1

次に、緑色LEDと赤色LEDを同じタイミングで0.5秒間隔でON/OFFするように変更してみてください。

ミニチャレンジ課題2

最後に、3色のLEDを以下のように点滅制御するフローを作成してみてください。

1秒ごとに、「緑色LEDをON」→「緑色LEDをOFF」→「青色LEDをON」→「青色LEDをOFF」→「赤色LEDをON」→「赤色LEDをOFF」という制御を繰り返す。
 

更新履歴

日付 内容
2022.6.14 新規投稿
通知の設定
通知タイミング
guest
2 コメント
新しい準
古い順 一番投票が多い
本文中にフィードバック
全てのコメントを見る
しかたっちゅ
しかたっちゅ
1 年 前

初めまして。
電子工作に興味を持ち、ラズパイとnode-Redを勉強しております。
このサイトも大変参考にさせて頂いており、ありがとうございます。
一つ疑問があり、質問させていただきました。

injectで繰り返し1秒間に1回1信号をだしますが、1信号は「何秒間」送信
しているのだとうか?と思いました。

inject 1 からraspi-outに1秒間に一回(一瞬?)信号がでているが
OFF機能がないのでdelayとchangeで1秒後に0信号を出してOFF
しているのはわかるのだが、chengeから何秒間だしつづけているのかな?
と混乱してきてしました。

もし教えていただけましたら幸いです。

よろしくお願いします。

目次