工場IOTプロジェクト第三弾・ルクス計・照度感知お知らせセンサー
みなさまこんにちは
まぶちでございます。
ついにIOT第三弾が開発実装されました。
といっても試作段階ですので、実用前の段階になります。
今回のIOT製品は、GY-30というモジュールを使って、照度を調べることができるものです。
この照度をLux(ルクス)に変換し、そのデータをラズパイ(小型コンピュータ)にて明るい場合
めちゃくちゃ明るいです。→1300ルクス以上は赤色ランプ
普通に明るいです。→800ルクス以上は黄色ランプ
少し暗いです。→200ルクス以上は緑色ランプ
暗いです。→それ以下は青色ランプ
というように、お知らせしてくれるものです。
いや、少し待ってください。
そんなん必要ないやん!!!
という声もあろうかと思いますが、そんな方は紐なしスタイルのスカイダイビングをさせるとして
話をすすめていきましょう。
たしかに今回も単純でなんの役にも立ちそうにありません。
しかし大事なのは以下の3点だと思います。
入力:センサーでなんらかのデータをとって
処理:それをなんらかの処理をして
出力:そして出力する。
この3段階がもっとも重要なんです。
たとえば、農業で土中の水分センサーにて水分を拾いあげます。入力
これを30%以下であれば水を5秒間散水
10%以下であれば水を20秒間散水
と定義→処理
ことができれば、
水がそれぞれの状況に応じて自動で散布されます。
つまりよりおおくの農地を管理できるわけです。
多くの農地を管理→生産性があがる。
と言う事なんですよ。
入力、処理、出力
センシング、プログラミング、アウトプット
と言い換える事ができるかもしれません。
これらの3つをつなげることが、野球でいうところのボールを投げる、受ける。
サッカーで言うところのキックする。トラップする。
に当たるんです。
今回手をかざしてはいますが、これは照度を変化させていると理解ください。
また画面側では、明るい暗いをインジケーターで示しています。
1,300ルクスなど色がでるようになっております。
またある一定の照度を下回ったとき、サーボモーターが指定角度に動くように成っております。
これを社内で完結できるようになれば、この閾値を自由に変更することができます。
自社にあわせて自由にカスタマイズすることが可能。
ということなのです。
なぜこれをやろうとしているのかというと、工場のシグナルタワーなどの色、照度をセンサーで拾って
別の行動(出力)に結びつけることができるからです。
では事例はどのようなケースが考えられるでしょうか。
大きく
省力型、安全型、データ型に分けて考えられると思います。
省力型
①リミットスイッチ
機械が最終加工地点にもどってきたことをリミットスイッチ(磁石)にて自動で感知します。
そうすることで、加工終了タイミングを最短で共有できます。
次の加工へのタイムラグをなくすことができます。
②光センサ
光センサを利用しシグナルタワーの点灯点滅を感知します。
それを事務所にて通知することができます。
今までそれをまとめて報告しに言っているのであれば、省力化につながります。
③傾きセンサー
排出ダンパーに傾きセンサーを設置しておけば、1排出の時間をカウントする必要がありません。
現場にて手作業で集計することがなくなり、生産性が改善します。
安全型
①温度センサ
大型のモーターに温度検知センサーを貼り付ける。
異常温度を発した際に、事前に報告がこれば、もしかすると莫大な故障を未然に防ぐことができるかもしれません。
②湿度センサ
ある濾過槽の中で、漏水が発生することを懸念するとします。そうした場合、湿度がある一定の閾値を超えたとき、
アラームを発生する。
データ型
データ型はIOTの中でもすこし特殊です。
機械に貼り付けてデータを取得するものになります。
データを取得することで、日報作業等を削減する省力型としても活用できますが、もう一つは
そのデータを活かすことができる。というものになります。
たとえば、モーターの温度をひろっておき、ある一定の温度を超えたら95度以上になると機械が故障するな。
ということがわかったり、機械の稼働率を見ることができます。
またよくあるのが、現場から生産数アップのために機械を入れてほしいという要望があったとします。
それが本当に機械の不足によるものなのか、あるいは単純に機械の稼働率を上げることですぐに対応できるものなのかがすぐに分かります。
こちらは設備投資や減価償却といった経営層、経理層において貴重な情報となりえます。
ソースコードを以下に貼り付けます。
“`
import smbus#smbusというモジュールをインポート
import RPi.GPIO as GPIO#RPi.GPIOというモジュールをインポート
#名前が長いので、asをつかってGPIOに名前短縮。別にGPでも良いですが、
#他の人がみたとき、よく使う定型文なのでわかりやすいです。
import time
#時間のモジュールをインポートし、タイマー的に使えるようにインポート
bus = smbus.SMBus(1)#この辺はもとのコードから引っ張ってるのでわかりません。
addr = 0x23#ここもよくわかりません。部品の一部とわりきりましょう。
luxRead = bus.read_i2c_block_data(addr,0x10)#ここもわかりません。
print(int(luxRead[0]*256+luxRead[1]/1.2))#ここはルクスを表示させるために変換しているコード
#プリント文にて表示させています。
lled = 27#GPIOの27番ピンをレッドLEDに指定。ホントはつづりRLEDですね。
yled = 17#同じく17番ピンをイエローLEDに指定。
gled = 15#同じく15番ピンをグリーンLEDに指定。
bled = 14#同じく14番ピンをブルーLEDに指定。
GPIO.setwarnings(False)#setwarnings(False)ここはアラームがうるさいので、このコードをいれます。
#別にいれなくても良いですが、毎回のアラームをよけるためのコードimport smbus#smbusというモジュールをインポート
import RPi.GPIO as GPIO#RPi.GPIOというモジュールをインポート
#名前が長いので、asをつかってGPIOに名前短縮。別にGPでも良いですが、
#他の人がみたとき、よく使う定型文なのでわかりやすいです。
import time
#時間のモジュールをインポートし、タイマー的に使えるようにインポート
bus = smbus.SMBus(1)#この辺はもとのコードから引っ張ってるのでわかりません。
addr = 0x23#ここもよくわかりません。部品の一部とわりきりましょう。
luxRead = bus.read_i2c_block_data(addr,0x10)#ここもわかりません。
print(int(luxRead[0]*256+luxRead[1]/1.2))#ここはルクスを表示させるために変換しているコード
#プリント文にて表示させています。
lled = 27#GPIOの27番ピンをレッドLEDに指定。ホントはつづりRLEDですね。
yled = 17#同じく17番ピンをイエローLEDに指定。
gled = 15#同じく15番ピンをグリーンLEDに指定。
bled = 14#同じく14番ピンをブルーLEDに指定。
GPIO.setwarnings(False)#setwarnings(False)ここはアラームがうるさいので、このコードをいれます。
#別にいれなくても良いですが、毎回のアラームをよけるためのコード
GPIO.setmode(GPIO.BCM)#GPIOピンをピン番号で呼ぶか、BCMで呼ぶかを選択してます。
GPIO.setup(yled,GPIO.OUT)#yled(さっき指示した17番ピンをOUT※出力型荷指定。)
GPIO.setup(gled,GPIO.OUT)
GPIO.setup(bled,GPIO.OUT)
GPIO.setup(lled,GPIO.OUT)
for i in range(150):#同じ動作を150回繰り返すfor 変数 in range():関数を指定。
luxRead = bus.read_i2c_block_data(addr,0x10)#ゴチャついたI2CのデータをLUXREAD変数に入れてます。
print(int(luxRead[0]*256+luxRead[1]/1.2))#カッコ内がルクスの数値なので、これをプリントにて表示させます。
if (luxRead[0]*256+luxRead[1]/1.2)<800:#難しそうな文ですが、さっきのルクスが200を下回ったら。とかいてます。
print(“☆★★★★”)#プリント文でわかりやすい表記に☆★をつかって
GPIO.output(bled,True)#もし200を下回ったら、bledを出力してね。(点灯)
time.sleep(1)#時間を1秒保持
GPIO.output(bled,False)#終わったら消灯(False)
time.sleep(0.0001)#時間をごく少量作ってます。
elif (luxRead[0]*256+luxRead[1]/1.2)<1000:#200度以上で500未満の場合
print(“☆☆★★★”)
GPIO.output(gled,True)
time.sleep(1)
GPIO.output(gled,False)
time.sleep(0.0001)
elif (luxRead[0]*256+luxRead[1]/1.2)<1190:
print(“☆☆☆☆★”)
GPIO.output(yled,True)
time.sleep(1)
GPIO.output(yled,False)
time.sleep(0.0001)
else: #いずれでもない場合はこの処理、つまり1280ルクス以上
print(“☆☆☆☆☆”)
GPIO.output(lled,True)
time.sleep(1)
GPIO.output(lled,False)
time.sleep(0.0001)
GPIO.cleanup()#GPIOにのこった情報をすべてクリーンナップします。
GPIO.setmode(GPIO.BCM)#GPIOピンをピン番号で呼ぶか、BCMで呼ぶかを選択してます。
GPIO.setup(yled,GPIO.OUT)#yled(さっき指示した17番ピンをOUT※出力型荷指定。)
GPIO.setup(gled,GPIO.OUT)
GPIO.setup(bled,GPIO.OUT)
GPIO.setup(lled,GPIO.OUT)
for i in range(150):#同じ動作を150回繰り返すfor 変数 in range():関数を指定。
luxRead = bus.read_i2c_block_data(addr,0x10)#ゴチャついたI2CのデータをLUXREAD変数に入れてます。
print(int(luxRead[0]*256+luxRead[1]/1.2))#カッコ内がルクスの数値なので、これをプリントにて表示させます。
if (luxRead[0]*256+luxRead[1]/1.2)<500:#難しそうな文ですが、さっきのルクスが200を下回ったら。とかいてます。
print(“☆★★★★”)#プリント文でわかりやすい表記に☆★をつかって
GPIO.output(bled,True)#もし200を下回ったら、bledを出力してね。(点灯)
time.sleep(1)#時間を1秒保持
GPIO.output(bled,False)#終わったら消灯(False)
time.sleep(0.0001)#時間をごく少量作ってます。
elif (luxRead[0]*256+luxRead[1]/1.2)<900:#200度以上で500未満の場合
print(“☆☆★★★”)
GPIO.output(gled,True)
time.sleep(1)
GPIO.output(gled,False)
time.sleep(0.0001)
elif (luxRead[0]*256+luxRead[1]/1.2)<1280:
print(“☆☆☆☆★”)
GPIO.output(yled,True)
time.sleep(1)
GPIO.output(yled,False)
time.sleep(0.0001)
else: #いずれでもない場合はこの処理、つまり1280ルクス以上
print(“☆☆☆☆☆”)
GPIO.output(lled,True)
time.sleep(1)
GPIO.output(lled,False)
time.sleep(0.0001)
GPIO.cleanup()#GPIOにのこった情報をすべてクリーンナップします。
“`