見出し画像

ArduinoとセンサーのI2C通信

I2C通信が必要なセンサーの値を読み取るために、動作する最低限のコードで確認したり、理解したい人向けです。


使用したArduinoとセンサー

今回使用したのはこちらのarduinoとセンサーです。
使用したセンサはMPU6050で、6軸のジャイロセンサーです。
加速度がx,y,z軸の計3軸、角速度がx,y,zの計3軸で、合わせて6軸です。

arduino uno
MPU-6050

配線とコード

配線は、センサーのVCCにArduinoの3.3V、GNDにGND、SCLにSCL、
SDAにSDAと単純な配線でできる。

#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と繋げる必要があります。

MPU-6000/6050の加速度のレジスタマップ
(RM-MPU-6000A-00 Revision: 4.2 P7P7)

終わりに

MPU-6050Arduinoで使う①入門編というサイトを参考にしてセンサを使い、文を書きました。このnoteでわからないことがあったり、間違ってることがあればぜひコメントしてください。


この記事が気に入ったらサポートをしてみませんか?