หมดปัญหาเน็ตหลุด! ขยายร่าง nRF52840 ต่อสายแลนด้วย W5500 + Zephyr RTOS

nRF52840 connected to W5500 Ethernet Module
การเชื่อมต่อบอร์ด ProMicro nRF52840 เข้ากับโมดูล Ethernet WIZnet W5500 เพื่อความเสถียรขั้นสุด

สวัสดีชาววิศวกรและ Maker สายอุตสาหกรรมทุกคนครับ! 🛠️ ใครที่เคยทำโปรเจกต์ IoT ไปติดตั้งในโรงงานที่มีเครื่องจักรเยอะๆ หรือในตึกที่มีผนังเหล็กหนาๆ น่าจะรู้ซึ้งถึงคำว่า "สัญญาณเน็ตหลุด" หรือความหน่วง (Latency) ของ Wi-Fi และ BLE กันเป็นอย่างดีใช่ไหมครับ?

แม้ว่าบอร์ดอย่าง nRF52840 จะเป็นสุดยอดชิปไร้สายตัวท็อป แต่ในสภาพแวดล้อมที่สัญญาณรบกวนเยอะ (Interference issues) บางครั้งการ "เสียบสายแลน" ก็คือคำตอบสุดท้าย! วันนี้เราจะพามาขยี้ Pain Point นี้ ด้วยการสอนวิธีขยายร่างบอร์ด nRF52840 ให้เชื่อมต่ออินเทอร์เน็ตผ่านสาย Ethernet โดยใช้ชิป WIZnet W5500 กันครับ!

ทำไมต้องรวมร่าง BLE กับ Ethernet? 🔀

การทำระบบแบบลูกผสม (Hybrid approach) นี้จะทำให้ระบบของคุณ "เก่งทั้งใกล้และไกล" ครับ:

  • เชื่อมต่อระยะใกล้ด้วย BLE: ให้บอร์ด nRF52840 คอยอ่านค่าจากเซนเซอร์ไร้สายตัวเล็กๆ รอบตัวมันด้วยสัญญาณ Bluetooth ที่กินไฟต่ำ
  • ส่งข้อมูลขึ้น Cloud ด้วย Ethernet: ใช้ชิป W5500 โยนข้อมูลทั้งหมดขึ้นเซิร์ฟเวอร์แบบผ่านสายแลน ซึ่งการันตีเรื่องความเสถียร ความเร็ว และความปลอดภัยในการทำ Firmware updates ครับ

💡 Maker's Tip: การทำงานแบบ Hybrid แบบนี้ตอบโจทย์ระบบ Industrial IoT (IIoT) มากๆ เพราะลดปัญหาคลื่นตีกันในโรงงานได้ 100% แถมชิป W5500 ยังจัดการโปรโตคอล TCP/IP ภายในตัวมันเอง (Hardware TCP/IP) ทำให้ไม่แย่งพลังประมวลผลของบอร์ดหลักเลย!

หากเพื่อนๆ วิศวกรกำลังหาโซลูชันสำหรับงานอุตสาหกรรม แวะมาช้อป โมดูล WIZnet W5500, บอร์ด nRF52840, หรืออุปกรณ์ Network สายแข็งต่างๆ ได้ที่ Globalbyte Shop เลยครับ ทัก LINE OA มาปรึกษาสเปกกับทีมเราได้ตลอดเลยนะ!

ขั้นตอนการทำ Step-by-Step ด้วย Zephyr RTOS 💻

โปรเจกต์นี้เราจะเขียนโค้ดด้วย nRF Connect SDK ซึ่งทำงานอยู่บนระบบปฏิบัติการ Zephyr RTOS ครับ โดยเราจะสร้างแอปพลิเคชันที่สั่งให้บอร์ด "ปิงหา Google DNS (8.8.8.8) ทุกๆ 5 วินาที" เพื่อทดสอบความเสถียรของเน็ตเวิร์กครับ

Step 1: ต่อสายวงจร (Wiring)

เชื่อมต่อบอร์ด ProMicro nRF52840 เข้ากับโมดูล W5500 ผ่านพอร์ต SPI (SCK, MOSI, MISO) และอย่าลืมต่อสายไฟ 3.3V, GND, ขา CS, INT, และ RESET ให้ครบถ้วนตามผังด้านล่างครับ

Step 2: ติดตั้งเครื่องมือและดึงซอร์สโค้ด

ติดตั้งโปรแกรม nRF Connect Toolchain ลงในคอมพิวเตอร์ของคุณ จากนั้นดึงโค้ดเทมเพลตตั้งต้นผ่านคำสั่ง Git ใน VS Code ครับ:

# 1. โคลนโค้ดจาก Repository
git clone https://github.com/teamprof/arduprof-template.git

# 2. เข้าไปที่โฟลเดอร์ และดึง Submodule ที่จำเป็น
cd arduprof-template
git submodule update --init --recursive
    

⚠️ ข้อควรรู้เรื่องไฟล์ตั้งค่า Zephyr (Kconfig & Devicetree)

ใน Zephyr RTOS เราต้องบอกบอร์ดว่าเราต่ออุปกรณ์อะไรไว้ที่ขาไหน ผ่านการแก้ไฟล์ prj.conf (เพื่อเปิดใช้งานฟังก์ชัน Ethernet W5500) และไฟล์ .overlay (เพื่อแมปขาพิน SPI) ครับ คุณสามารถคัดลอกโค้ดคอนฟิกจากกล่องด้านล่างไปใส่ทับในโปรเจกต์ของคุณได้เลย!

ผังการต่อสาย (Wiring Diagram) 🔌

Wiring diagram for nRF52840 to W5500
ผังการต่อสาย SPI ระหว่าง ProMicro nRF52840 และโมดูล W5500

การแก้ไฟล์ตั้งค่า Zephyr (prj.conf) ⚙️

# ตัวอย่างการตั้งค่าในไฟล์ prj.conf
CONFIG_NETWORKING=y
CONFIG_NET_L2_ETHERNET=y
CONFIG_ETH_W5500=y
CONFIG_ETH_DRIVER=y
CONFIG_NET_IPV4=y
CONFIG_NET_DHCPV4=y
CONFIG_NET_ARP=y
      

การแก้ไฟล์ Devicetree Overlay (.overlay) 🗺️

&spi3 {
    compatible = "nordic,nrf-spim";
    status = "okay";
    cs-gpios = <&gpio0 24 GPIO_ACTIVE_LOW>;
    pinctrl-0 = <&spi3_default>;
    pinctrl-1 = <&spi3_sleep>;
    pinctrl-names = "default", "sleep";

    w5500: w5500@0 {
        compatible = "wiznet,w5500";
        status = "okay";
        reg = <0x0>;
        spi-max-frequency = <20000000>;
        int-gpios = <&gpio0 11 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>;
        reset-gpios = <&gpio1 2 GPIO_ACTIVE_LOW>;
        local-mac-address = [00 AA BB CC DE 02]; 
    };
};
      

โค้ดโปรแกรมหลัก (ThreadApp.cpp) สำหรับการ Ping Google DNS 📡

void CLASSNAME::handlerSoftwareTimer(k_timer *timer)
{
    if (timer == &_timer1Hz)
    {
        static int count = 0;
        if (++count > 5)
        {
            count = 0;
            static constexpr const char DNS_IP[] = "8.8.8.8";
            
            // สั่ง Ping Google DNS ทุกๆ 5 วินาที
            auto ret = net::ping(DNS_IP, K_SECONDS(5));
            LOG_DBG("net:ping() result: %s", ret ? "success" : "failed");
        }
    }
}
      

ขั้นตอนการ Build และ Flash ลงบอร์ด 🚀

Build Config in VS Code Build Success Screen
ตั้งค่า Build Config ใน VS Code และกด Build เมื่อสำเร็จจะได้ไฟล์นามสกุล .uf2
Drag and Drop UF2 file to disk
กดปุ่ม Reset ที่บอร์ด 2 ครั้ง จะมีไดรฟ์ (NICENANO) เด้งขึ้นมา ให้ลากไฟล์ zephyr.uf2 ไปวางใส่เพื่อเบิร์นโปรแกรม

ผลลัพธ์ผ่านหน้าจอ Terminal (Serial Monitor) 🖥️

Serial Monitor Output Final Working Hardware Demo
บอร์ดจะจ่าย IP Address ผ่าน DHCP อัตโนมัติ และแสดงผลการ Ping ไปยัง 8.8.8.8 ว่าสำเร็จ (Success) ผ่านสายแลน!
*คำเตือนและข้อแนะนำ: เนื้อหาบทความนี้สรุปและแปลมาจากบทความเทคโนโลยีต่างประเทศ การพัฒนาระบบร่วมกับ Zephyr RTOS และ nRF Connect SDK จำเป็นต้องมีการตั้งค่าตัวแปรในโค้ด C++ (net_helper.cpp) และ Environment หลายจุด แนะนำให้คัดลอกซอร์สโค้ดฉบับเต็มจาก ลิงก์ต้นฉบับ เพื่อป้องกันข้อผิดพลาดขณะคอมไพล์โปรแกรมครับ

 


Blog posts

เข้าสู่ระบบ

ลืมรหัสผ่านใช่ไหม?

ยังไม่มีบัญชีใช่ไหม?
สร้างบัญชี