Day6

計測システムを構築_照度センサー_

Topへ

Day5へ

Day7へ

はじめに

raspberrypiのセットアップという先の見えない長い戦いが終焉し、ようやく次の段階に入ります。
今回は、いよいよ電子工作も含んだ作業になります。まず、手始めに照度センサーをraspberrypiに取り付けその 設定をしていきたいと思います。
といっても独力ではできないので、先輩方の方法をまねているだけになります。今回、全体をとうして参考にしたサイトは、 ココ になります。

Step1

使用するセンサー等

image

まず、使用する材料ですが、何はともかく照度センサーになります。
使用する照度センサーはBH1750になります。ネット通販等で購入できると思います。(Amazonでは簡単に検索できます。)
画像を見てわかると思いますが、いきなり半田付けも要求されます。

image

これまで半田付けをしたことが無かったので、ホームセンターで半田ごてを買い、ユーチューブで勉強し何とかピンを付けました。
その努力の結果が画像の写真になります。

image

この他に、今回はジャンパーワイヤブレッドボードが必要になります。
写真がその材料で、上がジャンパーワイヤ、下がブレッドボードになります。
ジャンパーワイヤは見てのとおり配線用の線で、ブレッドボードはその配線を中継?する版のようなものになります。
また、ジャンパーワイヤの先端はオスメスの種類がありますので、各パターンの線を揃えておく必要があります。
ブレッドボードについては次にもう少し触れます。

image

ブレットボードは半田付け等をせずに配線ができるものらしいです。
なので、これに先程のジャンパーワイヤ等を刺して配線ができる仕組みになります。
また、画像に示す赤のラインは繋がっているので、そこは押さえておく必要があります。

Step2

照度センサーを接続

image

照度センサーはブレッドボードとジャンパーワイヤを用いて画像のように配線します。

image

画像は実際の配線状況になります。

image

画像のように余った線を利用するとジャンパーワイヤを節約できます。

image

GraspberrypiについているGPIOピンには、番号や名前が画像に示すとおりに割り振られているようです。
今回は、その中の3v、GPIO2、GPIO3、Groundを使用しています。この中でGroundだけは電流を出さないピンでアースの役目をするピンになります。

Step3

raspberrypi側の設定

image

rraspberry piを起動します。
起動したらリモート側のパソコンの「Tera Term」を起動し、「sudo raspi-config」と入力しenterキーを押します。

image

「3」を選択します。

image

「I4」を選択します。

image

「はい」を選択します。

image

「了解」を選択します。

image

また「3」を選択します。

image

今度は「I5」を選択します。

image

「はい」を選択します。

image

「了解」を選択します。

image

「Finish」を選択したら設定が完了になります。

image

「Tera Term」に戻ります。
sudo nano /etc/modules」と入力しenterキーを押します。

image

nanoが起動しましたら、よくわかりませんが、
i2c-dev
snd-bcm2835
と入力し、「ctrl+O」と入力し「enter」を押して保存します。
保存が完了したら、「ctrl+X」と入力し「enter」を押してnanoを終了します。 その後、一度、raspberrypiを再起動します。

image

再度「Tera Term」を起動します。
起動したら、「sudo sudo apt-get install libi2c-dev」と入力しenterキーを押します。

image

実はここで相当躓いているのですが、結果的に「pip3 install smbus」と入力しenterキーを押します。

image

これで、照度センサーの設定が終わりましたので、プログラム(コード)を書くフォルダに移動しておきます。
cd python_apps」と入力しenterキーを押します。

image

「Visual Studio Code」を開き、「新しいテキストファイル」を選択します。(メモ帳等でも問題ありません。)

image

以下のコードを入力します。
import smbus
bus = smbus.SMBus(1)
addr = 0x23
luxRead = bus.read_i2c_block_data(addr,0x10)
print('{:.2f}'.format(luxRead[0]*256+luxRead[1]/1.2))
次からこのコードでわかる範囲で意味を書いていこうと思います。

image

まず、「import」文ですが、外部ファイルの内容を取り込み、プログラム中で利用できるようにするコードのようです。 (pip3でsmbusをインストールしたのはこのためだとわかります。)
c#でいうクラスのインスタンスのイメージで良いようです。
なので、2行目は、「smbus」の後に「.」がついているので、「smbus」の中の「SMBus()」という関数を使用していることがわかります。(それ自体の関数の意味 はわかりませんが・・・)

image

次に「addr = 0x23」ですが、「addr」はアドレスという意味を表した変数のようです。
その変数に格納する「0x23」ですが、これは「Tera Term」で「i2cdetect -y 1」と入力し、enterを押すことでヒントが得られます。
画像はその実行結果で、「23」という数字があります。多分これが照度センサーが繋がっているアドレスなのだと思います。
なので、この格納している値はセンサーのアドレスと思われます。

image

最後の「print('{:.2f}'.format(luxRead[0]*256+luxRead[1]/1.2))」ですが、「print」文が出力する命令文になります。
そして、何を出力するかというと、「luxRead[0]*256+luxRead[1]/1.2」でこれが明るさの値になると思います。
この値の出力を小数第二位までで表示するよう制限をかけているのが、「'{:.2f}'.format()」になります。
以上で、コードの説明を終わります。

image

どこでもいいのでこのコードを書いたファイルを「lumina_test.py」として保存します。

image

「WinSCP」を開き、保存した「lumina_test.py」をraspberrypiの「python_apps」フォルダ直下にコピーします。

image

「Tera Term」に戻り、「python3 lumina_test.py」と入力します。これは「lumina_test.py」を実行する命令文になります。
今回pythonは3系なので、「python3」という命令文になるようです。2系だと普通に「python」と書くようです。
とにもかくにも、画像が実行結果になります。
今回は、暗い箇所と若干明るい箇所の2箇所で実行してみました。無事に明るさが出力されています。単位は多分ルクスだと思います。
精度はどの程度かわかりませんが、精密さを必要としないのであれば十分な機能だと思います。以上で照度センサーについての内容は 終わりになります。ありがとうございました。