본문 바로가기

아두이노 (Arduino)/제어 (Control)

[MPU6050] 2. 각도값 계산 및 진동 제거하기

지난 게시글에서 데이터시터의 기본 정보를 확인하여 센서로부터 값을 읽어오는 것을 해보았다.

이번에는 읽은 값을 계산하여 각도를 계산해보자

 

MPU6050은 칩에 점의 방향으로 X, Y, Z축을 찾을 수 있다.

위 데이터 역시 데이터시트에서 가져온 자료이다.

해당 센서에 대한 모든 정보를 데이터시트를 통해 계산하면된다.

 

먼저 가져온 중력가속도의 값을 계산하여 각도를 측정해보자

X축과 Y축의 각도를 각각 계산하기위해서는 바닥을 가르키는 중력의 값을 알아야한다.

따라서 X축의 기울기를 구하기위해 Y, Z 중력가속도 벡터를 합한다. 이후 중력가속도와 X축을 atan 함수를 통해 계산하면 각도값을 얻을 수 있다. 하지만 atan, atan2 함수는 RAD 단위를 출력하기 떄문에 RAD_TO_DEG 를 곱하여 DEG 단위로 변환한다.

Y축 역시 X, Z의 벡터를 합하여 같은 과정으로 계산하면 된다.

 

위 코드의 결과를 [ 시리얼 플로터 ]를 통해 관찰하면 다음과 같이 많은 노이즈가 섞이는 것을 볼 수 있다.

이를 제거하기위해서 Low Pass Filter 를 사용하여 진동으로부터 들어오는 노이즈를 줄여보자

매우 효과적으로 진동의 노이즈를 줄인 것을 확인할 수 있다. 하지만 센서를 이리저리 움직여보면 반응속도에 있어 매우 느리다는 것을 느낄 수 있다.

따라서 각가속도의 값을 사용하여 LPF에 합성해보자

갑자기 코드가 복잡해지기 시작했다. 각가속도는 시간당 회전 각도를 얻은 값이기 때문에 센서를 측정하는 주기를 계산하여 곱한다. gyro_raw[i] / 131.0 을 해주었는데, 131은 데이터시트에서 나온 단위값이다.

Z축의 경우 중력가속도를 통해서는 계산할 수가 없기 때문에 각가속도를 통한 계산만 가능하다.

[ 시리얼 플로터 ]를 실행하면 다음과 같이 3축의 값을 얻을 수 있을 것이다.

그런데 Z축의 값이 계속 떨어지거나 상승할 것이다. 그 이유로는 센서마다 고유 노이즈를 가지고 있어 해당 노이즈를 함께 계산하여 위와 같은 문제가 발생하는 것이다. 따라서 센서를 가만히 두었을 때의 값을 보정해주어야한다.

 

센서를 가만히 두고 gyro_raw의 데이터를 읽어 그 값을 빼주면 된다.

offset의 경우 센서마다 값이 다르기 때문에 시리얼 모니터의 값을 보고 직접 수정하여야한다.

나는 gyro_raw의 값이 너무 잘 튀어서 raw에 LPF를 넣어서 깔끔하게 데이터를 얻었다.

이제 값이 튀지 않고 보정이 되어 정확한 값을 얻을 수 있다.

 

눈치가 빠른사람은 Z축의 값이 사람의 움직임을 측정하기에는 제한적이라는 것을 느낄 것이다.

1초당 최대 250도의 각도를 측정하도록 설정하였기 때문에 급격한 움직임은 측정할 수가 없다.

따라서 자이로 스코프의 설정은 최대 2000deg/sec 로 설정해보자

데이터 시트를 통해 비트열의 값을 수정하고, 단위 숫자 역시 수정한다.

offset 값 역시 변경된 감도에 맞게 수정하면 된다.

그러면 센서 감도 내에서 급격한 각도 변화가 있더라도 감지할 수 있을 것이다.

 

그리고, 해당 센서를 모션 감지, 드론 제어 등에 사용하려면 위와 같은 노이즈 제거를 위한 계산은 필수이다.

하지만 진동이 너무 강하면 제거가 되지 않는다.

해당 플로터처럼 모터 진동으로 인해 정확한 값을 추출할 수가 없을 때, MPU6050에 내장된 DLPF를 사용하면 된다.

사용방법은 간단하다. 이 역시 데이터시트를 통해 제어방법을 찾을 수가 있다.

26번 레지스터를 제어하여 DLPF를 사용하면된다.

우리는 모든 축에 한하여 DLPF를 사용해볼 것이다.

비트 연산을 사용하여 자이로, 중력 센서의 모든 축에 DLPF를 적용하였다.

보통 DLPF_CFG의 값은 1 ~ 3이면 충분하다. 높은 설정을 할 수록 미세하지만 반응속도가 느려지기 때문에 주의해야한다.

이렇게 우리는 흔들리지 않는 편안한 센서값을 얻었다. 이 값을 베이스로 드론 제어, 모션 감지 등에 사용하면 되는 것이다. 물론 추가적으로 칼만필터 등의 사용을 통해 정확한 값을 얻을 수도 있다.

 

sketch_jul29a.ino
0.00MB