RaspberryPiをできることから始めようシリーズの2回目
今回は、参考書籍と部品パーツ購入時から気なっていた温度センサモジュールI2Cを使って室温を測定していこうと思います。
プログラミングを少しかじった程度でDXの波に飲み込まれたど素人の作業ですので、体験記程度に見ていただければと思います。
なお、今回も参考図書として、『Raspberrypiで学ぶ電子工作』を中心に学習してきます。
コードなども自分なりに理解するために、解説を多少載せてはいきますが、ぜひ本書を手に取って、進めてみてください。
それでは、さっそくやっていきましょう。
今回やること
さて、今回は、温度センサモジュールを使って、温度測定とその結果をプログラム画面上に表示していきます。
さらに、温度センサモジュールは基盤とピンヘッダに分かれていて、これをはんだ付けする必要がありましたので、はじめてのはんだ付けにもチャレンジしています。
また、今回は前回エルチカを実装した後の2回目ですが、
書籍からは2コンテンツほどすっ飛ばして、温度センサモジュールを使用しています。
まぁ温度センサモジュール使用してみたかったのだからしょうがありませんよね(笑)
書籍を読み飛ばした分、どこかでつまずくかもしれませんが、その時は書籍をさかのぼって理解を深めていきます。
いきなりの難関!はんだ付け
今回は、いきなりの難関がやってきました。
それは、はんだ付けです。むき出しの基盤を触るだけでも少しビビってたのにはんだ付けともなると異常に怖さマックスです。
しかも、書籍とパーツセットを購入してましたが、ここにははんだ付けセットが含まれてません。
またまた、痛い出費、、、ラズパイのために結構私財を投げ出してるように感じます。
さて、気を取り直してはんだ購入しました。
何を購入してよいかもわからなかったので、アマゾンからそれっぽいセット品を購入です。
はんだ付けのやり方は書籍にもイラストがありましたが、いまいちイメージがつかずYouTubeで動画を探して、やり方を一通り確認していざ実践です。
一応、手順を記載しておきますが、動画などで検索してイメージ付けるのが一番いいと思います。
- はんだごての電源を入れ十分に熱します
- こて先が黒くなっていたりすると不良の原因になるので付属のスポンジできれいにしておきます。
- はんだの芯材を出しておき、丸まっているものを手でつかめる程度の伸ばしていきます。
- 基盤とピンヘッダを差し込み、その後はんだごてでピンとランド(基盤側)を3~4秒ほど熱します。
- ピンを熱したまま、はんだをこて先端に近づけ溶かしていきます。
- はんだの挿入は1~2秒程度が目安です。
- はんだとこてが触れると煙が出てきますが、ビビらないようにしましょう。
- はんだをゆっくりと抜きます
- はんだを引き抜いたあと溶けたはんだの成形を行っていきます。
- その後はんだごてをゆっくりと引き抜きます。
- あまりに早く引き抜くとはんだが角みたいに飛び出てしまいますので、ゆっくりがいいと思います
- 形状がきれいではない場合は再度こてを当てればはんだが溶けるので焦らずゆっくりやります。
- こて先にはんだが付着してるので、次回使用するために付属スポンジでこて先をきれいにします。
はじめてのはんだ付け少しビビりましたが、一つつけてしまえばなんのそのという感じで無事終わりました。
仕上がりどうでしょう。コツとかありましたら教えていただければ幸いです。
I2Cデバイスが反応しない
さて、最初の難関のはんだ付けが終わったので、本に従い、ブレッドボードに温度センサモジュールのセッティングと配線を終わらせます。
本書ではここで、温度センサモジュールI2Cが無事認識されているか確認するため、ターミナルに「i2cdetect -y 1」を入力することが紹介されましていましたのでさっそく入力します。
pi@raspberrypi:~ $ i2cdetect -y 1
Error: Could not open file `/dev/i2c-1' or `/dev/i2c/1': No such file or directory
エラー文が返ってきてしまいました。
ここからはこのエラー文についての悪戦苦闘が始まります。
エラー文に対する結果から言うと、配線やはんだ付けが悪いのではなく、ラズパイの初期設定でI2Cが有効になっていないことが原因のようです。
エラー文の解決は本書にも記載がなく、はんだ付けが悪かったのかなと非常に焦りました。
エラー文の解決
エラー文を見てみると、ファイルが開けない、ファイルが見つからないというエラー文なので何か違うなと思い、エラー文をコピーしてネット検索することにしました。
プログラミングをするようになってよく閲覧するサイトQiitaでその解答を見つけることができましたので、これをもとに設定を見直していきます。
先ほども結論だけ述べたように、ラズパイが初期設定で、I2Cが有効になっていないことが原因のようですので、ラズパイの設定からI2Cを有効化していきます。
pi@raspberrypi:/dev $ sudo raspi-config
- 写真撮り忘れましたが、いろんなインターフェイスが並んでる中から「I2C」を選択します。
最初の画面に戻るので、→ボタンで<Finish>に合わせ、その後画面の指示に従い、再起動します。
ちなみに、後から別のサイトで見つけましたが、ターミナル画面からコマンド入力しなくても、「ラズパイのアイコン」→「設定」→「インターフェイスタグ」→「I2C 有効」でも変更できるみたいです。
コンソール画面で操作するのなんかできる感がするので、今回はコンソール画面から設定変更していきました。
エラーの原因もわかり再度、「 i2cdetect -y 1
」を入力すると、
pi@raspberrypi:~ $ i2cdetect -y 1
0 1 2 3 4 5 6 7 8 9 a b c d e f
00: -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- 48 -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --
48がI2C温度センサモジュールのアドレスを示しており、ラズパイに認識されたことがわかります。
いやぁ~よかった。
本書にも記載されてない問題発生でしたので、今回は非常に焦りました。プログラミング関係でわからないことがあれば、完全な正解は出てきませんが、似たような課題とその解決策を探ることができるので非常に便利です。
温度測定のコード
ようやく、本題の温度測定のためのコード書きまでこぎつけました。
今回は、ここにたどり着くまでが一苦労でした。
温度センサモジュールの値を読むプログラムを「Thonny」に記載していきます。
# -*- coding: utf-8 -*-
import smbus
from time import sleep
def read_adt7410():
word_data = bus.read_word_data(address_adt7410, register_adt7410)
data = (word_data & 0xff00) >> 8 | (word_data & 0xff) << 8
data = data >> 3
if data ? 0x1000 == 0:
temperature = data * 0.0625
else:
temperature = ((~data & 0x1fff) + 1) * -0.0625
return temperature
bus = smbus.SMBus(1)
address_adt7410 = 0x48
register_adt7410 = 0x00
try:
while True:
inputValue = read_adt7410()
print(inputValue)
sleep(0.5)
except KeyboardInterrupt:
pass
細かい解説は本書を確認いただければと思います。
defで関数が定義されてますので、少しわかりにくいかもしれませんが、プログラムが動く順番としては、1行目から順に読み込み、def read_adt7410():からインデントされている5行目から13行目はひとまずスルーされていきます。
try:の中で、read_adt7410()とdefで作った関数を読み込んでますので、ここで初めてdef read_adt7410(): 部が読み込みされます。
def read_adt7410():の関数定義の中で、 0.0625をかけていますが、これは温度センサモジュールはAD変換された値なので、℃の表示に換算するためです。
0.0625の値は、温度センサモジュールの説明書に記載がありました。
2進数で0 0000 0000 0001が0.0625℃として規定されているようです。
分解能というらしいですが、ここは機械語を人間がわかる程度に換算してくれてる程度で先に進めます。
ちなみに今回の温度センサモジュールが13bit設定時の分解能0.0625℃というだけで他のデバイスを使う場合は値が変わります。
また、コードの中には0x48などこれまでなじみのない記法もありますが、
これはデバイスのアドレスを表示しているとのことです。「0x」で次の数字が16進数であることを表していています。その後ろの48というのは、先ほどの「 i2cdetect -y 1 」で48と表示されたことからもわかる通り、アドレス48のデバイス、つまりI2Cを指定していていることになります。
つまり、def read_adt7410():の関数中にもある通り、48番デバイスの00データを入手しろということでしょう。
ここも、こんなもんかという程度で流していきます。
僕は、電気回路の知識もプログラミングの知識も乏しいので、二兎を追う者は一兎をも得ずの心構えで、ある程度理解すればそんなもんかくらいの軽い気持ちで流して、おいおい覚えていくようにします。
温度測定画面が表示
何はともあれこれで、0.5秒ごとに温度センサモジュールが測定した値が表示されるようになります。
いざ、実行!!
無事、気温が23℃前後で表示されました。
部屋に置いたままだと23℃前後から変わり映えしないので、温度センサモジュールに指を置いて強制的に温度を上昇させてみます。
すると、29℃前後まで温度が上昇して、正常に動いていることが確認できました。
おわりに
今回は、温度センサモジュールの取り付けを行いました。
はんだ付けやI2Cが有効化されていないので、諸所不安・問題はありましたが、書籍・ネットの力を借りて解決することができました。
次回は、この温度測定をモニターに表示するプログラムに挑戦していきます!!
ここまで来ると、ラズパイで測定したデータをクラウドに送付して、簡単なデータ処理してリアルタイムでグラフ化するようなIoTらしい別画面での見える化にチャレンジしてみたくなりました。
CSVファイルに書き出せば処理はできそうなので、AWSやスプレッドシートなんかでチャレンジしてみようかなぁ~。
なるべくコストかけないほうほうを探してみます。
では、また。
コメント