第21回 Node-REDでLED制御 (3)

今回は、LEDの明るさを変えてみます。

目次

スイッチでLEDの明るさを変える?

前々回と前回の記事では、以下のようにGPIOピンのスイッチをNode-REDで制御して、LEDをON/OFFしました。

GPIO内部のスイッチ模式図

このような制御では、スイッチをONにするかOFFにするか、つまりLEDをつけるか消すかしかできませんよね。

ところがスイッチの制御方法を工夫すると、LEDの明るさを変えることができるんです。

そんなこと言われても、ON/OFFのスイッチしかありませんので、どう考えても明るさを変えることはできない感じですよね。スイッチをONすれば一定の明るさで光るわけですし、OFFにすれば消えてしまいます。

そこでNode-REDで作業を始める前に、上の図でスイッチを制御するだけで明るさを変える原理を理解しておきましょう。

明るさを変えるスイッチ制御方法

上の図で、電池、抵抗、LEDだけを抜き出してみました。

LEDとスイッチの回路

これからこの回路でスイッチを制御して明るさを変えるわけですが、とても無理そうです。

でもひとつだけ方法があるんです。その方法とは、思いっきり早くスイッチをパチパチしてON/OFFを繰り返すんです。

上の画像では物理的なスイッチのようになっているので、実際に手でスイッチを高速ON/OFFするのはかなり難しそうですよね。でもラズベリーパイのGPIOピンの内部スイッチは電子的なスイッチですので、プログラムで高速にスイッチのON/OFFを制御できるようになっています。

ものすごく早くスイッチのON/OFFを繰り返すとLEDは高速とはいっても実際に点滅するわけですが、人間の目には点滅していないように見えるんです。点滅の頻度を1秒間にだいたい100回以上にすると、人間の目には点滅が早すぎて普通に点灯しているように見えます。

このON/OFFの制御のようすは、横軸を時間にすると以下のようになります。

PWM信号1

この図では、LEDをONにする時間とOFFにする時間は同じにしています。つまり、ON/OFFの1回分のうち、50%をON、50%をOFFにしています。

このようにスイッチを制御すると、LEDが点灯している時間は全体の半分(50%)ですよね。

つまり、このような点滅制御をすれば、人間がLEDの光を見ると、半分ぐらいの明るさで光って見えるのではないか、というのがこの制御方法の発想です。

上の図ではONとOFFの時間を50%にしましたが、以下のようにONの時間を20%、OFFの時間を80%にすれば、上の制御よりもっと暗く光って見えるようになります。

PWM信号2

当然ながら、ONの時間の割合を増やすと、ONが50%のときより明るく光って見えるようになります。

PWM信号3

このようにスイッチを高速でON/OFFして、さらにONとOFFの割合を変えると、人間の目には明るさが変わって見える、というところまでは理解できましたでしょうか。

それではこれからこの制御方法に関する用語を覚えておきましょう。

このような制御方法は「PWM制御」と呼ばれています。

「PWM」とは「Pulse Width Modulation」の略です。日本語に無理やり訳すと「パルスの幅の調整」というような意味になります。なぜこのように呼ばれるかもう少し深掘りしましょう。

次の図のような、ある一定時間だけONになる信号は「パルス信号(Pulse Signal)」と呼ばれています。「Pulse」とは日本語で「脈拍」や
「鼓動」などの意味です。

パルス信号

ちょっと話がそれますが、宇宙には面白い星があります。普通の星は光り続けていますが、中には周期的にピカッ、ピカッ、と灯台の光のように光る星があります。このような星のことをパルス状の光を発する、ということで「パルサー(Pulsar)」と呼ばれています。実際、パルサーは宇宙の灯台と呼ばれています。

話を戻すと、スイッチパチパチ明るさ調整制御では以下のようにパルスの幅を調整しました。「幅」は英語で「Width」、「調整」は「Modulation」です。

PWM信号5

つまり、PWM制御とは「パルス(Pulse)の幅(Width)を調整(Modulation)する制御」という意味になります。

PWM制御の概要は理解できましたでしょうか。このあと、Node-REDのノード設定画面で、この「PWM」という言葉が出てきますのでぜひ覚えておいてください。

rpi – gpio outのPWM設定

前々回と前回の記事では、「rpi – gpio out」ノードをスイッチのON/OFF制御で使用しました。

「rpi – gpio out」ノードはPWM制御もできますので、ノードの設定内容を確認しておきましょう。(まだ作業はしませんので、解説だけお読みください)

「rpi – gpio out」ノードの設定画面で「出力形式」という項目があります。

gpio outノードのPWM設定1

ここでは「デジタル制御」か「PWM制御」を選択することができます。

gpio outノードのPWM設定2

デフォルトでは「デジタル制御」となっています。「デジタル制御」とは「0」か「1」の制御、つまり「OFF」か「ON」の制御ということで、単純なスイッチのON/OFF制御を意味しています。

PWM制御をする場合は、このメニューの「PWM出力」を選択します。

「PWM出力」を選択すると、その下の設定項目が以下のように変わります。「頻度」というちょっと謎の設定項目がありますよね。次に、この意味を理解しておきましょう。

gpio outノードのPWM設定3

この記事の最初の方で、スイッチパチパチを1秒間に100回程度繰り返すと、人間の目には普通に点灯しているように見える、と説明しました。

「頻度」設定は、このスイッチパチパチを1秒間に何回行うか、という設定です。単位は「Hz」と書いてあります。「Hz」は「ヘルツ」と読み、1秒間に繰り返す回数の単位です。

gpio outノードのPWM設定4

デフォルトで100、つまり1秒間にパチパチ100回になっています。これからフローを作成して実際にLEDの明るさを調整してみますが、もし光がちらつくようでしたら、この「頻度」を150など少し大きめの数値にしてください。

「rpi – gpio out」ノードのPWM制御設定は以上です。

次に、「rpi – gpio out」ノードの動作について説明します。

「rpi – gpio out」ノード」を「PWM制御」に設定すると、以下のように0〜100の数字のメッセージをこのノードに送ると、0%〜100%の明るさでLEDを点灯することができます。

gpio outノードのPWM設定5

例えば、80を送ると、以下のように80%でPWM制御してくれます。

gpio outノードのPWM設定6

それでは、実際に緑色LEDの明るさを変えてみましょう。

明るさを変えるフロー作成

緑色LEDの明るさを変えるフローを新規作成します。すでにフローが2つありますので、既存フローを停止してから新規フローを作成します。

準備

最初に、前回作成した「フロー2」のフローを停止しておきましょう。次のように、画面右側のフローがリストされているところで「◯」アイコンをクリックして停止状態にします。

PWMフロー作成1

停止状態にしたら、デプロイボタンをクリックしてフローを停止しておきます。

次に「フロー2」の名前を変更しておきましょう。

「フロー2」のタブをダブルクリックするとタブ名の設定画面が表示されますので、以下のように「delayによる点滅制御」に変更して完了ボタンをクリックします。(他の名前でも構いません)

PWMフロー作成2

次に、画面右上の「+」ボタンをクリックして、新規タブ作成します。

PWMフロー作成3

新規タブ作成後、タブ名を「フロー3」から「PWM制御」に変更しておきましょう。

PWMフロー作成4

PWM制御フロー作成

それでは、PWM制御のフローを作成していきます。

「rpi – gpio out」ノードはすでにあるフローのノードをコピーして使用します。

「delayによる点滅制御」にある「緑色LED」ノードをコピー、「PWM制御」のフローにペーストします。

PWMフロー作成6

コピーした「緑色LED」の出力形式設定は「PWM制御」の設定になっていませんので、設定を変更します。

「緑色LED」のノードをダブルクリックすると設定画面が表示されますので、以下のように「出力形式」を「PWM制御」に設定します。

PWMフロー作成7

あとは、「緑色LED」ノードに0〜100の数字のメッセージを送ると緑色LEDがPWM制御で点灯します。

いくつかInjectノードを用意して、明るさの違いを確認してみたいと思います。ここでは例として、「10%」「50%」「100%」の3種類の明るさの比較をしてみます。他の数値に設定していただいても構いません。

それでは、最初にInjectノードを以下のように配置してください。

PWMフロー作成8

配置後、ダブルクリックして設定画面を開きます。タイトルが「payload」、数値データとして「10」を送るように、以下のように設定します。また、このノードの意味がわかるようにノード名を「10%」に設定します。設定後、完了ボタンをクリックして設定画面を閉じます。

PWMフロー作成9

続いて、「50%」「100%」のInjectノードも作成しましょう。すでに「10%」のノードがありますので、「10%」のノードをクリックして選択、コピー&ペーストして2つ複製します。

PWMフロー作成10

複製した2つを以下のように50と100の数値メッセージを送るように設定します。

PWMフロー作成11

設定できたら、あとはノード間を以下のように接続します。

PWMフロー作成12

このように接続すると、以下のようにノードのボタンを押すと、数値メッセージが「緑色LED」ノードに送られて、PWM制御してくれます。

これでフローが完成しました!

動作確認

それでは動作確認しましょう。

動作確認するには、フローをデプロイする必要があります。右上のデプロイボタンをクリックしてデプロイします。

これでフローが動作しましたので、Injectノードのボタンをクリックしてみてください。

PWMフロー動作確認

「10%」「50%」「100%」で明るさが変わることを確認できましたか?

もしうまく動かなかったら、各ノードの設定をもう一度確認してみてください。

PWM制御では、1秒間に100回点滅しているのですが、一定の明るさで光っているように見えますよね。もしチラチラしているようでしたら、「緑色LED」ノードの「頻度」の設定を150〜200程度に変更してみてください。(ノードの設定を変更したらデプロイを忘れずに)

なお、PWM制御の値としては、「10%」「50%」としましたが、特に「50%」の明るさは「100%」の半分の明るさに見えなかったと思います。これは、人間の眼の仕様が、暗い部分の変化は敏感で、明るい部分の変化は鈍感なためです。(眼の感度は対数関数仕様になっています)

補足

この記事をお読みの方の中には、PWM制御のことはすでにご存知で、サーボモータ制御の経験をされている方もいるかもしれません。

「rpi – gpio out」ノードのPWM制御でサーボモータを制御することは可能ですが、このノードのPWM制御は問題があります。

「rpi – gpio out」ノードのPWM信号はソフトウエアで生成しています。そのため、PWM信号のONとOFFの比率が微妙に変動してしまい、結果としてサーボモータが静止しないことがあります。

そのような場合は、精密なPWM信号が生成できるノードを追加インストールする必要があります。(「node-red-node-pi-gpiod」というノードになります)

ノードの追加方法についてはこのシリーズ記事の後半で説明します。

更新履歴

日付 内容
2022.6.17 新規投稿
通知の設定
通知タイミング
guest
0 コメント
本文中にフィードバック
全てのコメントを見る
目次