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が掛かってもおかしくありません。

comment

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

関連記事

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

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

【PIC】LCD 1602の使い方

今回はパラレル接続のキャラクタLCD の使い方を紹介します。 タイトルに 1602 とついていますが、キャラクタLCD の制御IC は大抵同じものなので、文字数の違うものだったり、メーカーの違うもので …

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

前回の記事で I2C通信を制御するライブラリを作成したので、今回はそれを使って LCD に文字を表示させてみたいと思います。 前回の記事はこちら↓ 【PIC】I2C通信のやり方 目次1 LCD2 接続 …

【PIC】SPI通信のやり方

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

PICでUSARTに四苦八苦

今回はパソコンとのシリアル通信に挑戦しましたがなかなか苦労しました。最初に結論だけ言うと、 マイコンの TX は相手の RX に、RX は TX に! 逆に接続するよ! ってことでした。それでは本文↓ …