Pico

【直結でOK】RaspberryPi Pico MicroPythonでI2C通信をする方法 TMP102

Raspberry Pi PicoでMicroPythonを使って、温度センサ「TMP102」とI2C通信をする方法を解説します。配線や通信内容が簡単なので、初めてI2C通信をする方におすすめのH/W構成です。

はじめに

こんな人におすすめ
  • I2C通信は初めて
  • MicroPythonでサクッとI2C通信をしてみたい。
  • TMP102から温度情報を取りたい。

環境

環境バージョンなど備考
OS          Windows7 32bit
Tonny3.3.11
温度センサTMP102 

セットアップ方法

I2Cの通信の説明の前に、Picoのセットアップ方法や、開発環境について知りたい方は以下の記事を先にご覧ください。

温度センサ TMP102

数百円で購入できる、I2C通信に対応した温度センサです。1.4~3.4Vで動作するため、3.3VのPicoでサクッと使えます。4ヶ所ほどピンヘッダの半田付けが必要です。

TMP102の画像

※ 画像はSparkFunのHPより引用

Amazonスイッチサイエンスで購入可能です。


PicoとTMP102の接続

以下のように、PicoとTMP102を接続します。

旧型のため前述の写真とピンの位置が違いますが、右側の赤い基盤がTMP102です。

TMP102の結線の画像

PicoTMP102
1番ピン:I2C0 SDASDA
2番ピン:I2C0 SCLSCL
3番ピン:GNDGND
36番ピン:3V3 (OUT)V+

実行結果

後述する「温度取得のコード」の実行結果は以下の通りです。
エアコンを26度設定にしていたので、おおむね正しい値が取得できています。

温度取得の実行結果

全体コード

TMP102から温度情報を取得する、MicroPythonのコードです。

from machine import Pin, I2C
import time

# I2Cに使うピンの設定です
i2c = I2C(0, scl=Pin(1), sda=Pin(0), freq=100000)

# デバイスのアドレスをスキャンします
addr = i2c.scan()
print( "address is :" + str(addr) )

# 温度情報を100回取得します
for i in range(100):
    # OSのI/Oエラーが良く出るので、Try-exceptで囲います
    try:
        # tmp102の温度情報(12bit)は2byteに分かれて送られるため
        # 2byte分Readします。
        data = []
        data = i2c.readfrom(72,2)

        # 12bit は 1つ目の8bit全て、2つ目の下位4bitをに分かれます。
        # そのため、2つのデータをビットシフトして足します。
        tmp =  data[0] << 4
        tmp += data >> 4

        # 値1で、0.0625度となるため、計算した値にその値を掛け算して
        # 温度情報に変換します。
        print(tmp * 0.0625)
        time.sleep(1)
        
    except:
        print("Error")
        time.sleep(1)

コードのポイント

I2Cのピン設定とアドレスの取得

温度センサを接続した、RaspberryPi Picoのピン番号を設定します。

MicroPythonのピン番号の指定は0から始まります。ピン番号を指定する際は、下記のピン番号表の数字から
マイナス1した数字を指定(実装)してください。

Picoのピン配置の図
公式サイトより引用

正しいピン番号が指定できていれば、i2c.scan()で、TMP102のアドレス「72(0x48)」が取得できます。

# I2Cに使うピンの設定です
i2c = I2C(0, scl=Pin(1), sda=Pin(0), freq=100000)

# デバイスのアドレスをスキャンします
addr = i2c.scan()

0Vの場合はアドレス72」ーーーーーのアドレスとなるようです。

TMP102は「ADDR0」のピンに電圧をかけるかどうかで、取得されるアドレスが変わります。

  • 3.3Vの場合のアドレス ------ >  取得アドレス=73
  • 0Vの場合のアドレス  ------ >  取得アドレス=72

今回scan()の結果が72・73と不安定になりました。
TMP102のアドレスは、ADDRのピンに3.3Vを接続した場合は73」0Vを接続した場合は「72」となるようです。今回は「未接続」で使用したため発生した可能性があります。
同様の現象が出る場合は、上記ADDRの接続も検討してみてください。

温度情報の取得

i2c.readfrom()で温度情報を取得します。
温度情報法は2byteに分かれているので引数に、前述したアドレス「72(0x48)」と、「2」を指定して2byte分データを取得します。

        # tmp102の温度情報(12bit)は2byteに分かれて送られるため
        # 2byte分Readします。
        data = []
        data = i2c.readfrom(72,2)

  

取得データから温度情報への変換

取得した2byte(16bit)のデータうち、温度のデータは12bitのみです。
そのため、取得したデータをビットシフト・結合して温度情報を作成します。

1つ目のデータ (data0)

1つ目のデータには、「8~1のすべてのビット」に、温度情報の12~5ビット目のデータが格納されています。
後述する、温度情報の4~1bit目のデータを入れるため、左に4つビットシフトします。

2つ目のデータ (data1)

「8~5ビット」に、温度情報の4~1ビット目のデータが格納されています。
前述のビットシフトであけた部分にデータを入れるため、まず、右に4ビットシフトして場所を合わせてから、1つ目のデータと結合します。

TMP102の取得データのイメージ図

        # 12bit は 1つ目の8bit全て、2つ目の下位4bitをに分かれます。
        # そのため、2つのデータをビットシフトして足します。
        tmp = data[0] << 4
        tmp += data >> 4

        # 値1で、0.0625度となるため、計算した値にその値を掛け算して
        # 温度情報に変換します。
        print(tmp * 0.0625)
実際の温度への変換

結合した温度データの一単位は、0.0625度を表しています。
そのため、取得したデータに0.0625を掛けて、実際の温度情報を算出します。

まとめ

Raspberry Pi Picoで、MicroPythonを使ってI2C通信を行う方法について解説しました。参考になればうれしいです。

本サイトでは、RaspberryPi Pico本体に搭載されている温度センサの使い方や、Micropythonの開発環境のまとめについての記事も作成しています。興味のある方は以下からご覧ください。

応援・要望お待ちしてます

ブログを見ていて「この辺を詳しく知りたい」「このライブラリの使い方を知りたい」「こんなことで困ってる」...etc があれば、コメント・問い合わせ・Twitterで教えてください。質問・ご要望に合わせて解説記事を作ります。

ブログを気に入っていただけたり、「応援してもいいよ」という方がいたら、ブログやSNSでの紹介をお願いします。 あたたかい応援は、中の人の更新の大きな励みになります。

ABOUT ME
えす
現役のソフトウェアエンジニアです。 C++ C# Python を使ってます。10年ちょい設計/開発部門にいましたが、今はQAエンジニアっぽいことをしています。

COMMENT

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です