Wite.write関数
Wite.write関数はI2C※1通信時にスレーブデバイス※2がマスタ※3からのリクエストに応じてデータを送信するときと、マスタ※3がスレーブ※2に送信するデータをキュー※4に入れるときに使用します。beginTransmission()とendTransmission()の間で実行します。
使用例
#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:I2C
I2C(Inter-Integrated Circuit、アイ・スクエアド・シー)はフィリップス社で開発されたシリアルバスです。
※2、3:スレーブ、マスタ
I2Cインターフェースは1対n(1以上)の同期式シリアル通信で、1がマスターでnがスレーブとなっています。※伝送距離は装置内程度と非常に短い。
I2Cは通信する相手のアドレスをデータとして送りスレーブとの通信(送受信)を確立します、つまりI2Cはマスターからアクションを起こさないとスレーブとは送受信が出来ません。
送受信に使う配線が1本(SDA)、マスターと同期を取る為に送信するクロック信号が1本の計2本と、配線が少なくて済むのがI2C通信による最大のメリットです。
※4:キュー
キューとは、先に入力したデータが先に出力されるという特徴をもつデータ構造の一種。
データを入れるときは新しいデータが最後尾につき、データを出すときは一番古いデータが優先して出てくる。
このように、「最初に入った物が最初に出てくる」というデータの入出力方式は「First In First Out」を略して「FIFO」と呼ばれる。
キューは何かの処理を待たせる際によく使われる構造で、逆に最後に入力したデータが先に出力されるというデータ構造は、スタックと呼ばれている。
励みになりますのでよければクリック下さい(^o^)/