---
title: "이더넷 포트 사용하기 - UDP로 콘트롤리노 제어하기"
url: "https://maker.wiznet.io/louis_m/projects/%EC%9D%B4%EB%8D%94%EB%84%B7-%ED%8F%AC%ED%8A%B8-%EC%82%AC%EC%9A%A9%ED%95%98%EA%B8%B0-udp%EB%A1%9C-%EC%BD%98%ED%8A%B8%EB%A1%A4%EB%A6%AC%EB%85%B8-%EC%A0%9C%EC%96%B4%ED%95%98%EA%B8%B0/"
markdown_url: "https://maker.wiznet.io/louis_m/projects/%EC%9D%B4%EB%8D%94%EB%84%B7-%ED%8F%AC%ED%8A%B8-%EC%82%AC%EC%9A%A9%ED%95%98%EA%B8%B0-udp%EB%A1%9C-%EC%BD%98%ED%8A%B8%EB%A1%A4%EB%A6%AC%EB%85%B8-%EC%A0%9C%EC%96%B4%ED%95%98%EA%B8%B0/md"
type: "UCC: User Created Content"
author: "인찬아빠"
author_url: "https://blog.naver.com/badgay74/222915174086"
editor: "WIZnet"
editor_url: "https://maker.wiznet.io/"
original_author: "인찬아빠"
original_url: "https://blog.naver.com/badgay74/222915174086"
published: "2022-11-01"
language: "ko"
likes: 7
views: 1053
comments: 0
source: "WIZnet Makers (https://maker.wiznet.io/)"
---

# 이더넷 포트 사용하기 - UDP로 콘트롤리노 제어하기

> UDP

Original author: 인찬아빠 (source: https://blog.naver.com/badgay74/222915174086)

## Article

콘트롤리노 매시와 메가 시리즈에는 W5100 기반의 이더넷 포트가 내장되어 있습니다.

​

아두이노에 이더넷 쉴드를 사용하는 것과 동일하게 다양한 인터넷 프로토콜을 별도의 하드웨어 없이 사용할 수 있습니다.

​

이번 강좌에서는 UDP로 PC와 콘트롤리노가 통신하여 콘트롤리노의 출력 핀들을 PC에서 제어하는 것에 대해 설명드리겠습니다.

​

​

1. 회로 설명

​

회로는 콘트롤리노 맥시와 유무선 공유기, 그리고 제어할 Windows PC가 필요합니다.

![](https://cafeptthumb-phinf.pstatic.net/MjAyMjEwMjhfMTA0/MDAxNjY2OTU1Mjg0OTc5.f541b5KaQ6Y-q_0LuAmiN6gwVHvTDBXHk_Lol40VGVwg.Q0ebKf0jRUUzuWUECuxF5IbL_27ka3tpm33Ibfjy31cg.JPEG/%EA%B7%B8%EB%A6%BC_1.jpg?type=w1600)

​

2. 구성도

​

구성은 아래의 그림처럼 유무선 공유기, 콘트롤리노 맥시, PC로 구성됩니다.

​

유무선 공유기는 DHCP 서버로 동작하여 콘트롤리노와 PC에 IP를 할당해주고 메시지 전송 시에 터미널 역할을 합니다.

​

PC에서는 제어 툴을 통해 콘트롤리노로 제어 명령을 전송합니다.

​

콘트롤리노는 PC로부터 받은 명령을 확인하여 출력 핀을 제어합니다.

![](https://cafeptthumb-phinf.pstatic.net/MjAyMjEwMjhfMjQ1/MDAxNjY2OTU3Nzc0MDY2.xSpneEjfIpacHuCdahX8PRH_kdmdHT0T3vrh1qFryO0g.RUTIyykjhXWEckVuLkGdO8mniLPZ2tKF8RPOkh_2ifMg.PNG/%EA%B7%B8%EB%A6%BC_2.png?type=w1600)

​

​

3. 동작 원리

​

UDP 프로토콜은 사용자 데이터그램 프로토콜(User Datagram Protocol)로 인터넷 프로토콜의 한 종류입니다.

​

UDP는 TCP와는 다르게 단방향 프로토콜로, 메시지의 에러나 응답없이 단순히 보내기만 하는 통신 프로토콜 입니다.

​

대신 통신 속도가 TCP보다 비교적 빠르다는 장점이 있습니다.

![](https://cafeptthumb-phinf.pstatic.net/MjAyMjEwMjhfMTEw/MDAxNjY2OTUxMTkzNzMz.WRExb5fkLY2tvr65pi0xxoOXZxtXo-UNVrgH-WVFBOQg.o-Uqzhc1CzdYNnWFcQGHozT2soonlsZvj1Bh1cV6AJsg.PNG/%EA%B7%B8%EB%A6%BC1.png?type=w1600)

​

​

앞서 언급드렸듯이 콘트롤리노 맥시와 메가에는 W5100 기반의 이더넷 포트가 내장되어 있습니다.

​

아두이노 이더넷 쉴드와의 차이점은 CS(Chip Select) 핀 없이 SPI 통신 핀인 SCK, MOSI, MISO만으로 동작이 가능합니다.

​

기본적인 하드웨어 스펙은 아두이노 메가 + 이더넷 쉴드와 동일하기 때문에 아두이노에서 기본으로 제공하는 "Ethernet" 라이브러리를 바로 적용할 수 있습니다.

​

​

4. 예제

​

이번 예제는 JSON 형식의 명령을 UDP로 받아 명령에 따라 출력핀의 on/off를 제어하는 예제입니다.

​

MAC주소는 임의로 설정하여 사용하면 됩니다. 실 프로젝트에 사용할 때는 전세계에서 유일한 주소로 설정해야 하므로 약간의 주의가 필요할 수 있습니다.

​

첨부파일에 올려드린 제어 툴과 연동되는 예제이니 참고해주세요.

​

#include &lt;Ethernet.h> // 이더넷 라이브러리 #include &lt;EthernetUdp.h> // 이더넷 UDP 라이브러리 #include &lt;Controllino.h> #include &lt;ArduinoJson.h> // ArduinoJson 라이브러리 byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED}; // MAC 주소 unsigned int localPort = 6000; // 포트번호 char packetBuffer[UDP_TX_PACKET_MAX_SIZE]; // 수신 패킷 버퍼 char ReplyBuffer[UDP_TX_PACKET_MAX_SIZE]; // 응답 메시지 버퍼 EthernetUDP udp; // UDP 클래스 typedef struct protocolSt { // 수신 메시지 파싱 구조체 String ID; String CMD; } _ptSt; _ptSt _proto; // 구조체 변수 선언 void setup() { Serial.begin(9600); // 출력 핀 설정 pinMode(CONTROLLINO_D0, OUTPUT); pinMode(CONTROLLINO_D1, OUTPUT); pinMode(CONTROLLINO_D2, OUTPUT); pinMode(CONTROLLINO_D3, OUTPUT); pinMode(CONTROLLINO_D4, OUTPUT); pinMode(CONTROLLINO_D5, OUTPUT); pinMode(CONTROLLINO_D6, OUTPUT); pinMode(CONTROLLINO_D7, OUTPUT); pinMode(CONTROLLINO_D8, OUTPUT); pinMode(CONTROLLINO_D9, OUTPUT); pinMode(CONTROLLINO_D10, OUTPUT); pinMode(CONTROLLINO_D11, OUTPUT); pinMode(CONTROLLINO_R0, OUTPUT); pinMode(CONTROLLINO_R1, OUTPUT); pinMode(CONTROLLINO_R2, OUTPUT); pinMode(CONTROLLINO_R3, OUTPUT); pinMode(CONTROLLINO_R4, OUTPUT); pinMode(CONTROLLINO_R5, OUTPUT); pinMode(CONTROLLINO_R6, OUTPUT); pinMode(CONTROLLINO_R7, OUTPUT); pinMode(CONTROLLINO_R8, OUTPUT); pinMode(CONTROLLINO_R9, OUTPUT); Ethernet.begin(mac); // 이더넷 활성화 if (Ethernet.linkStatus() == LinkOFF) // 연결 상태 확인 Serial.println(F("Ethernet cable isn't connected.")); // DHCP로 할당받은 IP주소 출력 Serial.print(F("IP Address : ")); Serial.println(Ethernet.localIP()); udp.begin(localPort); // UDP 소켓 open } void loop() { int packetSize = udp.parsePacket(); // 수신한 패킷 파싱 if (packetSize) { // 패킷이 유효할 경우 udp.read(packetBuffer, UDP_TX_PACKET_MAX_SIZE); // 수신 패킷 버퍼에 저장 Serial.println(packetBuffer); // 수신 패킷 출력 String rcvString = packetBuffer; // 수신 버퍼 저장 ledOutput(rcvString); // 수신 명령에 따른 출력 핀 제어 } } void ledOutput(String _command) { if (isCommandJSON(_command)) { // 명령어 파싱이 완료되면, ID와 CMD에 따라 출력 핀 제어 if (_proto.ID == "D0") { digitalWrite(CONTROLLINO_D0, (_proto.CMD == "ON" ? true : false)); } else if (_proto.ID == "D1") { digitalWrite(CONTROLLINO_D1, (_proto.CMD == "ON" ? true : false)); } else if (_proto.ID == "D2") { digitalWrite(CONTROLLINO_D2, (_proto.CMD == "ON" ? true : false)); } else if (_proto.ID == "D3") { digitalWrite(CONTROLLINO_D3, (_proto.CMD == "ON" ? true : false)); } else if (_proto.ID == "D4") { digitalWrite(CONTROLLINO_D4, (_proto.CMD == "ON" ? true : false)); } else if (_proto.ID == "D5") { digitalWrite(CONTROLLINO_D5, (_proto.CMD == "ON" ? true : false)); } else if (_proto.ID == "D6") { digitalWrite(CONTROLLINO_D6, (_proto.CMD == "ON" ? true : false)); } else if (_proto.ID == "D7") { digitalWrite(CONTROLLINO_D7, (_proto.CMD == "ON" ? true : false)); } else if (_proto.ID == "D8") { digitalWrite(CONTROLLINO_D8, (_proto.CMD == "ON" ? true : false)); } else if (_proto.ID == "D9") { digitalWrite(CONTROLLINO_D9, (_proto.CMD == "ON" ? true : false)); } else if (_proto.ID == "D10") { digitalWrite(CONTROLLINO_D10, (_proto.CMD == "ON" ? true : false)); } else if (_proto.ID == "D11") { digitalWrite(CONTROLLINO_D11, (_proto.CMD == "ON" ? true : false)); } else if (_proto.ID == "R0") { digitalWrite(CONTROLLINO_R0, (_proto.CMD == "ON" ? true : false)); } else if (_proto.ID == "R1") { digitalWrite(CONTROLLINO_R1, (_proto.CMD == "ON" ? true : false)); } else if (_proto.ID == "R2") { digitalWrite(CONTROLLINO_R2, (_proto.CMD == "ON" ? true : false)); } else if (_proto.ID == "R3") { digitalWrite(CONTROLLINO_R3, (_proto.CMD == "ON" ? true : false)); } else if (_proto.ID == "R4") { digitalWrite(CONTROLLINO_R4, (_proto.CMD == "ON" ? true : false)); } else if (_proto.ID == "R5") { digitalWrite(CONTROLLINO_R5, (_proto.CMD == "ON" ? true : false)); } else if (_proto.ID == "R6") { digitalWrite(CONTROLLINO_R6, (_proto.CMD == "ON" ? true : false)); } else if (_proto.ID == "R7") { digitalWrite(CONTROLLINO_R7, (_proto.CMD == "ON" ? true : false)); } else if (_proto.ID == "R8") { digitalWrite(CONTROLLINO_R8, (_proto.CMD == "ON" ? true : false)); } else if (_proto.ID == "R9") { digitalWrite(CONTROLLINO_R9, (_proto.CMD == "ON" ? true : false)); } } } bool isCommandJSON(String _comm) // 명령어 파싱 { bool ret = false; StaticJsonDocument&lt;200> jsonBuffer; DeserializationError error = deserializeJson(jsonBuffer, _comm); if (error == false) // 파싱에 성공하면 명령 값 변수에 저장 { String _id = jsonBuffer["id"]; String _cmd = jsonBuffer["cmd"]; _proto.ID = _id; _proto.CMD = _cmd; ret = true; } return ret; }

​

스케치를 업로드하고 시리얼 모니터를 실행하면 DHCP 서버로부터 할당받은 IP를 확인할 수 있습니다.

​

제어툴의 IP와 PORT에 콘트롤리노의 IP, PORT를 입력하고 OPEN을 클릭하면 PC와 콘트롤리노가 서로 연결됩니다.

​

제어툴에서 출력할 핀의 버튼을 누르면 콘트롤리노에서 반응하는 것을 확인할 수 있습니다.

​

(아래 링크에서 영상도 확인할 수 있습니다.)

[https://cafe.naver.com/makezone/2724](https://cafe.naver.com/makezone/2724)

[![](https://dthumb-phinf.pstatic.net/?src=%22https%3A%2F%2Fcafeptthumb-phinf.pstatic.net%2FMjAyMjEwMjhfMTEw%2FMDAxNjY2OTUxMTkzNzMz.WRExb5fkLY2tvr65pi0xxoOXZxtXo-UNVrgH-WVFBOQg.o-Uqzhc1CzdYNnWFcQGHozT2soonlsZvj1Bh1cV6AJsg.PNG%2F%2525B1%2525D7%2525B8%2525B21.png%3Ftype%3Df550_412%26timestamp%3D1667140050492%22&type=ff500_300)](https://cafe.naver.com/makezone/2724)

[**이더넷 포트 사용하기 - UDP로 콘트롤리노 제어하기**](https://cafe.naver.com/makezone/2724)

[콘트롤리노 매시와 메가 시리즈에는 W5100 기반의 이더넷 포트가 내장되어 있습니다. 아두이노에 이더넷 쉴드를 사용하는 것과 동일하게 다양한 인터넷 프로토콜을 별도의 하드웨...](https://cafe.naver.com/makezone/2724)

[cafe.naver.com](https://cafe.naver.com/makezone/2724)

​

​

| Controllino_Control_Pannel_V0.1.zip |
| --- |

위에 압축파일은 영상에서 보는 제어 프로그램입니다. 다운받아 바로 실행하면 됩니다.

​

​

5. 마무리

​

이번 강좌에서는 콘트롤리노 맥시와 메가 시리즈에 내장된 이더넷 포트를 사용하여 UDP 통신으로 PC와 통신하여 핀 제어하는 것에 대해 설명드렸습니다.

​

UDP 통신의 특성상 1:N 통신이 가능하기 때문에 여러 개의 장치를 네트워크에 묶기만 하면 원격으로도 제어할 수 있습니다.

​

또, 기존 아두이노 이더넷 쉴드에서 가능했던 다른 통신 프로토콜도 사용할 수 있기 때문에 사용하시는 환경에 맞추어서 응용하시면 됩니다.

**[출처]** [이더넷 포트 사용하기 - UDP로 콘트롤리노 제어하기](https://blog.naver.com/badgay74/222915174086)|**작성자** [인찬아빠](https://blog.naver.com/badgay74)

---

Source: https://maker.wiznet.io/louis_m/projects/%EC%9D%B4%EB%8D%94%EB%84%B7-%ED%8F%AC%ED%8A%B8-%EC%82%AC%EC%9A%A9%ED%95%98%EA%B8%B0-udp%EB%A1%9C-%EC%BD%98%ED%8A%B8%EB%A1%A4%EB%A6%AC%EB%85%B8-%EC%A0%9C%EC%96%B4%ED%95%98%EA%B8%B0/
