มาลองใช้งาน WiFi บนบอร์ด Raspberry Pi Pico W

เมื่อไม่นานนี้ Raspberry Pi Trading เปิดตัวบอร์ด Raspberry Pi Pico W โดยออกแบบเหมือนกับ บอร์ด Raspberry Pi Pico รุ่นเดิม ทั้งคู่มาพร้อมกับไมโครคอนโทรลเลอร์  RP2040 dual-core Cortex-M0+ แต่เพิ่ม Pico W เพิ่มโมดูล Wireless รองรับการเชื่อมต่อ WiFi 4 และ Bluetooth LE 5.2 (แต่ไม่ได้เปิดใช้งาน Bluetooth ในขณะนี้ และคาดว่าจะเปิดใช้งานในอนาคตต่อไป)

บริษัทได้ส่ง Raspberry Pi Pico W เพื่อทดสอบ/ประเมินผล ในบทความนี้ และฉันจะเน้นการทดสอบที่เกี่ยวข้องกับ WiFi เนื่องจาก Raspberry Pi Pico W รองรับ MicroPython และ C/C++ SDK เหมือนกับบอร์ด Raspberry Pi Pico และ API อื่นๆ สำหรับการเชื่อมต่อแบบ Wireless

แกะกล่อง Raspberry Pi Pico W

การเริ่มใช้งาน-Raspberry-Pi-Pico-W

บอร์ด Raspberry Pi Pico W ที่ฉันได้รับถูกตัดจากม้วน/เทป 480 ชิ้น และฉันยังได้รับสายไมโคร USB เป็น USB ยาว 1 เมตร หากคุณสั่งซื้อบอร์ดราคา $6 (~210฿) น่าจะไม่รวมอยู่ด้วย

รีวิว-Raspberry-Pi-Pico-W

บอร์ดจะมีขนาดจิ๋วเท่ากับรุ่นเดิม, และพินเอาต์เหมือนกับบอร์ด RP2040 รุ่นแรก,  และยังมีการทำเครื่องหมายไว้ที่ด้านล่างของบอร์ดอย่างชัดเจน

Raspberry-Pi-Pico-W-PCB-markings

การเชื่อมต่อ Raspberry Pi Pico W เข้ากับคอมพิวเตอร์

เริ่มใช้งาน-Raspberry-Pi-Pico-W

เมื่อเราเชื่อมต่อบอร์ดกับโฮสต์แล้ว บอร์ดจะแสดงในคอมพิวเตอร์เป็นไดรเวอร์ RPI-RP2 แล็ปท็อปของฉันแม้ว่าจะใช้งาน Ubuntu 20.04 แต่ก็เหมือนกับที่ใช้บน Windows หรือ macOS

RPI-RP2-folder

มีสองไฟล์ในไดรเวอร์ RPI-RP2 ที่มี INFO_UF2.txt สำหรับเวอร์ชัน bootloader ของ UF2 และรุ่นของบอร์ด และ  INDEX.HTM ซึ่งเปลี่ยนเส้นทาง ไปยังเอกสารประกอบของ Pico บนเว็บไซต์ Raspberry Pi ไม่มีอะไรเปลี่ยนแปลงที่นี่จริงๆ

นี่คือผลลัพธ์จากบันทึกเคอร์เนล สำหรับการอ้างอิง:

WiFi พร้อม MicroPython

Raspberry Pi Pico และ Pico W ใช้ bootloader เดียวกัน แต่เฟิร์มแวร์ MicroPython นั้นแตกต่างกัน ฉันคิดว่าอาจเป็นเพราะความแตกต่างของฮาร์ดแวร์เล็กน้อย (เช่น การเชื่อมต่อ LED ของผู้ใช้) แต่เนื่องจากการเพิ่มสแต็ก WiFi ลงใน Raspberry Pi Pico นั้นไม่สมเหตุสมผล เนื่องจาก Pico ไม่มี WiFi และ การเพิ่มอาจเป็นการสิ้นเปลืองพื้นที่จัดเก็บและหน่วยความจำอันมีค่าของ Pico ในไมโครคอนโทรลเลอร์ที่มีข้อจำกัดด้านทรัพยากร

เราสามารถค้นหาไฟล์เฟิร์มแวร์ที่ถูกต้องบน เว็บไซต์ Raspberry Pi หรือสามารถดาวน์โหลดได้โดยตรงดังนี้:


เมื่อเราดาวน์โหลดแล้ว เพียงคัดลอก rp2-pico-w-latest.uf2 ไปยังไดรฟ์ RPI-RP2…

rp2-pico-w-latest-uf2

หลังจากคัดลอกเสร็จแล้ว ไดรฟ์จะหายไป และ Raspberry Pi Pico W จะแสดงเป็นอุปกรณ์ซีเรียล:


Raspberry Pi Pico W สามารถตรวจพบได้ใน BootTerm (หรือเครื่องมืออื่นๆ เช่น Putty, minicom, tio ฯลฯ…):


หากเราเชื่อมต่อกับอุปกรณ์ซีเรียล เราจะเข้าสู่อินเทอร์เฟซ REPL ซึ่งตอนนี้เราสามารถพิมพ์คำสั่งบางอย่างเพื่อแสดงรายการจุดเข้าใช้งาน 2.4 GHz:


ยอดเยี่ยม! มันใช้งานได้ เนื่องจากฉันอาศัยอยู่ในพื้นที่ชนบท จึงตรวจพบจุดเชื่อมต่อที่มองเห็นได้เพียงจุดเดียวเท่านั้น อีกค่าหนึ่ง (“) คือ SSID ที่ซ่อนอยู่ซึ่งเปิดใช้งานบนเราเตอร์ Xiaomi ของฉัน ตามเอกสารของ MicroPython API ค่าอื่นๆ อีกห้าค่าสำหรับ bssid หมายเลขช่องสัญญาณ RSSI โหมดตรวจสอบสิทธิ์ และสถานะที่ซ่อนอยู่ตามลำดับ แต่ตัวเลขสองตัวสุดท้ายอยู่นอกช่วง:

ความปลอดภัยมีห้าค่า:

  • 0 – open
  • 1 – WEP
  • 2 – WPA-PSK
  • 3 – WPA2-PSK
  • 4 – WPA/WPA2-PSK

และสถานะที่ซ่อนอยู่:

  • 0 – มองเห็นได้
  • 1 – ซ่อน

ต่อไป มาดูเอกสารประกอบคำแนะนำ “การเชื่อมต่ออินเทอร์เน็ต” สำหรับบอร์ด วิธีที่ง่ายที่สุดในการอัปเดตโค้ดเพื่อติดตั้งโปรแกรมตัวแก้ไข Thonny ก่อน:


หลังจากไปที่ Run->Select Interpreter และเลือก “MicroPython (Raspberry Pi Pico)” เราสามารถเรียกใช้โปรแกรม MicroPython ก่อนหน้าใน Thonny IDE ได้โดยไม่มีปัญหาใดๆ

Thonny-IDE-Raspberry-Pi-Pico-W

ตอนนี้เราเชื่อมต่อกับ CNX_Software_Xiaomi SSID โดยใช้:


aspberry-Pi-Pico-W-MicroPython-WiFi-connection

จากด้านบนคุณจะเห็นว่า Raspberry Pi Pico W ของฉันมีที่อยู่ IP และฉันสามารถ ping ได้สำเร็จ:


สำหรับการอ้างอิง เราจะเห็นว่าปรากฏเป็น PYPB บนเว็บ:


เฟิร์มแวร์มาพร้อมกับการตั้งค่าระดับสากลที่ปลอดภัย แต่ผู้ใช้สามารถเปิดใช้งานช่องเพิ่มเติมได้โดยการตั้งค่าประเทศและภูมิภาค:


หากคุณพบบอร์ดที่ไม่สามารถเชื่อมต่อกับเราเตอร์ได้เนื่องจากช่องสัญญาณไม่พร้อมใช้งาน ไม่ต้องกังวล สิ่งนี้มีประโยชน์มากจริงๆ

กรณีใช้งานทั่วไปสำหรับบอร์ดประเภทนี้คือการมีเว็บอินเตอร์เฟสเพื่อควบคุม LED หรือ GPIO ตอนนี้เราเรียกใช้เว็บเซิร์ฟเวอร์เพื่อควบคุม LED ของผู้ใช้บนบอร์ด:


โค้ดนี้ค่อนข้างยาวเนื่องจากมีการจัดการข้อผิดพลาดอยู่ด้วย เราสามารถเห็นได้ว่ามันใช้งานได้ดีโดยดูวิดีโอสาธิตสั้นๆ ด้านล่างนี้

สามารถปรับเปลี่ยนโค้ดเพื่อควบคุมรีเลย์หรือ GPIO ได้อย่างง่ายดาย

นอกจากนี้ยังสามารถติดตั้งและเรียกใช้เครื่องมือ iperf3 ยอดนิยมบน Raspberry Pi Pico W:


รหัสค่อนข้างสั้นเพราะเราข้ามการจัดการข้อผิดพลาดสำหรับการเชื่อมต่อ นี่คือผลลัพธ์จากการทดสอบ benchmark เครือข่าย :


สิ่งนี้ค่อนข้างช้าสำหรับฉัน แม้ว่าประสิทธิภาพบางอย่างจะไม่ใช่ข้อกำหนดหลักสำหรับแพลตฟอร์มประเภทนี้ อันที่จริง เกณฑ์มาตรฐานนี้อาจเป็นเรื่องปกติของฮาร์ดแวร์ดังกล่าว สำหรับข้อมูลอ้างอิง Damien George หัวหน้านักพัฒนาของ MicroPython ได้  ทำการทดสอบบนบอร์ด Pyboard D-series แล้วด้วยความเร็ว ประมาณ 7 Mbits/วินาที

อันที่จริง Raspberry Pi Pico W ยังสามารถใช้เป็นจุดเชื่อมต่อสำหรับไคลเอ็นต์ได้ถึงสี่เครื่อง ฉันไม่พบบทช่วยสอนใด ๆ ใน MicroPython แต่มีคำแนะนำสำหรับ ESP8266 และ ESP32 ดังนั้นตอนนี้ให้ลองตั้งค่า CNX-PICO SSID ต่อไปนี้และเชื่อมต่อจากโทรศัพท์:


ข่าวดีก็คือ Raspberry Pi Pico W ของฉันคือจุดเชื่อมต่อ (AP) ในตอนนี้ แต่สิ่งที่แย่คือการกำหนดค่า ssid แบบกำหนดเองไม่ทำงาน แต่บอร์ดจะสร้างการเชื่อมต่อเครือข่ายแบบเปิดโดยอัตโนมัติ ใน ชื่อจุด – PICO349B

ตั้งค่า-access-point-Raspberry-Pi-Pico-W

ดังนั้น API จึงแตกต่างออกไป หรือเฟิร์มแวร์ Raspberry Pi Pico W MicroPython ยังไม่รองรับชื่อจุดเข้าใช้งานที่กำหนดเอง

การใช้ WiFi บน Raspberry Pi Pico W ด้วยการเขียนโปรแกรม C

ตอนนี้ มาลองทำซ้ำตัวอย่างโค้ดด้านบนด้วย C/C++ SDK หากคุณยังไม่ได้ลองสิ่งนี้ คุณจะต้องตั้งค่า SDK เหมือนกับที่เราทำกับบอร์ด Raspberry Pi Pico และรับตัวอย่างในคอมพิวเตอร์ Linux หรือบอร์ด Raspberry Pi:


ขณะนี้เรามีไดเรกทอรีใหม่สำหรับ Pico W:


นี่คือตัวอย่างโค้ดสำหรับการสแกน WiFi:


สิ่งนี้ซับซ้อนกว่าตัวอย่าง MicroPython ด้านบนเล็กน้อย ตอนนี้เราเตรียมระบบเพื่อสร้างตัวอย่าง C:


เราจำเป็นต้องเปลี่ยน SSID และรหัสผ่านให้ตรงกับรหัสผ่านในเครือข่าย ต่อไปนี้คือผลลัพธ์ของคำสั่ง เพื่อการอ้างอิงเท่านั้น:


ตอนนี้เราสามารถสร้างตัวอย่าง wifi_scan ได้แล้ว:


ผลลัพธ์ค่อนข้างยาว แต่โดยพื้นฐานแล้วควรเริ่มต้นและสิ้นสุดดังนี้:


บิลด์จะสร้างไฟล์จำนวนมาก รวมถึงไฟล์ UF2 ที่เราจะใช้เพื่อคัดลอกไปยังบอร์ด:


เนื่องจากเรามีเฟิร์มแวร์ MicroPython ติดตั้งอยู่บนบอร์ดแล้ว ตอนนี้เราต้องกดปุ่ม BOOT และรีบูตบอร์ดเพื่อเข้าสู่โหมดที่เก็บข้อมูลขนาดใหญ่ และคัดลอก ไฟล์ picow_wifi_scan_poll.uf2 ไปยังไดรฟ์ RPI-RP2

RPI-RP2-wifi-scan-program

ที่นี่ไดรฟ์หายไป จากนั้นจำเป็นต้องรีบูตและโปรแกรมเริ่มทำงานโดยอัตโนมัติ และฉันยังสังเกตเห็นว่าบอร์ดไม่แสดงเป็นอุปกรณ์ซีเรียลอีกต่อไป เหตุผลหลักคือเราต้องเข้าถึงคอนโซลอนุกรมผ่านพิน UART ของ Raspberry Pi Pico W (พิน 1 Tx, พิน 2 Rx และพิน 3 GND) ดังนั้นฉันจึงบัดกรีส่วนหัวสั้น ๆ บนหมุดที่เกี่ยวข้องบน Raspberry Pi Pico W และใช้บอร์ด USB เป็น TTL เพื่อเชื่อมต่อกับแล็ปท็อปของฉัน แต่ถ้าพวกคุณใช้ Raspberry Pi SBC เพื่อตั้งโปรแกรมบอร์ด Pico W คุณสามารถเปลี่ยน UART ไปยังส่วนหัว GPIO 40 พิน

Raspberry-Pi-Pico-W-UART-serial-console

ตอนนี้ฉันสามารถใช้ BootTerm และดู CNX_Software_Xiaomi SSID และ SSID ที่ซ่อนอยู่ในเราเตอร์ถูกตรวจพบอย่างถูกต้อง:


การสแกนจึงใช้งานได้ แม้ว่าจะแสดง SSID เดียวกันหลายครั้ง ตอนนี้ เราสามารถลองเชื่อมต่อกับเราเตอร์ WiFi ของเราโดยใช้ตัวอย่างต่อไปนี้ใน wifi_connect/wifi_connect.c (ตัวอย่างจากเอกสาร Pico W):


เพียงตรวจสอบให้แน่ใจว่าคุณได้เปลี่ยนค่า ssid ค่าที่ส่งผ่าน และประเทศ (เช่น: CYW43_COUNTRY_TH) ต่อไปเราต้องการ ไฟล์ CMakeLists.txt :


นอกจากนี้ จำเป็นต้องคัดลอกไฟล์พิเศษบางไฟล์ไปยังไดเร็กทอรีการทำงานด้วย:


ตอนนี้คุณควรจะได้โฟลเดอร์ที่มีสี่ไฟล์:


ตอนนี้เราสามารถสร้างโปรแกรมได้เหมือนที่เคยทำ:


หากมีสิ่งผิดปกติเกิดขึ้นระหว่างขั้นตอน cmake ให้แก้ไขไฟล์ CMakeLists.txt และลบไฟล์ทั้งหมดในโฟลเดอร์บิลด์ จากนั้นรันคำสั่ง cmake อีกครั้ง

เนื่องจากฉันอยู่ในประเทศไทย ตอนแรกฉันคิดว่า CYW43_COUNTRY_TH น่าจะใช้ได้ แต่ผลที่ได้คือผิด!


หากคุณกำลังประสบปัญหานี้เช่นกัน ไดเร็กทอรีประเทศที่พร้อมใช้งานจะมีอยู่ใน pico-sdk/lib/cyw43-driver/src/cyw43_country.h นี่เป็นข้อความที่ตัดตอนมาที่คุณสามารถตรวจสอบได้:


หลังจากที่ฉันเปลี่ยนไปใช้ CYW43_COUNTRY_THAILAND ฉันก็สามารถสร้างให้เสร็จได้ ไฟล์ UF2 ที่เราต้องการมีลักษณะดังนี้:


ตอนนี้เราแฟลชไปที่บอร์ดตามปกติและดูว่าเราสามารถเชื่อมต่อกับเราเตอร์ได้จริงหรือไม่:


มีการพิมพ์ข้อมูลไม่มากนักที่นี่ แต่อย่างน้อยโปรแกรมก็ทำงานโดยไม่มีข้อผิดพลาด หากคุณต้องการใช้ C บน Raspberry Pi Pico W อาจต้องใช้เวลาสักครู่ในการเรียนรู้ รวมถึงการเรียนรู้ CYW43 API ใหม่ ไลบรารี LWiP และแม้แต่การใช้ FreeRTOS สำหรับตัวอย่างที่ซับซ้อนยิ่งขึ้น

เนื่องจากขณะนี้ยังไม่มีโค้ดตัวอย่างสำหรับควบคุม LEDs ผ่านหน้าเว็บ เรามาดูตัวอย่าง iperf กันก่อน ก่อนอื่นเราไปที่โฟลเดอร์  /pico-examples/build/pico_w/iperfและสร้างตัวอย่าง:


ในกรณีนี้เรามีไฟล์ UF2 สองไฟล์:


เราต้องการดูรหัสที่เลือกผ่าน PICO_CYW43_ARCH_POLL:

  1. PICO_CYW43_ARCH_POLL = 1 – หากคุณใช้ pico_cyw43_arch_poll คุณต้องสำรวจเป็นระยะจากลูป (loop) หลักของคุณ (ไม่ใช่จากตัวจับเวลา) เพื่อตรวจสอบไดรเวอร์ WiFi หรืองาน lwIP ที่ต้องทำ
  2. PICO_CYW43_ARCH_POLL != 1 – หากคุณไม่ได้ใช้ pico_cyw43_arch_poll แสดงว่าไดรเวอร์ WiFI และ lwIP จะต้องดำเนินการโดยใช้การขัดจังหวะพื้นหลัง แน่นอนว่าการนอนหลับนี้เป็นเพียงตัวอย่างบางส่วนเท่านั้น

การใช้การโพล (polling) หรือ interrup ของโปรแกรมเป็นแนวทางการเขียนโปรแกรมที่แตกต่างกันสองวิธี โดยทั่วไปการ interrup ของโปรแกรมจะมีประสิทธิภาพมากกว่า แต่ซับซ้อนกว่า ที่นี่ฉันเพิ่ง คัดลอก picow_iperf_server_background.uf2ไปยังบอร์ดเพื่อทำการทดสอบ โปรดทราบว่าการใช้งานจะขึ้นอยู่กับ iperf2 ไม่ใช่ iperf3 เช่น MicroPython เซิร์ฟเวอร์ iperf สามารถทำงานบน Raspberry Pi Pico W ได้ดังนี้:


ตอนนี้เรารันไคลเอนต์ iperf บนแล็ปท็อป:

ผลลัพธ์ของการทำงานคือ 8 Mbps ซึ่งดีกว่าเมื่อรันด้วย MicroPython เล็กน้อย แต่ยังอยู่ในช่วงเดียวกัน ผลลัพธ์จะแสดงในคอนโซลซีเรียล Pico W ด้วย:

หากคุณต้องการเรียกใช้ตัวอย่างฝั่งไคลเอ็นต์ iperf บน Pico W คุณต้องเพิ่มสองบรรทัดต่อไปนี้หลังชื่อ:

“คู่มือเริ่มต้นใช้งาน” นี้ให้ความรู้สึกเหมือนยาวและยาวกว่าที่ฉันคาดไว้ในตอนแรก ดังนั้นฉันจึงข้ามส่วนนี้ไป

ตอนนี้ มาดูบทแนะนำเกี่ยวกับ WiFi โดยใช้การสาธิตจุดเข้าใช้งานของ Raspberry Pi Pico W ก่อนสร้างตัวอย่าง ให้ดูโค้ดใน pico-examples/pico_w/access_point/picow_access_point.c:


ในฟังก์ชัน main() ส่วนนี้เราจะเห็น SSID เริ่มต้น (จุดเข้าใช้งาน name0 คือ picow_test รหัสผ่านคือรหัสผ่าน (ความปลอดภัย WPA2) ซับเน็ตคือ 192.168.4.0 โปรแกรมนี้จะเริ่มเซิร์ฟเวอร์ DHCP ให้ไคลเอ็นต์รับ ที่อยู่ IP หากตั้งรหัสผ่านเป็น NULL ควรเป็นเครือข่ายแบบเปิด ดังนั้นฉันจึงเปลี่ยน ap_name เป็น picow_cnxsoft และรหัสผ่านเป็น 123456…


ตอนนี้สร้างตัวอย่างตามปกติและ คัดลอก picow_access_point_poll.uf2หรือpicow_access_point_background.uf2ไปที่บอร์ด นี่คือเอาต์พุตเทอร์มินัล:


โปรดทราบว่าเซิร์ฟเวอร์บนพอร์ต 80 ไม่ใช่เว็บเซิร์ฟเวอร์ แต่เป็นเซิร์ฟเวอร์ TCP พื้นฐาน ซึ่งฉันคิดว่าควรมีจุดประสงค์หลักเพื่อใช้กับตัวอย่างไคลเอนต์ TCP ที่ติดตั้งบน Raspberry Pi Pico อื่น

อย่างไรก็ตาม ฉันยังสามารถเชื่อมต่อโทรศัพท์กับจุดเข้าใช้งาน picow_cnxsoft…

Raspberry-Pi-Pico-W-access

ยังทำงานในแล็ปท็อป Ubuntu ของฉัน

Raspberry-Pi-Pico-W-access-point-Ubuntu-client

อุปกรณ์ทั้งสองนี้ยังปรากฏในเทอร์มินัลอนุกรมของ Raspberry Pi Pico W:


เอกสารประกอบสำหรับ Raspberry Pi Pico W นั้นดีจริง ๆ สำหรับการเริ่มต้นใช้งาน WiFi แต่ไม่สมบูรณ์ เช่น ขณะนี้ยังไม่มีโค้ดตัวอย่างสำหรับการตั้งค่าจุดเชื่อมต่อใน MicroPython อีกตัวอย่างหนึ่งคือฉันต้องดูโค้ดใน C/C++ SDK ไม่ใช่เอกสาร เพื่อค้นหาการตั้งค่าสำหรับประเทศและภูมิภาคที่เกี่ยวข้อง อย่างไรก็ตาม ฉันคิดว่าคนส่วนใหญ่จะใช้ MicroPython ในบอร์ดพัฒนานี้ก่อน เพราะ C/C++ SDK นั้นยืดหยุ่นกว่า แต่จะเรียนรู้ได้ยากและใช้เวลานานกว่ามาก

แปลจากบทความภาษาอังกฤษ : Getting started with WiFi on Raspberry Pi Pico W board

Subscribe
Notify of
guest
0 Comments
Inline Feedbacks
View all comments
โฆษณา