본문 바로가기

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

[MPU6050] 1. 데이터 시트를 통해 센서 값 확인하기

구글에 MPU6050 데이터 시트를 검색하면 다음과 같은 파일을 찾을 수 있다.

최상단의 파일은 말 그대로 데이터 시트로 센서에 관한 스펙과 통신 방식, 전력 등에 관한 것을 제조사에서 정리한 것이다.

그 다음 파일은 레지스트리 주소 별로 어떤 값을 제어해야 하는지, 값의 변동에 따라 어떤 변화가 일어나는지 등에 대해서 정리가 되어있다. 예를 들어 센서의 감도를 수정할 수 있는 것이다.

MPU6050의 모듈 사진이다. 위에서 차례대로 전원, I2C, SPI 통신포트 등이 있다.

필요에 따라 여러 개의 센서를 종합하여 사용할 수 있도록 주소를 바꿀 수 있게 되어있다.

 

아두이노는 I2C 통신과 SPI 통신 라이브러리를 제공하기 때문에 쉽게 제어할 수 있다는 것이 큰 장점이다.

 

아두이노는 A4 : SDA, A5 : SCL 포트로 센서와 같은 포트에 연결하면 된다.

 

MPU6050은 전원을 연결해주었다고 값을 얻을 수 있는 것이 아니다.

전원을 관리하는 레지스터 값을 수정하여 우리가 원하는 방향대로 수정해야한다.

 

먼저 MPU6000-Register-Map 파일중 107번 레지스터의 값을 보자

처음 데이터시트를 보는 사람은 당황스러운 것이다. 영어도 영어지만 어떻게 해석을 해야하는지 잘 모르기 때문이다.

모든 통신은 하나의 비트를 반복하여 보내 하나의 Byte, kByte 이상의 단위로 통신한다.

간단하게 하나의 바이트로 통신한다고 생각하면 된다.

하나의 바이트는 8개의 비트 구성의 합인데 위 표에서는 각 비트별로 어떤 값을 제어할 수 있는지에 대해 정보가 정리되어 있다.

사실 여기서 딱히 값을 수정하여 제어할 것은 없다. 필요에 따라 센서를 공장 초기화 할 것이 아니라면 말이다.

 

MPU6050의 I2C 주소값은 0x68 (HEX) 이다. 이는 데이터 시트 초기에 나와있다.

먼저 센서를 활성화하기 위한 기본코드는 다음과 같다.

 

아두이노의 I2C 통신은 Wire 라는 라이브러리를 사용하여 통신한다. 간혹 필요에 따라 직접 통신 코드를 만들어 사용하는 개발자도 있다.

setup 함수의 첫 줄을 보면 Serial 통신을 사용할 때 많이 보았던 함수이름을 볼 수 있다.

Wire.begin() 함수를 사용하면 통신만을 하기 위해 초기화하고, Wire.begin(주소) 를 적용하면 입력한 "주소" 값으로 I2C 통신 주소값으로 지정되어 다른 모듈과 통신할 수 있다. 다른 장비에서 해당 장비에 적용된 "주소" 값으로 통신한다는 것이다.

이후 0x68 (HEX) 주소 값과 통신을 시작하여 107 (DEC) 값을 전달하고 0 값을 전달한다. 이후 통신을 종료한다.

앞서 레지스터 맵에서 확인한 107번 레지스터에 0의 값을 전달한 것이다.

보통 한번 초기화하면 센서의 설정이 유지되기 때문에 이후에 해당 레지스터를 수정안해도 되지만 상황에 맞춰 초기화를 해주면 된다.

 

다음으로 해당 센서의 핵심인 중력가속도와 각가속도의 값을 측정해보자

 

MPU6050 센서는 2g, 4g, 8g, 16g의 중력가속도를 센싱할 수 있도록 설정할 수 있다. 이는 데이터 시트의 센서 소개 부분에서 확인할 수 있다. 추가로 각가속도는 250deg/sec ~ 2000deg/sec 로 시간당 측정되는 최대 각도값이다.

다음으로 각가속도 센서와 중력가속도 센서의 설명을 보자

각가속도 센서의 경우 [ 250 deg/sec -> (Raw-Data)/131 ] ~ [ 2000 deg/sec -> (Raw-Data)/16.4 ] 의 데이터를 보여준다. I2C 통신으로 받은 값을 설정된 환경에 따라 131 ~ 16.4으로 나누면 각가속도 값을 측정하여 얻을 수 있다.

다른 정보는 단순 제어 및 센서의 측정을 통해 개발하는 것에서는 많이 사용되지 않기 때문에 넘어가자

중력가속도 센서의 경우 [ 2g -> (Raw-Data)/16384 ] ~ [ 16g -> (Raw-Data)/2048 ] 의 데이터를 보여준다.

설정된 환경값에 따라 가속도 단위 g의 Raw 데이터 값을 보여주는 것이다. 읽은 I2C 데이터를 16384 ~ 2048의 값으로 나눠주면 해당값은 1g로 측정되는 것이다.

 

센서 감도에 따른 단위 설정값을 알았으니 레지스터를 참고하여 어떤 설정값을 사용해야하는지 알아보자

27번 레지스터의 설정 비트에 대한 설명이다. 상위 비트에서부터 X, Y, Z 축에 대한 자가 진단, 그리고 감도를 설정할 수 있는 항목이 있다. 우리는 가장 작은 감도의 [ 250 deg/sec ] 감도를 설정하여 사용해보자

28번 레지스터의 설정 비트에 대한 설명이다. 상위 비트부터 X, Y, Z 축에 대한 자가진단, 그리고 감도를 설정한다.

우리는 가장 작은 감도의 [ 2g ] 감도를 설정해보자

감도 설정을 마쳤으니 다음으로 중력가속도와 각가속도의 값을 읽어보자

59번 ~ 64번 레지스터의 값으로 부터 중력가속도의 X, Y, Z 축에 감지된 가속도 값을 얻을 수 있다.

ACCEL_XOUT[15:8] , ~[7:0] 이라는 표기를 볼 수 있는데 이는 비트 자리 수를 의미하는 것이다.

59번 레지스터부터 순서대로 상위 바이트, 하위 바이트를 반복하여 값을 얻을 수 있다.

67번 ~ 72 번 레지스터의 값은 X, Y, Z 축의 각가속도 값을 얻는 것이다.

 

위 내용을 바탕으로 중력가속도와 각가속도 값을 얻어 출력해보자

Wire 라이브러리의 requestFrom 을 통해 해당 주소로 부터 몇 개의 바이트 데이터를 받을지를 요청하여 읽는다.

이후 상위비트와 하위비트를 비트연산을 통해 계산하여 값을 얻는다.

 

데이터 시트의 기본적인 값을 확인하여 MPU6050의 센서값을 읽는 것에 성공했다.

 

다음에는 각도의 계산과 진동을 효율적으로 최소화할 수 있는 방법에 대해 공부해보자

 

 

sketch_jul29a.ino
0.00MB