![見出し画像](https://assets.st-note.com/production/uploads/images/127816076/rectangle_large_type_2_68522b9cc85379fda0d5ba5e39ebd0fd.jpeg?width=800)
ArduinoとセンサーのI2C通信
I2C通信が必要なセンサーの値を読み取るために、動作する最低限のコードで確認したり、理解したい人向けです。
使用したArduinoとセンサー
今回使用したのはこちらのarduinoとセンサーです。
使用したセンサはMPU6050で、6軸のジャイロセンサーです。
加速度がx,y,z軸の計3軸、角速度がx,y,zの計3軸で、合わせて6軸です。
![](https://assets.st-note.com/img/1705302953595-xYmtTsLReg.jpg?width=800)
![](https://assets.st-note.com/img/1705303706581-9BMIyBD7dg.jpg?width=800)
配線とコード
配線は、センサーのVCCにArduinoの3.3V、GNDにGND、SCLにSCL、
SDAにSDAと単純な配線でできる。
![](https://assets.st-note.com/img/1705304873601-SFUHwKGvtX.jpg?width=800)
#include <Wire.h>
int data[14]; //センサからのデータ格納用配列
int x=0;//出力データ(生値)
int y=0;
int z=0;
void setup(){
Serial.begin(9600);//シリアル通信を開始する
Wire.begin();//I2C通信を開始する
Wire.beginTransmission(0x68);//送信処理を開始する(0x68がセンサーのアドレス)
Wire.write(0x6b); //レジスタ「0x6b」を指定
Wire.write(0x00); //0x00を指定(ON)
Wire.endTransmission(); //送信を終了する
}
void loop(){
MPU_DATAGET();
Serial.print("x: ");
Serial.print(x);
Serial.print(" ");
Serial.print("y: ");
Serial.print(y);
Serial.print(" ");
Serial.print("z: ");
Serial.println(z);
delay(100);
}
void MPU_DATAGET(){
Wire.beginTransmission(0x68); //送信処理を開始する
Wire.write(0x3b); //取得値の先頭を指定
Wire.endTransmission(); //送信を終了する
Wire.requestFrom(0x68,14); //0x3bから14バイト分のデータを要求する
int i=0;
while(Wire.available()){
data[i++]=Wire.read();//データを読み込む
}
x=(data[0]<<8)|data[1];//data[0]とdata[1]を繋げる
y=(data[2]<<8)|data[3];
z=(data[4]<<8)|data[5];
}
コードの内容説明
Wire.beginTransmission(0x68);//送信処理を開始する(0x68がセンサーのアドレス)
Wire.write(0x6b); //レジスタ「0x6b」を指定
Wire.write(0x00); //0x00を指定(ON)
Wire.endTransmission(); //送信を終了する
まずこの準備の部分では、センサーをONの状態にしています。レジスタ0x6bは、スリープモードなどをコントロールするもので、0x00の値を指定するとセンサーをONにできます。0x68を指定すればOFFにできます。
センサーのアドレスはセンサーのデータシートを見るか、I2CScannerを使うとわかります。
Wire.beginTransmission(0x68); //送信処理を開始する
Wire.write(0x3b); //取得値の先頭を指定
Wire.endTransmission(); //送信を終了する
Wire.requestFrom(0x68,14); //0x3bから14バイト分のデータを要求する
int i=0;
while(Wire.available()){
data[i++]=Wire.read();//データを読み込む
}
x=(data[0]<<8)|data[1];//data[0]とdata[1]を繋げる
y=(data[2]<<8)|data[3];
z=(data[4]<<8)|data[5];
ここでは、0x3bから14バイト分のデータを受け取り、それを配列に格納しています。
0x3bはX軸加速度の上位1バイトだけで0x3cと繋げる必要があります。
![](https://assets.st-note.com/img/1705308840973-Lpo0Wb0P6e.png)
(RM-MPU-6000A-00 Revision: 4.2 P7P7)
終わりに
MPU-6050Arduinoで使う①入門編というサイトを参考にしてセンサを使い、文を書きました。このnoteでわからないことがあったり、間違ってることがあればぜひコメントしてください。
この記事が気に入ったらサポートをしてみませんか?