Arduino에서 읽은 센서 값을 시리얼 플로터로 플롯 해보십시오.
3917 단어 I2Cprocessing가속도 센서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축은 중력 때문에 베이스가 높아지고 있습니다. 왜 양수 값으로 나와 있습니다.
Reference
이 문제에 관하여(Arduino에서 읽은 센서 값을 시리얼 플로터로 플롯 해보십시오.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/VoyagerC/items/104c6e25ea987336f7b5
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
// 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);
}
Reference
이 문제에 관하여(Arduino에서 읽은 센서 값을 시리얼 플로터로 플롯 해보십시오.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/VoyagerC/items/104c6e25ea987336f7b5텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)