前回はInjectノードを使って手動でLEDを制御しました。今回はLEDを自動的に点滅制御(Lチカ)してみます。
今回やること
今回の記事では、最初に緑色のLEDを1秒ごとにつけたり消したりする制御を行い、フローの作り方の理解を深めます。
LEDを自動点滅制御するフローは一つの正解があるわけではなく、いくつかのやり方があります。そこで、今回の記事では代表的な2つのフローを作成してLEDを自動点滅してみます。
LEDの点滅制御の方法がわかったら、フローを変更していろいろなパターンの点滅制御もしてみます。
今回の記事を通して、ノードの使い方の理解を深めましょう!
LEDの自動点滅制御
最初に基本的な点滅制御方法として、以下の2通りのフローを説明します。
- 前回のフローをそのまま利用して、Injectノードの設定変更のみで緑色LEDを自動点滅制御してみます。
- 新しいタイプのノードを追加して、緑色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を「ONにするノード」と「OFFにするノード」があります。
上の図で「ONにする」という制御のみを抜き出してみると、以下のようになります。
つまり、「ONにするノード」はメッセージを2秒間隔で送信すればよいことがわかります。
また、「OFFにする」という制御のみを抜き出してみると、以下のようになります。つまり「ONにするノード」と同様に「OFFにするノード」もメッセージを2秒間隔で送信すればよいことがわかります。
この2つの制御をまとめると、「ONにするノード」と「OFFにするノード」のメッセージ送信タイミングを1秒ずらして以下のようにメッセージを送信すれば、LEDを1秒ごとに点滅制御することができるわけです。
ところで、1つのノードの制御を1秒ずらす、というのはどのようにすればよいのでしょうか。
実は、Injectノードには指定した時間間隔でメッセージを送る設定にした場合、フローが動作を開始してから(つまり、デプロイしてから)メッセージを定期送信するまでの待ち時間を指定することができます。この設定を使って以下のように設定すると緑色LEDが1秒間隔で点滅制御できるようになります。
以上をまとめると、「ONにするノード」と「OFFにするノード」は以下のよう設定すると、緑色LEDを1秒ごとに点滅制御することができます。
ノード | 設定内容 |
---|---|
ONにするノード | フロー動作開始1秒後から、2秒間隔でメッセージを送信 |
OFFにするノード | フロー動作開始2秒後から、2秒間隔でメッセージを送信 |
それでは、これから各ノードの設定をしていきましょう。
最初に「ONにするInjectノード」をダブルクリック(タブレット・スマホの場合はダブルタップ)して設定画面を表示します。
表示された設定画面の下の方に、メッセージ送信設定の項目があります。
一定時間間隔で繰返しメッセージを送信する場合は、「繰り返し」の設定から「指定した時間間隔」を選択します。
選択すると、メッセージ送信間隔が設定できるようになりますので、以下のように「2秒」を設定します。
また、動作開始1秒後にメッセージ送信を開始しますので、以下のようにチェックボックスをONにして、「1秒後」にメッセージ送信を開始するように設定します。
これで「ONにするノード」の設定は完了です!
設定が終わったら、右上の「完了」ボタンをクリックして設定画面を閉じます。ノードが更新されて、以下のように繰返し設定がされていることを意味するマークが表示されます。
次に、「OFFにするノード」をダブルクリックして設定画面を表示し、以下のように「動作開始2秒後に、2秒間隔でメッセージを送信」するように設定します。
これですべての設定が終わりました!
この状態でデプロイすると、緑色のLEDが1秒ごとに点滅を開始するはずです。
うまく動きましたか?もしうまく点滅しないようでしたら、もう一度ノードの設定を確認してみてください。
2)新しいノードを追加して自動点滅
次に、新しいノードを使ってLEDの点滅制御をしてみましょう。
ここで作成するフローは、先ほどのフローとは別のフローとして作成することにします。
このように、現在動作しているフローとは別のフローを作成したいケースも今後出てくると思います。そこで、現在のフローは削除することなく動作を停止して、別のフローを作成して動作させる方法を確認していきましょう。
現在のフローをよく見ると、上の方に「フロー1」というタイトルがついていますよね。
フローはこのようにタブ形式になっていて、新たに別のタブを作成することにより「フロー1」とは別のフローを作成することが可能になっています。
これから新規タブを作成します。タブが2つになり、どっちがどのタブかわからなくなってしまいますので、最初に現在のタブの名前を変更しておきましょう。
最初に、「フロー1」タブ部分をダブルクリック(ダブルタップ)します。
以下のように設定画面が表示されます。「フロー1」と書かれているところがタブの名前ですので、ここを「Injectによる点滅制御」に変更します。(他の名前に変更しても構いません。他の名前に変更した場合は、このあと「Injectによる点滅制御」でタブ名を説明しますので、読み替えてください)
変更後、右上の「完了」ボタンをクリックすると、タブの名前が変更されます。
次に、新しいフローを作成するために、新しいタブを作成します。
画面右上に新規タブを作成するための「+」ボタンがあります。
このボタンをクリックすると新規のタブが作成されます。(タブの名前はデフォルトで「フロー2」などのように「フロー」+「数字」になります)
ここまでの作業でタブは2つになりました。
ここでNode-REDの動作仕様で重要なポイントがあります。
このように複数のタブがある場合、すべてのタブのフローが同時に動作します。
これから、新しく作成したタブ(フロー2)で緑色LEDを1秒ごとに点滅制御するフローを作成します。
ただ、すでに「Injectによる点滅制御」タブで同じ制御が動作しています。そこで「Injectによる点滅制御」のフローを停止しておく必要があります。
フローの停止方法は以下の手順で行います。
Node-REDの画面右側に以下のようなフローに関する情報が表示されています。もし表示されていないようでしたら、以下の「 i 」マークのアイコンをクリックしてください。
この領域には、フローに関する情報が表示されています。一番上には現在作成されているタブからリストされています。このリストの中から、動作を停止したいフローにマウスカーソルを合わせると、以下のように2種類のボタンが表示されます。
左側の目のマークはタブの表示/非表示切り替えのボタン、右側の丸いマークはフローを停止するか動作するかの切り替えのボタンです。
「Injectによる点滅制御」タブのフローを停止しますので、一度右側の丸いマークをクリックしてください。クリックすると、以下のようにタブの文字と形状が変わり停止マークが表示されます。また、情報表示領域のフローの文字列もイタリック体になり、動作が停止していることを示すようになります。
なお、間違って左側の表示/非表示切り替えのボタンを押してしまった場合はタブが消えてしまいます。その場合は以下のように画面右上の三角マークをクリックしてメニューを表示し、「すべてのフローを表示」を選択すると再度表示されます。
ところで、フローを停止しても緑色LEDは点滅を続けていますよね。Node-REDでは、フローを変更した場合は必ずデプロイする必要があります。そこで、一度「デプロイ」ボタンをクリックしてください。緑色LEDの点滅が停止すればOKです。
それでは、新しいタブにフローを作成していきましょう。前回の記事と同様に、緑色LEDを制御するために「rpi – gpio out」ノードが必要です。
この「rpi – gpio out」ノードは、パレットから「rpi – gpio out」ノードを配置して、設定して、、、と作業すると大変ですので、前回作成したノードをコピペしてしまいましょう。
以下のように「Injectによる点滅制御」タブを開いて、「緑色LED」ノードをクリックします。クリックするとノードが選択状態になりますので、ここでキーボードのCtrl + C(Windows)、Command + C(macOS)を押します。(通常のコピーのショートカットキーです)
次に、新規作成したタブを開き、キーボードのCtrl + V(Windows)、Command + V(macOS)を押します。キーを押すとマウスカーソルにノードがついてきますので、適当な場所でクリックして配置します。
以下のように「緑色LED」ノードが配置できればOKです。
次に、Injectノードを以下のように配置します。
このInjectノードからタイトル「payload」、値「1」のメッセージを2秒間隔で送信するように、以下のように設定します。
次に、2つのノードを以下のように接続します。
ここで、このフローの動作がどうなるか考えてみましょう。
Injectノードは2秒に1回、「1」のメッセージを「緑色LED」ノードに送信することになります。つまり、2秒に1回、「緑色LED」をONにしているわけです。
これってまったく意味がありませんよね…
そこで、これからノードを追加して緑色LEDが点滅するようなフローにします。最初に、これから作成するフローの考え方を説明します。
上のフローで、Injectノードは2秒に1回「1」のメッセージ、つまりLEDをONにするメッセージを送っています。
このフローに対して、以下のように「メッセージを受け取ったら1秒後に「0」のメッセージを『rpi – gpio out』ノードに送る」というフローを追加すれば、1秒ごとに点滅制御できるだろう、というアイデアです。
このようなフローを作成するには、以下の機能を持つノードが必要になります。
- メッセージを受け取ってから一定時間経過後にメッセージを送る
- メッセージの内容を変える
それではこれから、それぞれの機能を実現するノードについて説明します。
メッセージを受け取ってから一定時間経過後にメッセージを送るノード
このような制御を実現するために「delay」ノードというものが用意されています。
「delay」のノードとは、以下のようにメッセージを受け取ったら、一定時間待ったあと、受け取ったメッセージを送る、という機能になります。
メッセージの内容を変える
delayノードは、受け取ったメッセージを一定時間経過後に「そのまま」送るという制御をします。
つまり以下のように、Injectノードから「1」のメッセージ(LEDをONにするメッセージ)を受け取ったあと、一定時間経過したら「1」のメッセージを送ります。
緑色LEDをOFFにするには、「緑色LED」ノード(rpi – gpio outノード)に「0」を送る必要があります。つまり、delayノードから送られた「1」というメッセージを「0」に変更する必要があります。
このように、メッセージ内容を変更するためにに「change」ノードというものが用意されています。
changeノードは、受け取ったメッセージを変更して送信します。
つまり、以下のように「delay」ノードと「change」ノードを使用して、以下のように制御すれば、LEDをONにするメッセージとOFFにするメッセージが1秒ごとに送ることができるというわけです。
それでは、フローを完成させましょう。
最初にパレットから「delay」ノードと「change」ノードを探して以下のように配置します。(検索機能を使うとすぐに見つかります)
次は「delay」ノードの設定です。「delay」ノードをダブルクリックすると、以下のような設定画面が表示されます。メッセージを受け取ったら1秒後にそのメッセージを送信しますので、以下のように設定します。
これでdelayノードの設定完了です。
次に「change」ノードの設定です。changeノードをダブルクリックして設定画面を表示します。changeノードはいくつかの機能がありますが、ここでは「値の代入」機能にして、「payload」メッセージの値を0に設定することにします。
最後に、以下のようにノードを接続します。
このように接続すると、各ノードは以下のような働きをすることになります。
ノード | 働き |
---|---|
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 | 新規投稿 |
初めまして。
電子工作に興味を持ち、ラズパイとnode-Redを勉強しております。
このサイトも大変参考にさせて頂いており、ありがとうございます。
一つ疑問があり、質問させていただきました。
injectで繰り返し1秒間に1回1信号をだしますが、1信号は「何秒間」送信
しているのだとうか?と思いました。
inject 1 からraspi-outに1秒間に一回(一瞬?)信号がでているが
OFF機能がないのでdelayとchangeで1秒後に0信号を出してOFF
しているのはわかるのだが、chengeから何秒間だしつづけているのかな?
と混乱してきてしました。
もし教えていただけましたら幸いです。
よろしくお願いします。
初めまして。ご質問いただきどうもありがとうございます。
ご質問いただいた内容は、実は私もNode-REDに触れた当初は同じような疑問がありました。この疑問は、Node-REDのノード間の配線を、電子工作の配線のイメージで捉えてしまっていると出てきてしまいます。
電子工作の配線は、必ず何Vかの電圧になりますよね。例えば5VをON、0VをOFFなどと、信号の意味を電圧で表現していて、「信号がない」という状態はありません。
Node-REDの配線は、電子工作の配線とは考え方が異なっています。一言で説明すると
「Node-REDの配線は、メッセージの通り道」
ということになります。
Node-REDの配線を道路、メッセージ(信号)を車に例えてみます。Injectノードを例えば1秒間に1回、「1」を発生させる設定にした場合を考えます。このときInjectノードは、1秒間に1回、1台の車に「1」というメッセージを積んでInjectノードを出発して、道路を通ってつながっているノードに到着する、というイメージです。メッセージを受け取ったノードは、車に積まれているメッセージを確認します。
———
電子工作の配線の場合、例えば信号をOFF=0V、ON=5Vとする場合は、ONにする場合はどのぐらいの時間配線を5Vにするか、という話が出てきます。
一方Node-REDの配線は、メッセージの通り道を意味しているだけですので、1回メッセージ(信号)を送ると、配線を通って単にそのメッセージが次のノードに伝わるというとになります。
ところで、GPIOノードはメッセージを受け取ってGPIOピンを「その電圧に保ち」ますが、これはGPIOノードが次のような働きをするためです。
「GPIOノードが受け取ったメッセージが1の場合はGPIOピンをONにしてその状態を保ち、0の場合はOFFにしてその状態を保つ」
すみません、ちょっとわかりづらいところがあると思いますので、不明点などありましたら再度ご質問いただければと思います。