M5Stack gray의 9축 센서 MPU9250으로 가속도 검출
소개
M5Stack gray에 들어있는 9축 IMU의 MPU9250을 움직여 보았습니다.
조금 빠진 점이 있었으므로 내용을 남겨 둡니다.
다만, 시도한 시기에 의존한 문제도 있으므로 그 점은 양해 바랍니다.
MPU9250
3축 가속도, 3축 자이로, 3축 지자기가 결합된 9축 센서입니다.
이른바 자주 있는 x, y, z축의 가속도 센서입니다.
이 기사에서는 가속도만 다룹니다.
데이터시트
레지스터 맵
개발 환경
Arduino IDE
M5Stack 라이브러리 얻기
Arduino IDE의 보드 관리자에서 얻은 M5Stack-Core-ESP32에서는 MPU9250이 작동하지 않았습니다. (2018/10/18 현재 정보)
참고
Doesn't work sample sketch "MP9250BasicAHRS" on M5Stack Gray
I2C 주위에 트러블이 있는 것 같기 때문에, 최신을 gitHub로부터 clone 해 넣습니다. (안정판이 아니므로 다른 문제가 발생할 가능성이 있습니다.)
htps : // 기주 b. 코 m / 에 sp 레시 f / 아 r 즈이 노 에 sp32
설치 방법은 아래 참조
arduino-esp32 설치 방법 (Windows)
clone 대상C:\Users\UserName\Documents\Arduino\hardware\espressif\esp32
샘플을 움직여보세요
우선은 M5Stack의 스케치 예에 MPU9250을 움직일 수 있는 것이 있기 때문에 그것을 실제로 움직여 보겠습니다.
스케치 예/M5Stack/Modules/MPU9250/MPU9250BasicAHRS
MPU9250의 센서값이 LCD에 표시되면 OK입니다.
교정
calibrateMPU9250()
가 캘리브레이션을 실행하고 있습니다.
샘플에서는 setup()
안에서 불립니다.
// Calibrate gyro and accelerometers, load biases in bias registers
IMU.calibrateMPU9250(IMU.gyroBias, IMU.accelBias);
이 함수를 호출하면 MPU9250의 비 휘발 영역에 오프셋 값을 저장하기 때문에 일단 보정 실행 후 호출 할 필요가 없습니다.
나는 캘리브레이션시에는 X, Y를 수평(M5Stack의 LED를 상향)으로 해 실행했습니다. 그 후는 기본 calibrateMPU9250()
는 코멘트 아웃하고 있습니다.
가속도 획득
MPU9250은 자이로·지자기도 취할 수 있습니다만, 우선 가속도만 사용해 봅니다.
가속도는 IMU.ax,ay,az에 저장됩니다.
IMU.ax = (float)IMU.accelCount[0]*IMU.aRes;
IMU.ay = (float)IMU.accelCount[1]*IMU.aRes;
IMU.az = (float)IMU.accelCount[2]*IMU.aRes;
M5Stack이 놓은 방향 감지
여기까지 가속도가 검출되어 있으므로 M5Stack을 둔 방향을 검출하는 코드를 씁니다.
예를 들어, 정지 상태에서 LCD 위로 향하면 이상적으로
Z : 1000mG, X,Y : 0mG
됩니다.
단, 오차가 있으므로 적당하게 임계값을 마련하여 어느 쪽을 향하고 있는지 확인합니다.
ACCEL_THR_MAX 는 하향(거의 1000mG) 걸리는 방향을 검출하기 위한 임계치.
const static uint32_t ACCEL_THR_MAX = 700;
const static uint32_t ACCEL_THR_MIN = 300;
if(az >= ACCEL_THR_MAX && abs(ax) <= ACCEL_THR_MIN && abs(ay) <= ACCEL_THR_MIN){
//DETECT_FRONT
}
이것을 전방향분 쓰면 M5Stack를 쓰러뜨린 방향을 가속도 센서로 검출할 수 있습니다.
if( ax >= ACCEL_THR_MAX && abs(ay) <= ACCEL_THR_MIN && abs(az) <= ACCEL_THR_MIN){
//DETECT_LEFT
}else if(ax <= -ACCEL_THR_MAX && abs(ay) <= ACCEL_THR_MIN && abs(az) <= ACCEL_THR_MIN){
//DETECT_RIGHT
}else if(ay >= ACCEL_THR_MAX && abs(ax) <= ACCEL_THR_MIN && abs(az) <= ACCEL_THR_MIN){
//DETECT_TOP
}else if(ay <= -ACCEL_THR_MAX && abs(ax) <= ACCEL_THR_MIN && abs(az) <= ACCEL_THR_MIN){
//DETECT_BOTTOM
}else if(az >= ACCEL_THR_MAX && abs(ax) <= ACCEL_THR_MIN && abs(ay) <= ACCEL_THR_MIN){
//DETECT_FRONT
}else if(az <= -ACCEL_THR_MAX && abs(ax) <= ACCEL_THR_MIN && abs(ay) <= ACCEL_THR_MIN){
//DETECT_BACK
}else{
//not update
}
샘플
검출하는 M5Stack의 방향에 의해 Avatar로 말하는 표정이 바뀌는 샘플을 만들었습니다.
Reference
이 문제에 관하여(M5Stack gray의 9축 센서 MPU9250으로 가속도 검출), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/KatsuShun89/items/df91a16ed5d58710b858
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
3축 가속도, 3축 자이로, 3축 지자기가 결합된 9축 센서입니다.
이른바 자주 있는 x, y, z축의 가속도 센서입니다.
이 기사에서는 가속도만 다룹니다.
데이터시트
레지스터 맵
개발 환경
Arduino IDE
M5Stack 라이브러리 얻기
Arduino IDE의 보드 관리자에서 얻은 M5Stack-Core-ESP32에서는 MPU9250이 작동하지 않았습니다. (2018/10/18 현재 정보)
참고
Doesn't work sample sketch "MP9250BasicAHRS" on M5Stack Gray
I2C 주위에 트러블이 있는 것 같기 때문에, 최신을 gitHub로부터 clone 해 넣습니다. (안정판이 아니므로 다른 문제가 발생할 가능성이 있습니다.)
htps : // 기주 b. 코 m / 에 sp 레시 f / 아 r 즈이 노 에 sp32
설치 방법은 아래 참조
arduino-esp32 설치 방법 (Windows)
clone 대상C:\Users\UserName\Documents\Arduino\hardware\espressif\esp32
샘플을 움직여보세요
우선은 M5Stack의 스케치 예에 MPU9250을 움직일 수 있는 것이 있기 때문에 그것을 실제로 움직여 보겠습니다.
스케치 예/M5Stack/Modules/MPU9250/MPU9250BasicAHRS
MPU9250의 센서값이 LCD에 표시되면 OK입니다.
교정
calibrateMPU9250()
가 캘리브레이션을 실행하고 있습니다.
샘플에서는 setup()
안에서 불립니다.
// Calibrate gyro and accelerometers, load biases in bias registers
IMU.calibrateMPU9250(IMU.gyroBias, IMU.accelBias);
이 함수를 호출하면 MPU9250의 비 휘발 영역에 오프셋 값을 저장하기 때문에 일단 보정 실행 후 호출 할 필요가 없습니다.
나는 캘리브레이션시에는 X, Y를 수평(M5Stack의 LED를 상향)으로 해 실행했습니다. 그 후는 기본 calibrateMPU9250()
는 코멘트 아웃하고 있습니다.
가속도 획득
MPU9250은 자이로·지자기도 취할 수 있습니다만, 우선 가속도만 사용해 봅니다.
가속도는 IMU.ax,ay,az에 저장됩니다.
IMU.ax = (float)IMU.accelCount[0]*IMU.aRes;
IMU.ay = (float)IMU.accelCount[1]*IMU.aRes;
IMU.az = (float)IMU.accelCount[2]*IMU.aRes;
M5Stack이 놓은 방향 감지
여기까지 가속도가 검출되어 있으므로 M5Stack을 둔 방향을 검출하는 코드를 씁니다.
예를 들어, 정지 상태에서 LCD 위로 향하면 이상적으로
Z : 1000mG, X,Y : 0mG
됩니다.
단, 오차가 있으므로 적당하게 임계값을 마련하여 어느 쪽을 향하고 있는지 확인합니다.
ACCEL_THR_MAX 는 하향(거의 1000mG) 걸리는 방향을 검출하기 위한 임계치.
const static uint32_t ACCEL_THR_MAX = 700;
const static uint32_t ACCEL_THR_MIN = 300;
if(az >= ACCEL_THR_MAX && abs(ax) <= ACCEL_THR_MIN && abs(ay) <= ACCEL_THR_MIN){
//DETECT_FRONT
}
이것을 전방향분 쓰면 M5Stack를 쓰러뜨린 방향을 가속도 센서로 검출할 수 있습니다.
if( ax >= ACCEL_THR_MAX && abs(ay) <= ACCEL_THR_MIN && abs(az) <= ACCEL_THR_MIN){
//DETECT_LEFT
}else if(ax <= -ACCEL_THR_MAX && abs(ay) <= ACCEL_THR_MIN && abs(az) <= ACCEL_THR_MIN){
//DETECT_RIGHT
}else if(ay >= ACCEL_THR_MAX && abs(ax) <= ACCEL_THR_MIN && abs(az) <= ACCEL_THR_MIN){
//DETECT_TOP
}else if(ay <= -ACCEL_THR_MAX && abs(ax) <= ACCEL_THR_MIN && abs(az) <= ACCEL_THR_MIN){
//DETECT_BOTTOM
}else if(az >= ACCEL_THR_MAX && abs(ax) <= ACCEL_THR_MIN && abs(ay) <= ACCEL_THR_MIN){
//DETECT_FRONT
}else if(az <= -ACCEL_THR_MAX && abs(ax) <= ACCEL_THR_MIN && abs(ay) <= ACCEL_THR_MIN){
//DETECT_BACK
}else{
//not update
}
샘플
검출하는 M5Stack의 방향에 의해 Avatar로 말하는 표정이 바뀌는 샘플을 만들었습니다.
Reference
이 문제에 관하여(M5Stack gray의 9축 센서 MPU9250으로 가속도 검출), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/KatsuShun89/items/df91a16ed5d58710b858
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
Arduino IDE의 보드 관리자에서 얻은 M5Stack-Core-ESP32에서는 MPU9250이 작동하지 않았습니다. (2018/10/18 현재 정보)
참고
Doesn't work sample sketch "MP9250BasicAHRS" on M5Stack Gray
I2C 주위에 트러블이 있는 것 같기 때문에, 최신을 gitHub로부터 clone 해 넣습니다. (안정판이 아니므로 다른 문제가 발생할 가능성이 있습니다.)
htps : // 기주 b. 코 m / 에 sp 레시 f / 아 r 즈이 노 에 sp32
설치 방법은 아래 참조
arduino-esp32 설치 방법 (Windows)
clone 대상
C:\Users\UserName\Documents\Arduino\hardware\espressif\esp32
샘플을 움직여보세요
우선은 M5Stack의 스케치 예에 MPU9250을 움직일 수 있는 것이 있기 때문에 그것을 실제로 움직여 보겠습니다.
스케치 예/M5Stack/Modules/MPU9250/MPU9250BasicAHRS
MPU9250의 센서값이 LCD에 표시되면 OK입니다.
교정
calibrateMPU9250()
가 캘리브레이션을 실행하고 있습니다.
샘플에서는 setup()
안에서 불립니다.
// Calibrate gyro and accelerometers, load biases in bias registers
IMU.calibrateMPU9250(IMU.gyroBias, IMU.accelBias);
이 함수를 호출하면 MPU9250의 비 휘발 영역에 오프셋 값을 저장하기 때문에 일단 보정 실행 후 호출 할 필요가 없습니다.
나는 캘리브레이션시에는 X, Y를 수평(M5Stack의 LED를 상향)으로 해 실행했습니다. 그 후는 기본 calibrateMPU9250()
는 코멘트 아웃하고 있습니다.
가속도 획득
MPU9250은 자이로·지자기도 취할 수 있습니다만, 우선 가속도만 사용해 봅니다.
가속도는 IMU.ax,ay,az에 저장됩니다.
IMU.ax = (float)IMU.accelCount[0]*IMU.aRes;
IMU.ay = (float)IMU.accelCount[1]*IMU.aRes;
IMU.az = (float)IMU.accelCount[2]*IMU.aRes;
M5Stack이 놓은 방향 감지
여기까지 가속도가 검출되어 있으므로 M5Stack을 둔 방향을 검출하는 코드를 씁니다.
예를 들어, 정지 상태에서 LCD 위로 향하면 이상적으로
Z : 1000mG, X,Y : 0mG
됩니다.
단, 오차가 있으므로 적당하게 임계값을 마련하여 어느 쪽을 향하고 있는지 확인합니다.
ACCEL_THR_MAX 는 하향(거의 1000mG) 걸리는 방향을 검출하기 위한 임계치.
const static uint32_t ACCEL_THR_MAX = 700;
const static uint32_t ACCEL_THR_MIN = 300;
if(az >= ACCEL_THR_MAX && abs(ax) <= ACCEL_THR_MIN && abs(ay) <= ACCEL_THR_MIN){
//DETECT_FRONT
}
이것을 전방향분 쓰면 M5Stack를 쓰러뜨린 방향을 가속도 센서로 검출할 수 있습니다.
if( ax >= ACCEL_THR_MAX && abs(ay) <= ACCEL_THR_MIN && abs(az) <= ACCEL_THR_MIN){
//DETECT_LEFT
}else if(ax <= -ACCEL_THR_MAX && abs(ay) <= ACCEL_THR_MIN && abs(az) <= ACCEL_THR_MIN){
//DETECT_RIGHT
}else if(ay >= ACCEL_THR_MAX && abs(ax) <= ACCEL_THR_MIN && abs(az) <= ACCEL_THR_MIN){
//DETECT_TOP
}else if(ay <= -ACCEL_THR_MAX && abs(ax) <= ACCEL_THR_MIN && abs(az) <= ACCEL_THR_MIN){
//DETECT_BOTTOM
}else if(az >= ACCEL_THR_MAX && abs(ax) <= ACCEL_THR_MIN && abs(ay) <= ACCEL_THR_MIN){
//DETECT_FRONT
}else if(az <= -ACCEL_THR_MAX && abs(ax) <= ACCEL_THR_MIN && abs(ay) <= ACCEL_THR_MIN){
//DETECT_BACK
}else{
//not update
}
샘플
검출하는 M5Stack의 방향에 의해 Avatar로 말하는 표정이 바뀌는 샘플을 만들었습니다.
Reference
이 문제에 관하여(M5Stack gray의 9축 센서 MPU9250으로 가속도 검출), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/KatsuShun89/items/df91a16ed5d58710b858
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
calibrateMPU9250()
가 캘리브레이션을 실행하고 있습니다.샘플에서는
setup()
안에서 불립니다.// Calibrate gyro and accelerometers, load biases in bias registers
IMU.calibrateMPU9250(IMU.gyroBias, IMU.accelBias);
이 함수를 호출하면 MPU9250의 비 휘발 영역에 오프셋 값을 저장하기 때문에 일단 보정 실행 후 호출 할 필요가 없습니다.
나는 캘리브레이션시에는 X, Y를 수평(M5Stack의 LED를 상향)으로 해 실행했습니다. 그 후는 기본
calibrateMPU9250()
는 코멘트 아웃하고 있습니다.가속도 획득
MPU9250은 자이로·지자기도 취할 수 있습니다만, 우선 가속도만 사용해 봅니다.
가속도는 IMU.ax,ay,az에 저장됩니다.
IMU.ax = (float)IMU.accelCount[0]*IMU.aRes;
IMU.ay = (float)IMU.accelCount[1]*IMU.aRes;
IMU.az = (float)IMU.accelCount[2]*IMU.aRes;
M5Stack이 놓은 방향 감지
여기까지 가속도가 검출되어 있으므로 M5Stack을 둔 방향을 검출하는 코드를 씁니다.
예를 들어, 정지 상태에서 LCD 위로 향하면 이상적으로
Z : 1000mG, X,Y : 0mG
됩니다.
단, 오차가 있으므로 적당하게 임계값을 마련하여 어느 쪽을 향하고 있는지 확인합니다.
ACCEL_THR_MAX 는 하향(거의 1000mG) 걸리는 방향을 검출하기 위한 임계치.
const static uint32_t ACCEL_THR_MAX = 700;
const static uint32_t ACCEL_THR_MIN = 300;
if(az >= ACCEL_THR_MAX && abs(ax) <= ACCEL_THR_MIN && abs(ay) <= ACCEL_THR_MIN){
//DETECT_FRONT
}
이것을 전방향분 쓰면 M5Stack를 쓰러뜨린 방향을 가속도 센서로 검출할 수 있습니다.
if( ax >= ACCEL_THR_MAX && abs(ay) <= ACCEL_THR_MIN && abs(az) <= ACCEL_THR_MIN){
//DETECT_LEFT
}else if(ax <= -ACCEL_THR_MAX && abs(ay) <= ACCEL_THR_MIN && abs(az) <= ACCEL_THR_MIN){
//DETECT_RIGHT
}else if(ay >= ACCEL_THR_MAX && abs(ax) <= ACCEL_THR_MIN && abs(az) <= ACCEL_THR_MIN){
//DETECT_TOP
}else if(ay <= -ACCEL_THR_MAX && abs(ax) <= ACCEL_THR_MIN && abs(az) <= ACCEL_THR_MIN){
//DETECT_BOTTOM
}else if(az >= ACCEL_THR_MAX && abs(ax) <= ACCEL_THR_MIN && abs(ay) <= ACCEL_THR_MIN){
//DETECT_FRONT
}else if(az <= -ACCEL_THR_MAX && abs(ax) <= ACCEL_THR_MIN && abs(ay) <= ACCEL_THR_MIN){
//DETECT_BACK
}else{
//not update
}
샘플
검출하는 M5Stack의 방향에 의해 Avatar로 말하는 표정이 바뀌는 샘플을 만들었습니다.
Reference
이 문제에 관하여(M5Stack gray의 9축 센서 MPU9250으로 가속도 검출), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/KatsuShun89/items/df91a16ed5d58710b858
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
IMU.ax = (float)IMU.accelCount[0]*IMU.aRes;
IMU.ay = (float)IMU.accelCount[1]*IMU.aRes;
IMU.az = (float)IMU.accelCount[2]*IMU.aRes;
여기까지 가속도가 검출되어 있으므로 M5Stack을 둔 방향을 검출하는 코드를 씁니다.
예를 들어, 정지 상태에서 LCD 위로 향하면 이상적으로
Z : 1000mG, X,Y : 0mG
됩니다.
단, 오차가 있으므로 적당하게 임계값을 마련하여 어느 쪽을 향하고 있는지 확인합니다.
ACCEL_THR_MAX 는 하향(거의 1000mG) 걸리는 방향을 검출하기 위한 임계치.
const static uint32_t ACCEL_THR_MAX = 700;
const static uint32_t ACCEL_THR_MIN = 300;
if(az >= ACCEL_THR_MAX && abs(ax) <= ACCEL_THR_MIN && abs(ay) <= ACCEL_THR_MIN){
//DETECT_FRONT
}
이것을 전방향분 쓰면 M5Stack를 쓰러뜨린 방향을 가속도 센서로 검출할 수 있습니다.
if( ax >= ACCEL_THR_MAX && abs(ay) <= ACCEL_THR_MIN && abs(az) <= ACCEL_THR_MIN){
//DETECT_LEFT
}else if(ax <= -ACCEL_THR_MAX && abs(ay) <= ACCEL_THR_MIN && abs(az) <= ACCEL_THR_MIN){
//DETECT_RIGHT
}else if(ay >= ACCEL_THR_MAX && abs(ax) <= ACCEL_THR_MIN && abs(az) <= ACCEL_THR_MIN){
//DETECT_TOP
}else if(ay <= -ACCEL_THR_MAX && abs(ax) <= ACCEL_THR_MIN && abs(az) <= ACCEL_THR_MIN){
//DETECT_BOTTOM
}else if(az >= ACCEL_THR_MAX && abs(ax) <= ACCEL_THR_MIN && abs(ay) <= ACCEL_THR_MIN){
//DETECT_FRONT
}else if(az <= -ACCEL_THR_MAX && abs(ax) <= ACCEL_THR_MIN && abs(ay) <= ACCEL_THR_MIN){
//DETECT_BACK
}else{
//not update
}
샘플
검출하는 M5Stack의 방향에 의해 Avatar로 말하는 표정이 바뀌는 샘플을 만들었습니다.
Reference
이 문제에 관하여(M5Stack gray의 9축 센서 MPU9250으로 가속도 검출), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/KatsuShun89/items/df91a16ed5d58710b858
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
Reference
이 문제에 관하여(M5Stack gray의 9축 센서 MPU9250으로 가속도 검출), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/KatsuShun89/items/df91a16ed5d58710b858텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)