การเชื่อมต่อบอร์ด 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) 🔌
ผังการต่อสาย 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 ใน VS Code และกด Build เมื่อสำเร็จจะได้ไฟล์นามสกุล .uf2
กดปุ่ม Reset ที่บอร์ด 2 ครั้ง จะมีไดรฟ์ (NICENANO) เด้งขึ้นมา ให้ลากไฟล์ zephyr.uf2 ไปวางใส่เพื่อเบิร์นโปรแกรม
ผลลัพธ์ผ่านหน้าจอ Terminal (Serial Monitor) 🖥️
บอร์ดจะจ่าย IP Address ผ่าน DHCP อัตโนมัติ และแสดงผลการ Ping ไปยัง 8.8.8.8 ว่าสำเร็จ (Success) ผ่านสายแลน!
📚 แหล่งข้อมูลศึกษาเพิ่มเติม:
*คำเตือนและข้อแนะนำ: เนื้อหาบทความนี้สรุปและแปลมาจากบทความเทคโนโลยีต่างประเทศ การพัฒนาระบบร่วมกับ Zephyr RTOS และ nRF Connect SDK จำเป็นต้องมีการตั้งค่าตัวแปรในโค้ด C++ (net_helper.cpp) และ Environment หลายจุด แนะนำให้คัดลอกซอร์สโค้ดฉบับเต็มจาก
ลิงก์ต้นฉบับ เพื่อป้องกันข้อผิดพลาดขณะคอมไพล์โปรแกรมครับ