아두이노 강좌 #47 Arduino Ethernet Shied 2를 사용하여 DHCP, 수동IP 로 네트워크 연결
Lucy Archive
Lucy 2023
2020. 11. 10. 02:03

Arduino DHCP, 수동IP 이더넷 연결Arduino DHCP, 수동IP 이더넷 연결

Arduino Ethernet Shield 2 : DHCP, Static IP

본 포스트에서는

아두이노와 Arduino Ethernet Shield 2를 사용하여 DHCP, 고정 IP방식으로 LAN을 구성하는 방법

에 대해 설명합니다. 아두이노에서 Ethernet 관련 예제가 있지만 최소한의 코드로만 사용 방법을 알기 위해 정리하였습니다. 

아두이노 이더넷 연결

아두이노는 아두이노 이더넷 쉴드를 사용하여 네트워크에 연결되거나 인터넷에 연결 할 수 있습니다. 네트워크에 연결 한다는 말은 같은 네트워크 내에 연결된 PC, 스마트폰 등의 기기를 통해 제어되거나, 특정 웹 사이트에 접속해서 데이터를 수신하거나, 보낼 수 있는 환경을 말합니다. 기본적으로 네트워크 통신을 하기 위해 알아야 하는 기본 지식들은 많지만, 모르는 분들을 위해 아래와 같이 간단히 용어 정리를 하고 넘어갑니다.

Network

네트워크란 다수의 장치가 연결되어 데이터를 주고 받는 환경 또는 상태를 말합니다. 전자/IT 기술로서 네트워크란 단어 보다, 쉽게 사용되는 '물류 네트워크' 처럼 어느 경로이든 물건을 다른 사람과 주고 받을 수 있는 환경이 구축되어 있는 상태를 말합니다. 

LAN, WAN

LAN은 Network의 한 종류로 작은 범위의 네트워크를 말합니다. WAN은 광범위한 범위의 네트워크를 말하고 여러 개의 LAN이 연결된 Network를 의미합니다. 사실상 LAN, WAN의 용어를 명확하게 구분 짓는 기준은 없어 보이고, LAN이란 단어가 Network를 의미한다는 것만 기억하면 됩니다.

Internet

인터넷은 여러 LAN, WAN이 연결된 거대한 네트워크 입니다.

IP Address, MAC Address

Network는 여러 장치간의 연결을 의미하는데, 장치의 구분을 위해 사용되는 것이 IP와 MAC입니다. MAC(MAC Address)은 사람의 주민등록 번호와 같이 장치의 고유한 번호입니다. IP(IP Address)는 주민등록번호와 같이 고유한 번호가 아닌, 그 사람이 사는 곳의 주소와 같은 역할 입니다. 

공유기(Router)

서로 다른 네트워크를 중계해주시는 장치입니다. 집에서 사용하는 공유기처럼 KT,SKT와 같은 외부 인터넷 망과 홈 네트워크를 연결하는 용도로 사용됩니다. 

고정IP, DHCP

라우터에 연결되는 PC, 스마트폰과 같은 장치는 내부 네트워크 IP Address를 자동으로 라우터에 신청하여 받을 수도 있고, 고정된 IP Address 를 사용 될 수 있습니다. 고정된 IP를 사용할 경우 다른 장치와 충돌이 나지 않도록 사전에 적절한 배분이 필요합니다.

Ethernet

Ethernet은 데이터를 주고 받는 통신 규약의 하나이지만, 간단히 유선으로 LAN을 구성하기 위한 방법입니다. 가정이나 회사에서 사용되는 데스크탑 PC에 랜선을 연결하여 인터넷을 사용하는 경우 Ethernet 통신을 사용한다라고 말합니다.

Wifi

Wifi는 무선으로 무선랜에 연결 할 수 있게 해주는 기술입니다. 간단히 무선으로 LAN에 연결 하는 방식을 말합니다. 


환경 구성 및 준비

네트워크 구성

아두이노로 LAN(Local Area Network)에 연결하기 위해 아래와 같은 환경을 구성 하였습니다. 실제로는 복잡하지만 간단하게 표시하였습니다. 집으로 들어오는 통신사 모뎀에 유무선 공유기를 연결하여 유선(Ethernet)으로 아두이노를 연결 하였습니다. 아래와 같이 연결 하면 집의 스마트폰 또는 PC로 Arduino를 제어하거나, Arduino로 인터넷에 접속하여 필요한 데이터를 주고 받을 수 있습니다. 

Arduino 네트워크 구성Arduino 네트워크 구성

Arduino Ethernet Shield 2

Arduino 보드에서 이더넷을 사용하기 위해 여러가지 지원되는 보드들이 있지만, 이 포스트에서는 Arduino Ethernet Shield 2를 사용하였습니다. 이더넷 쉴드는 우측의 그림과 같이 Arduino 보드와 적층 형태로 연결하여 사용할 수 있습니다. 

Arduino Ethernet Shield2Arduino Ethernet Shield2

이더넷 쉴드의 주요 사양은 아래와 같습니다.

주요 사양

  • 동작 전원 : 5V
  • 메모리 : 32Kbyte (W5500 칩 내부)
  • 이더넷 속도 : 10Mbit/s or 100Mbit/s
  • Arduino와 통신 : SPI

DHCP로 네트워크 연결

DHCP는 네트워크에 접속하는 장치에 자동으로 IP주소, DNS, 게이트웨이 주소를 할당하는 방식을 말합니다. 아래 그림은 PC(or 노트북) 과 스마트폰에서 사용되는 네트워크 설정으로 DHCP 를 사용하는 경우의 설정을 나타낸 그림입니다. 일반적으로 개인적으로 사용하는 경우 대부분 DHCP가 설정되어 있습니다. 이해를 돕기 위해 추가한 사진입니다.

PC와 스마트폰의 DHCP 설정(좌) PC DHCP 설정, (우) 스마트폰 DHCP 설정


코드

아래 코드는 DHCP 모드로 LAN에 접속하여 할당 받은 IP를 출력하는 코드입니다. 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#include <SPI.h>
#include <Ethernet.h>
 
byte mac[] = {0x900xA20xDA0x100x530x07};
 
void setup() {
 
    Serial.begin(9600);
    while (!Serial) {;}
 
    Serial.println(F("Initialize Ethernet with DHCP:"));
    Ethernet.init(10);
    if (Ethernet.begin(mac) == 0) {
        Serial.println(F("Failed to configure Ethernet using DHCP"));
        while(1){;}
    }
 
    Serial.print(F("My IP address: "));
    Serial.println(Ethernet.localIP());
    Serial.print(F("My Gateway IP address: "));
    Serial.println(Ethernet.gatewayIP());
    Serial.print(F("My SubnetMask IP address: "));
    Serial.println(Ethernet.subnetMask());
}
 
void loop() {
    if((Ethernet.maintain() == 2|| (Ethernet.maintain() == 4)){
        Serial.println(F("Renewed or Rebind success"));
        Serial.print(F("My IP address: "));
        Serial.println(Ethernet.localIP());
    }
    else if((Ethernet.maintain() == 1|| (Ethernet.maintain() == 3)){
        Serial.println(F("Ethernet Connection Fail"));
    }
}
cs

코드 설명

  • 4줄 - MAC 주소 저장
    • MAC 주소는 보통 Arduino Ethernet Shield 보드의 하단에 스티커가 붙어 있습니다. 
  • 12번 줄 - 이더넷 클래스 초기화 Ethenret.init(10)
    • Ethernet.init(sspin) : sspin은 이더넷 쉴드의 CS 핀 번호를 입력
  • 13번 줄 - DHCP 방식으로 이더넷 연결을 시도하고 연결에 실패 했는지 확인
    • Ethernet.begin(mac) : DHCP 모드로 Ethernet 연결을 시작 정상적으로 연결되면 '1', 실패하면 '0'을 반환
    • Ethernet.begin(mac, ip) : 수동IP 모드로 Ethernet 연결을 시작 반환 값 없음
  • 18번 줄 - DHCP 정상적으로 연결 된 경우 IP를 반환
    • Ethernet.localIP() : Arduino의 IP주소를 반환
  • 27~34번 줄 - IP를 새로 부여 받거나 연결에 실패한 경우 메세지를 출력
    • Ethernet.maintain() : DHCP 서버에 IP 임대를 갱신하는 함수로 반환 값은 아래와 같다
      • 0 : Nothing Happened
      • 1 : renew failed
      • 2 : renew success
      • 3 : rebind fail
      • 4 : rebind success

실행 결과

왼쪽 그림은 아두이노를 공유기에 연결하여 부팅시 시리얼 포트로 출력되는 메세지입니다. 오른쪽 그림은 같은 공유기에 연결된 Window PC 명령 프롬프트에서 ping 명령어를 사용하여 해당 IP의 장치가 LAN에 정상적으로 연결 되었는지 확인 한 그림입니다.

Arduino DHCP 네트워크 연결Arduino DHCP 네트워크 연결


수동IP로 네트워크 연결

DHCP는 공유기에서 아두이노의 IP를 자동으로 할당하지만, 수동IP 방식은 아두이노에 IP를 지정하여 사용 할 목적으로 사용됩니다. 

코드

아래 코드는 아두이노에 192.168.0.50 IP를 지정하여 네트워크에 연결하는 코드입니다. 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include <SPI.h>
#include <Ethernet.h>
 
byte mac[] = {0x900xA20xDA0x100x530x07};
byte ip[] = {192168050};
 
void setup() {
 
  Serial.begin(9600);
  while (!Serial) {
    ; // wait for serial port to connect. Needed for native USB port only
  }
  
    Serial.println(F("Initialize Ethernet with Static IP:"));
    Ethernet.init(10);
    Ethernet.begin(mac, ip);
  // print your local IP address:
    Serial.print(F("My IP address: "));
    Serial.println(Ethernet.localIP());
    Serial.print(F("My Gateway IP address: "));
    Serial.println(Ethernet.gatewayIP());
    Serial.print(F("My SubnetMask IP address: "));
    Serial.println(Ethernet.subnetMask());
}
 
void loop() {
}
cs

코드 설명

  • 4줄 - MAC 주소 저장
  • 5줄 - IP주소 저장
  • 15줄 - Ethernet 클래스 초기화
  • 16줄 - Ethernet 연결 시작
    • Ethernet.begin(mac) : DHCP 모드
    • Ethernet.begin(mac, ip) : 수동 IP모드로 연결 - DNS, Gateway IP는 할당 받음
    • Ethenret.begin(mac, ip, dns, gateway, subnet) : 수동 IP모드로 연결 - DNS, Gateway, Subnet Mask 수동으로 할당

※ 주의사항 : 수동IP를 사용하는 경우 공유기(라우터)에서 사용되는 네트워크 IP주소 범위를 확인 후 적절한 IP로 설정해야 합니다.

실행 결과

왼쪽 그림은 아두이노를 공유기에 연결하여 부팅시 시리얼 포트로 출력된 화면입니다. 위 코드와 같이 Ethernet.begin(mac, ip) 메소드로 이더넷 설정하여 공유기로 부터 Gateway IP와 SubnetMask IP 할당 받은 것을 확인하였습니다. 오른쪽 그림은 같으 네트워크에 접속된 PC의 CMD창에서 ping 명령어를 사용하여 네트워크가 정상적으로 연결 되었는지 확인 한 화면입니다.

Arduino Static IP 네트워크 연결Arduino Static IP 네트워크 연결


마무리

본 포스트에서는

Arduino Uno 보드와 아두이노 이더넷 쉴드를 사용하여 자동IP, 수동IP로 네트워크에 연결

하는 방법에 대해 소개하였습니다. 간단한 내용이지만, 한 포스트에서 모든 것을 다루기가 벅찬 내용으로 본문의 내용은 필요한 경우 추가적으로 수정하거나, 이후 포스트에서 자세히 다룰 예정입니다. 
끝까지 읽어 주셔서 감사합니다.😊
관련포스트

👉 아두이노 이더넷 관련글 목록 보기

👉 아두이노 관련글 전체 목록 보기