통신 방식은 전자기기 간의 데이터 전송 및 상호작용을 구현하는 데 중요한 역할을 합니다. 아두이노와 다른 장치 간의 통신 방식은 여러 가지가 있으며, 각 방식은 특정 용도와 요구에 맞게 설계되었습니다. 이 글에서는 아두이노에서 사용 가능한 주요 통신 종류와 그에 대한 예제를 설명하겠습니다.
1. 직렬 통신 (Serial Communication)
1.1. UART (Universal Asynchronous Receiver-Transmitter)
설명: 직렬 통신의 기본 형태로, 데이터 비트가 하나씩 전송됩니다. UART는 비동기식으로 동작하여 클럭 신호 없이 데이터를 전송합니다.
주요 핀:
- TX (Transmit): 데이터를 전송하는 핀
- RX (Receive): 데이터를 수신하는 핀
예제: 아두이노와 컴퓨터 간의 직렬 통신
회로 구성:
- TX (아두이노) -> RX (컴퓨터 또는 시리얼 변환기)
- RX (아두이노) -> TX (컴퓨터 또는 시리얼 변환기)
- GND (아두이노) -> GND (컴퓨터 또는 시리얼 변환기)
코드 예제:
아두이노 코드:
void setup() {
Serial.begin(9600); // 시리얼 통신 시작
}
void loop() {
Serial.println("Hello, Serial!"); // 데이터 전송
delay(1000); // 1초 대기
}
컴퓨터 코드 (Python 예제):
import serial
ser = serial.Serial('COM3', 9600) # 포트와 보드레이트 설정
while True:
data = ser.readline() # 데이터 읽기
print(data.decode('utf-8').strip()) # 데이터 출력
2. I2C (Inter-Integrated Circuit)
2.1. 설명
I2C는 2선식 통신 방식으로, 하나의 데이터 라인(SDA)과 하나의 클럭 라인(SCL)을 사용합니다. 여러 장치가 동일한 I2C 버스에 연결될 수 있으며, 각 장치는 고유의 주소를 가지고 있습니다.
주요 핀:
- SDA (Serial Data Line): 데이터 전송 및 수신
- SCL (Serial Clock Line): 클럭 신호 제공
예제: 아두이노와 I2C LCD 디스플레이 연결
회로 구성:
- LCD SDA -> 아두이노 A4
- LCD SCL -> 아두이노 A5
- LCD VCC -> 아두이노 5V
- LCD GND -> 아두이노 GND
코드 예제:
아두이노 코드:
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2); // I2C 주소와 LCD 크기 설정
void setup() {
lcd.begin();
lcd.print("Hello, I2C LCD!"); // 메시지 출력
}
void loop() {
// 메인 루프
}
3. SPI (Serial Peripheral Interface)
3.1. 설명
SPI는 4선식 통신 방식으로, 데이터 전송 속도가 빠릅니다. 마스터와 슬레이브 장치 간의 통신을 지원하며, 각 장치는 고유의 선택 신호를 사용하여 구분됩니다.
주요 핀:
- MOSI (Master Out Slave In): 마스터에서 슬레이브로 데이터 전송
- MISO (Master In Slave Out): 슬레이브에서 마스터로 데이터 전송
- SCK (Serial Clock): 클럭 신호 제공
- SS (Slave Select): 슬레이브 장치 선택
예제: 아두이노와 SPI 8x8 LED 매트릭스 연결
회로 구성:
- MAX7219 DIN -> 아두이노 디지털 핀 11 (MOSI)
- MAX7219 CLK -> 아두이노 디지털 핀 13 (SCK)
- MAX7219 CS -> 아두이노 디지털 핀 10 (SS)
- MAX7219 VCC -> 아두이노 5V
- MAX7219 GND -> 아두이노 GND
코드 예제:
아두이노 코드:
#include <LedControl.h>
#define DATA_IN 11
#define CLK 13
#define LOAD 10
#define MAX_DEVICES 1
LedControl lc = LedControl(DATA_IN, CLK, LOAD, MAX_DEVICES);
void setup() {
for (int i = 0; i < MAX_DEVICES; i++) {
lc.shutdown(i, false);
lc.setIntensity(i, 8);
lc.clearDisplay(i);
}
}
void loop() {
lc.setLed(0, 0, 0, true);
delay(500);
lc.setLed(0, 1, 0, true);
delay(500);
lc.setLed(0, 0, 0, false);
lc.setLed(0, 1, 0, false);
delay(500);
}
4. OneWire
4.1. 설명
OneWire는 1선식 데이터 통신 방식을 사용하여 여러 장치가 동일한 데이터 라인에서 통신할 수 있도록 합니다. 데이터 전송 속도가 상대적으로 낮지만, 장치 수가 많아도 간단히 연결할 수 있습니다.
주요 핀:
- DATA: 데이터 전송 및 수신
예제: 아두이노와 DS18B20 온도 센서 연결
회로 구성:
- DS18B20 DATA -> 아두이노 디지털 핀 2
- DS18B20 VCC -> 아두이노 5V
- DS18B20 GND -> 아두이노 GND
- DS18B20 데이터 핀과 4.7kΩ 저항을 5V에 연결
코드 예제:
아두이노 코드:
#include <OneWire.h>
#include <DallasTemperature.h>
#define ONE_WIRE_BUS 2
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
void setup() {
Serial.begin(9600);
sensors.begin();
}
void loop() {
sensors.requestTemperatures();
Serial.print("Temperature: ");
Serial.print(sensors.getTempCByIndex(0));
Serial.println(" C");
delay(1000);
}
5. Bluetooth
5.1. 설명
Bluetooth는 무선 통신 방식으로, 데이터를 근거리에서 무선으로 전송할 수 있습니다. 주로 HC-05와 같은 모듈이 아두이노와 함께 사용됩니다.
주요 핀:
- TX: 데이터를 전송하는 핀
- RX: 데이터를 수신하는 핀
- VCC: 전원 공급
- GND: 접지
예제: 아두이노와 HC-05 블루투스 모듈 연결
회로 구성:
- HC-05 TX -> 아두이노 RX (핀 0)
- HC-05 RX -> 아두이노 TX (핀 1)
- HC-05 VCC -> 아두이노 5V
- HC-05 GND -> 아두이노 GND
코드 예제:
아두이노 코드:
void setup() {
Serial.begin(9600); // Bluetooth와 통신 시작
}
void loop() {
if (Serial.available()) {
char data = Serial.read(); // 수신된 데이터 읽기
Serial.print("Received: ");
Serial.println(data); // 데이터 출력
}
}
결론
통신 방식은 다양한 전자기기와 시스템 간의 데이터 전송과 상호작용을 구현하는 데 필수적입니다. 아두이노는 직렬 통신, I2C, SPI, OneWire, Bluetooth 등 여러 가지 통신 방식을 지원하여 다양한 응용 프로그램을 개발할 수 있습니다. 각 통신 방식의 특성과 회로 구성, 코드 예제를 잘 이해하면 효과적인 전자 프로젝트를 구현할 수 있습니다.
'Hardware > 아두이노' 카테고리의 다른 글
아두이노 시작하기 - 액추에이터 (0) | 2024.08.03 |
---|---|
아두이노 시작하기 - 문법 (0) | 2024.07.31 |
아두이노 시작하기 - 디스플레이 2 (0) | 2024.07.31 |
아두이노 시작하기 - 디스플레이 1 (0) | 2024.07.31 |
아두이노 시작하기 - 기판 및 쉴드 (0) | 2024.07.31 |