Arduino Mạch Ethernet Shield

Sử dụng Arduino Ethernet Shield là một trong những cách dễ nhất để kết nối Arduino với Internet. Bạn có thể xem các lựa chọn khác để kết nối Arduino với Internet thông qua Ethernet tại Arduino - Mạng Ethernet

Trong bài hướng dẫn này, chúng ta sẽ học:

mạch Ethernet shield cho Arduino

Phần cứng cần chuẩn bị

1×Arduino Uno R3
1×USB 2.0 cable type A/B (for USB-A PC)
1×USB 2.0 cable type C/B (for USB-C PC)
1×Arduino Ethernet Shield
1×Ethernet Cable
1×(Khuyến nghị) Screw Terminal Block Shield for Arduino Uno
1×(Khuyến nghị) Breadboard Shield for Arduino Uno
1×(Khuyến nghị) Enclosure for Arduino Uno
1×(Khuyến nghị) Prototyping Base Plate & Breadboard Kit for Arduino UNO

Or you can buy the following kits:

1×DIYables STEM V3 Starter Kit (Arduino included)
1×DIYables Sensor Kit (30 sensors/displays)
1×DIYables Sensor Kit (18 sensors/displays)

Kiến thức mạng cơ bản cho người mới bắt đầu

Phần này cung cấp kiến thức cơ bản cho những người mới bắt đầu, những người chưa biết gì về mạng máy tính.

Khi một thiết bị kết nối với Internet (qua Ethernet hoặc WiFi), nó PHẢI kết nối với một bộ định tuyến hoặc một điểm truy cập. Bộ định tuyến và điểm truy cập là các thiết bị đảm nhận vai trò là cổng vào Internet. Tất cả dữ liệu giữa một thiết bị và Internet đều được truyền qua bộ định tuyến hoặc điểm truy cập.

Khi một thiết bị kết nối với Internet, nó phải:

  • Có địa chỉ MAC
  • Có địa chỉ IP
  • Biết mặt nạ mạng con của mạng
  • Biết địa chỉ IP của gateway (địa chỉ IP của bộ định tuyến hoặc điểm truy cập)
  • Biết địa chỉ IP của máy chủ DNS (trong trường hợp kết nối với một tên miền)

Thiết bị sẽ không hoạt động nếu bất cứ điều gì trong số những điều sau đây:

  • Có một hoặc nhiều thiết bị khác trong cùng một mạng sử dụng cùng một địa chỉ MAC của thiết bị (gọi là địa chỉ MAC bị xung đột)
  • Có một hoặc nhiều thiết bị khác trong cùng một mạng sử dụng cùng một địa chỉ IP của thiết bị (gọi là địa chỉ IP bị xung đột)

Bài hướng dẫn này không làm bạn quá tải với kiến thức về mạng. Do đó, bài hướng dẫn này không giải thích những khái niệm này. Nó nằm ngoài phạm vi của bài hướng dẫn này. Thay vào đó, bài hướng dẫn cho thấy cách sử dụng chúng.

Địa chỉ MAC thường được tích hợp sẵn trên các thiết bị. Chúng ta không cần quan tâm đến nó. Tuy nhiên, Arduino Ethernet Shield lại không có địa chỉ MAC tích hợp sẵn. Địa chỉ MAC được in trên một nhãn dán dính lên shield. Chúng ta cần lấy địa chỉ MAC đó và thiết lập địa chỉ MAC cho Arduino Shield trong mã Arduino.

Có hai phương pháp để gán địa chỉ IP, mặt nạ mạng con, địa chỉ IP của gateway và địa chỉ IP của máy chủ DNS cho một thiết bị (bao gồm Arduino):

  1. Sử dụng địa chỉ IP tĩnh:
    • Cần quản lý địa chỉ IP, mặt nạ mạng con, địa chỉ IP của gateway và địa chỉ IP của máy chủ DNS
    • Cần cài đặt thủ công địa chỉ IP, mặt nạ mạng con, địa chỉ IP của gateway và máy chủ DNS (đối với Arduino Ethernet Shield, thiết lập thông tin này bằng mã Arduino)
    • Nó sẽ KHÔNG hoạt động nếu:
      • Thiết lập một địa chỉ IP đang được sử dụng bởi các thiết bị khác trên cùng một mạng LAN → xung đột IP
      • Thiết lập mặt nạ mạng con, địa chỉ IP của gateway và máy chủ DNS sai
  • Nhận địa chỉ IP tự động (DHCP), còn được gọi là địa chỉ IP động
    • Thiết bị tự động nhận địa chỉ IP, mặt nạ mạng con, địa chỉ IP của gateway và máy chủ DNS từ bộ định tuyến hoặc điểm truy cập bằng DHCP. Chúng ta không cần quản lý địa chỉ IP, mặt nạ mạng con, địa chỉ IP của gateway và máy chủ DNS. Bộ định tuyến/điểm truy cập sẽ thực hiện công việc này cho chúng ta.

    Khi bạn kết nối điện thoại thông minh với mạng WiFi ở nhà, phương pháp thứ hai được sử dụng.

    Khi sử dụng Arduino, phương pháp đầu tiên khó đối với người mới bắt đầu. Phương pháp thứ hai dễ và được khuyến nghị cho những người mới bắt đầu không biết gì về mạng.

    Cách sử dụng Arduino Ethernet Shield

    Arduino giao tiếp với Ethernet Shield thông qua giao diện SPI. Dưới đây là cách sử dụng Arduino Ethernet Shield.

    • Lắp Ethernet Shield lên Arduino Uno hoặc Mega
    • Kết nối PC với Arduino Uno/Mega bằng cáp USB
    • Kết nối Ethernet Shield với router hoặc điểm truy cập bằng cáp Ethernet
    • Mở Arduino IDE và viết mã
    • Tải mã lên Arduino Uno/Mega

    Nó hoàn toàn đơn giản.

    Mẫu mã Arduino cho Ethernet Shield của Arduino khi sử dụng địa chỉ IP động

    Điều kiện tiên quyết

    • Chúng ta cần biết địa chỉ MAC của Ethernet Shield (lấy từ nhãn dán do nhà sản xuất cung cấp)

    Cách lập trình từng bước

    • Bao gồm thư viện
    #include <SPI.h> #include <Ethernet.h>
    • Khai báo địa chỉ MAC
    // replace the MAC address below by the MAC address printed on a sticker on the Arduino Shield 2 byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
    • Khai báo các đối tượng khác tùy thuộc vào ứng dụng của bạn.
    • Khởi động Ethernet Shield
    // initialize the Ethernet shield using DHCP: Ethernet.begin(mac);
    • (Tùy chọn) In ra địa chỉ IP của Arduino, mặt nạ mạng con, địa chỉ IP của gateway và địa chỉ IP của máy chủ DNS.
    Serial.print("Arduino's IP Address: "); Serial.println(Ethernet.localIP()); Serial.print("DNS Server's IP Address: "); Serial.println(Ethernet.dnsServerIP()); Serial.print("Gateway's IP Address: "); Serial.println(Ethernet.gatewayIP()); Serial.print("Network's Subnet Mask: "); Serial.println(Ethernet.subnetMask());

    Xin lưu ý rằng Arduino không thể nhận được địa chỉ IP trong các trường hợp sau:

    • Router hoặc Điểm truy cập không hỗ trợ DHCP
    • Cáp Ethernet được cắm không đúng cách hoặc bị hỏng

    Để phát hiện những vấn đề này, chúng ta có thể chỉnh sửa Ethernet.begin(mac); thành:

    if (Ethernet.begin(mac) == 0) { Serial.println("Failed to obtaining an IP address"); // check for Ethernet hardware present if (Ethernet.hardwareStatus() == EthernetNoHardware) Serial.println("Ethernet shield was not found"); // check for Ethernet cable if (Ethernet.linkStatus() == LinkOFF) Serial.println("Ethernet cable is not connected."); while (true); }

    ※ Lưu ý:

    Nếu bạn không thay đổi địa chỉ MAC, nó có thể vẫn hoạt động. Tuy nhiên, nó có thể không hoạt động nếu nó trùng với địa chỉ MAC của một thiết bị khác trong cùng mạng LAN. Trong trường hợp mất nhãn dán địa chỉ MAC, chỉ cần sử dụng địa chỉ MAC ở trên để thử nghiệm.

    Mã khung đầy đủ khi sử dụng địa chỉ IP động

    /* * Mã Arduino này được phát triển bởi newbiely.vn * Mã Arduino này được cung cấp để sử dụng công khai, không có ràng buộc. * Để xem hướng dẫn chi tiết và sơ đồ kết nối, vui lòng truy cập: * https://newbiely.vn/tutorials/arduino/arduino-ethernet-shield-2 */ #include <SPI.h> #include <Ethernet.h> // replace the MAC address below by the MAC address printed on a sticker on the Arduino Shield 2 byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; // TODO: Declare something depending on your application void setup() { Serial.begin(9600); // initialize the Ethernet shield using DHCP: Serial.println("Obtaining an IP address using DHCP"); if (Ethernet.begin(mac) == 0) { Serial.println("Failed to obtaining an IP address"); // check for Ethernet hardware present if (Ethernet.hardwareStatus() == EthernetNoHardware) Serial.println("Ethernet shield was not found"); // check for Ethernet cable if (Ethernet.linkStatus() == LinkOFF) Serial.println("Ethernet cable is not connected."); while (true); } // print out Arduino's IP address, subnet mask, gateway's IP address, and DNS server's IP address Serial.print("- Arduino's IP address : "); Serial.println(Ethernet.localIP()); Serial.print("- Gateway's IP address : "); Serial.println(Ethernet.gatewayIP()); Serial.print("- Network's subnet mask : "); Serial.println(Ethernet.subnetMask()); Serial.print("- DNS server's IP address: "); Serial.println(Ethernet.dnsServerIP()); // TODO: initialize something depending on your application } void loop() { // TODO: do something depending on your application }

    Tải mã ở trên lên Arduino. Nếu thành công, Serial Monitor sẽ hiển thị như sau:

    COM6
    Send
    Obtaining an IP address using DHCP - Arduino's IP address : 192.168.0.5 - Gateway's IP address : 192.168.0.1 - Network's subnet mask : 255.255.255.0 - DNS server's IP address: 8.8.8.8
    Autoscroll Show timestamp
    Clear output
    9600 baud  
    Newline  

    Nếu Serial Monitor KHÔNG hiển thị như ở trên, hãy kiểm tra cáp Ethernet của bạn. Nếu nó vẫn KHÔNG hoạt động, hãy chuyển sang phần tiếp theo để thử sử dụng địa chỉ IP tĩnh.

    Mẫu mã Arduino cho Ethernet Shield của Arduino khi sử dụng địa chỉ IP tĩnh

    Điều kiện tiên quyết

    Cách lập trình từng bước

    • Bao gồm thư viện
    #include <SPI.h> #include <Ethernet.h>
    • Khai báo địa chỉ MAC
    // replace the MAC address below by the MAC address printed on a sticker on the Arduino Shield 2 byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
    • Khai báo một địa chỉ IP chưa được sử dụng, mặt nạ mạng con, địa chỉ IP của gateway, và địa chỉ IP của máy chủ DNS
    // change the IP address, subnet mask, gateway's IP address, and DNS server's IP address IPAddress ip(192, 168, 0, 5); IPAddress gateway(192, 168, 0, 1); IPAddress subnet(255, 255, 255, 0); IPAddress myDns(8, 8, 8, 8);
    • Khai báo các đối tượng khác tùy thuộc vào ứng dụng của bạn.
    • Khởi động Ethernet Shield
    // initialize the Ethernet shield using the static IP address: Ethernet.begin(mac, ip, myDns, gateway, subnet);
    • Tùy chọn: kiểm tra trạng thái liên kết mạng
    if (Ethernet.linkStatus() == LinkON) Serial.println("Link status: On"); else Serial.println("Link status: Off");

    ※ Lưu ý:

    Nếu bạn KHÔNG thay đổi địa chỉ MAC, nó vẫn có thể hoạt động. Tuy nhiên, nó có thể KHÔNG hoạt động nếu trùng với địa chỉ MAC của thiết bị khác trong cùng mạng LAN. Trong trường hợp bị mất tem dán địa chỉ MAC, chỉ cần dùng địa chỉ MAC ở trên để thử nghiệm.

    Mã khung hoàn chỉnh khi sử dụng địa chỉ IP tĩnh

    /* * Mã Arduino này được phát triển bởi newbiely.vn * Mã Arduino này được cung cấp để sử dụng công khai, không có ràng buộc. * Để xem hướng dẫn chi tiết và sơ đồ kết nối, vui lòng truy cập: * https://newbiely.vn/tutorials/arduino/arduino-ethernet-shield-2 */ #include <SPI.h> #include <Ethernet.h> // replace the MAC address below by the MAC address printed on a sticker on the Arduino Shield 2 byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; // change the IP address, subnet mask, gateway's IP address, and DNS server's IP address depending on your network IPAddress ip(192, 168, 0, 5); IPAddress gateway(192, 168, 0, 1); IPAddress subnet(255, 255, 255, 0); IPAddress myDns(8, 8, 8, 8); // TODO: Declare something depending on your application void setup() { Serial.begin(9600); // initialize the Ethernet shield using the static IP address: Ethernet.begin(mac, ip, myDns, gateway, subnet); // TODO: initialize something depending on your application } void loop() { // optional, check link status if (Ethernet.linkStatus() == LinkON) Serial.println("Link status: On"); else Serial.println("Link status: Off"); // TODO: do something depending on your application }

    Tải đoạn mã ở trên lên Arduino. Nếu thành công, Serial Monitor sẽ hiển thị như sau:

    COM6
    Send
    Link status: On Link status: On Link status: On
    Autoscroll Show timestamp
    Clear output
    9600 baud  
    Newline  

    Nếu Serial Monitor không hiển thị như ở trên:

    • Kiểm tra cáp Ethernet của bạn
    • đảm bảo rằng địa chỉ IP thuộc về mạng của bạn
    • đảm bảo địa chỉ IP không trùng với bất kỳ thiết bị nào khác trên cùng một mạng
    • đảm bảo mặt nạ mạng con, địa chỉ IP của gateway và địa chỉ IP của máy chủ DNS được thiết lập đúng

    Kiến thức bổ sung về mạng máy tính cho người mới bắt đầu

    Trong trường hợp sử dụng IP tĩnh, bạn cần có một địa chỉ IP chưa được sử dụng, mặt nạ mạng, địa chỉ IP của cổng mặc định và địa chỉ IP của máy chủ DNS. Phần dưới đây sẽ trình bày cách lấy chúng.

    Nếu Arduino và máy tính của bạn kết nối với cùng một mạng.

    • Mở Command Prompt trên máy tính của bạn
    • Nhập lệnh sau vào Command Prompt:
    ipconfig
    Command Prompt
    C:\Windows\system32>ipconfig Ethernet adapter Ethernet 2: Media State . . . . . . . . . . . : Media disconnected Connection-specific DNS Suffix . : Wireless LAN adapter Wi-Fi: Connection-specific DNS Suffix . : Link-local IPv6 Address . . . . . : fe80::d559:ae92:8dff:a604%20 IPv4 Address. . . . . . . . . . . : 192.168.0.14 Subnet Mask . . . . . . . . . . . : 255.255.255.0 Default Gateway . . . . . . . . . : 192.168.0.1
    • Từ phía trên, bạn có thể lấy mặt nạ mạng conđịa chỉ IP của gateway
    • Bạn có thể thấy địa chỉ IP của máy tính từ đầu ra ở trên. Chúng ta sẽ cố gắng tìm một địa chỉ IP chưa được sử dụng dựa trên địa chỉ IP của máy tính.
      • Tăng hoặc giảm từng bước một, bắt đầu từ địa chỉ IP của máy tính.
      • Gửi lệnh ping tới địa chỉ IP đó trên Dòng lệnh. Lặp lại hai bước này cho đến khi IP đó không thể liên lạc được. Nếu địa chỉ không thể liên lạc được, đó là một địa chỉ IP chưa được sử dụng và chúng ta có thể dùng nó cho Arduino. Ví dụ:
      ping 192.168.0.16
      Command Prompt
      C:\Users\youruser>ping 192.168.0.16 Pinging 192.168.0.16 with 32 bytes of data: Reply from 192.168.0.14: Destination host unreachable. Reply from 192.168.0.14: Destination host unreachable. Reply from 192.168.0.14: Destination host unreachable. Reply from 192.168.0.14: Destination host unreachable. Ping statistics for 192.168.0.16: Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),

      ※ Lưu ý:

      Trong một số trường hợp, ngay cả khi địa chỉ IP không thể truy cập được, nó có thể đang được một thiết bị khác sử dụng. Tuy nhiên, trường hợp này thường không xảy ra trong mạng gia đình của bạn.

      • Đối với địa chỉ IP của máy chủ DNS, chúng ta có thể đơn giản sử dụng 8.8.8.8

      Bây giờ bạn có thể sử dụng các shield này để kết nối Arduino với Internet. Xem ví dụ khác ở phần See Also.

      WARNING

      Hướng dẫn này đang được phát triển.