にわか電子工作ファン

にわか電子工作ファンの備忘録

温度センサー

こんにちは。

電子工作を勉強のために始めました。
”ラズパイ自由自在 電子工作パーツ制御完全攻略 ”を参考に進めて行こうと思います。立ち読みしていて面白そうだったのでこの本に決めました。17章までありますが部品を揃えたりする必要もあるようなのでできるところから少しずつ進めて行きます。
なお、部品は家にあればそれを利用、プログラムは思いつきで変えたりするので本はあくまで参考としての利用です。ブログにおかしなことが書いてあっても本が原因ではないです。

2章 温度センサー

・評価部品

・ADT7410 温度センサー

何故か家にあったこれ一個を使い実験する。
複数のセンサーをi2cで制御して性能差を確認すると言う本の趣旨から外れている気もするが一個しか持っていないのだからしょうがない。

・データシートはこちら
https://www.analog.com/media/en/technical-documentation/data-sheets/ADT7410.pdf

・型番違うが類似の本語あったのでこちらも
https://www.analog.com/media/jp/technical-documentation/data-sheets/ADT7420_jp.pdf


[ADT7410のピン情報]
 ・VDD:電源(+側) 今回3.3Vとした
 ・SCL:i2c 通信のタイミングを調整する
 ・SDA:i2c データのやり取りをする
 ・GND:グランド(ー側)

 ・J1、J2:SCL,ADAをプルアップしたい場合にショートさせる。10kΩでVDDにプルアップされる。何もしていないとオープン。

 ・J3、J4:部品のI2Cバスアドレスのデフォルトは0x48。競合する場合はJ3,J4をショートさせて変更するなど対応する。今回はこの部品しか使わないので特に何もしない。

動作確認環境

raspberry@raspberrypi:~ $ lsb_release -a
No LSB modules are available.
Distributor ID: Debian
Description: Debian GNU/Linux 11 (bullseye)
Release: 11
Codename: bullseye

raspberry@raspberrypi:~ $ python --version
Python 3.9.2

・プログラムの実行

・温度を測定するプログラム ADT7410のみ

[temp.py]

import pigpio
import datetime
import time

INTERVAL = 60

I2C_INTERFACE = 1

ADT7410_ADDRESS = 0x48 # センサ固有のアドレス

ADT7410_REG_TEMPERATURE_HIGH = 0x00
ADT7410_REG_CONFIGURATION = 0x03

pi = pigpio.pi()

#ADT7410
# (ADT7410を初期化)
adt7410_h = pi.i2c_open(I2C_INTERFACE, ADT7410_ADDRESS)

# (温度の分解能を最大(16bits)に変更
pi.i2c_write_byte_data(adt7410_h, ADT7410_REG_CONFIGURATION, 0b10000000) # 16bits

print('"ADT7410"')

while True:
    #ADT7401
    (val_count, val) = pi.i2c_read_i2c_block_data(adt7410_h, ADT7410_REG_TEMPERATURE_HIGH, 2)
    adt7410_temp = int.from_bytes(val, 'big', signed=True) / 128
    print(f'{adt7410_temp:.4f}')
    time.sleep(INTERVAL)

[実行]
raspberry@raspberrypi:~ $ python3 temp.py
"ADT7410"
28.7266
29.2109
27.8906
28.2969

つまずき

★つまずき1

・pi.i2c_openでエラーがでる
 ・原因:ラズパイのi2c機能が起動してない。
  ※本には記載が無いので注意
 (立ち上げておく事が当たり前なのかも‥)

 ・対策:ラズパイのi2c設定を立ち上げる
  (方法は下記)
  ・左上のラズベリーアイコン選択。
  ・プルダウンから設定を選択
  ・設定のプルダウンから
   “Raspberry Piの設定”を選択。
   エディタが開く
  ・エディタのインターフェースタブを選択
  ・i2cをON(薄い色から濃い色に変わる)

・確認には sudo i2cdetect -y 1 を実行
 ・i2cが動いてない時
raspberry@raspberrypi:~ $ sudo i2cdetect -y 1
Error: Could not open file `/dev/i2c-1' or `/dev/i2c/1': No such file or directory

 ・i2cが動いている時 ※下記は0x48がつながっている状態
raspberry@raspberrypi:~ $ sudo i2cdetect -y 1

i2cdetect
★つまずき2

 pi.i2c_write_byte_dataでwriteエラーが出る。
・温度センサーを1個だけにしたからか?
・現在原因調査中(勉強中)・・・
  ↓(一日経過)
・原因わかりました。
 ADT7410のGNDを接続するGPIOピンの場所を間違えてました。 
 本をよく見てなかった。次回からよく見る。(ラズパイが壊れなくてよかった)

・GPIO接続状態
 ・VDD:3V3 (1)
 ・SCL:GPIO2 (3)
 ・SDA:GPIO3 (5)
 ・GND:GND (9) ※ここを見間違えてGPIO4 (7)へ接続していた。

 ・FAN(GND):(6) GND
 ・FAN(VDD):(2) 5V

・ラズベリーパイのGPIOピン詳細確認
下記で確認可能
raspberry@raspberrypi:~ $ piout

pinout
★つまずき3

温度の読み替えがわからない。
データシートでなんとかわかった気がする

・精度により2種の読み方がある
 ・13ビットでの温度読み替え
raspberry@raspberrypi:~ $ i2cget -y 1 0x48 0x00 w
0x4a0e
 ・0x4a0eの2バイト前後を入れ替えて0x0e4a
 ・0x0e4a(0b111001001010)を3ビット右シフトして0b111001001
 ・0b11001101を16で割って10進数で表すと28.5625
28.6℃ぐらい

 ・16ビットでの温度読み替え
  (今回はこっちを使っている)
raspberry@raspberrypi:~ $ i2cget -y 1 0x48 0x80 w
0x210f
 ・0x210fの2バイト前後を入れ替えて0x0f21
 ・0x0f21(0b111100100001)を128で割って10進数で表すと30.2578125

★つまずき4

pigpioプログラムの意味がよくわからない
 pi.i2c_open()
 pi.i2c_write_byte_data()
 pi.i2c_read_i2c_block_data()
つまずいたまま。
本を読み終える頃にはわかっていると良いなと・・

・感想と疑問点

・温度センサの入力電圧範囲は2.7V-5.5V。今回3.3Vを利用したが。ラズパイは5.0Vの電源もある。
 こっちを使うとどうなるんだろう。性能が上がる?
・i2cって何だろう。
・プルアッププルダウンって何だろう。しないとどうなるのか?
・pigpioの関数?についての説明がどこかにあると嬉しい

・備忘録

・スクリーンショット gnome-screenshot
 ・インストール
  raspberry@raspberrypi:~ $ sudo apt install gnome-screenshot
 ・エリア指定したスクリーンショット
  raspberry@raspberrypi:~ $ gnome-screenshot --area

・pigpioの自動起動
raspberry@raspberrypi:~ $ sudo systemctl enable pigpiod.service
raspberry@raspberrypi:~ $ sudo shutdown -r now

起動確認
raspberry@raspberrypi:~ $ sudo systemctl status pigpiod.service


ここまで読んでいただきありがとうございました。