Arduino에서 읽은 센서 값을 시리얼 플로터로 플롯 해보십시오.

Arduino를 이용한 I2C 통신 ~ 가속도 센서



마지막 기사 에서 I2C 통신으로 센서에 액세스 할 수 있었으므로,
이번에는 필요한 센서 정보에 액세스하여
시리얼 플롯을 사용하여 데이터 파형을 살펴보겠습니다.

MPU-6050의 레지스터 주소(센서 값이 저장되는 위치)



MPU-6050 사양서 확인.
10진수의 59~66(16진수에서는 3B~42)이 이번 원하는 센서값입니다.
MPU-6050의 I2C 통신용 주소는 68(16진수)입니다.
* 마지막 기사 그럼 왠지, 잘 되지 않았습니다만.
이 사양서대로 설정합니다.



센서 값 중복? 데이터를 읽는 방법



레지스터 어드레스 3B, 3C는 모두 ACCEL_XOUT(x축 가속도)의 데이터가 저장되어 있습니다. 무엇이 다른가 하면,
3B의 가속도는 상 8bit의 데이터 3C는 하 8bit의 데이터를 격납하고 있습니다.
즉, 3B+3C의 16비트에서 x축 가속도의 값을 나타내고 있는 것입니다.

무슨 일이라면...


Arduino에서 센서 값 얻기 직렬 플롯



샘플 코드를 올립니다.

Gyro.ino
// MPU-6050 Accelerometer + Gyro

// I2CにアクセスするためにWireライブラリを使用
#include <Wire.h>

// レジスタアドレス
#define MPU6050_I2C_ADDRESS  0x68
//#define MPU6050_PWR_MGMT_1   0x6B  // R/W
#define MPU6050_GFS_SELL     0x1B   //角速度のフルスケールレンジ指定
#define MPU6050_AFS_SELL     0x1B   //加速度のフルスケールレンジ指定
#define MPU6050_CLK_SELL     0x6B   //内部クロック指定


// デバイス初期化時に実行される
void setup() {
  Wire.begin();


  Serial.begin(115200); // シリアルモニタのレートを115200bpsにセット

  Wire.beginTransmission(MPU6050_I2C_ADDRESS);
  Wire.write(MPU6050_GFS_SELL); //角速度フルスケール設定があるレジスタ
  Wire.write(0b00000000); //4,3bitを00に指定することで+-250degree/secまで測れる
  Wire.endTransmission();

  Wire.beginTransmission(MPU6050_I2C_ADDRESS);
  Wire.write(MPU6050_AFS_SELL); //加速度のフルスケール設定があるレジスタ
  Wire.write(0b0001100); //4,3bitを00に指定することで+-2gまで測れる。gが重力加速度
  Wire.endTransmission();

  Wire.beginTransmission(MPU6050_I2C_ADDRESS);
  Wire.write(MPU6050_CLK_SELL); //クロック設定があるレジスタ
  Wire.write(0b0000000); //2,1,0bitを000に指定することで、20MHz振動に設定
  Wire.endTransmission();
  delay(1000);
}

uint8_t Data[7] = {0};
int16_t RawData[3] = {0};
float AData[3] = {0};

void loop() {
 Wire.beginTransmission(MPU6050_I2C_ADDRESS);
 Wire.write(0x3B); //加速度のフルスケール設定があるレジスタ
 Wire.endTransmission();
 Wire.requestFrom(MPU6050_I2C_ADDRESS, 14);

 uint8_t index = 0;
 while(Wire.available()) {     //データを受信するまで繰り返しするようになっている
  Data[index++] = Wire.read(); //Wire.readから、読み出したデータ(1byte=8bit=1レジスタ分)が戻ってくる
 }

 RawData[0] = (int16_t) (Data[0]<<8 | Data[1]); //X軸 加速度
 RawData[1] = (int16_t) (Data[2]<<8 | Data[3]); //Y軸 加速度
 RawData[2] = (int16_t) (Data[4]<<8 | Data[5]); //Z軸 加速度
 RawData[3] = (int16_t) (Data[6]<<8 | Data[7]); //センサ校正用温度

 AData[0] = ((float)RawData[0]/16384)*9.81;
 AData[1] = ((float)RawData[1]/16384)*9.81;
 AData[2] = ((float)RawData[2]/16384)*9.81;

 Serial.print(AData[0]);    Serial.print(",");
 Serial.print(AData[1]);    Serial.print(",");
 Serial.println(AData[2]);

 delay(10);
}

Arduino 시리얼 플롯



위의 코드를 실행하고 Arduino에 쓴 후,
툴>시리얼 플로터를 선택.


가속도 센서가 움직이고 있음을 알 수 있습니다.
Z축은 중력 때문에 베이스가 높아지고 있습니다. 왜 양수 값으로 나와 있습니다.

좋은 웹페이지 즐겨찾기