I2C는 마이크로컨트롤러, 센서, 디스플레이 등 다양한 장치들을 두 개의 데이터 라인만을 사용하여 통신할 수 있는 직렬 통신 프로토콜입니다. 이 통신 방식은 라즈베리파이와 센서 등 다양한 외부 장치를 연결하는 데 널리 사용됩니다.
I2C 통신이란?
I2C는 마스터-슬레이브 방식의 통신 프로토콜입니다. 라즈베리파이 같은 마스터 장치가 버스를 제어하며, 여러 슬레이브 장치와 통신할 수 있습니다. 슬레이브 장치마다 고유한 주소가 있어, 마스터가 특정 슬레이브와 데이터를 주고받을 수 있습니다.
I2C의 주요 특징
- 2개의 신호선: 데이터 전송에 두 개의 신호선을 사용합니다.
- SCL (Serial Clock Line): 클럭 신호.
- SDA (Serial Data Line): 데이터 신호.
- 주소 기반 통신: 각 슬레이브 장치는 7비트 또는 10비트 주소를 가지며, 마스터는 이 주소를 통해 특정 슬레이브와 통신합니다.
- 양방향 통신: I2C는 한 라인에서 양방향 데이터 전송이 가능합니다.
- 속도: 일반적으로 표준 모드는 100kHz, 빠른 모드는 400kHz입니다.
라즈베리파이에서 I2C 설정 및 사용
라즈베리파이에서 I2C 통신을 사용하려면 몇 가지 설정 작업을 수행해야 합니다.
1. I2C 활성화
- I2C 인터페이스 활성화: 라즈베리파이에서 I2C 인터페이스는 기본적으로 비활성화되어 있으므로, 활성화해야 합니다.
- 터미널에서
sudo raspi-config
를 실행합니다. Interfacing Options
→I2C
를 선택하고 활성화합니다.- 라즈베리파이를 재부팅합니다.
- 터미널에서
- I2C 패키지 설치: I2C 통신을 쉽게 사용하기 위해 필요한 패키지를 설치합니다.
sudo apt-get install -y i2c-tools python3-smbus
2. I2C 장치 확인
- I2C 버스에 연결된 장치의 주소를 확인하려면 다음 명령어를 사용합니다. 이 명령어는 I2C 버스 1번에 연결된 장치들의 주소를 스캔합니다. 보통 7비트 주소가 표시됩니다.
sudo i2cdetect -y 1
3. I2C 핀 구성
라즈베리파이의 I2C 핀은 다음과 같습니다.
- SDA (Serial Data): 핀 3 (GPIO 2)
- SCL (Serial Clock): 핀 5 (GPIO 3)
이 핀들에 I2C 장치를 연결하면 됩니다.
4. Python을 이용한 I2C 통신
라즈베리파이에서 Python을 사용해 I2C 장치와 통신하려면 smbus
모듈을 사용합니다. 아래는 I2C 장치와 통신하는 기본적인 Python 코드 예시입니다.
import smbus
import time
# I2C 버스 초기화 (라즈베리파이의 경우 I2C 버스 1)
bus = smbus.SMBus(1)
# 슬레이브 장치 주소 (I2C 장치의 주소, 예를 들어 0x48)
DEVICE_ADDRESS = 0x48
# I2C 장치에 데이터를 쓰는 함수
def write_data(register, data):
bus.write_byte_data(DEVICE_ADDRESS, register, data)
# I2C 장치로부터 데이터를 읽는 함수
def read_data(register):
return bus.read_byte_data(DEVICE_ADDRESS, register)
# I2C 통신 예시
try:
while True:
# 레지스터 0x01에 값 0xFF 쓰기
write_data(0x01, 0xFF)
# 레지스터 0x01에서 값 읽기
value = read_data(0x01)
print(f"Read Value: {value}")
# 1초 대기
time.sleep(1)
except KeyboardInterrupt:
pass
이 코드에서는 다음 작업을 수행합니다:
smbus.SMBus(1)
로 I2C 버스를 초기화합니다. 라즈베리파이의 경우 I2C 버스 1번을 사용합니다.write_data()
함수는 특정 레지스터에 데이터를 씁니다.read_data()
함수는 특정 레지스터에서 데이터를 읽습니다.
5. 장치와의 통신
각 I2C 장치는 고유한 통신 규칙을 따르므로, 사용하려는 장치의 데이터시트를 참조하여 올바른 레지스터와 데이터를 전송해야 합니다.
예제: 온도 및 습도 센서 SHT31와 I2C 통신
온도 및 습도 센서인 SHT31과 I2C 통신을 통해 데이터를 읽어오는 예제를 보겠습니다.
장치 주소 확인
sudo i2cdetect -y 1
SHT31 센서는 보통 0x44
또는 0x45
주소를 사용합니다.
Python 코드 예시
import smbus
import time
# I2C 버스 초기화
bus = smbus.SMBus(1)
# SHT31 센서 주소
SHT31_ADDRESS = 0x44
# 명령어: 센서에서 측정 시작
MEASUREMENT_CMD = [0x2C, 0x06]
# I2C 명령어 전송
bus.write_i2c_block_data(SHT31_ADDRESS, MEASUREMENT_CMD[0], MEASUREMENT_CMD[1:])
# 0.5초 대기
time.sleep(0.5)
# 6바이트 데이터 읽기 (온도와 습도)
data = bus.read_i2c_block_data(SHT31_ADDRESS, 0, 6)
# 온도와 습도 계산
temperature_raw = data[0] * 256 + data[1]
temperature_celsius = -45 + (175 * temperature_raw / 65535.0)
humidity_raw = data[3] * 256 + data[4]
humidity = 100 * humidity_raw / 65535.0
print(f"Temperature: {temperature_celsius:.2f} C")
print(f"Humidity: {humidity:.2f} %")
이 코드에서는:
- SHT31 센서에서 데이터를 읽어와 온도와 습도를 계산합니다.
write_i2c_block_data()
함수로 측정 명령을 센서에 전송합니다.read_i2c_block_data()
함수로 6바이트 데이터를 읽어, 온도와 습도를 계산합니다.
I2C 통신의 장점
- 간단한 배선: 두 개의 선(SDA, SCL)으로 여러 장치를 연결할 수 있습니다.
- 다중 장치 연결 가능: 여러 슬레이브 장치를 하나의 I2C 버스에 연결할 수 있습니다.
- 다양한 속도 지원: 다양한 속도 모드를 지원하여 필요에 따라 설정할 수 있습니다.
I2C 통신의 단점
- 짧은 전송 거리: I2C는 긴 거리 전송에는 적합하지 않으며, 주로 짧은 거리(PCB 내부)에서 사용됩니다.
- 속도 제한: SPI 같은 다른 통신 방식에 비해 I2C의 속도는 느린 편입니다.
라즈베리파이에서 I2C 통신은 센서 및 다른 장치와 쉽게 통신할 수 있는 강력한 방법입니다. I2C는 다양한 장치를 하나의 버스에 연결할 수 있다는 장점이 있어, 여러 장치와 상호작용해야 하는 프로젝트에 매우 적합합니다. I2C 통신을 사용하여 다양한 센서와 장치를 라즈베리파이와 통합하여 스마트 프로젝트를 구현할 수 있습니다.
'컴퓨터|인터넷 > 라즈베리파이' 카테고리의 다른 글
라즈베리파이 피코에서 I2C 통신 (0) | 2024.10.12 |
---|---|
라즈베리파이 피코W 마이크로파이썬 mqtt 클라이언트 (1) | 2024.10.04 |
Ubuntu 시스템에서 apt update 및 apt upgrade 후 재부팅 실패시 (1) | 2024.10.04 |
Node-red: Chart in dashboard (2) | 2024.10.03 |
Node-red: Gauge in Dashboard (노드래드 대시보드 게이지의 활용) (0) | 2024.10.03 |
댓글