トップページ | 組込みソフト | I2C 制御コード |
Raspberry Pi I2C 制御コード 2014/6/2 | ||||||||||
Raspberry PiでI2Cインターフェースを使うためのコードを公開します。I2Cで何ができるか? インターフェースがGND, SCL,SDAの3本の線で繋げばいいので楽チンです。 センサーや、LCD、メモリなどがありいろいろ遊べます。 このコードのウリは、 I2Cの通信速度のセット 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が動作しません。 ソースファイルでセンサーのアドレスを直接値で書いています。
|