I2C対応デバイスは50社以上から1000種類を超えるI2C対応デバイスが開発・販売されています。
その中から特に汎用性が高く、日本国内で容易に入手可能であり、且つ、コネクタで接続でき半田付け不要なデバイスを
12種類厳選して、I2Cセンサードライバーを開発しました。
I2C規格は、1992年にフィリップス(現:NXP)が家電品のデジタル化に対応する為に策定した規格です。
特徴は、CPU回路の様に超高速動作より、速度は気にしないけど、省配線、省スペース、省電力で実装ができ、且つ、主CPUに
負荷を掛けずに、一度指示されると一人で指示通りに動くインテリジェンスを持ったデバイスの規格です。
通信手順の規格化、電気的信号の規格化等が行われています。
例えば、空気清浄器や加湿器では温度表示、湿度表示、空気の汚れ表示が有り、加湿の設定ボタンや、空気の汚れ検出ボタン等
赤外線リモコンの送受信機能等が有ります。つまり、内部には温度センサー、湿度センサー、空気の汚れセンサー、赤外線通信機能
タッチパネルセンサー、LED等の表示機能、ファンモーターの強弱制御機能等が実装されています。
また、携帯電話には、GPS機能以外にも方角を知る為の地磁気センサー、傾き等や携帯を振った事を検知する加速度センサー。
等が内臓されています。
これらのセンサーは、CPU回路の様な超高速処理は必要とせず、1秒間に100回程度のデータサンプリング、空気清浄器等では
1秒に1回のデータサンプリングでも多い位です。
この様に、超高速でデータを収集し処理を行わなければ成らない所には、I2Cセンサーデバイスは用途として向きませんが、携帯電話
や、カーナビ等、人間の速度に十分対応できる所であれば、超小型で少ない配線で省エネのセンサーデバイスとしてI2Cデバイス
が数多く活用されています。
I2Cデバイスは産業向けより民生向けが多い為、生産量が多く、そのセンサーの価格も数百円~数千円と非常に安価で入手できます。
I2C規格では、電源の+、-を除くと、SDA(データ)、SCL(クロック)の2本の配線でI2Cデバイスを接続します。さらに、I2C
デバイスには、固有のIDが割り振られている為、芋づる式に接続しても、IDで自分を認識する為、112個までのデバイスを芋づる接続
が理論上可能です。
2本の通信線で双方向通信を行う為、プリント基板内には余分な配線が無く、実装密度が向上でき、超小型、超高性能、超多機能を実現
しています。
しかし、配線の長さに限界が有る等の課題も有ります。ケーブル延長実験結果はこちら
I2Cデバイスは、汎用的に誰でも簡単に!。と言う訳では有りません。
特定目的に特化したデバイスが数多く存在します。それは、I2Cデバイスのレジスタの構造から良く解ります。
I2Cデバイス自身がI2C通信を行う為、I2Cデバイス自身にCPU、メモリ、センサー回路等を持っています。I2Cデバイスに何等かの設定
を行う、と言う事は、I2Cデバイスの持つレジスタ(メモリ)にマスタCPUから通信で設定する必要が有ります。
多分、デバイスの製造コストを抑え、いかに小さく、省電力にするか?を目的としている為、1ByteのレジスタをBit単位に分割し、極力メモリ
の容量を少なくしようとしているのが伺えます。つまり、メモリの使用効率を最大限にする為には、Bit単位での設定が不可欠なのです。
全く、意味の異なる設定どうしが、1Byteの中に混在している訳です。
これでは、汎用的に使おうとしている我々は、使いにくくて仕方ありません。組込みシステムの様に、ソフト開発時間が長くても完成してしま
えば、数が売れれば、開発コスト等、微々たる物になるでしょうが、一品、一品、ユーザー要求で開発しなければ成らない場合には、どうでも
良い部分に、時間とコストを掛けなければ成りません。
そこで、I2Cデバイスの個々の設定を全てプロパティと言う形で設定・読出しを可能としたAPIが「I2Cインターフェース・ドライバー」です。
温度・湿度・気圧センサーの1つの内部レジスタの例
上記の様なレジスタで構成されるI2CデバイスABCで、&H20がこのデバイスのアドレスとします。
ここで、スリープモードをON、最大値のみ保持、フィルタは1Khz、サンプリング速度は0.4sで設定すると仮定します。
この場合のBitパターンは、11001011となります。このレジスタに対する書き込み値は、16進数に変換し&HCBの値を
設定する必要が有ります。
I2C通信の最低単位は1Byteですので、特定のBitのみを指定しての変更はできません。
つまり、特定のbitのみ変更しようとしても、その前後のbitパターンを再度設定する必要が有ります。
I2Cセンサードライバーを用いた場合、(説明用サンプルです。具体例はI2Cソフトウェア機能説明書をご覧ください)
この様に、プロパティは、1bit構成で区分されている場合は、1bitに対してひとつのプロパティを準備しています。2bit構成で
ひとつの意味を持つ場合は、2bit構成でひとつのプロパティが準備されています。
ビットパターンを求める必要が無く、プロパティに10進数で設定値を代入し、その値をWriteすれば設定が完了します。
また、WriteメソッドでI2Cデバイスとの通信処理もバックグラウンドで実行しますので、I2Cとの通信処理のコードを書く
必要が有りません
Writeメソッド以外に、I2Cデバイスと通信を確立する為に最初に行うInitメソッド、I2Cデバイスのレジスタの内容を読み込む
Readメソッドが準備されています。
この様にI2C通信でI2Cデバイスが接続されている事を全く意識せず、通信の為のコードも書く必要もなく、プロパティへの
代入や読み出しでI2Cデバイスの利用が可能となります。
この実現により、特定のプロパティ、メソッドだけでI2Cデバイスを扱う事が出来き、なんら特別な処理を必要としません。
下表は、BME280と言う一つで温度、湿度、気圧が測定できるI2Cデバイスです。
図を見ても解るように、温度・湿度・気圧のデータの3つのデータを扱う為に、設定レジスタを含め11個のレジスタが有り、更に
データを補正する為のキャリブレーション用のレジスタが26個有ります。
※表中のAddressは、レジスタのアドレスでI2Cデバイスのアドレスとは異なります。
このレジスタをAddress別にビットパターンを求めて設定する必要が有ります。
更に、この中で温度のデータを見ると、レジスタアドレス0xFC(temp_xlsb)、0xFB(temp_lsb)、0Xfa(temp_msb)の3つのレジスタで
24bitでひとつの温度データを構成しています。
Xlsbでは下位4bitが0で埋まっていますので、この分を切り落とす必要が有ります。この様な場合でも「I2Cインターフェースドライバー」では、
3つのレジスタを読み取り、補正計算を行い、ひとつの温度データとして返すメソッドが準備されています。
基本的にプロパティ名は、Data-Sheet記載の名称と1:1に対応していますので、直感的にどのパラメータであるか判断でき、Data-Sheet
記載の名称でレジスタアドレスの自動判断を行う為、レジスタアドレスを全く意識せず開発作業が可能です。
注意:レジスタへ再設定する場合、該当するレジスタの内容を一度Readメソッドで読み出してから変更したいプロパティの内容を変更後に
Writeメソッドにて書き込んで下さい。
これは、I2C規格でマルチマスタ(CPU)構成が可能の為、他のCPUがレジスタの内容を変更してしまっている事に対応する為です。