Arduino Ethernet Shield W5100 乙太網路擴充板,使用 DHCP 取得 IP 位址

這裡介紹如何使用 Arduino Ethernet Shield W5100 乙太網路擴充板,透過 DHCP 自動取得 IP 位址。

這張是副廠的 Arduino Ethernet Shield W5100 乙太網路擴充板,相容於原廠的乙太網路擴充板,不過價格比較便宜,原廠的在網路上一張要價一千六百多,而這張只要三百多塊,如果沒有 POE 支援的更便宜,只要兩百多塊。

arduino-ethernet-shield-w5100-2

Arduino Ethernet Shield W5100 乙太網路擴充板

這是網路擴充板的背面。

arduino-ethernet-shield-w5100-3

Arduino Ethernet Shield W5100 乙太網路擴充板背面

擴充板在使用時就直接插在 Arduino 即可,這裡我是拿一張 UNO 的相容板來示範。

arduino-ethernet-shield-w5100-4

UNO 相容板乙太網路擴充板

插上擴充板之後,側面的樣子。

arduino-ethernet-shield-w5100-5

UNO 相容板乙太網路擴充板

這張擴充板在插上 UNO 上面時,RJ45 的插座下方的針腳很容易頂到 UNO 的 USB 插座,如果怕短路的話,在上面貼個膠帶會比較好。

arduino-ethernet-shield-w5100-6

UNO 相容板乙太網路擴充板

接上 USB 線與網路線,就可以來開發程式了。

arduino-ethernet-shield-w5100-7

接上 USB 線與網路線

要使用這張乙太網路擴充板需要一些函式庫,而 Arduino 的開發環境中有內建基本函式庫可以使用,以下是從 DHCP 取得 IP 位址,讓 Arduino 連上網路的範例。

#include <SPI.h>
#include <Ethernet.h>

// 指定網路卡 MAC 卡號
byte mac[] = {  0x00, 0xAA, 0xBB, 0xCC, 0xDE, 0x02 };

// 初始化 Ethernet client library
EthernetClient client;

void setup() {
  // 初始化序列埠
  Serial.begin(115200);
  // 啟用 Ethernet 連線,預設會以 DHCP 取得 IP 位址
  if (Ethernet.begin(mac) == 0) {
    Serial.println("無法取得 IP 位址");
    // 無法取得 IP 位址,不做任何事情
    for(;;)
      ;
  }
  // 輸出 IP 位址
  Serial.print("IP 位址:");
  Serial.println(Ethernet.localIP());
}

void loop() {

}

這裡的 Ethernet.begin(mac) 是設定網路卡 MAC 卡號,並且以 DHCP 取得 IP 位址,如果要自行指定 IP 位址,可以這樣寫:

// 網路卡 MAC 卡號
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };

// 指定 IP 位址
byte ip[] = { 192, 168, 1, 200 };

void setup() {
  Ethernet.begin(mac, ip);
}

若要設定 DNS、預設閘道與子網域等,就將這些參數再加上去即可,詳細用法請參考 Ethernet.begin() 的說明。

將寫好的程式編譯並上傳至 Arduino 之後,開啟序列埠監控視窗,就可以看到 Arduino 從 DHCP 伺服器所取得的動態 IP 位址了。

arduino-ethernet-shield-w5100-8

Arduino 輸出

這時候可以使用 ping 測試一下,看看 Arduino 所取得的 IP 位址是否可以正常使用。

ubuntu-terminal-ping

ping 輸出

如果您對於 Arduino 的相關應用有興趣,建議您可以繼續閱讀物聯網的文章。

Arduino, 物聯網

5 Comments

  1. 陳添

    請問如果我用跳線跟電腦做連接的話可行嗎

  2. Marco Chow

    你好,我有一個問題想請教一下,我現用一個Arduino uno r3 加 Ethernet Shield W5100.但不知何故,當我結合想做設定時,Ethernet Shield W5100只會亮著power紅燈,而傳輸program時,都只會出 “avrdude: stk500_recv(): programmer is not responding”但如果只用uno試led,它是可以用而且没有問題。試過按RESET但結果都是一樣。
    起初我以為是硬件問題,我再買多2個Ethernet Shield W5100及一個Arduino uno r3做測試,但結果相同。
    全部元件都是購自淘寶,希望大大可以幫忙,因為這是我的final project,而現在卡在這個環節上面….謝謝大家。

    • Jim

      請問執行以上程式結果顯示"無法取得 IP 位址",有可能是什麼原因造成,該如何排除??
      硬體:ArduinoUNO + Arduino Ethernet Shield W5100

      • G. T. Wang

        可以先測試看看手動指定 IP 位址是否能運作。

        若手動指定 IP 位址可以運作,則去查看 DHCP 伺服器的 log 檔,看看 DHCP 設定有沒有問題,或是網路線有沒有插好。

        若手動指定 IP 位址無法運作,看看是不是板子哪裡有問題。

Leave a Reply