การทดลอง: วัดความเร็วการส่งข้อมูลผ่าน ESPNow

วัดความเร็วของ โพรโตคอล ESPNow และอ่านข้อมูลจาก Serial Port ด้วย NodeJS

Nat
Chiang Mai Maker Club
3 min readSep 13, 2017

--

หลังจากที่เราทดลองใช้ ESPNow กันมาสักระยะนึง ก็ได้ฤกษ์มาวัดความสามารถสูงสุดของตัวโพรโตคอลว่า… จะส่งได้ถี่สุดได้เท่าไหร่ ใช้พลังงานขนาดไหน… แต่บทความนี้จะทดสอบคร่าวๆ เกี่ยวกับความเร็วในการส่งข้อมูลก่อนนะครับ

บทความนี้คงจะเป็นบทความที่น่าเบื่อในสามโลก… มันจะออกแนวโพสไว้เตือนใจ ๕๕๕ ข้อมูลเชิงสถิติ หรือการทดลองที่ละเอียดกว่านี้คงเขียนถึงอีกทีครับ…

ESP-Now คืออะไร?

ESP-Now เป็นโพรโตคอลที่พัฒนาโดย Espressif system ครับ การติดต่อสื่อสารนั้นไม่จำเป็นต้องมีตัวกลางอย่างเช่น Access Point หรือ Router เลยครับ สามารถเชื่อมต่อกันตรงๆได้เลย การเชื่อมต่อกัน สามารถทำได้ทั้งระบุ และไม่ระบุ key ครับ เหมาะสำหรับทำ remote controll สั่งเปิด — ปิด หรี่ไฟเป็นต้น ตัวโพรโตคอลใช้ความถี่ที่ 2.4GHz ครับ การส่งข้อมูลทำได้รวดเร็ว

ความสามารถ

  • Encrypted and unencrypted unicast communication.
  • สื่อสารได้ทั้งอุปกรณ์ที่เข้ารหัส และไม่ได้เข้ารหัส
  • ส่งข้อมูลได้ครั้งละ 250 byte ต่อครั้ง (payload)
  • มี callback function ที่แจ้งเตือนเมื่อส่งข้อมูลออกไปว่า สำเร็จหรือไม่

ข้อจำกัด

  • ยังไม่รองรับการสื่อสารแบบ broadcast
  • จำกัด encrypted peers ได้แค่ 10 เท่านั้น ถ้า unencrypted ได้ถึง 20 ตัวครับ
  • Payload หิ้วไปได้ครั้งละ 250byte

ผู้ที่สนใจสามารถหาข้อมูลเพิ่มเติมได้ที่ “Introduction to the ESP-Now” นะครับ

ทดลอง รับ — ส่ง — อ่านค่า

บทความนี้จะพูดถึงการทดลองเลยครับ.. ไม่อธิบายโค๊ดแล้วเนอะ พูดกันที่โค๊ดอย่างเดียวเลย… แล้วก็สรุปผลกันเลยครับ ซึ่งการทดลองนี้ Hardware จะใช้ ESPresso Lite 2.0 และ NodeWiFi เป็นตัวทดสอบครับ

ESPresso Lite 2.0 — ESP826 (ซ้าย) NodeWiFi — ESP8285 (ขวา)

Code ฝั่งส่ง (Slave)

โค๊ดไม่มีอะไรมากครับ ให้ delay 2ms นั่นแปลว่า
ใน 1 วินาที จะทำงาน 1000ms/2ms = 500 ครั้งนั่นเองครับ และจะใช้ฟังก์ชั่น esp_now_send ส่งข้อมูลไปยัง master node ครับ

การจับเวลา

ผมใช้ Ticker เข้ามาเป็น Timer คอยนับค่าทุกๆ 1 วินาที นับค่าจาก Callback ของ ESPNow โดยที่ไม่สนใจว่าจะ สำเร็จ หรือล้มเหลวครับ…

โค๊ดฝั่งรับ (Controller)

โค๊ดฝั่งรับทำเช่นเดียวกันครับ มี Timer ที่ทำงานทุกๆ 1 วินาที.. แล้วก็คอยเคลียร์ค่าที่รับมาได้.. แต่จะพิเศษนิดนึงคือ ถ้ากด GPIO 0 ค้างไว้ตอนโปรแกรมรันอยู่ จะส่งออกไปทาง Serial Port ด้วยครับ

Code ฝั่ง Bridge ข้อมูลจาก Serial Port

ส่วนนี้ผมเขียนด้วย NodeJS ครับ… และหลังการทดลองพบว่าเราส่ง packet ขนาด ~41bytes ฝั่ง ESP8266 ทำความเร็วได้ประมาณ 480Hz แบบนิ่งๆเลย แต่ถ้าเขียนออก Serial Port ที่ baudrate 115200 จะส่งข้อมูลไม่ทัน และ WDT Reset เลยครับ จึงต้องปรับขึ้นไปเป็น baudrate 230400 ครับ

ผลการรันโปรแกรม

ถ้าไม่กด GPIO0 นั่นคือ ไม่ให้ทำ I/O Serial.write ความถี่ที่ทำได้คือ ~480Hz ค่อนข้างนิ่งเลย

แต่พอกด GPIO0 แล้วก็พบว่า ความเร็วในการรับข้อมูลจาก ESPNow ยังคงได้ 480packets/s นั่นคือ 19680 bytes/sแต่ข้อมูลจาก Serial Port มีความไม่สม่ำเสมออยู่บ้าง.. ตามข้อมูลข้างล่าง…

บทสรุป

วันนี้เราทดสอบโพรโตคอล ESPNow รับส่งข้อมูลด้วยความเร็วสูง ขนาด packet ประมาณ 41bytes พยายามส่งข้อมูล ทุกๆ 2ms (500Hz)

พบว่าส่งได้ประมาณ 480Hz แล้วก็ส่งผ่าน SerialPort ที่ Baudrate 230400 ได้ความเร็วประมาณ 19229.444 B/s (เฉลี่ยนิดเดียวนะครับ)

ก็ประมาณนี้ก่อนครับ…

--

--