이우의 개발일지
Raspberry Pi 5로 MPU6050 자이로 센서 제어 (가속도계 + 자이로 스코프 ) 본문
Raspberry Pi로 MPU6050 (가속도계 + 자이로 스코프) 제어하기
MPU 6050 자이로 센서에 대해
먼저, 자이로 센서는 균형을 이루기 위해 현재 정보값을 얻기 위한 센서로 많이 쓰인다.
흔히, 6축과 9축이 존재 하는데 6축은 자이로스코프 3축, 가속도 3축으로 이뤄지고 여기서 9축은 지자기계 3축이 추가된다고 보면 된다.
내가 쓴 자이로 센서는 6축을 이용한다. 만약 북쪽 방향을 알아야한다면 9축 센서가 필요하다.
자이로센서 통신 방식은 I2C이다.
I2C(Inter intergrated circuit) 통신은 두 개의 전선으로 다수의 통신을 지원하는 디바이스와 데이터를 송/수신할 수 있는 통신 방식이다. 하나의 마스터와 다수의 슬레이브로 연결이 구성되며, 마스터에서 기준 클럭(SCL)을 생성하고, 이 클럭에 맞춰 데이터(SDA)를 전송 및 수신한다. Half-Duplex 통신 방식을 사용한다.
각 핀별 역할
- SDA (Serial Date Line) : I2C 통신에서 데이터로 송수신하는 데이터 라인
- SCL (Serial Clock Line) : I2C 통신에서 클럭 신호를 제공하는 라인
- INT (Interrupt) - 선택 : 특정 이벤트시 신호를 알림
라즈베리파이와 자이로센서 연결
여기에서는 위에 처럼 자이로센서의 Vcc, GND, SDA, SCL 을 맞춰 연결해주면 된다.
라즈베리파이 자이로센서 SW 연결
만약 연결을 완료하였으면, 이제 I2C 통신 설정을 해주면 된다.
sudo raspi-config
먼저, raspi-config 창을 열어서 interface options 에 들어가 I2C를 enable 해주면 된다.
enable 해준 뒤, sudo reboot로 재부팅을 한다.
sudo i2cdetect -y 1
이후, I2C 장치 확인을 한다.
자이로 센서가 정상적으로 연결되면 0x68 or 0x69 주소가 표시될 것이다.
만약,, I2C 장치 인식이 안된다... 라고 한다면
lsmod | grep i2c
이걸 입력을 해봐서
i2c_bcm2835 16384 0 i2c_dev 20480 0 |
이런식으로 출력이 된다면 SW 문제 없는 것이다. (숫자는 좀 달라도 됨.)
암튼 그럼 하드웨어 문제임.. 선 잘 보고 맞게 꼽았는지 확인해볼 것!!
아무튼 여기까지 해서 i2cdetect -y 1 해서 주소가 잘 떴으면, 그 다음 스텝으로 넘어간다.
pip install smbus mpu6050-raspberrypi
라즈베리파이용 mpu6050 라이브러리 설치 후
확인 작업 밑에
python -c "import smbus; print('smbus imported successfully')"
여기까지 해서 아래 최종 코드를 입력한다.
MPU6050 최종코드
import smbus
import time
# MPU6050 I2C 주소 (일반적으로 0x68)
MPU6050_ADDR = 0x68
# I2C 버스 (라즈베리파이 5에서는 보통 1번 버스 사용)
bus = smbus.SMBus(1)
# MPU6050 초기화
def mpu6050_init():
# 전원 관리 레지스터 0으로 설정하여 활성화
bus.write_byte_data(MPU6050_ADDR, 0x6B, 0)
# 데이터 읽기 함수
def read_raw_data(addr):
high = bus.read_byte_data(MPU6050_ADDR, addr)
low = bus.read_byte_data(MPU6050_ADDR, addr+1)
value = (high << 8) | low
# 2의 보수 변환 (16비트)
if value > 32768:
value -= 65536
return value
# 초기화 실행
mpu6050_init()
print("MPU6050 데이터 수집 시작...")
try:
while True:
# 가속도 값 읽기 (X, Y, Z)
accel_x = read_raw_data(0x3B)
accel_y = read_raw_data(0x3D)
accel_z = read_raw_data(0x3F)
# 자이로 값 읽기 (X, Y, Z)
gyro_x = read_raw_data(0x43)
gyro_y = read_raw_data(0x45)
gyro_z = read_raw_data(0x47)
# 변환 (센서 값 -> g 및 deg/s)
Ax = accel_x / 16384.0
Ay = accel_y / 16384.0
Az = accel_z / 16384.0
Gx = gyro_x / 131.0
Gy = gyro_y / 131.0
Gz = gyro_z / 131.0
print(f"Accel: X={Ax:.2f}g, Y={Ay:.2f}g, Z={Az:.2f}g | Gyro: X={Gx:.2f}°/s, Y={Gy:.2f}°/s, Z={Gz:.2f}°/s")
time.sleep(0.5)
except KeyboardInterrupt:
print("\n프로그램 종료")
코드 설명
- I2C 버스 초기화: smbus.SMBus(1) 사용
- MPU6050 초기화: 0x6B 레지스터에 0을 써서 센서 활성화
- 센서 값 읽기:
- read_raw_data() 함수에서 16비트 데이터 읽음.
- 2의 보수 변환 적용하여 음수 값 처리.
- 가속도 및 자이로 변환:
- 가속도 값 → g 단위 (16384.0으로 나누기)
- 자이로 값 → 도/초(131.0으로 나누기)
- 반복 출력: 0.5초마다 센서 값 출력
- Ctrl + C로 종료 가능 (KeyboardInterrupt 예외 처리)
이렇게 위에 코드가 잘 실행되면 끝!
MPU 6050 코드 실행 결과
(myenv) @raspberrypi:~/myenv $ python3 mpu6050.py
MPU6050 데이터 수집 시작...
Accel: X=0.04g, Y=-0.01g, Z=1.03g | Gyro: X=31.34°/s, Y=1.93°/s, Z=-5.44°/s
Accel: X=0.03g, Y=0.02g, Z=1.04g | Gyro: X=35.05°/s, Y=-1.45°/s, Z=-1.05°/s
Accel: X=0.04g, Y=0.02g, Z=1.04g | Gyro: X=34.76°/s, Y=-1.54°/s, Z=-1.22°/s
Accel: X=0.04g, Y=0.02g, Z=1.04g | Gyro: X=33.45°/s, Y=0.97°/s, Z=-0.87°/s
Accel: X=0.05g, Y=0.03g, Z=1.03g | Gyro: X=33.82°/s, Y=-1.24°/s, Z=0.56°/s
Accel: X=0.06g, Y=0.02g, Z=1.03g | Gyro: X=31.68°/s, Y=-0.49°/s, Z=-1.11°/s
Accel: X=0.11g, Y=0.02g, Z=1.03g | Gyro: X=32.05°/s, Y=-9.22°/s, Z=-4.75°/s
Accel: X=0.22g, Y=0.02g, Z=1.03g | Gyro: X=31.03°/s, Y=8.47°/s, Z=-0.82°/s
Accel: X=0.31g, Y=0.02g, Z=1.01g | Gyro: X=35.39°/s, Y=-11.00°/s, Z=4.61°/s
Accel: X=0.32g, Y=0.08g, Z=1.09g | Gyro: X=20.48°/s, Y=48.19°/s, Z=8.37°/s
Accel: X=-0.15g, Y=-0.03g, Z=0.97g | Gyro: X=19.24°/s, Y=19.95°/s, Z=-3.36°/s
Accel: X=-0.11g, Y=0.01g, Z=1.02g | Gyro: X=31.60°/s, Y=0.12°/s, Z=-2.02°/s
Accel: X=-0.11g, Y=-0.05g, Z=1.00g | Gyro: X=40.03°/s, Y=14.50°/s, Z=-0.80°/s
이런 식으로 잘 출력이 된다.
이제 이 값을 가지고 각자의 시스템에 맞춰서 값을 사용하면 된다.
나는 Roll, pitch, yaw 값을 맞추는데 사용할 것이기 때문에 이후 2번째 시리즈로 돌아오겠다!
'Embeded' 카테고리의 다른 글
인공지능 스피커 SK 누구 (Nugu) 소개, 전체 스펙 및 분해 (1) | 2025.02.13 |
---|---|
Dynamixel 모터 제어 일기.. XM430-W210 (0) | 2024.11.11 |
라즈베리파이 yolo v2 모델 이용 및 라즈베리파이 to STM32 보드 UART 통신 (9) | 2024.10.08 |
STM32 임베디드용 ML 모델 개발하기 (Tiny yolo, SSD Mobile net) (1) | 2024.07.17 |