緑・橙・赤の光で設備などの状態を表示する信号灯は工場や物流などの現場でよく使われています。この信号灯の状態をデジタル化し、Ambientに送って稼働状態を可視化します。
信号灯を制御する
信号灯の状態をデジタル化するプロトタイプ開発のために、まず信号灯を制御します。ネットで適当に購入した信号灯は24Vで駆動するもので、回路図もありません。緑、黄、赤、グレーのケーブルが出ているので、それぞれに24Vを加えれば、その色が点灯するのだと思いますが、手元に24Vの電源もありません。
信号灯を分解すると、写真の左から2番目、3番目のようにLEDが搭載された基板が3枚、柱状に配置されています。回路図がないので、この基板を利用することはあきらめ、写真の右側のように基板の上にLEDテープを貼り、M5Stackで制御することにしました。真面目にやるなら3枚の基板それぞれにLEDテープを貼った方がよいのでしょうが、今回は手を抜いて1枚しか貼っていません。
プログラムはUI Flowで書きました。緑60秒→橙20秒→赤30秒→橙20秒→緑60秒と点灯し続けます。こういうちょっとしたプログラムを書くにはUI Flowはとても便利です。
信号灯の状態をデジタル化する
信号灯ができたので、この状態をデジタル化します。やり方はいくつかありますが、今回は光センサを緑・橙・赤、それぞれの部分に貼り付けて、光の強さを調べることにしました。
M5Stackの光センサ「M5Stack用光センサユニット」は光の強さがアナログとデジタルで出力されます。3つの光センサを扱うために「M5Stack用I/Oハブユニット」を使いました。M5Stack用のハブユニットにはもう一つ「M5Stack用Port A(I2C)拡張ハブユニット」がありますが、こちらはI2Cで通信するデバイス用のハブなので、光センサには使えません。
3つの光センサと「M5Stack用I/Oハブユニット」を上の写真のようにつなぎ、信号灯に貼り付けます。今は実験なのでテープで貼っただけですが、工場などで使うときには結束バンドなどを使ってしっかり固定する必要があります。
光センサには感度調整用の可変抵抗があります。ライトが点いているかどうかのしきい値はプログラムで設定するので、可変抵抗は3つとも真ん中あたりにしておきます。
次のプログラムを動かして、しきい値の調整をします。プログラムをビルドするにはporthub.cppとporthub.hというファイルが必要です。この2つのファイルはArduino IDEの「ファイル」メニュー→「スケッチ例」「M5Stack」「Unit」の下の「PbHUB」にあります。
プログラムを動かすと、光センサの出力値がシリアルモニタに出力されます。シリアルモニタを閉じ、Arduino IDEで「ツール」メニューから「シリアルプロッタ」を選択すると、3つの光センサの値がグラフ表示されます。
光センサの出力は明るいときが小さい値、暗いときが大きな値になります。グラフの青い線(緑のライトに対応)を見ると、明るいときで300ぐらい、暗いときで380ぐらいの値なので、340をしきい値にしてそれ以下なら点灯、それ以上なら消灯と判断できます。同様にグラフの赤い線(橙のライトに対応)のしきい値は180、緑の線(赤いライトに対応)は250にするとよさそうです。グラフの青、赤、緑という線はデータの1番目、2番目、3番目を表していて、信号灯のライトの色ではないので、間違えないでください。
緑・橙・赤のライトの点灯/消灯を判断するしきい値を使って、信号灯の状態をAmbientに送信するプログラムは次のようになります。
3つの光センサから値を取得し、しきい値と比較してライトが点灯しているか消灯しているかを判断します。前回の測定と状態が違っているときだけAmbientにデータを送信しています。
Ambientでの表示
Ambientでは「稼働状態」チャートを使うとわかりやすい表示ができます。まず、チャネル一覧ページでデータを送信するチャネルの「設定変更」を選択し、チャネル設定画面を開きます。
ここで「データー1」の名前を「緑」、名前欄の右側の色のついたタイルをクリックして緑色を選択します。同様に「データー2」「データー3」も設定します。データの名前は「緑」「橙」「赤」としましたが、実際に信号灯を使っている場面に合わせて「稼働中」「異常」「停止中」などとしてもよいと思います。
チャネル設定をしてチャネル名をクリックするとボードが表示されます。ここでチャート上部のチャート名をクリックしてチャート設定画面を表示し、チャート種類として「稼働状態」を、表示するデータとして「d1」「d2」「d3」を選択します。
ボードに戻ると、下の図のように信号灯の状態が時系列の稼働状態として可視化されているのが確認できます。