본문 바로가기
SSM/쿼드콥터

[쿼드콥터] SPI 통신 < MPU6050 -> MPU6000 >

by 우툴 2015. 11. 20.
728x90

MPU6050 / MPU6000 에 대하여 

 mpu6050은 6축 자이로 가속도 센서이다. 6축이라는건 3축 자이로와 3축 가속도 센서가 합쳐진 것인다. 그렇다면 이 자이로 가속도 센서라는게 어떤값을 출력하는지 알아야지 사용하지 않겠는가?? 그래서 어떤값을 출력하는지 보자면 아래와 같다. 

3축 자이로 센서 - 각 축에 대한 회전 가속도 값

3축 가속도 센서 - 각 축에 대한 가속도 값 + 중력 가속도 값

(아래의 4.데이터 수신 및 변환 꼭 볼것!) 

그래서 자이로 가속도 센서를 이용하여서 궁극적으로 각도를 추정할 수 있게 됩니다. 이 추정하는 과정에서 상보필터 혹은 칼만필터를 사용하기도 하는데 이 부분은 복잡하므로 다음으로 설명을 미루겠다. 하여튼 이 자이로 가속도 센서의 값을 받아오는 통신 같은 경우는 SPI 통신 또는 I2C 통신을 사용하여서 값을 받아올 수 있는데 여기서 SPI 통신을 이용하여 값을 받아오는 것을 설명하겠다.

SPI 통신을 이용하여 MPU6050 MPU6000 값 받아오기

(SPI 통신같은경우는 MPU6000만 지원하고 MPU6050은 I2C 방식만 지원한다고 합니다. 수정 - 2016년 1월 6일)

 STM32F103ZET6( cortex m3 )를 MCU  두고 통신을 하기 때문에 keil uVision4 를 이용하여서 mpu6050과 spi 통신을 하였다. cortex m3 를 다루기 위해서는 따로 m3 에 대해서 조금 공부를 해야 한다. 그 부분은 다음에 기회가 된다면 설명 하도록 하겠다. 

 그래서 내가 설명하고자 하는 내용은 SPI 통신을 이용해서 mpu6050 센서값을 받아오는 과정을 순서를 설명하고자 한다. 처음 센서값을 받아오려고 노력했을때는 주먹구구식으로 남의 코드를 받아적어서 사용 하기에 급급했었는데 그러다 보니 센서값이 읽어지지 않아도 어디서 문제인지 알 수가 없었다. 그렇기에 통신의 흐름을 이해하는 것은 매우 중요하다고 생각해서 설명하고자 한다.

  • SPI 통신의 흐름

 위의 그림은 mpu6050 과의 통신을 간략하게 표현해 놓은 것이고 그거에 대해서 설명을 하겠다. 사실상 mpu6050 datasheet 가 가장 정확하게 적혀있다. 정말 제대로 알고 싶다면 datasheet를 정독하는 것도 좋은 방법일거 같다. 그럼 위의 흐름을 순서대로 설명하겠다.

 1. 통신의 시작 과 종료


<2016년 1월 6일 그림 수정>

 SPI 통신 같은 경우는 1 대 1 뿐만 아니라 1 대 n 통신이 가능하기 때문에 어떤 녀석이랑 통신을 시작할지 알려주고 신호를 줘야한다. 그것이 바로 cs핀을 이용하는 건데 cs핀의 연결되있는 핀을 high (3,3V) 상태를 대기 상태로 만들어 놓고 이 핀을 low (0V) 상태로 만들어 주는 것으로 통신을 시작한다. 반대로 통신의 종료는 low 상태의 핀을 high 상태로 만들어 주는 것으로 통신을 종료한다.  

 2. 원하는 데이터를 받기 위한 레지스터 주소값 전달

 우리가 원하는 데이터 얻기위해서는 우리가 원하는 데이터가 무엇인지 센서에게 알려줘야 합니다. 그렇기에 우리가 원하는 데이터를 받아올수 있고 이러한 데이터를 받기위해 mpu6050의 레지스터 멥을 참고해서 주소값을 보내면된다. SPI 주소값 같은경우 MSB 0으로 보내면 쓰기(설정) 용이고 MSB 1으로 보내면 읽기용이다. 

 3. 데이터 송수신 방식

 SPI 통신같은경우는 데이터를 주고 받기 위해서 무조건 Push가 있어야 Output이 나오게 된다. 나만의 이해법일 수도 있는데 젠가라는 게임을 상상하고 매칭하면 더 쉬울거 같다. 쌓여져 있는 젠가의 탑에서 우리가 원하는 젠가 블록을 얻기위해서는 어떻게 해야할까? 그것은 간단하다. 손가락으로 원하는 젠가 블록을 누르면 손가락으로 누른 반대편에서 우리가 원하는 젠가 블록이 빠지게 되는 걸 볼 수 있기 때문이다. 이와 마찬가지로 SPI 통신도 젠가 블록을 얻기위해서 손가락으로 누른것 처럼 데이터를 보내서 받고자 하는 데이터를 밀어줘야한다. 즉 그림처럼 Master에서 데이터를 보내면 이게 Slave로 가서 데이터를 밀고 다시 그 밀린 데이터가 마스터로 들어온다고 보면 된다. 그렇기에 mpu6050 흐름도에서 더미 데이터도 받아오기도 하고 더미 데이터를 보내기도 하는 이유가 다 이 때문이다.

 4. 데이터 수신 및 변환


 위에서 말하기는 자이로 가속도 센서에서 데이터가 가속도 값과 각가속도 값이 나온다고 언급했는데 사실상은 그렇게 직접적으로 값이 바로 나오는게 아니다. 센서에서 주는 값은 16비트의 데이터 형식으로 값을 출력해준다.. 아 그럼 이걸 어떻게 해야할까?? 그건 바로 각각의 출력되는 데이터에 Scale Factor 를 나누어서 단위를 변환해주는 것이다. 즉 이런걸 분해능이라고도 하는데 이런 정보는 기기의 datasheet에 있으므로 꼭 확인하길 바란다. 사실상 이 부분이 가장 중요하다면 중요하다고 생각한다. 아무리 데이터를 다 잘 받아왔어도 이 부분에서 잘못해 버리면 데이터를 잘못 받아온 셈이 될태니까 말이다. 

미흡하지만 아래에 MPU6050센서값을 받기위해서 쓴 파일을 첨부하겠다.

mpu6000.c

mpu6000.h

728x90

댓글