NOBのArduino日記!

NOBのArduino日記!

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

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

Wite.endTransmission関数

 Wite.endTransmission関数I2C※1通信時におけるスレーブ※2バイスに対しての送信処理を完了します。
 つまりキュー※3に保持されたデータをendTransmission()関数で送信します。

使用例
 Arduino IDEで使用するWite.beginTransmission関数の使用例は以下の通りです。
 試しにこのプログラムを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.endTransmission(stop)関数の【パラメータ】を表1に、【戻り値】を表2に示します。

表1:Wire.endTransmission(stop)関数の【パラメータ】
項目 内容

stop

(省略可)

 trueに設定するとstopメッセージをリクエストのあと送信し、I2Cバスを開放します(デフォルト)。falseに設定するとrestartメッセージをリクエストのあと送信し、コネクションを維持します。 
 
表2:Wire.endTransmission(stop)関数の【戻り値】
項目 内容
0 成功
1 送ろうとしたデータが送信バッファのサイズを超えた
2 スレーブ・アドレスを送信し、NACKを受信した
3 データ・バイトを送信し、NACKを受信した
4 その他のエラー
 
以下補足です

※1:I2C
 I2C(Inter-Integrated Circuit、アイ・スクエアド・シー)はフィリップス社で開発されたシリアルバスです。

※2:スレーブ
 I2Cインターフェースは1対n(1以上)の同期式シリアル通信で、1がマスターでnがスレーブとなっています。※伝送距離は装置内程度と非常に短い。
 I2Cは通信する相手のアドレスをデータとして送りスレーブとの通信(送受信)を確立します、つまりI2Cはマスターからアクションを起こさないとスレーブとは送受信が出来ません。
 送受信に使う配線が1本(SDA)、マスターと同期を取る為に送信するクロック信号が1本の計2本と、配線が少なくて済むのがI2C通信による最大のメリットです
 
※3:キュー
 キューとは、先に入力したデータが先に出力されるという特徴をもつデータ構造の一種。
 データを入れるときは新しいデータが最後尾につき、データを出すときは一番古いデータが優先して出てくる。
 このように、「最初に入った物が最初に出てくる」というデータの入出力方式は「First In First Out」を略して「FIFO」と呼ばれる。
 キューは何かの処理を待たせる際によく使われる構造で、逆に最後に入力したデータが先に出力されるというデータ構造は、スタックと呼ばれている。

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

↩【ArduinoIDE reference】目次に戻る