รีวิว “MaUWB_DW3000 with STM32 AT Command” – ทดสอบบอร์ด UWB ด้วย Arduino

สวัสดีครับ อุปกรณ์ที่ผมจะรีวิววันนี้คือ MaUWB_DW3000 with STM32 AT Command ครับ โดยอุปกรณ์นี้เป็นมอดูลอัลตราไวด์แบนด์ (ultra-wideband : UWB) จาก MakerFabs ซึ่งมีไมโครคอนโทรเลอร์ ESP32 และพร้อมหน้าจอ OLED รวมทั้งใช้มอดูล DW3000 Transceivers เป็นมอดูลหลักสำหรับการทำงานด้าน UWB เว็บไซต์ของผู้ผลิตรายงานว่าบอร์ดชุดนี้สามารถทำงานในโหมด multi-tags+multi-anchors ได้สูงสุด 8 anchors และ 64 tags  โดยบอร์ดรุ่นนี้จะมี STM32F103RCT6 ควบคุมการทำงานของมอดูล DW3000 ซึ่งเราจะควบคุมการทำงานของมอดูล UWB เช่น การตั้งโหมดการทำงานระหว่าง anchor และ tag ได้ด้วยการส่ง AT command จาก ESP32 ไปยัง STM32 สำหรับคุณสมบัติอื่น ๆ สามารถอ่านเพิ่มเติมได้จากเว็บไซต์และ WiKi ของผู้ผลิต

เปิดกล่องและทดลองใช้งาน

ผู้ผลิตส่งพัสดุมาให้ผมจากจีน ภายในมีมอดูล MaUWB_DW3000 with STM32 AT Command แยกมาให้จำนวน 4 ชุด ภายในมีบอร์ด, แบตเตอรี่ 3.7V 600 mAh, male pin header 2.54mm 12P มาให้ 2 แผง นอกจากนั้นก็ยังมีแบตเตอรี่สำรองมาเพิ่มให้อีก 4 ชุด และ ST-LINK V2 สำหรับการ upload firmware ให้กับ STM32 ครับ

UWB board with Arduino unboxing
อุปกรณ์ที่ได้รับ
UWB board male pin header 2.54 batter
รายการอุปกรณ์ภายในถุงซีล
UWB board with Arduino front
ด้านหน้าของบอร์ด MaUWB_DW3000 with STM32 AT Command
MaUWB_DW3000 with STM32 AT Command UWB board with Arduino
ด้านหลังของบอร์ด MaUWB_DW3000 with STM32 AT Command

ตัวบอร์ดมี silkscreen สีแดง ด้านบนเป็นมอดูล ESP32-WROVER-B ด้านข้างมอดูลจะเป็นช่องสำหรับบัดกรี pin header ฝั่งละ 12 ขา และจอ OLED แบบ 128×64 พิกเซล รวมทั้งมีปุ่ม RST และ FLASH อยู่ข้าง ๆ USB Type-C connector ซึ่งเราสามารถเสียบแบตเตอรี่ได้ด้วย JST connector ที่อยู่ด้านบนนี้ครับ บริเวณมุมของบอร์ดมีรูขนาด M3 เอาไว้ให้เราวาง support ได้ 4 จุดครับ สำหรับตัวมอดูล MaUBW-DW3000 และองค์ประกอบอื่น ๆ ก็จะอยู่ด้านล่างของบอร์ดครับซึ่งมีสกรีนว่า ESP32 AT UWB Pro with Display v1.1

ทดสอบการใช้งานครั้งแรก

ผมลองนำบอร์ดมาเสียบสาย USB Type-C เข้ากับคอมพิวเตอร์ พบว่าบอร์ดทำงานได้ทันที โดยไฟแสดงสถานะที่สำคัญจะประกอบด้วย LD9 (สีเขียว) ที่อยู่ด้านบนนั้นจะติดเมื่อเราเสียบและจ่ายไฟผ่านสาย USB  ซึ่ง LD9 นี้จะไม่ติดถ้าเราจ่ายพลังงานด้วยแบตเตอรี่ เราสามารถชาร์จแบตเตอรี่ได้ด้วยการเสียบสาย USB โดยไฟ LD8 (สีแดง) ที่อยู่ต่ำลงมาจะติดค้างระหว่างการชาร์จและจะดับเมื่อชาร์จเรียบร้อย ด้านหลังจะมี LED หลายดวง เช่น PWR LED สีเขียวสำหรับแสดง power status ของบอร์ด, รวมถึงมี LED สีแดง และสีฟ้าซึ่งจะกระพริบเมื่อมีการสื่อสารกับมอดูล UWฺB

USB Type-C UWB board with Arduino
การจ่ายพลังงานผ่านสาย USB Type-C

เมื่อตรวจสอบข้อมูลที่ส่งออกมาจาก firmware ทาง Serial port ก็พบว่าบอร์ดรายงานข้อมูลต่าง ๆ ตามรายละเอียดด้านล่างนี้ คร่าว ๆ คือมอดูลนี้ใช้ firmware เวอร์ชัน 1.0.8 ตั้งค่าโหมดการทำงานเป็น T0 และกำหนด refresh rate ไว้ที่ 15Hz

ควบคุมการทำงานด้วย AT Command

เราสามารถควบคุมการทำงานของมอดูลได้ด้วยการส่ง AT command ไปให้บอร์ดทาง Serial port ได้หลายคำสั่ง โดยเอกสารอ้างอิงเวอร์ชัน 1.0.7 จากหน้า GitHub ของผู้ผลิต แสดงรายการ AT commands ทั้งหมด 15 คำสั่ง ซึ่งพอจะจัดเป็นกลุ่มได้ดังนี้

  • ทดสอบการสื่อสาร
  • อ่านค่าเวอร์ชัน
  • รีสตาร์ทมอดูล
  • อ่านค่า/บันทึกค่า configuration
  • อ่านค่า/ตั้งค่า role play
  • อ่านค่า/ตั้งค่า antenna delay
  • อ่านค่า/ตั้งค่า capacity
  • อ่านค่า/ตั้งค่า report
  • สั่งให้มอดูลรายงาน
  • SLEEP

ในบรรดาคำสั่งพวกนี้ จะมีคำสั่งที่ผมต้องใช้บ่อยที่สุดคือคำสั่ง AT+SETCFG ซึ่งจะใช้เพื่อกำหนดโหมดการทำงานและ ID ประจำอุปกรณ์ โดยมีรูปแบบของคำสั่งเป็น AT+SETCFG=x1,x2,x3,x4 โดยที่

  • x1 เป็นไอดีของอุปกรณ์ (0 – 7 สำหรับ anchor, 0-63 สำหรับ tag),
  • x2 เป็นโหมดการทำงาน (0 หมายถึง tag, 1 หมายถึง anchor),
  • x3 เป็นอัตราการสื่อสารข้อมูล (0 หมายถึง 850kbp, 1 หมายถึง 1.68Mbps) และ
  • x4 หมายถึงการใช้งานฟิลเตอร์กรอบค่าระยะทาง (0 หมายถึงปิดการใช้งาน, 1 หมายถึงเปิดใช้งาน)

การเตรียมคลังโปรแกรมสำหรับการเขียนโปรแกรม

เว็บไซต์ของผู้ผลิตมีขั้นตอนการเตรียมโปรแกรมและคลังโปรแกรมต่าง ๆ ไว้ให้ ทำตามได้ง่ายมากครับ ผู้ผลิตแนะนำให้ใช้ Arduino IDE เวอร์ชัน 1.8.10/1.8.19 แต่ผมก็สามารถใช้ 2.2.1 ที่ติดตั้งไว้แล้วได้โดยไม่พบปัญหาอะไร หลังจากนั้นผมจึง Clone ข้อมูลจาก Github ของผู้ผลิต เสร็จแล้วติดตั้ง ESP32 Board ซึ่งการรีวิวนี้ผมใช้เวอร์ชัน 2.0.3 ที่มีอยู่แล้ว ตามด้วยการติดตั้ง Adafruit SSD1306 Libraryเวอร์ชันล่าสุด โดยการติดตั้ง Library นี้ผมได้ตั้งค่า Sketchbook Location ให้มาใช้โฟล์เดอร์ที่กำหนดเองเพื่อทดสอบว่าจะมีการเรียกหา Library อื่นอีกหรือไม่ ซึ่งนอกจาก Adafruit GFX Library และ Adafruit BusIO แล้วก็ไม่พบว่าต้องติดตั้งอะไรเพิ่มเติมอีก ขั้นตอนสุดท้ายก็คือเลือกบอร์ดเป็น ESP32 Dev Module ตามคำแนะนำของผู้ผลิต

Library UWB board with Arduino
การติดตั้ง Library และการเลือกบอร์ด

ทดสอบการทำงานในโหมด One Tag + One Anchor

การทดสอบแรกเป็นการทดสอบการทำงานในโหมด One Tag + One Anchor ซึ่งการทำงานในโหมดนี้เราจะต้องมีมอดูลที่ทำหน้าที่ anchor และ tag อย่างละ 1 ตัว สำหรับการเขียนโปรแกรมเพื่อให้มอดูลทำหน้าที่เป็น tag นั้นทำได้ด้วยการเปิดไฟล์ examples/esp32_at_t0/esp32_at_t0.ino ซึ่งตอนนี้ผมไม่ได้แก้ไขอะไร เพียงแค่เลือก port สำหรับการ upload ให้ถูกต้องแล้วกดปุ่ม upload โปรแกรมได้เลย ในกรณีของผมพบว่าผมสามารถคอมไพล์และ upload ได้โดยไม่มีปัญหาอะไร และบอร์ดทำงานได้ตามปกติ สำหรับการทำให้มอดูลทำงานในโหมด anchor นั้นทำได้ง่ายเช่นเดียวกันเพียงแค่เปิดไฟล์ examples/esp32_at_a0/esp32_at_a0.ino แล้ว upload ได้ทันทีเช่นเดียวกัน โดยค่า default ของโปรแกรมทั้งสองตัวจะตั้งค่าให้มอดูลที่ทำหน้าที่ tag มี ID เป็น T0 และตัวที่ทำหน้าที่เป็น anchor  จะมี ID เป็น A0

เมื่อ upload เสร็จแล้วเปิดหน้าต่าง Serial monitor จะได้ผลตามตัวอย่างในภาพด้านล่าง มอดูลทางซ้ายมือทำหน้าที่เป็น T0 และทางขวามือเป็น A0 ผมพบว่าทั้งสองบอร์ดรายงานข้อมูลเหมือนกัน ข้อมูลที่สำคัญในแต่ละแถวจะประกอบด้วย tid ซึ่งเป็น ID ของ tag ที่รายงานข้อมูลบรรทัดนี้, ค่า range และ rssi ซึ่งเป็นรายการของระยะทาง (เซนติเมตร) และความแรงของสัญญาณ (dBm) ระหว่าง tag กับ anchor ที่พบ โดย range และ rssi นี้จะเป็นลิสต์เรียงตามลำดับ ID ของ anchor ซึ่งเราสามารถกำหนดให้บอร์ดรายงานข้อมูลนี้หรือไม่ก็ได้ด้วยคำสั่ง AT+RPT โดย 0 หมายถึงไม่รายงาน และ 1 หมายถึงรายงาน

Serial port UWB board with Arduino
ตัวอย่างข้อมูลที่มอดูลรายงานออกทาง Serial port

ทดสอบการทำงานในโหมด Multi Anchor + Multi Tag

การใช้งานแบบ single anchor + single tag จะให้ผลเป็นระยะทางและความแรงของสัญญาณเท่านั้น และหากเราต้องการใช้ข้อมูลเพียงแค่ระยะทางและค่า RSSI เราก็สามารถทำได้ด้วยการเพิ่ม anchor หรือ tag เข้าไปในระบบ โดยจะต้องกำหนดให้ ID ของมอดูลนั้นไม่ซ้ำกัน การตั้งค่า ID นั้นสามารถทำผ่านทาง Serial port ก็ได้ แต่ผมใช้การตั้งค่าในโค๊ด โดยในกรณีของ anchor นั้นทำได้ด้วยการแก้ไขบรรทัดที่ 57 โดยคำสั่งเดิม sendData(“AT+SETCFG=0,1,0,1”, 2000, 1); จะสั่งให้มอดูลทำหน้าที่เป็น anchor หมายเลข 0 แต่ถ้าเราต้องการกำหนดให้มอดูลนี้เป็น A1 ก็ได้เราเปลี่ยนเลข 0 ตัวแรกเป็น 1 ก็จะได้คำสั่งเป็น sendData(“AT+SETCFG=1,1,0,1”, 2000, 1); เป็นต้น สำหรับ code ตัวอย่างของ tag นั้นทำได้ง่ายกว่า เพียงแก้ไขค่าคงที่ UWB_INDEX ให้เป็นหมายเลขที่ต้องการเท่านั้น ตามตัวอย่างในภาพด้านล่างนี้

setting ID anchor and tag UWB board with Arduino
การตั้งค่า ID ของ (ซ้าย) anchor และ (ขวา) tag

อย่างไรก็ตาม ถ้าเราเพิ่ม anchor ให้มากขึ้นอีกเป็นรวมแล้วมี anchor อย่างน้อย 3 ตัว เราจะสามารถนำค่าระยะทางจาก tag ไปยัง anchor แต่ละตัวนั้นมาใช้เพื่อคำนวณตำแหน่งของ tag ได้ ซึ่งตัวอย่างที่ผู้ผลิตเตรียมให้เรานั้นเราจะต้องใช้โค๊ด examples/Indoor positioning/get_range/get_range.ino (พบผมว่าลิงค์ใน WiKi ตอนที่ผมรีวิวนี้ชี้ไปผิดไฟล์) ซึ่งจะมีฟังก์ชัน range_analy ที่รับสตริงอินพุตมาสกัดค่า range และ rssi แล้วรายงานข้อมูลออกไปทาง Serial port ตามตัวอย่างด้านล่าง เสร็จแล้วข้อมูลนี้จะถูกนำไปใช้งานต่อในโปรแกรม position.exe หรือ position.py ซึ่งจะทำหน้าที่วาดตำแหน่งของมอดูล tag /anchor ให้เราดู ซึ่งรายละเอียดเกี่ยวกับการทดสอบนี้จะยกลงไปรายงานในหัวข้อการทดสอบการคำนวณตำแหน่งครับ

การทดสอบการวัดระยะทาง

ภายในอาคาร

ผมทดสอบการรับส่งข้อมูลที่บริเวณชั้นล่างของอาคารคณะวิทยาการคอมพิวเตอร์และเทคโนลยีสารสนเทศ มหาวิทยาลัยราชภัฎรำไพพรรณี แต่ละห้องมีขนาดประมาณ 4×8 เมตรตามแผนภาพด้านล่าง ตัวหนังสือด้านบนของแต่ละห้องเป็นชื่อห้อง ส่วนที่เป็นผนังที่วาดด้วยสีดำทึบเป็นผนังปูนความหนาประมาณ 10 เซนติเมตร สำหรับผนังที่ผมวาดด้วยสีฟ้านั้นเป็นผนังที่เป็นผนังที่เป็นเฟรมอะลูมิเนียมและกระจกใส ในการทดลองนี้ผมวาง A0 ไว้ที่จุดสีแดงที่อยู่บริเวณมุมขวาล่างของห้อง Meeting Room แล้วถือ T0 ไปยังตำแหน่งต่าง ๆ ของจุดสีเหลืองในภาพ โดยตัวเลขสีน้ำเงินข้างจุดสีเหลืองคือค่าระยะทางและตัวเลขสีแดงคือค่า RSSI ที่ผมอ่านค่าได้ โดยรวม ๆ แล้วระยะทางจากตำแหน่งที่วาง A0 ไปถึงผนังด้านซ้ายสุดของภาพ (ผนังซ้ายของห้อง ST Room) จะมีระยะทางรวมประมาณ 44 เมตร

การทดสอบการวัดระยะภายในอาคาร
การทดสอบการวัดระยะภายในอาคาร

จากภาพจะเห็นว่าการวัดค่าภายในห้อง Meeting room ที่ A0 วางอยู่นั้นวัดค่าได้ทุกจุด การอ่านค่าทำได้สะดวกไม่ว่าจะวางอุปกรณ์อย่างไร (เพียงแต่อย่าลืมว่าทิศทางของอุปกรณ์จะมีผลต่อการคำนวณระยะทางและพิกัดด้วย) สำหรับการทดลองบริเวณห้อง GI1 และ GI2 นั้นก็ยังคงอ่านค่าได้ปกติเช่นเดียวกัน จากนั้นผมจึงไปทดลองต่อในห้อง D1 ซึ่งในกรณีนี้ผมยังคงอ่านค่าได้ทั้ง 4 มุมแต่เริ่มสังเกตพบว่ามอดูลเริ่มรายงานระยะติด ๆ ขัด ๆ ผมจะต้องหันอุปกรณ์ให้ถูกทิศทางจึงจะอ่านค่าได้ รวมทั้งค่า RSSI ที่ได้นั้นเริ่มจะไม่ค่อยเปลี่ยนแปลง โดยเฉพาะผนังฝั่งซ้ายของห้องนี้ ซึ่งจะมีค่า RSSI ที่รายงานเพียงสองค่าเท่านั้น คือ -90.52 dBm หรือไม่ก็เป็น -121.70 dBm

สำหรับห้อง CSIT Office นั้นผมทดลองอ่านค่าได้เฉพาะผนังด้านขวาเท่านั้นซึ่งมีีระยะทางประมาณ 21 เมตรจาก A0 โดยในกรณีนี้การสื่อสารระหว่างอุปกรณ์ทำได้ยาก ผมต้องพยายามจัดวางและหันอุปกรณ์ให้ดี และถึงแม้ว่าจะยังคงอ่านค่าระยะทางได้บ้างแต่ค่า RSSI นั้นกลับไม่ค่อยเปลี่ยนแปลงแล้ว เท่าที่พบคือมอดูลจะรายงาน RSSI ค่าเดียว คือ -121.70 dBm สำหรับส่วนอื่น ๆ ของห้องนี้และจุดที่เหลือที่ไม่มีตัวเลขกำกับนั้นมอดูลไม่สามารถสื่อสารได้ ไม่ว่าจะพยายามขยับการวางอุปกรณ์อย่างไรก็ตาม

การทดสอบภายนอกอาคาร

ผมทดลองวัดระยะทางและความแรงสัญญาณบริเวณด้านหน้าอาคารคณะวิทยาการคอมพิวเตอร์และเทคโนลยีสารสนเทศ โดยวาง A0 ไว้ที่ตำแหน่ง A และถือ T0 เดินไปอ่านค่าตามจุด P แต่ละจุดตามตัวอย่างในภาพ โดยในช่วง A ไปถึง P0 หรือเลยไปอีกเล็กน้อยซึ่งระยะทางไม่เกิน 20 เมตรนั้นค่า RSSI ยังคงอยู่ในระดับดีมีค่าประมาณ -81.93 dBm สามารถรับข้อมูลได้ง่าย ผมไม่ต้องสนใจทิศทางของอุปกรณ์มากนัก แต่เมื่อเริ่มเข้าใกล้ P1 หรือไกลออกไปเล็กน้อยในช่วงระยะประมาณ 30 ถึง 50 เมตรก็พบว่าเริ่มรับสัญญาณได้ยากขึ้น มีค่า RSSI ประมาณ -87.92 ถึง -90.52 dBm และผมจำเป็นต้องหันทิศทางให้ดีมอดูลจึงจะสามารถรายงานระยะทางได้ และเมื่อเลยไปในช่วง P2 ถึง P3 ซึ่งมีระยะไกลประมาณ 80 เมตรนั้นการรับสัญญาณเริ่มทำได้ยากมากขึ้นไปอีก ค่า RSSI เริ่มตกลงไปถึง -121.70 dBm ไกลเลยจุด P4 ไปไม่สามารถรับค่าใด ๆ ได้อีก

การทดสอบการวัดระยะภายนอกอาคาร
การทดสอบการวัดระยะภายนอกอาคาร

จากนั้นผมได้ทดสอบอีกครั้งบริเวณถนนสุขุมวิทด้านหน้ามหาวิทยาลัย โดยวาง A0 ไว้ที่จุด A และตั้งใจจะทดสอบระยะทางตามแนวเส้นสีเหลืองไปจนสุดที่ปลายเส้นด้านซ้ายซึ่งมีแนวถนนเป็นทางตรงแต่ภูมิประเทศเป็นเนินที่ปลายทั้งสองฝั่งของเส้นสีเหลือง แต่ผลการทดลองที่ได้นั้นใกล้เคียงกันกับการทดลองที่ผ่านมา นั่นคือเมื่อไปถึงจุด P0 ซึ่งมีระยะทางประมาณ 50 เมตรนั้นค่า RSSI เริ่มตกลงและรับสัญญาณได้ยากมาก จุดไกลสุดเท่าที่ผมทดลองได้คือ P1 ซึ่งมีระยะทางประมาณ 100 เมตร

การทดสอบการวัดระยะภายนอกอาคาร
การทดสอบการวัดระยะภายนอกอาคาร

อย่างไรก็ตามการทดสอบนี้ไม่ได้ควบคุมปัจจัยต่าง ๆ ที่อาจจะส่งผลต่อการรับส่งสัญญาณ ดังนั้นการทดสอบประสิทธิภาพระยะนั้นควรจะทำด้วยเครื่องมือที่เหมาะสมและทดสอบกับเงื่อนไขต่าง ๆ ให้รอบด้าน

การลดความคลาดเคลื่อนของการคำนวณค่าระยะทาง

จากการสังเกตเบื้องต้นผมพบว่าค่าระยะทางจาก T0 ไปยัง A0/A1/A2 ที่มอดูลรายงานออกมานั้นค่อนข้างแตกต่างกันพอสมควรถึงแม้ว่าผมจะวางมอดูลทั้งสามตัวไว้ใกล้กันมากก็ตาม หรือแม้แต่เมื่อผมทดลองนำมาทดสอบทีละตัวก็พบว่ายังคงได้ค่าที่ต่างกันเหมือนเดิม ภาพด้านล่างนี้เป็นตัวอย่างกราฟที่แสดงค่าระยะทางที่อุปกรณ์รายงานออกมา ผมวางมอดูล anchor ไว้บน tripod ที่อยู่ด้านซ้ายของภาพ พยายามวาง anchor ทั้งสามตัวให้ล้อมรอบศูนย์กลางของฐานรองให้มากที่สุด แล้วลองเดินที่ไปที่ระยะทางต่าง ๆ โดยในภาพนี้ผมวาดกราฟของ A0/A1/A2 ด้วยสีแดง/สีเขียว/สีน้ำเงินตามลำดับ จากภาพจะเห็นว่า anchor ทั้งสามตัวนั้นอยู่ห่างจากกันไม่เกิน 5 เซนติเมตร แต่ในกราฟด้านขวาจะเห็นว่ามีมอดูลบางตัวรายงานค่าแตกต่างจากตัวอื่นไปประมาณ 10 – 30 เซนติเมตร นอกจากนั้นแล้วค่าที่ได้นี้ยังแตกต่างจากที่ควรจะเป็นอีกด้วย เช่น ผมยืนอยู่ที่ระยะประมาณ 200 เซนติเมตรและมอดูลรายงานเป็น 240 เซนติเมตร

Error ของค่าระยะทางที่มอดูลคำนวณได้
Error ของค่าระยะทางที่มอดูลคำนวณได้

ความแตกต่างหรือความคลาดเคลื่อนนี้ย่อมจะส่งผลต่อค่าพิกัดที่คำนวณได้ ดังนั้นเนื้อหาของการรีวิวส่วนนี้ผมจึงอยากจะทดสอบความแม่นยำของระยะทางที่ได้ โดยผมได้นำ T0 ไปวางให้ห่างจาก A0 ตามระยะทางที่กำหนด ในการทดลองนี้ผมเก็บค่าทั้งหมด 11 ระยะ ประกอบด้วย 50, 100, 200, 300, 400, 500, 1000, 1500, 2000, 2500, และ 3000 เซนติเมตร ซึ่งค่าระยะทางนี้ผมวัดด้วยเทปวัดระยะ แต่ไม่ได้วัดแบบแม่นยำมากนัก ผมคาดว่าน่าจะมีความคลาดเคลื่อนประมาณของการวัดประมาณ +- 10 เซนติเมตร

ผมวาง T0 ไว้ที่แต่ละจุดแล้วบันทึกข้อมูลเป็นเวลาประมาณ 3 นาที เสร็จแล้วผมจึงเขียนโปรแกรมเพื่อหาความสัมพันธ์ระหว่างค่าที่มอดูลวัดได้เทียบกับค่าอ้างอิงที่วัดด้วยเทปวัดระยะ ซึ่งดูด้วยสายตาคร่าว ๆ แล้วน่าจะเป็นความสัมพันธ์เชิงเส้น (linear) จากนั้นผมจึงใช้วิธี least squares เพื่อหาสัมประสิทธิ์ของเส้นตรงที่เหมาะสมที่สุดกับความสัมพันธ์นั้น ภาพด้านล่างนี้แสดงความสัมพันธ์ที่วิเคราะห์ได้ จุดและเส้นสีแดง สีเขียว และสีน้ำเงินเป็นข้อมูลของ A0, A1, และ A2 ตามลำดับ ส่วนเส้นสี magenta นั้นเป็นตัวแทนของค่าอ้างอิง จากภาพจะเห็นว่าค่าของ A0/A1/A2 นั้นสัมพันธ์กับระยะทางอ้างอิงเป็นอย่างมาก โดยค่าสัมประสิทธิ์ของ (m, b) ของมอดูลแต่ละตัวที่คำนวณได้นั้นมีค่าดังต่อไปนี้


ความสัมพันธ์ระหว่างระยะทางที่คำนวณได้เทียบกับค่าอ้างอิง
ความสัมพันธ์ระหว่างระยะทางที่คำนวณได้เทียบกับค่าอ้างอิง

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

Boxplot ของค่าระยะทางระหว่างT0-A0 เทียบกับระยะทางอ้างอิง
Boxplot ของค่าระยะทางระหว่างT0-A0 เทียบกับระยะทางอ้างอิง

Boxplot ของค่าระยะทางระหว่างT0-A1 เทียบกับระยะทางอ้างอิง
Boxplot ของค่าระยะทางระหว่างT0-A1 เทียบกับระยะทางอ้างอิง

Boxplot ของค่าระยะทางระหว่างT0-A2 เทียบกับระยะทางอ้างอิง
Boxplot ของค่าระยะทางระหว่างT0-A2 เทียบกับระยะทางอ้างอิง

ทดสอบการระบุตำแหน่ง

วิดีโอด้านล่างนี้เป็นตัวอย่างการทดสอบการระบุตำแหน่งของ T0 โดยวาง A0/A1/A2 ไว้ที่จุดสีแดง/สีเขียว/สีน้ำเงิน และถือ T0 เดินไปมาระหว่าง anchor ทั้งสามตัว โดยจุดสีขาวเป็นค่าพิกัดที่ได้จากวิธีที่อยู่ในโค๊ดตัวอย่าง position.py สำหรับจุดสีเหลืองนั้นเป็นค่าที่ได้จากการนำค่าระยะทางที่มอดูลทั้งสามตัวรายงานมาปรับแก้ด้วยค่าสัมประสิทธิ์ที่ได้จากการทดลองข้างบนแล้วคำนวณพิกัดด้วยวิธี least squares ส่วนจุดสี magenta นั้นได้จากการนำค่าที่มอดูลรายงานไปคำนวณด้วยวิธี least squares โดยตรงครับ (หมายเหตุ: ค่าระยะทางที่เขียนรายงานบนเส้นในวิดีโอนี้มีหน่วยเป็น pixel ยังไม่ได้แปลงให้เป็นเซนติเมตร แต่ในวิดีโออื่น ๆ นั้นผมคำนวณระยะทางเป็นเซนติเมตรเรียบร้อยแล้ว)

ทดสอบความแม่นยำของการคำนวณตำแหน่ง

กรณีที่ไม่มีสิ่งรบกวน

ลำดับต่อมาผมทดสอบความแม่นยำของตำแหน่งหรือพิกัดที่คำนวณได้โดยการวาง anchor ทั้งสามตัวเป็นรูปสามเหลี่ลม แต่ละตัวห่างกันประมาณ 5 เมตร แล้ววาง T0 ไว้ตรงกลาง กำหนดให้ A0 อยู่ที่จุดกำเนิด, A1 อยู่ที่ (0, 500) และ A2 อยู่ที่ (510, 256) เซนติเมตร และวัดค่าพิกัดของ T0 ได้ (200, 290) ตามลำดับ วัดด้วยตลับเมตร ความคลาดเคลื่อนของการวัดประมาณ +- 10 เซนติเมตร วางไว้นิ่ง ๆ ประมาณ 3 นาที จากนั้นจึงแยกคำนวณค่าพิกัดด้วยวิธีต่าง ๆ เหมือนกับการทดลองด้านบน ได้ผลลัพธ์ตามข้อมูลและภาพด้านล่างนี้ ซึ่งจะเห็นว่าค่าระยะทางที่ได้นั้นมีการเปลี่ยนแปลงน้อยมาก


fig cal result 2024 04 07 001 test3 2d realtime plot
เมื่อนำค่าที่บันทึกได้มาคำนวณค่า DRMS (distance root mean squared) และ 2DRMS (Twice the Distance Root Mean Square) จะได้ค่า DRMS ของค่าพิกัดต้นฉบับและพิกัดที่ได้จากค่าระยะทางที่ปรับแก้ความคลาดเคลื่อนแล้วเท่ากับ 1.20 และ 1.04 เซนติเมตรตามลำดับ และได้ค่า 2DRMS ของค่าพิกัดต้นฉบับและพิกัดที่ได้จากค่าระยะทางที่ปรับแก้ความคลาดเคลื่อนแล้วเท่ากับ 2.41 และ 2.08 เซนติเมตรตามลำดับ ซึ่งอาจจะมองได้ว่าแม่นยำมาก แต่การทดลองครั้งนี้ทำในวันหยุด ไม่มีคนในรัศมี 100 เมตรนอกจากผมคนเดียว ภาพด้านล่างนี้แสดงความคลาดเคลื่อนของพิกัดที่ได้จากค่าระยะทางที่ปรับแก้ความคลาดเคลื่อนแล้ว

fig cal result 2024 04 07 001 test2 position error

กรณีที่มีสิ่งรบกวน

หลังจากนั้นผมได้ทดลองใหม่อีกครั้ง อุปกรณ์ทุกตัวยังคงวางไว้นิ่ง เพียงแต่ผมมีการขยับตัวเข้ามาบัง A0/T0 บ้างเป็นบางครั้ง ผมบันทึกข้อมูลประมาณ 1 นาทีครึ่ง ได้ค่า DRMS ของค่าพิกัดต้นฉบับและพิกัดที่ได้จากค่าระยะทางที่ปรับแก้ความคลาดเคลื่อนแล้วเท่ากับ 2.65 และ 2.31 เซนติเมตรตามลำดับ และได้ค่า 2DRMS ของค่าพิกัดต้นฉบับและพิกัดที่ได้จากค่าระยะทางที่ปรับแก้ความคลาดเคลื่อนแล้วเท่ากับ 5.31 และ 4.62 เซนติเมตรตามลำดับ

fig cal result 2024 04 07 001 test4 position error

การทดสอบผลของการบังสัญญาณต่อค่าที่วัดได้

ผมสังเกตพบว่าการที่ผมขยับมือหรือเข้าไปยืนบังระหว่าง anchor กับ tag บางคู่นั้นจะทำค่าระยะทางและตำแหน่งของ tag ที่คำนวณได้คลาดเคลื่อนเพิ่มมากขึ้น ดังนั้นผมจึงนำอุปกรณ์ทั้งหมดทดลองซ้ำอีกครั้ง โดยครั้งนี้ทดลองในวันที่ภายในอาคารมีคนทำงานตามปกติ ผมวางอุปกรณ์ตามตำแหน่งที่แสดงในภาพด้านล่างนี้ โดยพยายามทำสภาพแวดล้อมให้นิ่ง ไม่มีสิ่งใดเคลื่อนไหว แล้วบันทึกค่าไว้ประมาณ 2 นาที ได้ DRMS และ 2DRMS ของค่าพิกัดต้นฉบับและพิกัดที่ได้จากค่าระยะทางที่ปรับแก้ความคลาดเคลื่อนแล้วเท่ากับ 2.34 และ 4.30 เซนติเมตรตามลำดับ ซึ่งถือว่ามีความคลาดเคลื่อนใกล้เคียงกับการทดลองในวันหยุด

mauwb dw3000 st calibration fig meeting room device positions

mauwb dw3000 st calibration fig meeting room empty room realtime
ลำดับต่อมาผมทำการทดลองอีกรอบ เพียงแต่คราวนี้ผมทดลองเดินเอาตัวไปบังแนวรับส่งข้อมูลระหว่าง tag กับ anchor ตามตัวอย่างในวิดีโอด้านล่างนี้ ผมพบว่าเมื่อผมเดินไปบังการสื่อสารบางคู่จะทำให้ค่าระยะทางที่มอดูล tag กับ anchor บางตัวมีความคลาดเคลื่อนเพิ่มขึ้น ในการทดลองของผม ผมพบว่าเมื่อผมบังคู่ T0/A1 นั้นจะเห็นผลชัดเจนที่สุด นั่นคือจะทำให้ระยะทางที่ได้นั้นมีความยาวเพิ่มขึ้น ในกรณีนี้ผมได้ DRMS และ 2DRMS ของค่าพิกัดต้นฉบับและพิกัดที่ได้จากค่าระยะทางที่ปรับแก้ความคลาดเคลื่อนแล้วเท่ากับ 17.25 และ 34.50 เซนติเมตรตามลำดับ จะเห็นว่าในกรณีนี้ความคลาดเคลื่อนจะสูงขึ้นมากประมาณ 7 เท่าเลยทีเดียว

ภาพต่อไปนี้เปรียบเทียบ position error ของการทดลองทั้งสองครั้งนี้
mauwb dw3000 st calibration fig meeting room empty room position errormauwb dw3000 st calibration fig meeting room 2 person moving position error

ทดสอบเดินตามแนวผนังห้อง

การทดลองสุดท้ายคือการถือ T0 เคลื่อนที่ไปตามตำแหน่งต่าง ๆ ในห้อง รวมทั้งที่มุมของโต๊ะทั้งสี่จุด (P0, P1, P2, P3) ซึ่งผมวัดพิกัดด้วยเทปวัดระยะและแสดงในวิดีโอด้วยสี magenta โดยในช่วงแรก ๆ ของวิดีโอผมนำ T0 ไปวางให้ใกล้กับ P0…P3 จากวิดีโอจะเห็นว่าพิกัดที่คำนวณค่อนข้างใกล้เคียง อาจจะมีช่วงเหลือมเวลาและพิกัดที่ได้นั้นเคลื่อนจากพิกัดที่ควรจะเป็นไปบ้าง ส่วนในช่วงครึ่งหลังของวิดีโอผมได้ลองนำ T0 เดินไปตามแนวผนังห้องซึ่งพบว่าสามารถคำนวณได้ค่อนข้างดี เป็นแนวเส้นตรงสอดคล้องกับแนวเส้นจริงดีมาก

อื่น ๆ

ในการรีวิวนี้ผมพบปัญหาเล็ก ๆ น้อย ๆ อยู่บ้าง เช่น ในกรณีของผม ผมพบว่ามีบางจุดของบางบอร์ดที่อาจจะดูไม่ค่อยเรียบร้อยไปหน่อย เช่น LED D2 ในภาพซึ่งเกือบจะเคลื่อนออกจากตำแหน่งไปมาก (แต่รวม ๆ แล้วก็ทำงานได้ตามปกติ) อีกอย่างหนึ่งคือพบยังไม่พบตัวอย่างสำหรับการทดสอบร่วมกับ Apple ครับ

mauwb dw3000 st led d2

ผู้ผลิตมีไฟล์ PCB และ SCH สำหรับผู้ที่ต้องการรายละเอียดของบอร์ดเพิ่มเติมได้ด้วยโปรแกรม Autodesk Eagle ตามตัวอย่างด้านล่างนี้ครับ

mauwb dw3000 st hardware pcb both layers mauwb dw3000 st hardware pcb bottom layer mauwb dw3000 st hardware pcb top layers mauwb dw3000 st hardware schematics

สรุป

ในการรีวิวนี้ ผมทดสอบการวัดระยะทางและคำนวณพิกัดด้วยค่า config ตามโค๊ดตัวอย่างของผู้ผลิต ซึ่งทุกอย่างสามารถทำงานได้ตามที่ควรจะเป็น ผมลดความคลาดเคลื่อนของค่าระยะทางด้วยการหาความสัมพันธ์เชิงเส้นระหว่างค่าที่วัดได้กับค่าอ้างอิง แต่เราอาจจะทำด้วยการคำนวณค่า antenna delay ซึ่งอาจจะทำได้ด้วยการใช้อุปกรณ์เฉพาะทางในการทดสอบและวัดค่า (ซึ่งผมไม่มี) หรืออาจจะทำด้วยการใช้เทคนิค binary search ตามตัวอย่างการ calibrate ค่า antenna delay ของมอดูล ESP32 UWB (Ultra Wideband) โดย Jim Remington ก็ได้ครับ

โดยสรุปแล้วผมต้องขอบคุณทาง MakerFabs ที่ส่งอุปกรณ์ชุดนี้มาให้ทดสอบ ซึ่งมีประโยชน์กับผมมากทั้งในแง่ของการใช้ในการเรียนการสอนและการทำวิจัย รวมทั้งผมคิดว่ามอดูลชุดนี้เป็นทางเลือกที่ดีสำหรับนักพัฒนาที่ต้องการระบบสำหรับการระบุตำแหน่งที่สามารถใช้ได้ทั้งภายในและภายนอกอาคาร รวมทั้งเป็นระบบที่มีมีความแม่นยำกว่าการใช้เครื่องรับสัญญาณ GNSS ทั่วไป ผู้ที่สนใจสามารถซื้อมอดูล MaUWB_DW3000 with STM32 AT Command ได้จากเว็บไซต์ของผู้ผลิตซึ่งจำหน่วยในราคา $54.80 (~2,000฿) ครับ

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