라즈베리파이 피코(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.writeto
와 I2C.readfrom
메서드를 사용할 수 있습니다.
데이터 쓰기 예제
# I2C 장치 주소 (예시: 0x48)
DEVICE_ADDRESS = 0x48
# 장치에 데이터 쓰기
i2c.writeto(DEVICE_ADDRESS, b'\x01\xFF') # 레지스터 0x01에 데이터 0xFF 쓰기
이 코드에서는 DEVICE_ADDRESS
에 해당하는 I2C 장치에 두 바이트(0x01
과 0xFF
)를 씁니다.
데이터 읽기 예제
# 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 버스를 통해 연결할 수 있습니다.
'컴퓨터|인터넷 > 라즈베리파이' 카테고리의 다른 글
센서 데이터 획득 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 |
댓글