두 아두이노 간의 통신 | Communication between two Arduino
이 튜토리얼에서 우리는 다음을 배우게 될 것입니다:
- 두 아두이노 간의 통신 - 개요
- 이더넷/와이파이를 통한 두 아두이노 간의 통신
- 예제 어플리케이션: 아두이노 #1에 연결된 버튼/스위치가 이더넷/와이파이를 통해 아두이노 #2에 연결된 LED를 제어함
- 인터넷을 통해 두 아두이노를 연결하는 방법
튜토리얼은 두 가지 경우에 대한 아두이노 코드를 제공합니다:
- 아두이노 우노 R4 와이파이
- 아두이노 우노/메가 이더넷 쉴드 2와 함께
준비물
2 | × | Arduino UNO R4 WiFi | Amazon | |
2 | × | USB Cable Type-C | 쿠팡 | Amazon | |
1 | × | (Recommended) Screw Terminal Block Shield for Arduino UNO R4 | 쿠팡 | Amazon | |
1 | × | (Recommended) Breadboard Shield For Arduino UNO R4 | 쿠팡 | Amazon | |
1 | × | (Recommended) Enclosure For Arduino UNO R4 | 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 | × | (Recommended) Breadboard Shield For Arduino Uno | 쿠팡 | Amazon | |
1 | × | (Recommended) 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 네트워크 내에서 서로 연결되든 인터넷을 통해 연결되든, 두 가지 유형의 통신이 있습니다:
- 두 개의 아두이노가 서로 직접 통신한다
- 두 개의 아두이노가 중앙 집중식 서버(예: MQTT 서버)를 통해 통신한다. 두 아두이노 간 MQTT를 통한 통신 보기
직접 통신하는 경우, 대부분의 경우 하나의 아두이노가 TCP 클라이언트 역할을 하고 다른 하나는 TCP 서버 역할을 합니다.
중앙 서버를 통해 통신하는 경우, 대부분의 경우 양쪽 Arduino 모두 TCP 클라이언트 역할을 합니다.
애플리케이션에 따라, 두 아두이노 간의 통신을 위해 애플리케이션 프로토콜을 선택해야 합니다. 다음은 사용할 수 있는 일부 애플리케이션 프로토콜입니다:
- 자체 정의된 프로토콜 over raw TCP (직접적으로)
- Modbus TCP (직접적으로)
- HTTP (직접적으로)
- Telnet (직접적으로)
- SSH (직접적으로)
- MQTT (중앙 집중식 서버를 통해)
※ NOTE THAT:
다음의 경우는 중요하지 않습니다:
- 아두이노 둘 다 이더넷을 사용하는 경우
- 아두이노 둘 다 WiFi를 사용하는 경우
- 아두이노 하나는 이더넷을 사용하고, 다른 하나는 WiFi를 사용하는 경우
UDP 프로토콜은 이 튜토리얼의 범위를 벗어납니다.
예시 응용 프로그램
다음 애플리케이션을 구현해 봅시다: 버튼/스위치가 연결된 아두이노 #1이 이더넷/와이파이를 통해 아두이노 #2에 연결된 LED를 제어합니다.
이 튜토리얼은 두 개의 아두이노 이더넷 쉴드 2를 사용합니다. 다른 WiFi 쉴드나 이더넷 쉴드를 대신 사용할 수도 있습니다. 다른 쉴드를 사용하는 경우 코드를 약간 수정하기만 하면 됩니다.
위에서 언급한 바와 같이, 사용할 수 있는 몇 가지 응용 프로그램 프로토콜이 있습니다. 이 예에서 간단하게 만들기 위해, 우리 스스로 프로토콜을 정의할 것입니다 (자체 정의 프로토콜).
자체 정의 프로토콜
간단한 프로토콜을 정의해 봅시다:
- 아두이노 #1과 아두이노 #2 사이에 TCP 연결이 생성됩니다
- 아두이노 #1:
- TCP 클라이언트로 작동, 아두이노 #2에게 TCP 연결 요청을 적극적으로 함
- 스위치가 켜질 경우, 아두이노 #1은 값이 1인 바이트(명령)를 아두이노 #2에게 전송합니다.
- 스위치가 꺼질 경우, 아두이노 #1은 값이 0인 바이트(명령)를 아두이노 #2에게 전송합니다.
- 아두이노 #2:
- TCP 서버로 작동, 아두이노 #1으로부터의 TCP 연결 요청을 청취
- 받은 바이트가 1이면, LED를 켭니다
- 받은 바이트가 0이면, LED를 끕니다
배선도
※ NOTE THAT:
LED에 내장된 저항이 없다면 저항을 추가해야 합니다. Arduino - LED 와 Arduino - Button 튜토리얼에서 더 배울 수 있습니다.
두 아두이노 간의 WiFi를 통한 통신
아두이노 우노 R4 와이파이 #1을 위한 아두이노 코드
아두이노 우노 R4 와이파이 #2를 위한 아두이노 코드
두 아두이노 간의 이더넷을 통한 통신
아두이노 이더넷 #1을 위한 아두이노 코드
아두이노 이더넷 #2를 위한 아두이노 코드
사용 방법
- 이더넷 쉴드를 사용하는 경우, 아두이노 #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 주소를 얻으세요
- 아두이노 #1 코드에서 TCP 서버 IP 주소를 업데이트하세요.
- 아두이노 #1 코드를 아두이노 #1에 업로드하세요.
- 아두이노 IDE #1에서 시리얼 모니터를 엽니다.
- 아두이노 #1의 버튼을 누르고 있으면 → 아두이노 #2의 LED 상태를 확인하세요 (켜짐)
- 아두이노 #1의 버튼을 놓으면 → 아두이노 #2의 LED 상태를 확인하세요 (꺼짐)
- 버튼을 여러 번 누르고, 누른 채로 있었다가, 놓으세요.
- 두 시리얼 모니터의 출력을 확인하세요
- 아두이노 #1의 시리얼 모니터
- (**): "파일" → "새로 만들기" 또는 "열기"를 통해 Arduino IDE #2 창에서 Arduino IDE #2 창을 열 경우, 동일한 PC에서 두 Arduino의 두 시리얼 모니터를 동시에 열 수 없습니다.
- 이 자체 정의 프로토콜에는 대안이 있습니다. 바로 Modbus TCP입니다. Modbus 프로토콜은 표준화되어 있으며, 자체 정의 프로토콜에 비해 많은 장점이 있습니다. Arduino - Modbus 튜토리얼에서 자세히 보세요.
아두이노 #2의 시리얼 모니터
※ NOTE THAT:
동영상
비디오 제작은 시간이 많이 걸리는 작업입니다. 비디오 튜토리얼이 학습에 도움이 되었다면, 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마다 다릅니다. 이는 본 튜토리얼의 범위를 벗어납니다.