본문 바로가기
Firmware_/아두이노

[아두이노] MPU-6050 자이로센서 TEST

by Cocopop 2021. 9. 30.
반응형

* 이 과정은 제가 공부 목적을 위해 작성한 글이므로 옳은 답은 없습니다.

(설명들이 제가 찾아보고 생각한 부분에서만 작성한거기 때문에 틀린 부분일 수도 있어요 ㅎㅎ)

 

 

 

이번에 테스트 해볼 부품은 바로 "MPU-6050" 제품으로 자이로 센서 입니다.

 

자이로 센서가 어디에 쓰는 부품일까요?

 

먼저 자이로 센서 테스트를 하기 앞서 자이로스코프의 대해

이해를 하고 넘어가도록 할게요.

(저도 디테일한 내용은 잘 모르지만.. 최대한 이해할 수 있게 설명해보겠습니다.)

 

 

 

 

첫번째로 이해해야 할 부분은

자이로스코프! 입니다.

 

Gyro(회전하다), Scope(관찰하다)

위키백과

자이로스코프(Gyroscope)는 위아래가 완전히 대칭인 팽이(Rotor)고리를

이용하여 팽이의 축에 직각인 방향(Spin axis)으로 만들고 다시 그것을

제 2의 고리(Gimbal)를 써서 앞의 것과 직각 방향으로 만든 후

다시 제 3의 고리(Gyroscope frame)를 만들어 앞의 둘의 직각 되는 방향으로 지탱하여

팽이의 회전이 어떤 방향으로도 일어날 수 있도록(회전할 수 있도록) 한 장치를 말합니다.

(밑에 유튜브 영상으로 자이로스코프가 진짜 안떨어지더라구요 ㅋㅋ)

 

 

이는 각운동량 보존법칙에 의해 일어나는데요.(위키백과)

회전하고 있는 물체외부로부터 회전력(힘)이 작용하지 않는 한 물체의 각운동량이 항상 일정하게

보존된다고 합니다.  회전하는 각운동량물체의 회전 반경운동량의 곱으로 외부로부터 회전력이 작용하지 않을 경우 각운동량은 항상 보존되어 회전 반경의 축소화되고 그 방향은 거의 고정하게 되는것이지요. 

 

즉, 외부에서 받은 힘에 따라 운동 속도가 달라지는 기구입니다.

하지만 이 각운동량은 외부에서 힘이 작용하지 않는다면 일정하게 보존됩니다.

 

 

 

이런 기능으로 현대에서 주로 사용하고 있는 기기는 스마트폰, 드론, 비행기, 게임기 등 엄청 많이 사용되고 있습니다.

 

 

 

자! 이제 자이로스코프의 대해 간단한 이해가 끝났는데요.

그럼 자이로 센서는 또 무엇일까요?

 

자이로 센서 : 자이로스코프가 내재된 물체가 회전운동을 하면 생기는 회전 반발력을 측정하고 전기신호로 바꾸는 장치.

즉, 자이로스코프의 각운동량의 값을 전기신호로 잡아 데이터를 뿌려주는 센서 입니다.

 

이 센서 종류는 세가지 정도 있는걸로 알고 있는데요.

1. 광학식 자이로

2. Inertial 자이로

3. MEMS 자이로

 

그 중에서 제가 테스트할 MPU-6050은 MEMS 자이로 센서입니다.

 

MEMS 자이로 센서 : 코리올리의 힘을 이용한 튜닝포크(Tuning Fork)방식의 MESE 센서로

코리올리 힘을 측정하여 전기신호로 변환하고 힘에 대한 각속도를 계산하는 센서입니다.

 

여기서 또 코리올리의 힘이라는게 나오는데요.... 이건 또 무엇일까요?

 

 

 

======

 

======

 

 

위키백과

코리올리의 힘 : 회전하는 좌표계 내에서 물체가 운동을 하는 경우 힘을 주면 좌표계에 의해

위에 사진으로 보면 수직으로 직선운동을 하는것 처럼 보이지만, 실제로는 회전을 하면서

운동을 합니다. 이런 효과를 코리올리 효과라고 하는데요.

 

이 물체의 코리올리 효과를 유발하는 힘을 코리올리 힘이라고 합니다.

직선운동의 방향을 바꿔버리기 때문에 저향력이라고도 부르네요.

공식 : F(coriolis) = 2m(v x Ω)

 

 

 

 

 

위키백과

위에 설명으로 코리올리 힘의 예를 들자면,

적도에서 북풍이 부는 경우에도 바람은 코리올리 힘을 받게 됩니다.

 

지구는 자전을 하기 때문에 회전좌표계이며, 북풍이 부는 바람은 경우 시계/반시계 회전이 모두 코리올리 힘을

받아 회전하는 것이라고 합니다.

 

 

 

자이로 센서 테스트를 하기 전에 이것저것 알아야 할것들이 정말

많네요.. 진짜 발명품들은 물리와 수학으로 이루어졌다는게 맞는것 같습니다.

(어려워요 ㅜㅜ)

 

=====

 

=====

 

그래서 결론은 저희가 쓰는 MPU-6050은 MEMS 기반의 자이로 센서이고,

코리올리의 법칙으로 계산을 해서 받은 값을 전기신호로 전해집니다.

 

 

이제 자이로센서 구조를 봐볼까요?

 

MPU-6050의 통신은 I2C 방식으로 사용됩니다.

그래서 기본적으로 GND, VCC, SDA, SCL 단자만으로 사용해서

테스트를 해볼 수 있습니다.

 

 

 

 

센서 사양은 위에 표처럼 나와 있는데요.

초기값을 설정할때 사용됩니다.

 

 

 

<< MPU - 6050 TEST >>

 

제가 사용할 칩은 STM32 계열 칩으로 

테스트를 할건데요. 

(Atmega, 8051계열도 상관없습니다)

 

 

 

 

<초기화>

자이로센서를 실행하기 앞서 초기화 설정부터 시작해줘야 합니다.

 

 

<< 초기 설정별 설명>>

1. 첫번째로 저는 WHO_AM_I로 장치의 ID를 체크합니다.

AD0 Pin으로 인해 기본값이 달라 질 수 있는데요.

AD0 Pin : LOW = 기본값은 0x68(104) 입니다.

AD0 Pin : High(Vcc 3.3v 연결) = 기본값은 0x60(96) 입니다.

 

연결을 안하면 기기는 기본적으로 AD0 Pin이 Low로 되어 

있어서 연결 안할 때는 0x68로 ID체크 하시면 됩니다.

 

 

 

 

 

2. ID 체크가 끝나고 나서 첫번째 초기화 시켜준 레지스터는 

PWR_MGMT_1입니다.

 

이 레지스터는 전원 모드와 클럭 소스를 구성할 수 있습니다.

또한 전체장치를 재설정하기 위한 비트 및 온도 센서를 비활성화하기 위한 비트도 제공됩니다.

 

DEVICE_RESET : 재설정모드

SLEEP : 1=저전력 절전모드, 0=절전모드 아님.

CYCLE : 1=SLEEP가 0인 상태에서 CYCLE_MODE로 전환.

(CYCLE_MODE : 절전 모드와 웨이크업 사이를 순환하여 LP_WAKE_CTRL(레지스터 108)에 의해 결정된 가속도계 속도에서 단일 샘플의 데이터를 취합니다.)

* Wake주파수를 구성하려면 전원 관리 2 레지스터(레지스터 108)를 사용하여 LP_WAKE_CTRL을 설정합니다.

TEMP_DIS : 온도 센서 활성 비활성.

CLKSEL : 내부 8MHz 오실레이터, 자이로스코프 기반 클럭 또는 외부 소스를 선택가능.

* 내부 8MHz 오실레이터 또는 외부 소스를 클럭 소스로 선택 = 자이로스코프가 비활성화된 저전력 모드에서 작동할 수  있습니다.

(but, 안정성이 향상되려면 장치가 자이로스코프 중 하나를 표보고 참고하고 사용하도록 구성하는게 좋다고 합니다.)

 

저는 0으로 설정해서 내부 클럭 8MHz를 사용하도록 합니다.

 

 

=====

 

=====

 

 

 

3. SMPLRT_DIV 레지스터 입니다. 이 레지스터는 샘플 속도를 생성하는데 사용되는 자이로 스코프 출력 속도의 구분선지정합니다.

 

센서 레지스터 출력, FIFO 출력 및 DMP 샘플링은 모두 이 샘플링 속도를 토대로 사용됩니다.

샘플 속도는 자이로스코프 출력 속도를

SMPLRT_DIV(샘플 속도) = 자이로스코프 출력 속도 / (1+ SMPLRT_DIV)

공식으로 나누어 생성됩니다.

 

만약, DLPF가 비활성화 된 경우는 자이로스코프 출력 속도는 8KHz로 정해집니다. 

 (DLPF_CFG = 0 or 7) = 이부분은 0x1A 레지스터와 연관되어 있어요.

그렇게 되면 가속계 출력 속도는 1KHz 입니다. 

(즉, 1KHz보다 큰 샘플 속도의 경우 동일한 가속도계 샘플이 FIFO, DMP 및 센서 레지스터로 두 번 이상 출력될 수 있습니다.) 

 

저는 0x07로 설정했으니, 8/(1+7) = 1KHz 샘플 속도가 나올 것 같습니다.(맞나요? 저도 솔직히..잘은 모르겠습니다)

 

 

 

 

 

4. 이 부분은 제가 주석처리를 하고 넘어갔는데요. 

그래도 사용할 사람들은 사용하는 부분이라 넣었습니다.

 

이 레지스터는 자이로스코프 및 가속도계 모두에 대한 외부 프레임 동기화(FSYNC) 핀 샘플링 및 디지털 로우패스 필터(DLPF)설정을 구성하는 레지스터입니다.

DLPF - 자이로스코프 출력속도 영향이 있습니다.

 

EXT_SYNC_SET : FSYNC 핀에 연결된 외부 신호를 샘플링 할 수 있습니다.

위에 표를 보면서 원하는 신호를 설정합니다.

 

래치된 FSYNC 신호는 레지스터 25에 정의된 대로 샘플링 속도로 샘플링 합니다.

 

DLPF_CFG : 가속도계와 자이로스코프 필터링 값을 설정하는 곳.

위에서 말했듯이 DLPF가 비활성화 되면 자이로스코프 출력 속도는 8KHz가 된다고

말했는데, 표를 보시면 0일때 자이로스코프 출력 속도가 8KHz로 설정되어 있습니다.

 

이부분은 처음에 설정하다가 주석으로 빼버렸습니다.

 

 

 

5. 이 레지스터는 가속도계 설정 레지스터 입니다.

디지털 출력 3축 가속도계 풀 스케일 범위 를 구성하는데 사용합니다.

(단위는 중력가속도)

 

이 레지스터는 DHPF(Digital High Pass Filter)도 구성합니다.

 

각 가속도계 축에 대한 자가 테스트는 XA_ST, YA_ST, ZA_ST를 제어하여 활성화 할 수 있습니다.

(자체 테스트가 활성화 되면 온보드 전자 장치가 해당 센서를 작동시킵니다.)

- 이 작동은 외부 힘을 시뮬레이션 합니다.

- 작동된 센서가 해당 출력 신호를 생성합니다. 출력 신호는 자가 테스트 반응을 관찰하는 데 사용합니다.

 

자가 테스트 반응은 다음과 같이 정의 됩니다.

자체 테스트 응답 = 자체 테스트가 활성화된 센서 출력 - 자체 테스트가 활성화되지 않은 센서 출력

 

이 부분은 각 가속도 센서들을 테스트함을 위한 설정인것 같습니다.

 

제가 사용하는 부분은 AFS_SEL 에서 0으로 설정해서 최소 스케일 범위를 선택했습니다.

 

 

 

 

6. 이 레지스터는 자이로 설정부분인데요.

가속도와 같습니다.

 

각 XG_ST, YG_ST, ZG_ST를 제어해서 활성화하고 자가 테스트를 진행 할 수 있습니다.

그리고 FS_SEL를 설정해서 자이로스코프 출력의 전체 스케일 범위를 선택합니다.

(사용자가 프로그래밍할 수 있는 최대 범위(Full Scale Range) 초의 디지털 출력)

(1초에 몇 도를 회전하는가)

 

저는 여기서도 0으로 설정해서 최소 범위를 택했습니다.

 

 

이렇게 초기값을 정했는데요.

제가 정한 수치를 본다면

 

온도센서 비활성화, 절전모드 비활성화, 내부클럭 8MHz

샘플 속도 1KHz, 가속도 스케일 범위 2g, 자이로 스케일 범위 250/s

설정 했습니다.

 

 

=====

 

=====

 

 

 

이제 가속도와 자이로 각속도를 받아볼까요?

첫 번째 함수는 가속도 함수이며, 

위에 표와 같이 0x3B부터 시작해서 0x40까지 가속도 레지스터 주소가 있습니다.

이 값들은 16bit 값을 가지고 있어서 상위 하위로 나눠 불러와 16bit 변수에 넣습니다.

그래서 함수를 보시면 시작 값은 0x3B로 설정하고 총 6개 레지스터 주소에서 데이터를 받고

각각 해당하는 Ax, Ay, Az 변수에 데이터 값을 넣습니다.

 

Ax 변수에 데이터를 넣을 때! DataStruct->Ax = DataStruct->Accel_X_RAW / 16384.0;

중에 16384라는 숫자가 있잖아요?

그게 무엇이냐면

 

MPU-6050 datasheet를 보면 가속도계 측정에 풀 스케일 부분에 맞게

LSBin ACEL_xOUTIS 당 가속도계의 감도 수치가 있습니다.

그거에 맞게 설정해서 나눠줍니다.

제가 위에서 0으로 설정해서 2g을 설정했잖아요?

 

그래서 16384가 나온거에요.

 

 

 

두번째 함수는 자이로 센서값을 얻는 함수입니다.

자이로 센서도 가속도 센서와 마찬가지고 16bit 데이터를 가지고 있으며, 0x43으로 시작해서

0x48로 끝납니다. 위와 같이 데이터를 불러와 16bit 변수에 집어 넣습니다.

 

이 부분에서도 Gx = DataStruct->Gyro_X_RAW / 131.0;

중 131이 있는데요.

 

이것도 가속도와 같습니다.

 

표에 맞게 설정한 FS_SEL에 맞게 LSB Sensitivity 값(자이로스코프의 감도)을 넣어줍니다.

 

 

 

가속도와 각속도를 모두 불러왔으니 이제 일단 데이터를 먼저 확인을 해야죠?

아직 상보필터와 다른 필터들을 사용하지 않아서 불안정할 수도 있습니다.

 

저는 시리얼을 printf로 설정해서 사용했어요.

 

 

 

시리얼로 데이터를 받아보면 제가 움직일때, 가속도와 각속도가 데이터가 바뀝니다.

(아 저 수치는 제가 소수점 첫번째자리를 받게해서 저렇게 나온거에요)

 

 

 

 

 

 

300x250