Wite.available関数
Wite.available関数はI2C※1通信read()で読み取ることができるバイト数を返します。マスタ※2デバイスでは、requestFrom()が呼ばれた後、スレーブ※3ではonReceive()ハンドラ※4の中で実行します。
使用例
#include <Wire.h> //I2C Arduino Library #define address 0x1E //0011110b, I2C 7bit address of HMC5883 void setup() { //GY-273 Serial.begin(9600); Wire.begin(); Wire.beginTransmission(address); //open communication with HMC5883 Wire.write(0x02); //select mode register Wire.write(0x00); //continuous measurement mode Wire.endTransmission(); } void loop() { Serial.println(Angleread()) ; // 方位角を返す delay(500) ; // 500ms後に繰り返す } int Angleread() { int x, y, z; //triple axis data Wire.beginTransmission(address); Wire.write(0x03); //select register 3, X MSB register Wire.endTransmission(); Wire.requestFrom(address, 6); if (6 <= Wire.available()) { x = Wire.read() << 8; //X msb x |= Wire.read(); //X lsb z = Wire.read() << 8; //Z msb z |= Wire.read(); //Z lsb y = Wire.read() << 8; //Y msb y |= Wire.read(); //Y lsb } return atan2((x + 20) , (y + 20) * (-1)) * RAD_TO_DEG + 180; //40と20は補正値 }
図1:プログラム例
Wire.available()のパラメータはありません。
戻り値:読み取り可能なバイト数を返します。
以下補足です
※1:I2C
I2C(Inter-Integrated Circuit、アイ・スクエアド・シー)はフィリップス社で開発されたシリアルバスです。
※2,3:マスタ,スレーブ
I2Cインターフェースは1対n(1以上)の同期式シリアル通信で、1がマスターでnがスレーブとなっています。※伝送距離は装置内程度と非常に短い。
I2Cは通信する相手のアドレスをデータとして送りスレーブとの通信(送受信)を確立します、つまりI2Cはマスターからアクションを起こさないとスレーブとは送受信が出来ません。
送受信に使う配線が1本(SDA)、マスターと同期を取る為に送信するクロック信号が1本の計2本と、配線が少なくて済むのがI2C通信による最大のメリットです。
※4:ハンドラ
ハンドラ(handler)とは、何らかの処理要求が発生したときに起動されるプログラムのことです。
ハンドラはプログラム中で関数やサブルーチンなどの形で実装され、メモリ上に展開されますが、通常のプログラムの流れには組み込まれず、普段は待機しています。
そのハンドラが対応すべき処理要求が発生するとプログラムの流れを中断してハンドラが呼び出され、要求された処理を実行します。
対応付けられた事象の種類により「イベントハンドラ」「割り込みハンドラ」などの種類があります。
励みになりますのでよければクリック下さい(^o^)/