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 후 바로 데이터를 읽으면 에러가 나는 문제
2. PWR_MGMT_1의 SLEEP을 제거해주지 않아 데이터를 0만 받아오는 문제
때문에 위의 라이브러리를 이용한 새로운 모듈을 만들었다.
크게 바뀐건 없고 생성자 호출 후 딜레이, PWR_MGMT를 Sleep에서 Cycle로 바꿔줬다.
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
테스트 코드 작성 후 실행하면 측정이 잘 되는것을 볼 수 있다.
'Projects > 센서 모니터링 시스템' 카테고리의 다른 글
[센서 모니터링 시스템] 7. Repository 개발 (0) | 2022.08.17 |
---|---|
[센서 모니터링 시스템] 6. Spring 서버 기본환경 설정 (0) | 2022.08.17 |
[센서 모니터링 시스템] 4. CCS811(공기질 센서) 모듈 개발 (0) | 2022.08.17 |
[센서 모니터링 시스템] 3. I2C 포트 제어하기 (0) | 2022.08.17 |
[센서 모니터링 시스템] 2. 라즈베리파이 개발환경 구성 (0) | 2022.08.17 |