125_두대의아두이노_시리얼연동 💬🤝

도로시와 지니의 두 대의 아두이노 1:1 시리얼 연동

도로시와 지니가 함께하는 마스터-슬레이브 원격 제어, 1:1 UART 직결 및 원격 LED 점멸 실습

  • 👧 도로시: “지니야! 1번 아두이노에서 ‘불 켜!’ 하고 신호를 쏘면 2번 아두이노가 신호를 받아서 LED를 번쩍 켤 수 있을까?”
  • 🐱 지니: “당연하지! 송신 아두이노가 ‘1’과 ‘0’ 문자를 시리얼로 쏘고, 수신 아두이노가 귀를 열어두고 있다가 읽어내면 완벽한 원격 제어가 이루어진단다!”
  • 🐶 토토: “바우! 두 보드 사이에 텔레파시 광선이 흐른다 멍!”

  • 🖥️ 강의 슬라이드: slides.md

1. 두 대의 아두이노 1:1 시리얼 하드웨어 회로 및 배선

두 대의 아두이노 1:1 시리얼 하드웨어 회로 및 배선

🔌 핵심 연결 3대 포인트

  1. 송신측 아두이노 1번(TX) ➡️ 수신측 아두이노 0번(RX):
    • 송신자가 말하는 데이터 전송선이 수신자의 귀로 들어갑니다.
  2. 공통 접지(GND) 결선:
    • 두 아두이노의 GND 핀을 점퍼선으로 직결하여 기준 전위(0V)를 완벽히 일치시킵니다.
  3. 수신측 아두이노 8번 핀에 LED 연결:
    • 디지털 8번 핀 ➡️ 220Ω 저항 ➡️ LED 애노드(+) ➡️ 캐소드(-) ➡️ GND.

2. 송신부(Master Sender) 아두이노 전체 코드

송신부 아두이노 스케치 코딩

💻 1초마다 번갈아가며 ‘1’과 ‘0’ 제어 문자를 전송하는 코드

// ==========================================
// [송신측 아두이노 (Master Sender) 스케치]
// ==========================================

void setup() {
  // 1. 하드웨어 시리얼 통신 시작 (9600 bps)
  Serial.begin(9600);
}

void loop() {
  // 1. LED 점등 명령 문자 '1' 전송
  Serial.print('1');
  // 1초 동안 유지
  delay(1000);

  // 2. LED 소등 명령 문자 '0' 전송
  Serial.print('0');
  // 1초 동안 유지
  delay(1000);
}

[!TIP] 코드를 업로드할 때는 수신 아두이노의 0번 핀에 꽂힌 전선을 잠시 뽑아두어야 PC의 USB 업로드 신호와 충돌하지 않습니다! 업로드가 끝나면 다시 꽂아주세요.


3. 수신부(Slave Receiver) 아두이노 전체 코드

수신부 아두이노 링 버퍼 및 데이터 처리 파이프라인

💻 날아온 문자를 수신 버퍼에서 꺼내어 LED를 제어하는 코드

// ==========================================
// [수신측 아두이노 (Slave Receiver) 스케치]
// ==========================================

const int LED_PIN = 8; // 제어할 외부 LED 핀 번호

void setup() {
  // 1. 송신측과 정확히 동일한 통신 속도(9600 bps)로 설정
  Serial.begin(9600);

  // 2. LED 핀을 디지털 출력 모드로 설정
  pinMode(LED_PIN, OUTPUT);
  digitalWrite(LED_PIN, LOW); // 초기 상태: 소등
}

void loop() {
  // 1. 수신 버퍼에 데이터가 도착했는지 검사
  if (Serial.available() > 0) {
    // 2. 1바이트 문자 읽어오기
    char cmd = Serial.read();

    // 3. 수신된 문자에 따른 LED 제어
    if (cmd == '1') {
      digitalWrite(LED_PIN, HIGH); // '1' 수신 시 LED 점등!
    } 
    else if (cmd == '0') {
      digitalWrite(LED_PIN, LOW);  // '0' 수신 시 LED 소등!
    }
  }
}

4. 코드 상세 해설: 링 버퍼(Ring Buffer)와 available()

아두이노 64바이트 링 버퍼(Ring Buffer)와 Serial.available() 원리

🔍 아두이노 시리얼 우체통 시스템의 원리

  1. 하드웨어 인터럽트와 64바이트 링 버퍼:
    • 송신자가 보낸 데이터가 수신측 0번(RX) 핀으로 들어오면, 아두이노 내부의 하드웨어 UART 인터럽트가 자동으로 깨어나 CPU가 다른 일을 하고 있더라도 백그라운드에서 데이터를 64바이트 크기의 수신 버퍼에 차곡차곡 쌓아둡니다.
  2. Serial.available():
    • “지금 우체통에 도착해서 쌓여 있는 편지가 몇 통이니?”를 반환합니다.
    • 버퍼가 비어 있으면 0이 반환되어 불필요한 연산을 건너뛰고, 데이터가 들어오는 즉시 if문 안으로 진입합니다.
  3. Serial.read():
    • 수신 버퍼의 맨 앞에서 편지 1통(1바이트)을 꺼내어 반환하고, 버퍼에서 해당 바이트를 지워 다음 데이터가 앞으로 당겨지도록 관리합니다.

5. 실습 시 자주 발생하는 트러블슈팅 가이드

시리얼 통신 트러블슈팅 가이드

문제 증상 주요 원인 점검 및 해결 방법
LED가 전혀 반응 없음 핀 결선 오배선 송신측 TX(1번) ➡️ 수신측 RX(0번) 연결 재확인
외계어 문자 수신 / 오작동 GND 미연결 또는 속도 불일치 ① 두 보드의 GND 핀이 직결되었는지 점검 ② 양쪽 보드의 Serial.begin(9600) 보드레이트 일치 확인
업로드 컴파일러 오류 USB 업로드 충돌 0번, 1번 핀의 전선을 뽑고 업로드 후 다시 결선

🌟 도로시와 지니의 핵심 요약 노트!

도로시와 지니의 핵심 정리 및 축하

  • 👧 도로시: “송신 보드가 Serial.print('1')을 쏘면 수신 보드가 Serial.read()로 읽어서 8번 LED를 켜는 흐름이 정말 완벽해!”
  • 🐱 지니: “맞아! 하지만 0번, 1번 핀을 쓸 때마다 선을 뽑아야 하는 불편함이 있었지? 다음 시간에는 일반 디지털 핀을 통신 핀으로 변신시키는 소프트웨어 시리얼을 배워보자!”
  • 🐶 토토: “바우! 선을 뽑지 않아도 되는 편리한 통신 세상으로 출발이다 멍!”
서브목차