I2C 통신의 개요
I2C(Inter-Integrated Circuit) 통신은 두 개 이상의 장치가 서로 데이터를 송수신할 수 있도록 하는 직렬 통신 방식입니다. I2C는 SDA(데이터)와 SCL(클럭) 두 개의 라인을 사용하여 여러 장치를 연결할 수 있으며, 하나의 마스터와 여러 슬레이브 간의 통신을 지원합니다. 오늘은 I2C 통신의 기본 개념과 사용 방법을 학습하겠습니다.
1. I2C 통신의 기본 개념
I2C는 다음과 같은 특징을 가집니다:
- 멀티마스터/슬레이브 구조: 하나의 마스터와 여러 슬레이브 장치 간의 통신을 지원합니다.
- 2개의 와이어 사용: SDA(Serial Data Line)와 SCL(Serial Clock Line)를 사용합니다.
- 주소 지정: 각 슬레이브 장치는 고유한 주소를 가지며, 마스터는 주소를 통해 특정 슬레이브와 통신합니다.
2. I2C 통신 설정
I2C 통신을 사용하려면 SDA와 SCL 핀을 설정하고, 각 슬레이브 장치의 주소를 알아야 합니다. Arduino에서는 Wire
라이브러리를 사용하여 I2C 통신을 구현할 수 있습니다.
3. I2C 통신 사용 예제
다음 예제에서는 I2C LCD 디스플레이를 사용하여 데이터를 출력하는 방법을 보여줍니다.
하드웨어 연결
- I2C LCD 연결:
- VCC: 5V
- GND: GND
- SDA: Arduino A4
- SCL: Arduino A5
I2C LCD 라이브러리 설치
I2C LCD를 사용하려면 라이브러리를 설치해야 합니다.
- Arduino IDE 라이브러리 매니저 열기:
Sketch
->Include Library
->Manage Libraries...
- 라이브러리 검색 및 설치:
LiquidCrystal_I2C
를 검색하고,LiquidCrystal_I2C
라이브러리를 설치합니다.
예제: I2C LCD 디스플레이 사용
다음 예제는 I2C LCD 디스플레이에 "Hello, World!"를 출력하는 방법을 보여줍니다.
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2); // LCD 주소와 크기 설정
void setup() {
lcd.begin(16, 2); // LCD 초기화 (16x2 크기)
lcd.print("Hello, World!"); // LCD에 텍스트 출력
}
void loop() {
// 메인 루프는 비워둠
}
위 코드에서는 LiquidCrystal_I2C
라이브러리를 사용하여 I2C LCD 디스플레이를 초기화하고, "Hello, World!"를 출력합니다.
4. 두 아두이노 간의 I2C 통신
두 개의 Arduino 보드를 사용하여 I2C 통신을 구현할 수 있습니다. 하나의 보드는 마스터로, 다른 보드는 슬레이브로 설정하여 데이터를 송수신합니다.
하드웨어 연결
- Arduino 1 (마스터):
- SDA: Arduino 2의 SDA 핀에 연결
- SCL: Arduino 2의 SCL 핀에 연결
- GND: Arduino 2의 GND에 연결
- Arduino 2 (슬레이브):
- SDA: Arduino 1의 SDA 핀에 연결
- SCL: Arduino 1의 SCL 핀에 연결
- GND: Arduino 1의 GND에 연결
예제: 마스터 코드 (Arduino 1)
#include <Wire.h>
void setup() {
Wire.begin(); // I2C 마스터 시작
Serial.begin(9600); // 시리얼 통신 시작
}
void loop() {
Wire.beginTransmission(8); // 슬레이브 주소 (8)
Wire.write("Hello from Master"); // 데이터 송신
Wire.endTransmission(); // 전송 끝
delay(1000); // 1초 대기
}
예제: 슬레이브 코드 (Arduino 2)
#include <Wire.h>
void setup() {
Wire.begin(8); // I2C 슬레이브 시작 (주소: 8)
Wire.onReceive(receiveEvent); // 데이터 수신 이벤트 핸들러 설정
Serial.begin(9600); // 시리얼 통신 시작
}
void loop() {
delay(100); // 짧은 지연 시간
}
// 데이터 수신 이벤트 핸들러
void receiveEvent(int howMany) {
while (Wire.available()) {
char c = Wire.read(); // 수신된 데이터 읽기
Serial.print(c); // 수신된 데이터 출력
}
Serial.println(); // 줄 바꿈
}
위 코드에서는 첫 번째 Arduino 보드가 마스터로 설정되어 데이터를 송신하고, 두 번째 Arduino 보드가 슬레이브로 설정되어 데이터를 수신하여 시리얼 모니터에 출력합니다.
마무리
오늘은 I2C 통신을 사용하여 데이터를 송수신하는 방법을 학습했습니다. I2C LCD 디스플레이를 사용하여 데이터를 출력하고, 두 아두이노 간의 I2C 통신을 구현하는 방법을 익혔습니다. 다음 날에는 SPI 통신에 대해 더 깊이 알아보겠습니다.
질문이나 추가적인 피드백이 있으면 언제든지 댓글로 남겨 주세요.
Day 17 예고
다음 날은 "SPI 통신"에 대해 다룰 것입니다. SPI 통신을 사용하여 여러 장치 간의 데이터 송수신 방법을 학습하고, 실습 예제를 통해 이해를 돕겠습니다.
'-----ETC----- > C++ 임베디드 시스템 프로그래밍 시리즈' 카테고리의 다른 글
[C++ 임베디드 시스템 프로그래밍 시리즈] Day 17: SPI 통신 (0) | 2024.08.01 |
---|---|
[C++ 임베디드 시스템 프로그래밍 시리즈] Day 18: CAN 통신 (0) | 2024.08.01 |
[C++ 임베디드 시스템 프로그래밍 시리즈] Day 14: 초음파 센서 제어 (0) | 2024.08.01 |
[C++ 임베디드 시스템 프로그래밍 시리즈] Day 15: 직렬 통신 (UART) (0) | 2024.08.01 |
[C++ 임베디드 시스템 프로그래밍 시리즈] Day 12: 모터 제어 (PWM) (0) | 2024.08.01 |