소스 뷰어
import smbus
import time
import math

# MPU6050 레지스터 주소
MPU6050_ADDR = 0x68  # MPU6050 I2C 주소

# MPU6050 레지스터
PWR_MGMT_1 = 0x6B
ACCEL_XOUT_H = 0x3B
GYRO_XOUT_H = 0x43

# I2C 버스 설정
bus = smbus.SMBus(1)  # Raspberry Pi에서 I2C bus 1 사용

# MPU6050 초기화
def mpu_init():
    bus.write_byte_data(MPU6050_ADDR, PWR_MGMT_1, 0)  # MPU6050 시작

# 레지스터에서 2바이트 읽기 (MPU6050은 데이터가 MSB, LSB로 나뉘어 저장됨)
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
    
    # 음수 값을 처리하기 위해 16비트 데이터를 부호 있는 값으로 변환
    if value > 32768:
        value = value - 65536
    return value

# 가속도 및 자이로 값 읽기
def read_accel_gyro():
    # 가속도 값 읽기
    acc_x = read_raw_data(ACCEL_XOUT_H)
    acc_y = read_raw_data(ACCEL_XOUT_H + 2)
    acc_z = read_raw_data(ACCEL_XOUT_H + 4)
    
    # 자이로 값 읽기
    gyro_x = read_raw_data(GYRO_XOUT_H)
    gyro_y = read_raw_data(GYRO_XOUT_H + 2)
    gyro_z = read_raw_data(GYRO_XOUT_H + 4)
    
    # 가속도 값 (단위: g, 1g = 9.8m/s^2)
    Ax = acc_x / 16384.0
    Ay = acc_y / 16384.0
    Az = acc_z / 16384.0
    
    # 자이로 값 (단위: 도/초)
    Gx = gyro_x / 131.0
    Gy = gyro_y / 131.0
    Gz = gyro_z / 131.0
    
    return (Ax, Ay, Az, Gx, Gy, Gz)

# 회전 각도 계산 (자이로 데이터를 이용)
def calculate_rotation(Ax, Ay, Az):
    # 각 축에 대한 회전 각도 계산 (라디안 -> 도)
    roll = math.atan2(Ay, Az) * 180 / math.pi
    pitch = math.atan2(-Ax, math.sqrt(Ay**2 + Az**2)) * 180 / math.pi
    return roll, pitch

# 초기화
mpu_init()

# 데이터 읽기 루프
count = 0 
while 1:
    count += 1
    # 가속도와 자이로 값 읽기
    Ax, Ay, Az, Gx, Gy, Gz = read_accel_gyro()
    
    # 회전 각도 계산
    roll, pitch = calculate_rotation(Ax, Ay, Az)
    
    print(  "-"*40 )
    print( f"Count: {count:d}" )
    print(f"가속도: X={Ax:.2f}g, Y={Ay:.2f}g, Z={Az:.2f}g")
    print(f"각속도: X={Gx:.2f}°/s, Y={Gy:.2f}°/s, Z={Gz:.2f}°/s")
    print(f"회전각: Roll={roll:.2f}°, Pitch={pitch:.2f}°")
    
    # 1초 대기
    time.sleep(1)
pass