NOBのArduino日記!

NOBのArduino日記!

趣味は車・バイク・自転車・ラジコン・電子工作です。

Arduino IDE(Wire.available関数の使い方)

Wite.available関数

 Wite.available関数はI2C※1通信read()で読み取ることができるバイト数を返します。マスタ※2バイスでは、requestFrom()が呼ばれた後、スレーブ※3ではonReceive()ハンドラ※4の中で実行します。

使用例
 Arduino IDEで使用するWite.begin関数の使用例は以下の通りです。
 試しにこのプログラムをArduinoUNO実行するとセンサー(電子コンパスモジュール)で測定した値をArduinoに取得し、その値から計算された方位がPCのシリアルモニタ上に表示されます。
#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
図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)とは、何らかの処理要求が発生したときに起動されるプログラムのことです。
 ハンドラはプログラム中で関数やサブルーチンなどの形で実装され、メモリ上に展開されますが、通常のプログラムの流れには組み込まれず、普段は待機しています。
 そのハンドラが対応すべき処理要求が発生するとプログラムの流れを中断してハンドラが呼び出され、要求された処理を実行します。
 対応付けられた事象の種類により「イベントハンドラ」「割り込みハンドラ」などの種類があります。

 
イメージ 1 イメージ 3
励みになりますのでよければクリック下さい(^o^)/

↩【ArduinoIDE reference】目次に戻る