I²C 통신 · 학습
실행 조건
기본 실습: 제공한 byte·합성 센서 데이터. 실제 I²C 예제: Linux의 I²C 장치와 smbus2 필요 (python -m pip install smbus2).
이번에 배울 내용
같은 두 Byte도 부호와 센서 범위 설정에 따라 전혀 다른 물리량이 됩니다. 경계값부터 변환을 검증합니다.
전체 흐름
레지스터 Byte → signed 정수 → 감도 계수 → 물리량·편차
Byte에서 부호 있는 정수로
두 Byte를 합친 u=(high<<8)|low가 32768 이상이면 65536을 빼서 signed 16-bit 값으로 읽습니다. 0x8000은 −32768입니다. 경계값을 먼저 시험하면 변환 오류를 빨리 찾을 수 있습니다.
정수에서 물리량으로
가속도·Angular Velocity의 감도 계수는 센서 범위 설정에 따라 달라집니다. Raw 값만 저장하면 나중에 단위를 복원하기 어려우므로 설정과 측정 시각을 함께 기록합니다.
정지 상태의 평균 편차와 흔들림도 구분합니다.
풀이 예제
바이트 쌍은 (0x40,0x00),(0xC0,0x00),(0x7F,0xFF),(0x80,0x00),(0xFF,0xFF)입니다. 앞 바이트가 high byte입니다.
pairs=[(0x40,0),(0xC0,0),(0x7F,0xFF),(0x80,0),(0xFF,0xFF)]
def signed16(high,low):
value=(high<<8)|low
return value-65536 if value>=32768 else value
print([signed16(*p) for p in pairs])
[16384, -16384, 32767, -32768, -1]