PIC解説

【PIC】I2Cでセンサーの値を読み取る

投稿日:

電子工作といえば色々なセンサーを使ってみたいですよね。

温度・湿度センサーや加速度センサー、ジェスチャーセンサーなんてものもあります。多くのセンサーは I2C 通信で扱えるので一つやり方を覚えてしまえば色々なセンサーに応用することができます。

今回は秋月電子で販売されているこちらの温湿度・気圧センサー BME280 を例にセンサーの値を読み取って前回紹介した LCD に表示させてみたいと思います。

前回の記事はこちら

【PIC】I2CでLCDに文字を表示する

I2C通信についてはこちらで詳しく解説しています。

【PIC】I2C通信のやり方

使用するもの

LCDに関して、前回の記事では秋月電子の 8 x 2 小型LCDモジュールを使用しましたが、今回はストロベリーリナックスの 16 x 2 LCDモジュールを使用しました。どちらもライブラリを変更することなく全く同じように扱えます。

 

書き込み・読み取りの流れ

センサーを扱うときには、値を読み取るのはもちろん、設定などを書き込むことも必要になります。まず初めにそれぞれの通信の流れを紹介します。

●書き込み

  1. スレーブアドレス送信 (R/W = 0)
  2. 書き込むレジスタアドレス送信
  3. データ送信

●読み取り

  1. スレーブアドレス送信 (R/W = 0)
  2. 読み取るレジスタアドレス送信
  3. 通信再スタート
  4. スレーブアドレス送信 (R/W = 1)
  5. データ受信

書き込みと読み取りのどちらの場合でも、まずは Write モードで通信を開始して、最初のデータでレジスタのアドレスを指定します。

読み取りの通信再スタートは、RepeatedStartCondition を送信しても、一度通信を終了して再び StartCondition を送信してもどちらでも構いません。

書き込んだり読み取ったりすると、普通レジスタのアドレスが +1 されるので、連続したレジスタには連続してアクセスすることが可能です。ただし、この点はセンサーによって違うこともあるのでデータシートを確認した方が良いです。

 

ライブラリの紹介

前々回の記事で I2C 通信の基本ライブラリを作成しましたが、スタートビットの送信からいちいち書くのはあまり現実的ではないので、今回はそれを拡張して実用的なライブラリを作成しました。

最後の3つが今回拡張した関数です。

想定としては、書き込み時には CmdI2C() を、読み取り時には SendI2C() と GetDataI2C() を使う感じです。

読み取りは連続したレジスタのデータを複数読み取ることが多いので、GetDataI2C() に関してはデフォルトで複数バイトを取得するようにしています。

 

BME280について

BME280 は温度・湿度・気圧を高精度で測定できるセンサーですが、しっかり活用しようとすると(PICのメモリ容量的に)かなり大変なので、今回は温度だけ簡単に測定したいと思います。

このセンサーのレジスタはこのようになっています。

温度の測定結果は 0xFA, 0xFB, 0xFC に格納されていることがわかります。正直 20bit もの精度は不要だし処理も面倒なので、0xFA, 0xFB の上位 16bit だけを読み取りたいと思います。

また、このデータは温度そのものではなく、ADCの測定結果となっているので、℃に変換するには計算が必要となります。

この計算もすごく複雑なのですが、今回は簡単な近似式を計算したのでこちらを使います。

T(10-1℃) = data * 101/2000 – 1418

data は先程の上位 16bit のデータです。小数を扱うのは面倒なので小数第一位までの温度を10倍した整数で計算します。

 

動作確認

それでは実際に先程のライブラリを使ってセンサーの値を読み取り、温度を LCD に表示させてみたいと思います。

以下プログラム、回路図、動作写真となります。

I2Cライブラリ

LCDライブラリ

無事に温度を測定することができました。センサーに触ると温度が上昇するのも確認できます。

 

今回の記事は以上となります。ここまで見ていただきありがとうございました。

このセンサーに限らず、いろんなセンサーを使ってみてはいかがでしょうか。

-PIC解説

執筆者:


  1. kontrol より:

    thank you. Achievements. Respects.

  2. bob より:

    Uncool!
    PICでは、どの回路でも
    MCLR(RA5)はPullUpしないと安定稼働は望めません。
    MCLR Float状態ではいつResetが掛かってもおかしくありません。

kontrol へ返信する コメントをキャンセル

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

関連記事

【PIC】I2C通信のやり方

マイコンで Lチカが出来たら次は LCD に文字を表示したり、色々なセンサーを扱いたいですよね。今回はマイコンと周辺機器の通信によく使われる I2C通信のやり方をちょっとだけ詳しく解説していきます。 …

【PIC】SPI通信のやり方

多くの PIC に搭載されている MSSPモジュールを使うと I2C と SPI の2つのシリアル通信を行うことができます。 今回は SPI通信のやり方(マスター)を紹介します。 I2C についてはこ …

【PIC】ADCの使い方 サーミスタで温度測定

今回は ADC (Analog to Digital Converter) の使い方を解説します。 PIC の IOピンは通常デジタルの入出力しか出来ませんが、ADC を使用することでアナログ入力(電 …

PIC超入門!ゼロからLチカまでの道【その2:プロジェクト作成~プロパティ設定】

前回 MPLAB X IDE を導入したので、今回はプロジェクトの作成から説明していきます。 前回の記事はこちら PIC超入門!ゼロからLチカまでの道【その1:部品購入~IDE導入】 目次1 プロジェ …

PIC超入門!ゼロからLチカまでの道【その4:プログラム書き込み~Lチカ】

前回プログラムが完成したので、あとはプログラムを書き込んで、回路を組み立ててついにLチカです! あともう少しでゴールなので頑張りましょう。 前回の記事はこちら PIC超入門!ゼロからLチカまでの道【そ …