I2Cは他の電子部品と通信するための通信方式です。I2Cは同じ配線に複数台繋げられるというのが最大の特徴です。そのため多くのセンサーがあっても同じI2Cに全部つなぐこともできて配線が楽です。また、UARTやSPIなどと違い相手とやり取りしながらデータを送るため、相手がいない場合や相手が拒否した場合には送信自体がエラーとなります。その代わり通信速度はSPIなどと比べるとそれほど速くありません。
I2Cの特徴
- 2本の通信線だけで双方向通信する上に、複数台で通信できる。
- 親子関係があり、親1つに対して子をたくさん繋げられる。
- 子はアドレスを持つ。
- 親が好きなタイミングで1つの子に対して通信を始める。書き込みと読み込みがある。
- 子は書き込みでも読み込みでも必ず”返事”をして、返事がないとエラーになる。
- 子は親に対して「ちょっとまってね、今準備してるから」や「それは無理」という返事(NAK)ができる。
配線時の注意点
I2Cはsdaとsclという2本の線で通信しますが、どちらも双方向通信するようになっています。そのために、オープンドレイン+プルアップ抵抗という構成で通信する必要があります。
マイコンにある内蔵プルアップはとても弱いためI2Cで利用するには足りない場合があります。安定した通信をするためには外部で数kオームの抵抗でプルアップする必要があります。また、UARTやSPI以上に距離が長い通信を苦手とします。
初期設定
利用できるI2Cの数はデバイスにより異なります。obniz Boardシリーズの場合はi2c0の1つとなります。i2c.start()によりi2cを設定します。ioとi2cは別のもので、start()時にi2cのsda, sclそれぞれで利用するioの番号を指定します。
例えば、Masterモード(親)で、io0をsdaに、io1をsclにする場合は、このようになります。
// Javascript Example
var i2c = obniz.getFreeI2C();
i2c.start({mode:"master", sda:0, scl:1, clock:400000});
obniz.getFreeI2C()により利用されていないi2cを取得できます。または利用するi2cを直接指定します。
// Javascript Example
obniz.i2c0.start({mode:"master", sda:0, scl:1, clock:400000});
pullでsdaとsclの内部プルアップを指定できます。io.pull()
で設定できるものが利用できます。内蔵プルアップ指定時は400kHzまでとなっています。特に3vの内蔵プルアップは弱いため、3vの内蔵プルアップを指定した場合は100khzまでとなっており、それ以上はエラーとなります。また、相手の回路やセンサーとgndがつながっておらず、ioを相手のgndと繋ぐ場合はgndで利用するioを指定することもできます。
// Javascript Example
obniz.i2c0.start({mode:"master", sda:0, scl:1, gnd:2, clock:400000, pull:"5v"});
上記はそれぞれmasterの場合の初期設定です。masterかslaveかによって初期設定が異なりますのでそれぞれのページを参照ください。
終了
開始したi2cはi2c.end()で終了します。