Pico

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

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

はじめに

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

環境

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

セットアップ方法

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

RaspberryPi Pico を使ってみたい

スイッチサイエンスなど、電子工作系のWebサイトで購入可能ですが、送料無料のプライム会員さんや、別の買い物と合わせれば、いつものAmazonでも100円以下の違いで購入可能です。安価なのでポイントだけでの購入もできるかもしれません。以下はGroveシリーズでおなじみのSeeedStudioが出品しているページです。

千円程度で試せるお手軽ボードですが、H/Wのプログラミングの学習・ノウハウの習得には十分な機能を持っています。是非触りながらいろいろと試してみてください。


書籍はさらっと読めるムック本がおすすめです。

\楽天ポイント5倍セール!/
楽天市場

温度センサ TMP102

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

TMP102の画像

※ 画像はSparkFunのHPより引用

スイッチサインエンスはもちろん。Amazon・楽天でも買うことがきます。2021年年末時点での最安は以下です。


PicoとTMP102の接続

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

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

RaspberryPi Picoと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のピン設定とアドレスの取得

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()

ADDR0でアドレス番号を安定させる

TMP102は「ADDR0」のピンに電圧をかけるかどうかで、デバイスのアドレスが変わる仕組みが存在します。前述の接続方法では、ADDR0の接続は省略していますが、アドレスが不安定になる場合は、ADDR0への接続を試してみてください。(3V3 (OUT) ・GNDを二股にしてADDR0に接続します)

ADDR0への接続  アドレス
3V3 (OUT) を接続73
0V(GND)を接続72
未接続73 / 72 が不安定に切り替わる場合あり

i2c.readfrom()で温度データを取得する

i2c.readfrom()で温度データを取得します。引数に「取得するデバイスのアドレス」と「データ数」を指定すると、戻り値でTMP102からの温度データが配列が返されます。

i2c.readfrom( デバイスのアドレス、取得するデータ数[byte] )


TMP102の温度データは2byteなので、以下のようにデバイスのアドレス(72)と、データ数(2)を指定します。温度情報はdataの配列に代入されます。

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

  

温度データから温度へ変換する

取得した配列2byte(16bit)のデータうち、温度データとして使われるのは12bitのみです。
そのため、以下のビットシフト・計算をしてデータから温度を作成します。ビットシフトの内容はイメージと合わせて後述します。

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

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

① 1つ目のデータ(data[0])を、左に4ビットシフト

1つ目のデータの「8~1のビット」に、温度データの「12~5ビット」のデータが格納されています。
そのままではビットの番号が合わないので、ビットを左にシフトして温度データのビットの番号に合わせます。シフトした結果は、tmpという変数に代入します。

一つ目のデータのビットシフトの内容を解説する画像

② 2つ目のデータ (data[ 1])を右に4ビットシフト

2つめのデータの「8~5ビット」に、温度データの「4~1ビット」のデータが格納されています。
こちらもビット番号が合わないので、ビットを右にシフトして温度データのビットの番号に合わせます。
(右にあふれたデータは削除、左側には0が追加されます)

シフトすると、tmpの空いている部分にピッタリと合うようになるので、2つ目のデータをtmpに結合(足し算)します。

二つ目のデータのビットシフトの内容を解説する画像

この変換で、「tmp」に、TMP102の温度データ(12bit)の値をセットすることができます。

実際の温度への変換

TMP102からの温度データの単位は、0.0625度となっています。そのためtmpの内容に0.0625を掛け算すると、実際の温度の数値になります。

上のイメージの、tmp(0001 1010 0000)を十進数にすると「416」になります。
416 × 0.0625の掛け算すると「26度」になります。

まとめ

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

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

RaspberryPi Pico 本体搭載 温度センサの使い方

Raspberrpi Pico 開発環境まとめ

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

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

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

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

POSTED COMMENT

  1. 電気だいすきオジサン より:

    こんにちは、初見です。大変参考になります。
    ところで、秋月電子通商でM-14538という「距離センサー」があります。サンプルソフトはArduinoしかありません。
    これを複数個使いたいと考えてます。
    I2Cのセンサーをアナログスイッチで切り替える事例をみたことあります。今回センサーのSCLを10kΩでプルアップしてから、TLP222(フォトMOSリレー(ON抵抗2Ω)で複数個のSCLを切り替えて使おうと思ってます。
    本題はここからで、Arduino ではなくpicoでやりたいと思ったのですが I2C通信について Arduino からマイクロパイソンに書き換える方法が判らなくて断念しているところです
    Arduino が複雑でパイソンがシンプルなのは なぜなのか
    知りたいところです。

    • えす より:

      電気だいすきオジサンさん こんにちは。

      ご質問ありがとうございます。

      私もM-14538は使ったことはないのですが、
      秋月のM-14538のサンプルコード(Arduino)を見てみました。

      後半のreadDistanceの関数は参考(?)として書かれているだけなので、なくても動きそうですね。
      MicroPythonとの違いや、書き換えについては、もう少しコード見てから再度コメントさせてもらいます。

      • えす より:

        秋月のコードを少し読み進めてみました。
        MicroPythonがなぜシンプルなのか、については以下の要因があるかしれません。
        ・Serial.begin() や Serial.print() が print()のみでシンプルに書ける。
        ・変数の宣言時に型の指定がいらない。
        ・setup(), loop()など必須の関数がない。

        ただそれよりも秋月のサンプルコードの書き方が複雑さを高めている気がします。
        (使わない関数を記載、同じ変数を関数間で使えるように関数の外で定義など)

        いずれにしても、M-14538を動かせるPythonのコードがあったほうが話が早いかと思ったので、
        秋月にM-14538を一つ発注してみました。

        届き次第コードの移植と動作確認をして、記事を作成する予定ですので、
        もう少々お待ちいただければと思います。

        ちなみに秋月は発注が多く納期が延びているようです。
        電子工作の輪が広がるのはいいことですが、困ったものですね ^^;

    • jh1cdv00 より:

      同じようなことを動かしたことがあります、参考になれば・・・
      Maker_Pi_RP2040の紹介
      人についていくロボットカー
      今話題の、マイコンラズハ゜イ・PICO(RP2040)を使ってロボットカーを動かしてみました
      ハード構成は、たったこれだけ
      1)制御用マイコンボード:Maker_Pi_RP2040
      2)距離センサ:vl53l0x 2個
      3)DC-モータ 2個
      ソフトは、adafruit社のライブラリとサンプルのおかげで、ほとんどコピーしただけです。
      結果の動きは、ロボットカーについてきてもらうには、コツがいりますが、かえってその動きが楽しく、良い運動になってます!!!
      youtubeに動画をアップしておきました。
      https://youtu.be/Xsuf-nzJ51A
      プログラム含むファイルをギガファイル便にアップしておきました
      https://xgf.nu/gHZA

      • えす より:

        jh1cdv00さん、コメントありがとうございます。

        ロボットカーいいですね~。
        vl53l0の距離センサも、Picoで動かすのは簡単なんですね。

        ソースも見てみたいところなんですが、ギガファイル便のURLへ飛ぶと、
        アップロード画面に飛んでしまうみたいです。URL確認してもらると助かります。

COMMENT

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