株式会社インデペンデンスシステムズ横浜

システム開発エンジニアの西田五郎が運営しております。Raspberry Pi や Arduino その他新規開発案件のご依頼をお待ちしております。

Raspberry Pi 通信制御

温度センサADT7410(その1)i2C通信とは

投稿日:

温度センサのADT7410を使ってみます。ADT7410はアナログ・デバイセズ社の製品ですが、実際には以下の秋月さんのモジュールを使います。
ADT7410使用 高精度・高分解能 I2C・16Bit 温度センサモジュール

以下はピンを接続してブレッドボードに接続した状態です。(※はんだ付けは明らかにだめな例です。今現在はさすがにもう少しはうまく出来ると思います。)
IMG_0403

このADT7410モジュールを使いながら関連するテーマについて整理してみたいと思います。今回はADT7410でも採用されているi2C通信についてです。私自身がi2Cデバイスを開発出来るわけではないので、システム開発エンジニアとしてi2Cデバイス利用者の観点から書きます。(参考までにですが、私が初めてi2Cを知ったのはRaspberry Pi関連だったと思います。)必要な場合は下記のメーカのマニュアル等を参照して下さい。

i2Cとは
i2Cは正しくは2の文字を小さく記述してアイ・スクエアド・シーと読むということですが、小さい文字(上付き文字)は書きにくいので、i2Cと書いてアイ・ツー・シーと読んでいる場合もあると思います。(参考 Wikipediaへのリンク

i2Cとは、私の認識では2線式双方向バスでのシリアル通信の規格の一つ(※他のシリアル通信の規格としてはUART、SPI、1-Wireもあります。)ですが、現時点のメーカ(NXPセミコンダクターズ)の日本語のマニュアルから引用させて頂きます。

※引用ここから
フィリップス・セミコンダクターズ(現在:NXPセミコンダクターズ)は、効率的なIC(デバイス) 間制御をシンプルに実現するシンプルな2線式双方向バスを開発しました。このバスはI2Cバス(Inter-ICバス)と呼ばれ、シリアル・データライン (SDA)とシリアル・クロックライン(SCL)の2本のバスラインで構成されます。
※引用ここまで

今現在のマニュアルへのリンクは以下です。
i2Cバス仕様およびユーザーマニュアル

この2線式双方向バスの図として以下のような図が利用されることが多いと思います。(以下は私が書いたものです。)
i2c

シリアル・データライン (SDA)とシリアル・クロックライン(SCL)の2本のバスライン構成で、複数のデバイスを並列に接続出来るという特徴があります。各デバイスはアドレスで識別します。複数のデバイスがバス構成で接続出来るようにオープンドレインまたはオープンコレクタになっています。そのためバス上のどこかでプルアップ抵抗が必要になります。

私の場合は、このサイトでも何回か書いていますが、シリアル通信といえばRS232CとかせいぜいUARTということで、これらの伝統的なシリアル通信ではデバイスの接続は基本的には1対1です。複数のデバイスを接続して制御する場合は複数のポートが必要となってきます。Windowsパソコンで考えた場合は、実際に経験があるのですが、UART-USB変換のケーブルがデバイスの数だけ必要となりプログラム的にも複数のポートの制御が必要になります。

一方、i2Cでは2本のバスライン構成で、複数のデバイスを並列に接続出来るという意味では随分とシンプルになります。それでは、WindowsパソコンでI2Cの制御が出来るのかということですが、例えばですが、Arduinoのようなマイコンでi2Cデバイスを制御して、WindowsパソコンとはマイコンとUART-USBで通信するという方法もあると思います。これでもUART-USB変換のケーブルが1本になるので、シンプルな構成になると思います。

Raspberry PiでADT7410の接続の確認
実際にADT7410をRaspberry Piに接続してi2Cのアドレスを確認してみます。

Raspberry Piでi2Cを使えるようにする
まずは、Raspberry Piでi2Cを使えるようにする方法についてです。この方法にもいくつかあるようですが、ここでは間違いが少ないと思われたraspi-configを使う方法を使いました。その手順についてです。

以下のように、raspi-configを起動します。
$ sudo raspi-config

0001

8 Advanced Optionsを選択します。
(※画像は全て今現在のスクリーンショットです。)
0002

A7 i2Cを選択します。
0003

YESを選択します。
0004

OKで先に進みます。
0005

YESを選択します。
0006

OKで先に進みます。
0007

最初の画面に戻ります。Finishで終了します。(Finishへはタブキーで移動出来ます。)
0008

Raspberry Piを再起動します。

次に以下のように、ic2-toolsをインストールします。
$ sudo apt-get update
$ sudo apt-get install i2c-tools

0009

次にRaspbery Piと接続します。
GND、VDD(3.3V)、SCL、SDA をそれぞれ接続します。i2Cではどこかにプルアップ抵抗が必要となりますので、ここではADT7410のプルアップ抵抗をはんだ付けをして有効にしています。バス上のどこかにプルアップ抵抗が存在すればいいので必ずしもADT7410でプルアップ抵抗を有効にする必要はないです。
IMG_0405

raspbery piのピンは以下です。モデルがいろいろとありますが、ここは(赤線で囲んだ部分)共通のようです。
raspipin

$ sudo i2cdetect -y 1 を実行しますと以下のようにアドレスが確認出来ます。デフォルトの状態のアドレスが表示されています。
0010

例えばLCD等の他のi2Cデバイスを並列に接続して複数のアドレスが表示されるところを確認したいところですが、そういったデバイスが今現在手元にありません。そのため複数のi2cデバイスを接続すると複数のアドレスが表示されるはずですとだけ書いておきます。

今回はここまでです。続きとなる実際の温度の取得については以下で書きました。
温度センサADT7410(その2)Arduinoでの利用
温度センサADT7410(その3)Raspbery Piでの利用

AdSense

AdSense

-Raspberry Pi, 通信制御

執筆者:

関連記事

AndroidでUSBシリアル通信(その3)ライブラリサンプルの通信確認

AndroidでUSBシリアル通信の3回目です。前回は以下のライブラリのArduinoのスケッチの動作を確認しました。 usb-serial-for-android (※2021年1月10日追記 現時 …

Raspberry PiでIoT(MQTTで遠隔操作編 その1)MQTTでの通信

Raspberry PiでIoTのMQTTで遠隔操作編のシリーズを始めます。実際に動作させてみるということを重点として進めます。ここでの遠隔操作は2台のRaspberry Pi間でインターネット経由の …

Raspberry PiでAC100V(ソリッド・ステート・リレー)制御

Raspberry PiでAC100VのON/OFF制御を試してみました。今回そのために以下のソリッド・ステート・リレーキットを利用しました。この製品を選んだ理由としては「扱いが簡単」かなと思ったから …

Arduino CC3000 WiFi シールドでHTTP POST

Arduino CC3000 WiFi シールドでHTTP POST通信を試してみます。以下はArduino UNOに接続した状態です。 Arduino CC3000 WiFi シールドの概要、導入に …

Raspberry Piでタッチアプリ開発(その2)Kivyの導入と動作確認

Raspberry Piでタッチアプリ開発の2回目です。前回はハードウェア構成や開発環境等の概要的なことを書きました。今回から具体的な内容ですが、まずpythonのNUIライブラリのKivyの導入につ …