ทดลองใช้ VL53L8 วัดระยะแบบหลายโซน
ช่วงหลังเห็นเทคโนโลยีเซ็นเซอร์วัดระยะหลายตัวที่น่าสนใจเมื่อเทียบกับเซ็นเซอร์แบบเดิม เช่น กลุ่มราคาถูก IR และ ultrasonic ที่รายงานค่าระยะไปด้านหน้าเพียงค่าเดียว หรือพวกราคาแพง Lidar ที่รายงานค่าระยะรอบตัว หลังจากไปงาน ST Tech Tour ที่จัดในประเทศไทย ผมติดใจตัว multizone Time-of-Flight (ToF) sensor เพราะเห็นการสาธิตตรวจจับระยะแนวด้านหน้าได้ถึง 8x8 พื้นที่ย่อย ลองไปเช็คสเปคของรุ่น VL53L8 ก็ดูแล้วประทับใจด้วยมุมมอง 45 องศาทั้งแนวนอนและแนวดิ่งคิดเป็นมุมแนวแทยงมุมคือ 65 องศา ระยะที่ตรวจจับได้คือ 4 เมตรก็ครอบคลุมพื้นที่ของห้องในบ้านก็ตรงใจกับงาน smart home ที่เล็งเอาไว้
แต่แปลกใจเหมือนกันที่ไม่ค่อยเห็นข้อมูลและตัวอย่างการใช้งานเซ็นเซอร์กลุ่มนี้ เลยถามคนของ STMicro เลยทราบว่าตลาดหลักของเขาคือ smartphone ซึ่งเรียกได้ว่าแทบไม่ต้องทำการตลาดเลย ผมจึงอยากเขียนแนะนำการใช้เซ็นเซอร์ VL53L8 ไว้หน่อย เผื่อมีคนที่กำลังอยากหา solution มาใช้กับงานตัวเองจะได้ลองคิดว่าเหมาะกับโจทย์ไหม แม้ว่า ST จะไม่ได้โปรโมทเซ็นเซอร์รุ่นนี้มากนักก็ยังมีบอร์ดพัฒนาให้เลือกซื้อได้ 2 แบบคือ
- บอร์ด X-NUCLEO-53L8A1 เป็นบอร์ดเสริมแบบ Arduino shield เลยใช้งานได้ง่ายเพราะเสียบลงไปบนหัวต่อ Arduino ได้เลย
- บอร์ด SATEL-VL53L8 เป็นบอร์ดเสริมสำหรับนำมาเสียบสายเอง แม้จะใช้ยากกว่าแต่ดีตรงให้มา 2 บอร์ดในราคาประมาณเดียวกัน
ตอนเลือกบอร์ดก็จะงงหน่อยเพราะตัวชิพที่อยู่บนบอร์ดคือ VL53L8CA ซึ่งไม่มีข้อมูลอยู่บนเว็บไซต์ของ ST มีแต่รุ่น VL53L8CX เน้น low-power และรุ่น VL53L8CH ที่มีข้อมูลเพิ่มสำหรับงาน AI ลองถามคนของ ST ได้ความว่าทาง ST ตอนออก product ใหม่บางทีเขาจะเริ่มด้วยรุ่นที่มีความสามารถครบทุกอย่าง แล้วค่อยไปตัดฟีเจอร์ออก (ลด cost) ให้ตรงกับการนำไปใช้ของลูกค้า
ช่วงสงกรานต์ทาง ม.ธรรมศาสตร์ จะหยุดนานหน่อยน่าจะพอมีเวลามาลอง และพอดีทางเว็บ eStore ของ STMicroelectronics จัดโปรโมชันส่งฟรีถึงสิ้นเดือนมีนาคม เลยสั่งบอร์ด X-NUCLEO-53L8A1 ออนไลน์ไป มาถึงภายใน 1 สัปดาห์ก็จ่ายค่าภาษีไปหน่อยก็ได้มาลองใช้ โค้ดตัวอย่างของบอร์ด VL-53L8A1 ถูกพัฒนามาสำหรับบอร์ด NUCLEO-F401RE และ NUCLEO-L486RG ซึ่งพอดีมีบอร์ด NUCLEO-F401RE อยู่แล้ว เลยสามารถทดลองได้ทันที การแสดงผลของโค้ดตัวอย่างจะส่งข้อความผ่านทางพอร์ตอนุกรมมาแสดงผลด้วยโปรแกรม Tera Term ที่จำลองหน้าจอแบบ terminal VT100
ทดลองกับบอร์ดอื่น
ผมมีบอร์ด ST อยู่หลายรุ่นที่มีหัวต่อ Arduino โดยมีบางรุ่นที่จะมีส่วนสื่อสารแบบไร้สายด้วย เลยอยากลองว่าโค้ดตัวอย่างจะสามารถใช้กับบอร์ดอื่นได้ไหม ทาง ST เองได้พัฒนาชุดซอฟต์แวร์ X-CUBE-TOF1 สำหรับขยายโปรแกรม STM32CubeMX ที่ใช้สร้าง project และโค้ดเริ่มต้นให้กับบอร์ด STM32 เลยคิดว่าน่าจะลองสักหน่อย บอร์ดที่จะเอามาลองคือ B-L475E-IOT01A ที่ใช้หน่วยประมวลผล STM32L475 และส่วนสื่อสารไร้สาย WiFi และ Bluetooth และบอร์ด NUCLEO-WB55 ที่ใช้หน่วยประมวลผล STM32WB55RG และส่วนสื่อสารไร้สาย Bluetooth
การเชื่อมต่อกับชิพ VL53L8CA จะผ่านทาง I2C (เลือก SPI ได้ด้วยการสลับ jumper บนบอร์ด) ขา external interrupt สำหรับกระตุ้นการอ่านข้อมูล และขา digital output อีก 2 ขาสำหรับควบคุมการทำงาน (LPn และ PWR) ลองอ่าน schematic และเชื่อมโยงกับตำแหน่งขาบนหัวต่อ Arduino shield ของ NUCLEO-F401RE พบว่าตำแหน่งขาที่เกี่ยวข้องคือ D14,D15,A2,D10,D11 ซึ่งสามารถไปเช็คตำแหน่งขาที่เกี่ยวข้องบนบอร์ดที่จะมาทดลองได้
โปรแกรม STM32CubeMX เป็น GUI tool สำหรับสร้าง project (STM32CubeIDE, Keil MDK-ARM, IAR EWARM) ที่ลดความวุ่นวายในการตั้งค่าฮาร์ดแวร์รวมทั้งส่วนซอฟต์แวร์เสริม หลังจากติดตั้ง X-CUBE-TOF1 เข้าไป เราจะสามารถเลือกสร้างโค้ดและตั้งค่าฮาร์ดแวร์สำหรับเชื่อมต่อชิพ VL53L8 ได้จากหัวข้อ Middleware and Software Packs โดยป้อน port ที่เกี่ยวข้อง จากนั้นจึงไปเลือก generate code เป็น project ตามที่ต้องการ
ผมเลือกให้สร้าง project เป็น Keil MDK-ARM เพราะรุ่น Community Edition สามารถใช้งานได้เต็มความสามารถ รวมทั้งการใช้งานทั่วไปและฟีเจอร์ดีบั๊กจะใช้ง่ายกว่า STM32CubeIDE แต่หากใครกังวลใจเรื่อง non-commercial license ก็แนะนำให้สร้างเป็น STM32CubeIDE project แทน หลังจาก build และติดตั้งลงบอร์ดก็สามารถทำงานได้ทันทีทั้งบอร์ด B-L475E-IOT01A และ NUCLEO-WB55 ต้องขอชมว่าทาง STMicroelectronics ทำการบ้านในส่วน STM32CubeMX มาค่อนข้างดี จึงสามารถ generate โค้ดของเซ็นเซอร์ให้ทำงานได้บนหน่วยประมวลผลต่างรุ่นกัน
หลังจากติดตั้งลงบอร์ด B-L474E-IOT01A ทดลองใช้โปรแกรม Tera Term รับและแสดงข้อมูล ก็สามารถทำงานได้ทั้งแบบ 8x8 และแบบรายงานสถานะความแรงของสัญญาณด้วย จึงมั่นใจได้ว่าโค้ดที่สร้างจาก X-CUBE-TOF1 ทำงานได้ถูกต้อง
ความเห็นส่วนตัวคือ ประทับใจเครื่องมือพัฒนาสำหรับ VL53L8 โดยรวม แต่จุดที่ต้องขอติทางนักพัฒนาของ ST คือ การทำให้โค้ดซับซ้อนโดยไม่จำเป็น เช่น การอ่านค่าระยะก็ไปซ่อนอยู่ในฟังก์ชัน MX_53L8A1_SimpleRanging_Process() ในไฟล์ app_tof.c ที่เป็น infinite loop ทำให้การเขียนโค้ดสำหรับฮาร์ดแวร์อื่นคงต้องเลือกทำ 2 แบบคือ
- ย้ายโค้ดจากใน MX_53L8A1_SimpleRanging_Process() ไปรวมกับ main loop
- เลือกใช้ FreeRTOS แล้วนำโค้ดของ TOF ไปอยู่ใน task แล้วไปเชื่อมโยงกับ task อื่นๆผ่านทาง IPC เช่น Queue
ตัวเลือกอื่นที่ง่ายกว่า
สำหรับคนที่ไม่ชอบชุดเครื่องมือพัฒนาของ STM32 อีกตัวเลือกหนึ่งที่ง่ายขึ้นคือ การใช้ STM32duino ซึ่งเป็นการพอร์ต Arduino มาใช้กับ STM32 ข้อดีคือมีนักพัฒนาที่แปลงโค้ดตัวอย่างเป็นไลบรารี VL53L8CX ให้ทำงานในแพลตฟอร์ม STM32duino แล้ว การทดลองก็ทำได้ง่ายผ่านทาง Platform.io บน VS Code โดยระบุแค่ขา LPn และ PWR เท่านั้น
ข้อดีของ Plืatform.io คือ ความง่ายในการนำไลบรารีต่างๆของ Arduino มาใช้ เช่น การเลือกติดตั้งไลบรารี PubSubClient และ ArduinoJSON จะทำให้เราสามารถเขียนโค้ดรายงานค่าผ่านทาง MQTT ได้แบบง่าย
終わりに (ในตอนท้าย)
ผมเขียนบทความนี้เพื่อแนะนำการใช้งานเซ็นเซอร์ VL53L8 เพื่อวัดระยะทางไปข้างหน้าแบบหลายโซน เมื่อพิจารณาจากสเปคที่บอกว่า sample rate สูงสุด 15 Hz จึงน่าจะนำไปใช้งานได้หลายโจทย์ เช่น gesture detection แต่ก็คงต้องออกแรงกันหน่อยเพราะเมื่อเทียบกับตัววัดระยะแบบเดิม เราต้องตีความตัวเลข 16 หรือ 64 ค่า (หรือปรับเป็นโซนเฉพาะได้) เพื่อแปลงออกมาเป็นความหมาย ดังนั้นการนำเทคนิคสาย machine learning ก็อาจเป็นตัวเลือกที่จำเป็นสำหรับการใช้ประโยชน์จากเซ็นเซอร์แบบ multizone ToF นี้