自分にやさしく

特小/電子工作/プログラミング/アニメ/雑記等

#02 [電子工作]Raspberry Pi

前回

yuhanaoka.hatenablog.com

今日は第7章、I2Cデバイスを使った電子工作。

I2C : アイ・ツー・シー と読む。シリアル通信の一種で、多数のセンサを取り扱えるのが特徴。
I2Cインターフェースは同期式シリアル通信(送る側と受け取り側の同期ができる通信)で、高速な通信が可能。
また、制御できる機器(スレーブっていうの?)も複数扱えるとのこと。

但し伝送距離は短く、基本的に基板内の通信に使う模様。

(...うーん。。。シリアル通信についてもまとめたほうが良さそうだ。)


実は以前にも、I2Cデバイスを使ったことがあって

これ

akizukidenshi.com


を使って、温湿度、気圧のデータを取得したことがある。


=事前準備=

まず、Raspberry Pi の I2C 通信を許可しなけばならない。


sudo raspi-config

をコマンドで実行し


f:id:yuhanaoka:20170401195437p:plain

からInterfacing Options を選択


f:id:yuhanaoka:20170401195817p:plain


I2C を選択する。
Would you like the ARM I2C interface to be enabled? と聞かれるので <はい>を選択。

次にpythonでI2C通信を行うためのモジュールをインストールする。

sudo apt-get update

sudo apt-get install i2c-tools python-smbus

を打ち込み実行。


=準備=


事前準備が完了したら、道具の準備。

今回使用した機器はこれ。



なんか、ピンと本体がバラバラ何だが....。
うん。半田付けが必要みたい。

というわけで、モクモクはんだ付け。

f:id:yuhanaoka:20170401202843j:plain
あ、ちなみにこのこてを使いました。

f:id:yuhanaoka:20170401203124j:plain
はんだも半田ごても所有していたけど、結局使わず。
自宅で使ったの初めてなのでは?

そして無事半田付け完了。

f:id:yuhanaoka:20170401203205j:plain




=回路の作製=

回路は書籍を参考に作る。

この図がイマイチ理解できていないのだけれど、

I2Cマスター : Raspberry Pi

スレーブ : 温度センサー

で良いのだろうか?

こんな感じで作製した。

つなげたら

i2cdetect -y 1
を入力

最初はうまく認識しなくて、ワイヤーをもう一度つけ直したら認識した。
(認識しなくても、あきらめないこと!)

=コードの記述=

サンプルコード通りに打ってみたけど、エラーが消えない...?

サンプルコードを読んでみたら、おかしいところがあった。

関数で宣言されてない変数を使っている。よく見ると、プログラムの初期化時にこの変数は宣言されているが、関数に渡されていない。

f:id:yuhanaoka:20170401204633j:plain

そこで、関数に引数として渡してやるように書き換えた。

import smbus
from time import sleep

#----------def------------
def read_adt7410(address_adt7410,register_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
#---------main----------

bus = smbus.SMBus(1)
address_adt7410 = 0x48
register_adt7410 = 0x00

try:
while True :
inputValue = read_adt7410(address_adt7410,register_adt7410)
print(inputValue)
sleep(0.5)
except KeyboardInterrupt :
pass

=実行=

エアコンを20℃に設定して動かしているので、結構正確な値が取れているのではないか!


=メモ=

光センサを使えば、部屋の照度を取ることで在室か否か判断できそうだ。