본문 바로가기
Projects/센서 모니터링 시스템

[센서 모니터링 시스템] 5. MPU6050(가속도 센서) 모듈 개발

by DevJaewoo 2022. 8. 17.
반응형

MPU6050 모듈 개발

이제 가속도 센서 모듈을 개발해야 한다.

데이터시트(레지스터 맵) 는 아래의 링크를 통해 다운받을 수 있다.

 

http://www.datasheet.kr/ic/735136/MPU-6050-datasheet-pdf.html

 

MPU-6050 데이터시트 PDF - InvenSense

MPU-6050 데이터시트 PDF - (MPU-6050/-6000) Register Map and Descriptions.

www.datasheet.kr

 

MPU6050이 워낙 유명한 센서라 라이브러리가 있나 해서 찾아봤는데 역시나 있었다.

https://pypi.org/project/mpu6050-raspberrypi/

 

mpu6050-raspberrypi

A Python module for accessing the MPU-6050 digital accelerometer and gyroscope on a Raspberry Pi.

pypi.org

 

그런데 2가지 문제가 있었다.

1. init 후 바로 데이터를 읽으면 에러가 나는 문제

init 후 읽기 시 에러

 

2. PWR_MGMT_1의 SLEEP을 제거해주지 않아 데이터를 0만 받아오는 문제

데이터 0만 나옴

 

때문에 위의 라이브러리를 이용한 새로운 모듈을 만들었다.

크게 바뀐건 없고 생성자 호출 후 딜레이, PWR_MGMT를 Sleep에서 Cycle로 바꿔줬다.

PWR_MGMT_1 레지스터

from time import sleep
from mpu6050 import mpu6050

class MPU6050:
        def __init__(self, i2c):
                self.i2c = i2c
                self.mpu6050 = mpu6050(0x68)
                sleep(0.1)
                i2c.write_i2c_block_data(0x68, 0x6B, [0x20])
                sleep(0.1)


        def get_accel_data(self):
                return self.mpu6050.get_accel_data()

 

테스트코드 작성 후 돌려보면 잘 돌아가는것을 확인할 수 있다.

측정 결과

 

또 MPU6050에 온도 측정 기능도 있어서 함수를 따로 만들어줬다.

데이터시트를 보면 41번, 42번 레지스터에서 8Bit씩 읽어 16Bit로 합치고,

합친 숫자 / 340 + 36.53을 하면 온도가 나온다고 되어있다.

온도 레지스터

 

여기서 중요한건 16-bit Signed value이다.

만약 부호 없이 사용하면 온도가 28도에서 228도가 되는 기적을 볼 수 있다.

 

StackOverflow에 검색해봤더니 numpy.int16 함수를 사용하면 된다고 한다.

https://stackoverflow.com/questions/48971438/signed-decimal-from-a-signed-hex-short-in-python

 

Signed decimal from a signed hex short in python

I was wondering if theres any easy and fast way to obtain the decimal value of a signed hex in python. What I do to check the value of a hex code is just open up python in terminal and type in th...

stackoverflow.com

 

numpy 패키지가 없다면 설치해주자.

pip3 install numpy

 

아래와 같이 온도를 측정하는 함수를 추가로 작성했다.

from time import sleep
from mpu6050 import mpu6050

import numpy as np

class MPU6050:
        def __init__(self, i2c):
                self.i2c = i2c
                self.mpu6050 = mpu6050(0x68)
                sleep(0.1)
                i2c.write_i2c_block_data(0x68, 0x6B, [0x20])
                sleep(0.1)


        def get_accel_data(self):
                return self.mpu6050.get_accel_data()

        def get_temp_data(self):
                data = self.i2c.read_i2c_block_data(0x68, 0x41, 2)
                temp = np.int16(data[0] << 8 | data[1]) / 340.0 + 36.53;
                return temp

 

테스트 코드 작성 후 실행하면 측정이 잘 되는것을 볼 수 있다.

측정 결과

반응형