시리얼 통신 소프트웨어 실습 - 3. 아두이노 및 라즈베리파이와 시리얼 통신하기

2025. 2. 10. 16:02프로그래밍/시스템

3장: 아두이노 및 라즈베리파이와 시리얼 통신하기

Python을 이용하여 아두이노 및 라즈베리파이와 시리얼 통신을 수행하면,
외부 장치와 데이터를 주고받을 수 있어 다양한 임베디드 및 IoT 프로젝트를 구현할 수 있습니다.

이번 장에서는 아두이노와 Python 간 시리얼 통신을 통해 데이터를 송·수신하는 방법과
라즈베리파이를 활용한 RS-485 통신을 실습합니다.


1. 아두이노와 Python 간 시리얼 통신

아두이노와 PC(Python) 간 시리얼 통신을 통해 아두이노에서 데이터를 송신하고 Python에서 이를 수신하는 실습을 진행합니다.
또한, Python에서 명령어를 전송하고 아두이노에서 이를 처리하는 방법도 다룹니다.


✅ 아두이노에서 데이터 송신 & Python에서 수신

📌 구성 개요

[아두이노] TX, RX ↔ USB ↔ [PC에서 Python 코드 실행]

💡 아두이노는 PC와 USB로 연결되며, Python에서 이를 시리얼 포트(COM 포트)로 인식합니다.


🔹 아두이노 코드: 센서 데이터 송신

아두이노는 DHT11 온습도 센서 값을 읽고, 이를 Python으로 전송하는 역할을 합니다.

#include <DHT.h>

#define DHTPIN 2      // 센서 연결 핀
#define DHTTYPE DHT11 // 센서 종류
DHT dht(DHTPIN, DHTTYPE);

void setup() {
    Serial.begin(9600); // 시리얼 통신 시작
    dht.begin();
}

void loop() {
    float temperature = dht.readTemperature();
    float humidity = dht.readHumidity();

    if (!isnan(temperature) && !isnan(humidity)) {
        Serial.print("Temp: ");
        Serial.print(temperature);
        Serial.print("C, Humidity: ");
        Serial.print(humidity);
        Serial.println("%");
    }

    delay(2000); // 2초마다 전송
}

📌 DHT11 센서를 통해 온도 및 습도를 측정하여 Python으로 전송하는 코드입니다.


🔹 Python 코드: 아두이노 데이터 수신

아두이노에서 전송하는 데이터를 Python으로 수신하여 출력하는 코드입니다.

import serial

# 아두이노 시리얼 포트 설정
ser = serial.Serial('COM3', 9600, timeout=1)

try:
    while True:
        data = ser.readline().decode().strip()
        if data:
            print("아두이노로부터 수신된 데이터:", data)

except KeyboardInterrupt:
    print("종료")

finally:
    ser.close()

📌 아두이노에서 전송된 데이터를 readline()을 사용하여 한 줄씩 수신
📌 데이터를 UTF-8로 디코딩 후 출력


2. Python에서 명령을 전송하고 아두이노에서 처리

Python에서 명령어를 보내면, 아두이노가 해당 명령을 처리하는 방식을 구현합니다.
예를 들어, Python에서 "LED_ON"을 보내면 아두이노가 LED를 켜는 기능을 만들 수 있습니다.


🔹 아두이노 코드: Python 명령어 수신 후 LED 제어

#define LED_PIN 13

void setup() {
    Serial.begin(9600);
    pinMode(LED_PIN, OUTPUT);
}

void loop() {
    if (Serial.available()) { // 데이터가 들어왔는지 확인
        String command = Serial.readStringUntil('\n'); // 명령어 읽기

        if (command == "LED_ON") {
            digitalWrite(LED_PIN, HIGH);
            Serial.println("LED 켜짐");
        }
        else if (command == "LED_OFF") {
            digitalWrite(LED_PIN, LOW);
            Serial.println("LED 꺼짐");
        }
    }
}

📌 Python에서 특정 명령을 보내면, 아두이노가 이를 읽고 LED를 ON/OFF하는 코드입니다.


🔹 Python 코드: 명령 전송

import serial
import time

ser = serial.Serial('COM3', 9600, timeout=1)

try:
    while True:
        command = input("명령 입력 (LED_ON / LED_OFF / exit): ").strip()
        
        if command in ["LED_ON", "LED_OFF"]:
            ser.write((command + '\n').encode())  # 명령 전송
            time.sleep(1)  # 전송 후 대기
            response = ser.readline().decode().strip()  # 응답 받기
            print("아두이노 응답:", response)

        elif command == "exit":
            break

except KeyboardInterrupt:
    print("종료")

finally:
    ser.close()

📌 Python에서 "LED_ON", "LED_OFF" 명령을 전송하면 아두이노가 처리 후 응답을 반환합니다.


3. 라즈베리파이와 RS-485 통신

라즈베리파이는 UART 포트를 이용하여 RS-485 장치와 직접 통신할 수 있습니다.
Python을 이용하여 센서 데이터를 수신하고 이를 처리하는 방법을 실습합니다.


✅ Raspberry Pi의 UART 포트를 활용한 RS-485 데이터 송수신

📌 하드웨어 연결

[Raspberry Pi] UART TX/RX → [MAX485] → RS-485 네트워크

💡 RS-485 데이터 송수신을 위해 Raspberry Pi의 UART 포트를 활용


🔹 Raspberry Pi의 시리얼 포트 활성화

sudo raspi-config
  • "Interfacing Options" → "Serial" 선택
  • "Would you like a login shell to be accessible over serial?" → "No"
  • "Would you like the serial port hardware to be enabled?" → "Yes"
  • 설정 저장 후 재부팅:
sudo reboot

🔹 Raspberry Pi에서 Python을 이용한 RS-485 데이터 송·수신

import serial
import time

# 라즈베리파이의 UART 포트 설정
ser = serial.Serial(
    port='/dev/serial0',  # Raspberry Pi의 기본 UART 포트
    baudrate=9600,
    timeout=1
)

try:
    while True:
        # 데이터 송신
        ser.write(b'TEMP_REQ\n')
        print("송신: TEMP_REQ")

        # 데이터 수신
        response = ser.readline().decode().strip()
        if response:
            print("수신:", response)

        time.sleep(2)

except KeyboardInterrupt:
    print("종료")

finally:
    ser.close()

📌 라즈베리파이가 RS-485 네트워크에 연결된 센서에 "TEMP_REQ"를 전송하고 응답을 받음.


📌 요약

아두이노와 Python 간 시리얼 통신을 통해 데이터를 송·수신 가능
Python에서 명령을 전송하면 아두이노가 이를 처리할 수 있음 (예: LED 제어)
Raspberry Pi의 UART 포트를 이용하여 RS-485 데이터를 송·수신할 수 있음
Python으로 Raspberry Pi와 RS-485 센서 간 통신을 수행 가능