I2C通信

基本操作

I2C(アイ・スクエアド・シー,アイ・アイ・シー,Inter-Integrated Circuit)はTWI(2線直列インターフェース)とも呼ばれる.

I2C通信では,1つのマスタデバイスと,1つ以上のスレーブデバイスがある.マイクロコントローラはマスタデバイスとしてもスレーブデバイスとしても設定できる.

1.gif

SCL(クロック)信号は主にマスタによって制御される.データの転送はSDA(データ)線で行われる.マスタは各スレーブに対し,固有の7ビットアドレスを使って通信を行う.

以下のI2C指定が使える:

"START"START信号を送信する
"STOP"STOP信号を送信する
"READ"I2Cデバイスから入力チャンネルに読み込む
"WRITE"出力チャンネルからI2Cデバイスに書き込む
"data"data をI2Cデバイスに書き込む
"ACK"ACK信号(肯定応答)を送信または受信する
"NACK"NACK信号(否定応答)を送信または受信する

I2C指定

"START"信号と"STOP"信号はマスタデバイスのみが送信する."READ"は入力チャンネルが,"WRITE"は出力チャンネルが使用し,data は入出力チャンネルのどちらでも使うことができる."ACK"信号と"NACK"信号はデータを受け取るデバイスによって送信され,データを送信するデバイスによって読み取られる.

マイクロコントローラが通信する必要のあるI2Cデバイスの指定は"I2C"オプションで"I2C"->{name1->{spec11,spec12,},name2->{spec21,spec22,},}として与えられる.I2Cの namei は以下の値を取ることができる:

"addr"マスタモードのマイクロコントローラとアドレス addr のスレーブ
"Master"スレーブモードのマイクロコントローラ

マイクロコントローラに接続されたI2Cデバイスの可能な名前

スレーブのI2Cデバイスについて,指定と共に"ClockFrequency"サブオプションを与えることができる.

マイクロコントローラのI2Cチャンネル:

{"SDA pin","I2C","SlaveAddress"->addr,"Conversion"}データがアドレス addr のスレーブデバイスによって送受信され,マイクロコントローラはマスタデバイスとなる
{"SDA pin","I2C","Conversion"}データがマスタデバイスによって送受信され,マイクロコントローラはスレーブデバイスとなる

マスタおよびスレーブモードにおけるI2Cチャンネル

入力チャンネルでは,サブオプション"Conversion"は入ってくるデータがどのように変換され,入力に割り当てられる必要があるのかを指定する.

出力チャンネルでは,サブオプション"Conversion"は出力がどのように変換され,送信される必要があるのかを指定する.

マイクロコントローラがスレーブモードで動作している場合,そのI2CアドレスはMicrocontrollerEmbedCode[sys,<|,"I2CAddress"->"addr"|>,]のように,マイクロコントローラの詳細設定をすべて指定する第2引数で指定しなければならない.

ATmega168をマスタとして,Arduino Unoをスレーブとして使用し,また,スレーブのMPU-6050温度センサを使用する.マスタはスレーブMPU-6050から測定値を受け取り,それをスレーブのArduino Unoに送る.スレーブのUnoはデータをシリアルで送り,そのデータはデバイスのフレームワークが読むことができる.

2.gif

I2Cの接続と,ATmega168の電圧調整器を以下に示す.

3.gif

マスタはスレーブデバイスと通信を行うために,そのアドレスを知る必要がある.MPU-6050のデータシートから,アドレスは0x68であることが分かる.スレーブのUnoにはその他の有効な任意のアドレスが選べる.

スレーブのアドレス.

マスタはまずMPU-6050を初期化する.すべてのサンプリング時点において,マスタは自信が送った2バイトを読み込む.

MPU6050センサからの入力のための指定.

マスタは1つのスレーブから別のスレーブへ2バイトを渡す.

マスタATmega168の入出力系は単位行列である.

マスタはその後これらのバイトを,クロック周波数が MHzであるスレーブのUnoに書き込む必要がある.

Unoスレーブへの出力のための指定.

ピン27はマスタATmega168のSDAピンであり,このピンを通してデータの送受信が行われる.入力バイトと出力バイトの変換は,単に通過するだけであるので,同一である.

入出力チャンネル指定を設定する.
パッケージをロードする.
マスタに埋め込む.

マスタはスレーブMPU-6050からの生のバイトをスレーブUnoに送る.スレーブUnoは変換計算を行う.

スレーブUnoをマスタからの2バイトを読み込むように設定する必要がある.

Unoのマスタからの入力のための指定.

MPU-6050のデータシートには,生のバイトを実際の温度の値に変換する方法が指定されている.生のバイトは16ビットの値に変換され,さらに実際の値に変換される.

Unoスレーブが受け取った入力の変換.
摂氏に変換する系のモデル.

スレーブがI2Cデータを受信するように設定し,変換を行い,それをシリアルポートで送信する.マスタに呼び出されたときに応答できるようにスレーブのI2Cアドレスも指定しなければならない.

スレーブUnoにコードを埋め込む.

最後に,スレーブからのシリアルデータを受信するようにデバイスフレームワークを設定する.

Unoスレーブへの接続を開く.
受信したデータを解釈する関数.
データを読み込むタスクを設定する.
しばらくしたらタスクを削除し,デバイスを閉じる.
受信したデータのプロット.