2016년 8월 29일 월요일

MPU-6050/9250 다루기

IMU 혹은 AHRS 센서라 불리는 자세 인식 센서는 재미있는 효과를 보여주기에 적합한 좋은 도구입니다.
현재, 여러 종류의 제품이 나와있지만 그 중에서도 가장 많이 알려진 MPU-6050과 MPU-9250을 다루는 법에 대해 기술하겠습니다.
MPU-6050 보드

MPU-6050은 아두이노에서 가장 많이 알려진 IMU센서입니다. 이것은 값도 저렴하고 DMP라 부르는 센서 융합 기술을 내장하고 있기에, 기존의 칼만 필터 등으로 센서 융합 알고리즘을 구현하느라 애쓰지 않아도 되는 장점을 갖고 있습니다.
MPU-9250은 6050에 비해 잘 알려져있지는 않지만, 매우 유용한 센서입니다.
MPU-9250 보드

MPU-6050과 9250의 가장 큰 차이는 지자기 센서 포함 유무입니다. MPU-6050은 지자기 센서를 포함하지 않기때문에 지면과 수평인 Yaw 방향에 오차가 생깁니다. 반면에, MPU-9250은 지자기 센서를 포함하고 있기때문에 Yaw 방향에 대해서도 정확한 각도를 추출합니다.
Yaw 방향의 필요성에 따라 6050 혹은 9250을 선택해서 사용하면 됩니다.

MPU-6050/9250을 아두이노 보드에 연결하려면 다음과 같은 회로를 구현합니다.

이 회로를 이해하려면 I2C 통신에 대해 알아야 합니다.
대부분의 아두이노 부품은 Digital In/Out 혹은 Analog In/Out을 통해 제어했습니다. 그러나, 좀 더 복잡한 제어를 하기 위해서는 서로 정보를 교환하는 통신이란 방법이 필요합니다.
IC 칩과 칩 사이의 통신을 위해 만들어진 규약이 I2C(Inter Intergrated Circuit)입니다. I2C는 SCL과 SDA라는 핀을 통해 서로 연결할 수 있습니다.
아두이노 보드는 Analog 입력 핀으로 사용되는 A4와 A5가 각각 SDA, SCL로 사용될 수 있기에 I2C 연결을 위해서 이 핀을 사용합니다.

회로 연결을 하고 아두니티에서 Wire Editor를 작성한다면 다음과 같이 표현됩니다.

아두이노 스케치를 만들기 전 MPUSeries의 Sketch Option을 잘 설정해야 합니다. (설정 방법 참고)
MPU 보드의 Orientation을 맞추는 것은 중요합니다. 왜냐하면 MPU 보드의 방향과 유니티의 방향이 일치해야 쉽게 제어할 수 있기 때문입니다.
MPU보드에는 좌표계가 있습니다.

주의할 점은 MPU 보드에서 Z는 위 방향을 의미하지만, 유니티에서는 Y가 위 방향이란 것입니다. 그리고, 만들다보면 MPU 보드의 방향과 유니티 방향을 맞추기 어려운 경우가 생깁니다.
이런 경우 MPU보드와 유니티 방향을 재 설정하는 아두이노 스케치 옵션을 통해 맞추면 됩니다.

MPU 보드로 GameObject 회전시키기
MPU 보드는 Roll, Pitch, Yaw라는 3차원 공간의 각도를 알려줍니다. 이것을 GameObject Transform의 Rotation에 사용한다면 MPU 보드로 GameObject의 회전을 제어할 수 있습니다.
RotationReactor는 보드로부터 수집된 회전 정보를 GameObject Transform의 Rotation에 적용하는 기능을 갖고 있습니다.



RotationReactor를 사용하기 위해서는 다음과 같은 설정이 필요합니다.

  • smoothFollow: GameObject 회전이 보다 부드럽게 연결됨

RotationReactor와 MPUSeries를 연결하면 MPU 보드로 회전되는 GameObject를 볼 수 있습니다.

동영상을 통해 작동 모습을 직접 확인하시기 바랍니다.




댓글 7개:

  1. 저기 제발 부탁드립니다.ㅜㅜ 질문 답변좀 해주실 수 있나요?

    답글삭제
  2. 제가 아두이노 하나당, mpu6050을 한개씩 달아서 만든 뒤 ARDUnity 를 통해서 각도를 받고 있는데요, 1개씩 할때는 잘 되는데, 2개를 연결하면 가만히 두면,, 꼭 센서가 자동으로 살짝식 계속 움직이네요..
    MPU6050 ID는 각 각 다르게 주었습니다. ㅜㅜ
    그리고 ArdunityApp이랑 CommSerial도 다 다르게 했고요... 값이 둘다 들어오긴 하는데 하나가 센서를 가만히 땅에 두어도 저절로 천천히 움직이네요.ㅜㅜ

    답글삭제
    답글
    1. IMU센서는 드리프트 현상이 있습니다.
      가만히 있어도 조금씩 움직이는 것이 드리프트 현상입니다.
      이 현상이 생기는 이유는 초기화된 후 센서가 자체 캘리브레이션하기 때문입니다.
      최초 사용 시 땅바닥에 내려놓은 후 안 움직일때까지 기다렸다 사용하면 해결됩니다.
      아두니티 MPUSeries에는 이것을 소프트웨어적으로 제어하기 위해 Calibration Event를 사용할 수 있습니다.

      삭제
  3. can not do anything for translation?

    답글삭제
  4. 아두니티 디럭스 버전 사용하고 있는 학생입니다.
    제가 진행하는 프로젝트에서 mpu센서를 이용해서 회전값이나 자이로 값을 읽어오는데는 문제가 없는데, 위치를 받아오기 위해서는 어떤 방법이 있을까요?

    답글삭제
  5. mpu 6050으로 처음 테스트 해보았습니다. 계속 "Now MPU is calibrating"라는 메시지만 나오고 mpu를 움직여도 동작을 하지 않습니다. (calibrating 시간을 아무리 오래 기다려도 더이상 변화가 없습니다.)
    아두이노 사이트에서 mpu 6050 예제가 있어서 그 예제를 바로 돌려보았는데 그 예제로는 시리얼모니터에서 mpu를 움직이면 값이 변화되는 것이 보입니다.
    해결 방법 부탁드려요

    답글삭제