본문 바로가기
컴퓨터|인터넷/라즈베리파이

라즈베리파이 피코에서 I2C 통신

by 즐거운 지니 2024. 10. 12.
반응형

라즈베리파이 피코(Raspberry Pi Pico)에서 마이크로파이썬(MicroPython)으로 I2C 통신을 사용하는 방법도 있습니다. 라즈베리파이 피코 역시 라즈베피라이와 마찬가지로 여러 장치를 I2C 프로토콜을 통해 연결할 수 있으며, MicroPython의 machine 모듈을 사용하여 간단히 I2C 통신을 구현할 수 있습니다.

1. 라즈베리파이 피코에서 I2C 핀

라즈베리파이 피코에는 여러 I2C 인터페이스를 사용할 수 있습니다. 기본적으로 두 개의 I2C 인터페이스가 있으며, 각각의 인터페이스는 여러 GPIO 핀을 사용할 수 있습니다.

기본 I2C 핀

  • I2C0:
    • SDA: GPIO 0 (핀 1)
    • SCL: GPIO 1 (핀 2)
  • I2C1:
    • SDA: GPIO 2 (핀 4)
    • SCL: GPIO 3 (핀 5)

물론, MicroPython에서는 I2C 핀을 직접 지정할 수 있습니다.

2. MicroPython에서 I2C 통신 초기화

MicroPython을 사용하면 machine.I2C 클래스를 통해 I2C 통신을 쉽게 설정할 수 있습니다. 아래는 기본적인 I2C 초기화 코드입니다.

I2C 통신 초기화 예제

from machine import Pin, I2C
import time

# I2C0 초기화: SDA=GPIO0, SCL=GPIO1
i2c = I2C(0, scl=Pin(1), sda=Pin(0), freq=400000)  # 400kHz 속도로 설정

# I2C1 초기화: SDA=GPIO2, SCL=GPIO3
# i2c = I2C(1, scl=Pin(3), sda=Pin(2), freq=400000)

# I2C 버스에 연결된 장치의 주소 스캔
devices = i2c.scan()

if devices:
    print("I2C devices found:", [hex(device) for device in devices])
else:
    print("No I2C devices found")

이 코드에서는 I2C(0, scl=Pin(1), sda=Pin(0), freq=400000)을 사용하여 I2C 버스를 설정합니다.

  • I2C(0)은 I2C0 버스를 사용한다는 의미입니다.
  • Pin(1)은 SCL 핀을 GPIO 1로 설정하고, Pin(0)은 SDA 핀을 GPIO 0으로 설정합니다.
  • freq=400000은 I2C 통신 속도를 400kHz로 설정하는 것입니다.

i2c.scan()은 I2C 버스에 연결된 장치들의 주소를 스캔하여 리스트로 반환합니다. 장치가 연결되어 있으면 해당 장치들의 I2C 주소를 출력합니다.

3. I2C 통신을 통한 데이터 전송 및 수신

I2C 장치와 통신하려면 데이터를 쓰고 읽는 기능을 구현해야 합니다. 이를 위해 I2C.writetoI2C.readfrom 메서드를 사용할 수 있습니다.

데이터 쓰기 예제

# I2C 장치 주소 (예시: 0x48)
DEVICE_ADDRESS = 0x48

# 장치에 데이터 쓰기
i2c.writeto(DEVICE_ADDRESS, b'\x01\xFF')  # 레지스터 0x01에 데이터 0xFF 쓰기

이 코드에서는 DEVICE_ADDRESS에 해당하는 I2C 장치에 두 바이트(0x010xFF)를 씁니다.

데이터 읽기 예제

# I2C 장치에서 2바이트 읽기
data = i2c.readfrom(DEVICE_ADDRESS, 2)  # 장치에서 2바이트 읽기
print("Read data:", data)

이 코드는 DEVICE_ADDRESS에 해당하는 장치에서 2바이트 데이터를 읽어옵니다.

4. I2C 장치와의 예제 (온도 및 습도 센서 SHT31)

MicroPython을 사용하여 라즈베리파이 피코와 SHT31 같은 온도/습도 센서를 연결하는 예제를 살펴보겠습니다.

SHT31와 I2C 통신 예제

from machine import Pin, I2C
import time

# I2C 설정
i2c = I2C(0, scl=Pin(1), sda=Pin(0), freq=400000)

# SHT31 센서 주소
SHT31_ADDRESS = 0x44

# 측정 명령어
MEASURE_CMD = b'\x2C\x06'

# 측정 요청
i2c.writeto(SHT31_ADDRESS, MEASURE_CMD)

# 데이터 수신 (6바이트)
time.sleep(0.5)  # 측정 완료 대기
data = i2c.readfrom(SHT31_ADDRESS, 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} %")

5. I2C 관련 함수

  • I2C.init(scl, sda, freq): I2C 버스를 초기화합니다.
  • I2C.scan(): 버스에 연결된 장치의 주소를 스캔하고, 리스트로 반환합니다.
  • I2C.readfrom(addr, nbytes): addr 주소에서 nbytes 바이트를 읽어옵니다.
  • I2C.writeto(addr, buf): addr 주소로 buf 데이터를 전송합니다.
  • I2C.readfrom_mem(addr, memaddr, nbytes): addr 주소의 memaddr 메모리 위치에서 nbytes 바이트를 읽습니다.
  • I2C.writeto_mem(addr, memaddr, buf): addr 주소의 memaddr 메모리 위치에 buf 데이터를 씁니다.

라즈베리파이 피코에서 MicroPython을 사용해 I2C 통신을 설정하고 다양한 센서와 장치와 통신하는 것은 매우 간단합니다. machine.I2C 클래스를 통해 핀을 지정하고, 데이터를 쉽게 주고받을 수 있습니다. 이 방법을 통해 온도/습도 센서, 가속도계, 조도 센서 등 다양한 장치를 I2C 버스를 통해 연결할 수 있습니다.

반응형

댓글