두 아두이노 간의 통신 | Communication between two Arduino

이 튜토리얼에서 우리는 다음을 배우게 될 것입니다:

communication between two arduino

튜토리얼은 두 가지 경우에 대한 아두이노 코드를 제공합니다:

준비물

2×Arduino UNO R4 WiFi Amazon
2×USB Cable Type-C 쿠팡 | Amazon
1×(Recommended) Screw Terminal Block Shield for Arduino Uno 쿠팡 | Amazon
1×(Optional) Transparent Acrylic Enclosure For Arduino Uno Amazon

Alternatively if using Ethernet:

2×Arduino Uno Amazon
2×USB 2.0 cable type A/B 쿠팡 | Amazon
2×Arduino Ethernet Shield 2 Amazon
2×Ethernet Cable Amazon
1×(Recommended) Screw Terminal Block Shield for Arduino Uno 쿠팡 | Amazon
1×(Optional) Transparent Acrylic Enclosure For Arduino Uno Amazon
공개: 이 섹션에서 제공된 링크 중 일부는 제휴 링크입니다. 이 링크를 통해 구매한 경우 추가 비용없이 수수료를 받을 수 있습니다. 지원해 주셔서 감사합니다.

두 아두이노 간의 통신 - 개요

특정 사례를 살펴봅시다: 아두이노 #1이 아두이노 #2와 통신합니다. 두 아두이노 간의 통신을 가능하게 하는 많은 방법이 있습니다. 통신 범위에 따라 그 중 하나를 선택할 수 있습니다. 아래 표는 일부 방법과 그 통신 범위를 보여줍니다.

Methods Range
I2C very short
SPI very short
UART (TTL) very short
UART (RS-232/485/422) short
Bluetooth short
LoRa long
Ethernet/WiFi unlimited(*)

※ NOTE THAT:

(*):

  • 두 개의 아두이노가 인터넷에 연결되어 있다면, 통신 범위는 무제한입니다.
  • 두 개의 아두이노가 인터넷에 연결되어 있지 않지만 같은 LAN 네트워크에 연결되어 있다면, 여전히 서로 통신할 수 있습니다. 통신 범위는 LAN 네트워크 내에서 제한됩니다.

위의 방법들 중, 이 튜토리얼은 두 아두이노가 무제한 거리에서 서로 통신할 수 있게 하기 때문에 이더넷/와이파이를 사용하여 두 아두이노 간의 통신을 가능하게 합니다.

두 아두이노 간의 이더넷/와이파이를 통한 통신

아두이노 두 대가 이더넷/와이파이를 통해 서로 통신할 수 있습니다:

  • 같은 LAN 네트워크 안에 있는 두 개의 아두이노, 인터넷 연결이 필요하지 않습니다.
  • 다른 LAN 네트워크에 있는 두 개의 아두이노, 인터넷 연결이 필요합니다.

두 개의 아두이노가 로컬 LAN 네트워크 내에서 서로 연결되든 인터넷을 통해 연결되든, 두 가지 유형의 통신이 있습니다:

직접 통신하는 경우, 대부분의 경우 하나의 아두이노가 TCP 클라이언트 역할을 하고 다른 하나는 TCP 서버 역할을 합니다.

중앙 서버를 통해 통신하는 경우, 대부분의 경우 양쪽 Arduino 모두 TCP 클라이언트 역할을 합니다.

애플리케이션에 따라, 두 아두이노 간의 통신을 위해 애플리케이션 프로토콜을 선택해야 합니다. 다음은 사용할 수 있는 일부 애플리케이션 프로토콜입니다:

  • 자체 정의된 프로토콜 over raw TCP (직접적으로)
  • Modbus TCP (직접적으로)
  • HTTP (직접적으로)
  • Telnet (직접적으로)
  • SSH (직접적으로)
  • MQTT (중앙 집중식 서버를 통해)

※ NOTE THAT:

다음의 경우는 중요하지 않습니다:

  • 아두이노 둘 다 이더넷을 사용하는 경우
  • 아두이노 둘 다 WiFi를 사용하는 경우
  • 아두이노 하나는 이더넷을 사용하고, 다른 하나는 WiFi를 사용하는 경우

UDP 프로토콜은 이 튜토리얼의 범위를 벗어납니다.

예시 응용 프로그램

다음 애플리케이션을 구현해 봅시다: 버튼/스위치가 연결된 아두이노 #1이 이더넷/와이파이를 통해 아두이노 #2에 연결된 LED를 제어합니다.

communication between two arduino

이 튜토리얼은 두 개의 아두이노 이더넷 쉴드 2를 사용합니다. 다른 WiFi 쉴드이더넷 쉴드를 대신 사용할 수도 있습니다. 다른 쉴드를 사용하는 경우 코드를 약간 수정하기만 하면 됩니다.

위에서 언급한 바와 같이, 사용할 수 있는 몇 가지 응용 프로그램 프로토콜이 있습니다. 이 예에서 간단하게 만들기 위해, 우리 스스로 프로토콜을 정의할 것입니다 (자체 정의 프로토콜).

자체 정의 프로토콜

간단한 프로토콜을 정의해 봅시다:

  • 아두이노 #1과 아두이노 #2 사이에 TCP 연결이 생성됩니다
  • 아두이노 #1:
    • TCP 클라이언트로 작동, 아두이노 #2에게 TCP 연결 요청을 적극적으로 함
    • 스위치가 켜질 경우, 아두이노 #1은 값이 1인 바이트(명령)를 아두이노 #2에게 전송합니다.
    • 스위치가 꺼질 경우, 아두이노 #1은 값이 0인 바이트(명령)를 아두이노 #2에게 전송합니다.
  • 아두이노 #2:
    • TCP 서버로 작동, 아두이노 #1으로부터의 TCP 연결 요청을 청취
    • 받은 바이트가 1이면, LED를 켭니다
    • 받은 바이트가 0이면, LED를 끕니다

    배선도

    two arduino led switch button

    ※ NOTE THAT:

    LED에 내장된 저항이 없다면 저항을 추가해야 합니다. Arduino - LEDArduino - Button 튜토리얼에서 더 배울 수 있습니다.

두 아두이노 간의 WiFi를 통한 통신

아두이노 우노 R4 와이파이 #1을 위한 아두이노 코드

/* * 이 Arduino 코드는 newbiely.kr 에서 개발되었습니다 * 이 Arduino 코드는 어떠한 제한 없이 공개 사용을 위해 제공됩니다. * 상세한 지침 및 연결도에 대해서는 다음을 방문하세요: * https://newbiely.kr/tutorials/arduino/communication-between-two-arduino */ // ARDUINO #1: TCP CLIENT + A BUTTON/SWITCH #include <ezButton.h> #include <WiFiS3.h> const char ssid[] = "YOUR_WIFI_SSID"; // 네트워크 SSID (이름) 변경 const char pass[] = "YOUR_WIFI_PASSWORD"; // 네트워크 비밀번호 변경 (WPA 사용 시, 또는 WEP 키로 사용) const int BUTTON_PIN = 7; const int serverPort = 4080; ezButton button(BUTTON_PIN); // 핀 7에 연결된 ezButton 생성; IPAddress serverAddress(192, 168, 0, 180); WiFiClient TCPclient; int status = WL_IDLE_STATUS; void setup() { Serial.begin(9600); button.setDebounceTime(50); // 디바운스 시간을 50 밀리초로 설정 Serial.println("ARDUINO #1: TCP CLIENT + A BUTTON/SWITCH"); // WiFi 모듈 검사: if (WiFi.status() == WL_NO_MODULE) { Serial.println("WiFi 모듈과의 통신 실패!"); // 계속하지 않음 while (true) ; } String fv = WiFi.firmwareVersion(); if (fv < WIFI_FIRMWARE_LATEST_VERSION) { Serial.println("펌웨어 업그레이드를 해주세요"); } // WiFi 네트워크에 연결 시도: while (status != WL_CONNECTED) { Serial.print("SSID에 연결을 시도 중: "); Serial.println(ssid); // WPA/WPA2 네트워크에 연결. 오픈 또는 WEP 네트워크 사용 시 이 줄을 변경하세요: status = WiFi.begin(ssid, pass); // 연결을 위해 10초 기다림: delay(10000); } // 보드의 IP 주소 출력: Serial.print("IP 주소: "); Serial.println(WiFi.localIP()); // TCP 서버에 연결 (Arduino #2) if (TCPclient.connect(serverAddress, serverPort)) Serial.println("TCP 서버에 연결됨"); else Serial.println("TCP 서버에 연결 실패"); } void loop() { button.loop(); // 반드시 loop() 함수를 먼저 호출해야 함 if (!TCPclient.connected()) { Serial.println("연결이 끊김"); TCPclient.stop(); // TCP 서버에 다시 연결 (Arduino #2) if (TCPclient.connect(serverAddress, serverPort)) Serial.println("TCP 서버에 다시 연결됨"); else Serial.println("TCP 서버에 다시 연결 실패"); } if (button.isPressed()) { TCPclient.write('1'); TCPclient.flush(); Serial.println("- 버튼이 눌렸습니다, 보낸 명령: 1"); } if (button.isReleased()) { TCPclient.write('0'); TCPclient.flush(); Serial.println("- 버튼이 놓였습니다, 보낸 명령: 0"); } }

아두이노 우노 R4 와이파이 #2를 위한 아두이노 코드

/* * 이 Arduino 코드는 newbiely.kr 에서 개발되었습니다 * 이 Arduino 코드는 어떠한 제한 없이 공개 사용을 위해 제공됩니다. * 상세한 지침 및 연결도에 대해서는 다음을 방문하세요: * https://newbiely.kr/tutorials/arduino/communication-between-two-arduino */ // ARDUINO #2: TCP 서버 + LED 하나 #include <WiFiS3.h> const char ssid[] = "YOUR_WIFI_SSID"; // 네트워크 SSID(이름) 변경 const char pass[] = "YOUR_WIFI_PASSWORD"; // 네트워크 비밀번호 변경 (WPA 사용시, 또는 WEP 키로 사용) const int LED_PIN = 7; const int serverPort = 4080; WiFiServer TCPserver(serverPort); int status = WL_IDLE_STATUS; void setup() { Serial.begin(9600); pinMode(LED_PIN, OUTPUT); Serial.println("ARDUINO #2: TCP 서버 + LED 하나"); // WiFi 모듈 체크: if (WiFi.status() == WL_NO_MODULE) { Serial.println("WiFi 모듈과의 통신 실패!"); // 계속하지 않음 while (true) ; } String fv = WiFi.firmwareVersion(); if (fv < WIFI_FIRMWARE_LATEST_VERSION) { Serial.println("펌웨어를 업그레이드해 주세요"); } // WiFi 네트워크에 연결 시도: while (status != WL_CONNECTED) { Serial.print("SSID에 연결 시도 중: "); Serial.println(ssid); // WPA/WPA2 네트워크에 연결. 오픈 또는 WEP 네트워크를 사용하는 경우 이 줄을 변경하세요: status = WiFi.begin(ssid, pass); // 연결을 위해 10초 대기: delay(10000); } // 로컬 IP 주소 출력: Serial.print("TCP 서버 IP 주소: "); Serial.println(WiFi.localIP()); Serial.println("-> Arduino #1 코드의 serverAddress를 업데이트하세요"); // TCP 클라이언트 (Arduino #1로부터) 대기 TCPserver.begin(); } void loop() { // TCP 클라이언트 (Arduino #1로부터) 대기: WiFiClient client = TCPserver.available(); if (client) { // TCP 클라이언트로부터 명령어 읽기: char command = client.read(); if (command == '1') { Serial.print("- 받은 명령어: "); Serial.println(command); digitalWrite(LED_PIN, HIGH); // LED 켜기 } else if (command == '0') { Serial.print("- 받은 명령어: "); Serial.println(command); digitalWrite(LED_PIN, LOW); // LED 끄기 } } }

두 아두이노 간의 이더넷을 통한 통신

아두이노 이더넷 #1을 위한 아두이노 코드

/* * 이 Arduino 코드는 newbiely.kr 에서 개발되었습니다 * 이 Arduino 코드는 어떠한 제한 없이 공개 사용을 위해 제공됩니다. * 상세한 지침 및 연결도에 대해서는 다음을 방문하세요: * https://newbiely.kr/tutorials/arduino/communication-between-two-arduino */ // ARDUINO #1: TCP CLIENT + A BUTTON/SWITCH #include <ezButton.h> #include <SPI.h> #include <Ethernet.h> const int BUTTON_PIN = 7; const int serverPort = 4080; ezButton button(BUTTON_PIN); // create ezButton that attach to pin 7; byte mac[] = {0x00, 0xAA, 0xBB, 0xCC, 0xDE, 0x03}; IPAddress serverAddress(192, 168, 0, 180); EthernetClient TCPclient; void setup() { Serial.begin(9600); button.setDebounceTime(50); // 50 밀리초로 디바운스 시간 설정 Serial.println("ARDUINO #1: TCP CLIENT + A BUTTON/SWITCH"); // 이더넷 쉴드 초기화: if (Ethernet.begin(mac) == 0) Serial.println("Failed to configure Ethernet using DHCP"); // TCP 서버 (아두이노 #2)에 연결하기 if (TCPclient.connect(serverAddress, serverPort)) Serial.println("Connected to TCP server"); else Serial.println("Failed to connect to TCP server"); } void loop() { button.loop(); // 먼저 loop() 함수를 호출해야 함 if (!TCPclient.connected()) { Serial.println("Connection is disconnected"); TCPclient.stop(); // TCP 서버 (아두이노 #2)에 다시 연결하기 if (TCPclient.connect(serverAddress, serverPort)) Serial.println("Reconnected to TCP server"); else Serial.println("Failed to reconnect to TCP server"); } if (button.isPressed()) { TCPclient.write('1'); TCPclient.flush(); Serial.println("- The button is pressed, sent command: 1"); } if (button.isReleased()) { TCPclient.write('0'); TCPclient.flush(); Serial.println("- The button is released, sent command: 0"); } }

아두이노 이더넷 #2를 위한 아두이노 코드

/* * 이 Arduino 코드는 newbiely.kr 에서 개발되었습니다 * 이 Arduino 코드는 어떠한 제한 없이 공개 사용을 위해 제공됩니다. * 상세한 지침 및 연결도에 대해서는 다음을 방문하세요: * https://newbiely.kr/tutorials/arduino/communication-between-two-arduino */ // ARDUINO #2: TCP SERVER + AN LED #include <SPI.h> #include <Ethernet.h> const int LED_PIN = 7; const int serverPort = 4080; byte mac[] = {0x00, 0xAA, 0xBB, 0xCC, 0xDE, 0x02}; EthernetServer TCPserver(serverPort); void setup() { Serial.begin(9600); pinMode(LED_PIN, OUTPUT); Serial.println("ARDUINO #2: TCP SERVER + AN LED"); // 이더넷 실드 초기화: if (Ethernet.begin(mac) == 0) Serial.println("Failed to configure Ethernet using DHCP"); // 로컬 IP 주소 출력: Serial.print("TCP Server IP address: "); Serial.println(Ethernet.localIP()); Serial.println("-> Please update the serverAddress in Arduino #1 code"); // TCP 클라이언트 (Arduino #1에서) 수신 대기 TCPserver.begin(); } void loop() { // Arduino #1에서 TCP 클라이언트 대기: EthernetClient client = TCPserver.available(); if (client) { // TCP 클라이언트에서 명령어 읽기: char command = client.read(); if (command == '1') { Serial.print("- Received command: "); Serial.println(command); digitalWrite(LED_PIN, HIGH); // LED 켜기 } else if (command == '0') { Serial.print("- Received command: "); Serial.println(command); digitalWrite(LED_PIN, LOW); // LED 끄기 } Ethernet.maintain(); } }

사용 방법

  • 이더넷 쉴드를 사용하는 경우, 아두이노 #1과 아두이노 #2에 이더넷 쉴드를 쌓으세요
  • 버튼/스위치를 아두이노 #1에 연결하세요
  • LED를 아두이노 #2에 연결하세요
  • 아두이노 IDE를 엽니다 (아두이노 IDE #1이라고 함)
  • 아두이노 IDE에 ezButton 라이브러리를 설치하세요
  • USB 케이블을 통해 아두이노 #1을 PC에 연결하고 아두이노 IDE #1에서 아두이노 #1의 COM 포트를 선택하세요
  • PC에서 아두이노 IDE 아이콘을 클릭하여 다른 아두이노 IDE 창을 엽니다 (아두이노 IDE #2라고 함) (중요!(**))
  • USB 케이블을 통해 아두이노 #2를 PC에 연결하고 아두이노 IDE #2에서 아두이노 #2의 COM 포트를 선택하세요
  • 아두이노 #1 코드를 복사하여 아두이노 IDE #1에 붙여넣고 저장하세요 (Arduino1이라고 명명)
  • 아두이노 #2 코드를 복사하여 아두이노 IDE #2에 붙여넣고 저장하세요 (Arduino2라고 명명)
  • 아두이노 #2 코드를 먼저 아두이노 #2에 업로드하세요
  • 아두이노 IDE #2에서 시리얼 모니터를 열고 TCP 서버 IP 주소를 얻으세요
COM6
Send
ARDUINO #2: TCP SERVER + AN LED TCP Server IP address: 192.168.0.2 -> Please update the serverAddress in Arduino #1 code
Autoscroll Show timestamp
Clear output
9600 baud  
Newline  
  • 아두이노 #1 코드에서 TCP 서버 IP 주소를 업데이트하세요.
  • 아두이노 #1 코드를 아두이노 #1에 업로드하세요.
  • 아두이노 IDE #1에서 시리얼 모니터를 엽니다.
  • 아두이노 #1의 버튼을 누르고 있으면 → 아두이노 #2의 LED 상태를 확인하세요 (켜짐)
  • 아두이노 #1의 버튼을 놓으면 → 아두이노 #2의 LED 상태를 확인하세요 (꺼짐)
  • 버튼을 여러 번 누르고, 누른 채로 있었다가, 놓으세요.
  • 두 시리얼 모니터의 출력을 확인하세요
    • 아두이노 #1의 시리얼 모니터
    COM6
    Send
    ARDUINO #1: TCP CLIENT + A BUTTON/SWITCH Connected to TCP server - The button is pressed, sent command: 1 - The button is released, sent command: 0 - The button is pressed, sent command: 1 - The button is released, sent command: 0 - The button is pressed, sent command: 1 - The button is released, sent command: 0
    Autoscroll Show timestamp
    Clear output
    9600 baud  
    Newline  

    아두이노 #2의 시리얼 모니터

    COM6
    Send
    ARDUINO #2: TCP SERVER + AN LED TCP Server IP address: 192.168.0.2 -> Please update the serverAddress in Arduino #1 code - Received command: 1 - Received command: 0 - Received command: 1 - Received command: 0 - Received command: 1 - Received command: 0
    Autoscroll Show timestamp
    Clear output
    9600 baud  
    Newline  

    ※ NOTE THAT:

    • (**): "파일" → "새로 만들기" 또는 "열기"를 통해 Arduino IDE #2 창에서 Arduino IDE #2 창을 열 경우, 동일한 PC에서 두 Arduino의 두 시리얼 모니터를 동시에 열 수 없습니다.
    • 이 자체 정의 프로토콜에는 대안이 있습니다. 바로 Modbus TCP입니다. Modbus 프로토콜은 표준화되어 있으며, 자체 정의 프로토콜에 비해 많은 장점이 있습니다. Arduino - Modbus 튜토리얼에서 자세히 보세요.

동영상

비디오 제작은 시간이 많이 걸리는 작업입니다. 비디오 튜토리얼이 학습에 도움이 되었다면, YouTube 채널 을 구독하여 알려 주시기 바랍니다. 비디오에 대한 높은 수요가 있다면, 비디오를 만들기 위해 노력하겠습니다.

인터넷을 통해 두 아두이노를 연결하는 방법

IP 주소에는 두 가지 종류가 있습니다: 사설 IP 주소와 공인 IP 주소. 집에서 사용하는 IP 주소는 대개 사설 IP 주소입니다.

개인 IP 주소는 쉽게 식별할 수 있습니다. 개인 IP 주소에는 세 가지 패턴이 있습니다: 10.x.x.x, 172.16.x.x, 192.168.x.x

다음 경우에는 프라이빗 IP 주소를 사용하는 것이 중요하지 않습니다:

  • 두 개의 아두이노가 동일한 LAN 네트워크에 있을 경우, 직접 통신하는 경우든 중앙 집중식 서버를 통해 통신하는 경우든, LAN 네트워크가 인터넷에 연결되어 있든 그렇지 않든 관계없습니다.
  • 두 개의 아두이노가 서로 다른 LAN 네트워크에 있고 중앙 집중식 서버를 통해 서로 통신하는 경우

두 아두이노가 다른 LAN 네트워크에 있고 서로 직접 통신하는 경우. 아두이노 TCP 클라이언트는 사설 IP 주소를 사용할 수 있습니다. 하지만, 아두이노 TCP 서버는 반드시 다음 중 하나를 사용해야 합니다:

  • 공용 IP 주소
  • 라우터/AP에서 "포트 포워딩"이 설정된 사설 IP 주소

"포트 포워딩"을 수행하는 과정은 각 라우터/AP마다 다릅니다. 이는 본 튜토리얼의 범위를 벗어납니다.

※ OUR MESSAGES

  • Please feel free to share the link of this tutorial. However, Please do not use our content on any other websites. We invested a lot of effort and time to create the content, please respect our work!