- 앞서 아두이노 프로젝트에서 제가 MPU 6050의 값을 처리를 못한 것으로 끝난 것으로 포스팅을 마친것과는 달리 최근 MPU 6050의 값을 이용하여 값을 활용하여 안드로이드에서 보일수 있게 만들었습니다. 정확히 말씀드리자면 Roll,Pitch,Yaw 값중에 Roll,Pitch의 값만 구할수 있었으니 반만 구했다고 할수 있습니다. 먼저 이유를 말씀드리자면 Yaw값을 구하기 위해서는 gyro값을 처리하여 accel값과 같이 처리를 하여야 하는데 제가 만든 작품의 특성상 GYRO값을 누적시킬 만큼의 데이터를 활용하지 못하였고 적분을 하지 못하였기 때문입니다.
MPU6050으로 얻을 수 있는 값
- 먼저 MPU 6050의 출력값으로는 우측과 같습니다. 제가 아두이노 센서 관련 포스팅을 할때 많이 보여드린 결과값이죠.
- accel의 값으로는 x,y,z축을 기준으로 -16384~+16384만큼의 범위를 가집니다. 저의 결과 값은 자동차키트(센서)를 정방향으로 가만히 두었을 때 값이지만 위와 아래의 값이 다르고 z의 값이 유난히 큰것을 볼수 있습니다.
- 기본적으로 MPU6050에서 값을 파형 형태로 전달하기 때문에 항상 정확히 같은 값을 기대할 수 없으며 accel값은 중력의 영향을 받기 때문에 수직의 값을 측정하는 z의 값이 유난히 크게 나오게 됩니다.
Roll,Pitch???
- pitch = arctan(x/z)
- roll = arctan(y/z)
- 자바 공식으로 적으면
- float pitch = (float) (Math.atan2(y, z) * 180/PI);
- float roll = (float) (Math.atan2(x, z) * 180/PI);
- 이렇게 사용할 수 있습니다. 자바에서 뒤에 180/PI를 붙이는 이유는 atan2의 리턴값이 라디안값으로 리턴되기 때문입니다.
- Roll,Pitch는 아래의 사진을 보면 이해하기 쉬운데 기울기 값입니다. 즉 값을 이용해서 MPU6050센서의 앞뒤,좌우의 기울기 값을 알수 있습니다. Roll은 센서의 좌우로의 기울기, Pitch는 앞뒤로의 기울기를 알수 있습니다.
- 오른쪽의 스마트폰에서의 값은 제 자동차 키트에서의 값입니다. 나침판 그림은 각각의 값을 보기 쉽게 표현하기 위한 것입니다. 이런식으로 활용할 수 있습니다.
Yaw??
- yaw값을 알면 mpu6050센서에서의 방향상태를 x,y,z축으로 알수 있지만 yaw값은 제일 까다로운 값입니다. 제가 전문성이 떨어지기 때문에 간단히 설명을 드리자면 yaw값을 구하기 위해서는 gyro값을 계속 누적시켜 적분을 한 값이 필요로 한데, 이 값은 위에서 적은 거와 같이 센서값은 파형의 형태로 전달되기 때문에 순간순간 미세한 오차가 있으며 계속 누적할 경우 오차가 커지게 됩니다. 이를 위해선 필터의 값이 필요합니다. 저 같은 경우는 아두이노에서 자동차의 컨트롤값의 처리와 센서의 처리에 있어 컨트롤의 값이 실시간으로 이루어져야하고 우선시 되기때문에 센서의 값을 누적시킬수 없기 때문에 구하지 못하였습니다.
http://www.geekmomprojects.com/mpu-6050-dmp-data-from-i2cdevlib/