トップページ 組込みソフト I2C 制御コード
Raspberry Pi I2C 制御コード                 2014/6/2
 Raspberry PiでI2Cインターフェースを使うためのコードを公開します。I2Cで何ができるか?
インターフェースがGND, SCL,SDAの3本の線で繋げばいいので楽チンです。
センサーや、LCD、メモリなどがありいろいろ遊べます。
このコードのウリは、

I2Cの通信速度のセット
I2Cの通信速度の取得


ができるので自分が作ったソフトの中で、条件により
通信速度を変えることができます。いちいち端末からコマンドを打ち込むことから開放されます。
Raspberry Piでの設定
I2Cモジュール(i2c-bcm2708 )を「ブラックリスト」から 外しておくことが必要です。(I2Cモジュールは前科者なのか?)
sudo vi /etc/modprobe.d/raspi-blacklist.conf
更前
i2c-bcm2708
変更後
#i2c-bcm2708
#をつけてコメントにします。

sudo vi /etc/modules
i2c-dev
を最後の行に付け加えます。

リブートします。
sudo reboot
これでI2Cが動きます。
ダウンロード
ソースフィルはエクリプスでコンパイルして動作確認しています。
I2C.cpp
I2C.h
main.cpp(サンプルプログラム)
使ってみたI2Cデバイス
キャラクタLCD
秋月電子通商 ACM1602N1-FLW-FBW

重大な問題あり!
当たり前の通信速度100kHzで動かない。
いったん100kHzで動かなくなると、50kHzにしてもダメ。
これを動かすには最初に50kHzに設定してから動かすこと。
また、readをすると動かなくなる。例えば、
i2cdetect
をやると動かなくなる。
このLCDが動かなくなったら、電源OFF  -> ON をする。
これはRaspberryが立ち上がるまでの時間がかかるので、待っている間いらいらします。
当たり前の100kHzが動かない!
readすると動かない!
説明書にそれが書いていない。
ひどい製品
だと思います。
このLCDはやめた方がいいと思います。

温度センサー
秋月電子通商 高精度・高分解能 I2C・16Bit 温度センサモジュール
精度が±0.5℃と高精度です。
しかし、
2バイト読み込みはできるが、1バイト読み込みができない。
という不具合あり。2バイトで読み込めば使えるので良しとします。

0x48がアドレス。0x00と0x01が同じ値で読み込まれています。念のため大気圧センサー(アドレス0x5d)で同様のことをしてみると、ちゃんとデータが取得できます。

秋月電子通商 高精度12ビットI2C接続デジタル温度センサ STTS751
100円と安いです。これも必要です。
SOT23変換基板 金フラッシュ (10枚入)
150円なので250円となります。
しかし、ICが米粒くらいの大きさなので半田付けが大変です。

精度が±2℃なので誤差が大きすぎます。28℃を超えたら冷房を入れるところが多いと思いますが、30℃になっても冷房が入らないことになるかもしれません。100円ショップで100円+消費税で買える温度計のほうがお安く済みます。

大気圧センサー
秋月電子通商 LPS331使用 高精度大気圧センサーモジュール
取得した気圧データが正しいのか?比較するための気圧計がないのでわかりません。なんとなくそれなりのデータかな?と思っています。温度も計測できます。ただし精度が±2度。ちょっとがっかりですね。
注意:
4番ピンをVDDにしてアドレス0x5dになります。GNDで0x5cです。どちらにも接続しないと0x5dになったり0x5cになったり不安定になります。必ずどちらかに繋いでください。

湿度センサー
秋月電子通商 温湿度センサ モジュール AM2321
資料が中国語だけです。
いろいろ癖のあるセンサーみたいです。他のセンサーのように使えません。
i2cdetect
でアドレスが検出できません。いつもはスリープ状態で「起きろ!」みたいな処理をしないと始まらないように思います。
温度も測れて±0.2度の精度です。これをうまく使えば湿度と温度の両方で使えそうです。
計測結果
3つのセンサーで温度を計測した結果です。

100円の温度計は26℃です。
古い温度計は25℃です。(小学生のときに校内理科研究発表会でもらった温度計。何十年前のもの?nikkeiとメーカー名の表示あり。)
結局温度はどれが正しいのかわかりません。
また気圧については、比べるものがないのでわかりません。直近では晴天が続いているので993が2日くらい同じ数値です。雨になればどれくらい変わるのかわかります。
プログラムについて
main.cpp において
次の関数でI2Cのボーレートを取得できます。初期値では100kHzになっています。
int br = i2c.GetBaudrate();
次の関数でボーレートを設定できます。
i2c.SetBaudrate(50000);
50kHzに設定しないとLCDが動作しません。
ソースファイルでセンサーのアドレスを直接値で書いています。
センサーのアドレス
キャラクタLCD 0x50
高精度・高分解能 I2C・16Bit 温度センサモジュール 0x48
秋月電子通商 高精度12ビットI2C接続デジタル温度センサ STTS751 0x39
秋月電子通商 LPS331使用 高精度大気圧センサーモジュール 0x5d
上記を参考にソースを読んでください。