รีวิว DEVIO NB-Shield I และ Mini-project: Cellular Tower logger

สวัสดีครับ

หลังจากที่ AIS ประกาศ pre-order module NB-IoT ไปเมื่อเดือนธันวา​คม​ที่ผ่านมา ผมซึ่งสนใจจะนำมาใช้กับ senior project อยู่แล้วเลยสั่งซื้อมาชุดหนึ่ง และเมื่อเดือนพฤษภา​คม​ที่ผ่านมา module ก็เปิดให้ซื้อ เลยเป็นที่มาของรีวิวครั้งนี้ครับ

NB-IoT คืออะไร

NB-IoT หรือ Narrow-band Internet​of Things คือเทคโนโลยี​โทรคมนาคมแบบ LTE ที่ออกแบบมาสำหรับใช้งานกับอุปกรณ์​ที่เน้นการสื่อสารไม่เน้นความเร็วมาก แต่เน้นการประหยัดพลังงาน และมีการติดต่อสม่ำเสมอด้วยข้อมูล​ปริมาณ​น้อย เช่นระบบโทรมาตร หรืออุปกรณ์​สั่งการต่างๆ ที่ไม่เน้นความรวดเร็ว​ในการตอบสนอง (non real-time applications) โดยทำงานในช่วง subcarier กว้างราวๆ 200 KHz ของความถี่สำหรับให้บริการโทรศัพท์​มือถืออยู่แล้ว (กรณีของ AIS ทำงานที่ 900 MHz)​

NB-IoT มีข้อดีสำคัญที่ดีกว่าการใช้เครือข่าย LTE ปกติ เช่น:

  • เครือข่ายของ NB-IoT​ เป็นเคือข่ายที่แยกต่างหากจากเครือข่ายมือถือปกติ ความแออัดจึงน้อยกว่า
  • ประหยัดพลังงานกว่า เนื่องจากรูปแบบการเข้ารหัสคลื่นสัญญาณ​ (waceform modulation) ที่ง่ายกว่าปกติ ทำให้ใช้พลังงานในการประมวลผลและส่งสัญญาณ​น้อยกว่า
  • ราคาชิพถูกกว่า เนื่องจากความซับซ้อนในการออกแบบน้อยกว่า ส่วนหนึ่งเนื่องจากแถบความถี่ที่ใช้น้อยกว่าปกติที่ใช้แถบความถี่ประมาณ​ 1.2 MHz

ว่าด้วย Module

DEVIO NB-SHIELD I

สำหรับ Module ที่ AIS ส่งมาให้นักพัฒนา​ลองใช้ จะเป็น DEVUINO เป็นลักษณะ Breakout board ของ Arduino พูดง่ายๆ คือสามารถเสียบทับ pin ของ Arduino Uno เดิมได้เลยครับ

หน้าตา board DEVIO NB-SHIELD I
สังเกตว่าขนาดและลักษณะการจัดเรียง pin จะเหมือนกับ Arduino Uno

board DEVIO NB-SHIELD I เมื่อต่อกับ Arduino Uno

และตัวบอร์ด​ก็ฝัง E-Sim มาให้พร้อมเลย ฉะนั้นแค่ซื้อและลงทะเบียน​ก็สามารถใช้งานได้เลย

Mini-project: Cellular Tower logger

ที่มา

ตอนแรกที่ผมได้มา ผมเองอยากจะลองใช้งานเป็น Sensors logger แต่ตอนนั้นผมเองยังไม่รู้ว่าจะเก็บคว่าอะไรระหว่างทางดี แต่สิ่งสำคัญ​คือต้องรู้คือระบบกำลังเก็บข้อมูลที่ไหน ครั้นจะใช้ GPS ก็ดูจะไม่ประหยัดพลังงานเท่าไหร่ เพราะตัว GPS Module นั้นค่อนข้างกินพลังงานในช่วงที่กำลังจับสัญญาณ​ดาวเทียม ผมเลยกะจะใช้การทำ Cellular Tower triangulation เพื่อหาตำแหน่งคร่าวๆ

(สำหรับใครที่ไม่รู้ว่า CTT คืออะไร มันคือการหาตำแหน่งปัจจุบัน​โดยคร่าวๆ โดยอาศัยการหาตำแหน่งของเสาสัญญาณ​โทรศัพท์​มือถือประกอบกับความแรงของสัญญาณ​มือถือ ณ ขณะนั้นหลายๆ เสา แล้วเอามาดูว่ารัศมีสัญญาณ​มีจุดใดคาบเกี่ยวกับเสาอื่นที่เคยเก็บไว้บ้าง ก็จะได้พิกัดคร่าวๆ ครับ ใครที่ต้องการศึกษาเพิ่มเติม ลองอ่านรายงานเรื่องนี้ที่ผมเคยเขียนไว้ในวิชา Location-base applications ดูครับ)

ปัญหาคือตำแหน่งของเสาที่ได้ ปกติจะอยู่ในรูปของ Location Area Code (LAC) คู่กับ Physical Cellular​ ID (CID) เมื่อเอารหัสเสาฯ นี้ไปหาคำแหน่งของเราคู่กับความแรงของสัญญาณ​ผ่าน API เปิดต่างๆ เช่น Google map location API หรือ Unwiredlab Location API เป็นต้น แต่ในระบบ NB-IoT​ จะได้เป็น Tracking Area Code (TAC) กับ E-UTRANS ID (EIC) และเนื่องจากยังอยู่ในช่วงเริ่มต้น ข้อมูลเสาที่ว่าเลยยังไม่มีในฐานข้อมูล​ที่ว่ามาครับ

ผมเลย E-Mail ไปถามหน่วยพัฒนาของ AIS

E-Mail ที่ผมส่งไปถามทีมงานพัฒนาของ AIS เมื่อวันที่ 4 พ.ค.

และนี่คือคำตอบที่ได้เมื่อวันที่ 5 พ.ค. (ซึ่งจนกระทั่งวันที่เขียนบทความนี้ก็ยังไม่มีความคืบหน้าครับ)​

E-Mail ที่ตอบกลับมาจาก AIS เมื่อวันที่ 5 พ.ค.

ถ้าเป็นกรณีอื่นที่ผมติดต่อช่องทางอื่น ผมคงกลายเป็น Popuko โทรไปทวงไปแล้ว

อย่าทำให้ปอปุโกะโกรธ

แต่เนื่องจากผมติดต่อได้แค่ทาง E-Mail และศรัทธาในปรัชญา​ของ Blognone ที่ว่า “อยากได้ต้องทำเอง”

ผเลยตัดสินใจทำ module เก็บข้อมูลเสาที่ว่ามานี้ซะเองเลยครับ!

สถาปัตยกรรม​ของระบบ

คุณสามารถดู Source code ทั้งหมดที่ใช้ใน mini-project นี้ได้ที่ https://github.com/itpcc/NB-IoT-Cellular-logger

ส่วนอุปกรณ์​

รูปแบบการเชื่อมต่อที่ใช้ใน Mini-project

การทำงานของตัว module ผมใช้ Arduino Uno คู่กับ GPS ต่อกับตัว Module NB​-IoT ครับ แล้วใช้ power bank ทั่วไปจ่ายไฟผ่าน USB ครับ (จริงๆ กะจะให้แสดงค่าที่เก็บได้บนจอ OLED ด้วย แต่ปรากฏ​ว่าแรมไม่พอหรืออะไรรบกวนไม่ทราบ ติด Error ส่งค่าไม่ออก เลยตัดออกไปแล้ว monitor บน Firebase)​

หน้า Firestore monitor ค่าที่ได้จาก module

สำหรับ code ที่ใช้ก็ล้อกับ example ที่ AIS ให้มาเลย แต่ตัว Library เนื่องจากไม่มี method ในการอ่านรหัสเสาสัญญาณ​ที่ใช้ปัจจุบัน​ เลยเพิ่ม method ที่ว่าขึ้นมาครับ ซึ่งก็ไม่ได้ซับซ้อนกว่าเดิมเท่าไหร่ เพราะถึงแม้ว่า AIS จะไม่ได้ทำ manual ไว้ให้ แต่ Qualcomm มี AT commands references manual ให้ เลยยังพอจะทำความเข้าใจการทำงานแล้วแทรกการแปรค่าได้อยู่ครับ

ส่วนการอ่านพิกัดผ่าน GPS นั้นก็ใช้การอ่านข้อมูลผ่าน serial interface ที่ module ส่งออกมาอัตโนมัติทุกๆ วินาทีอยู่แล้วได้เลย ปัญหาที่พบมี 2 อย่างครับ คือ

1. เราไม่สามารถใช้ AltSoftSerial ที่ออกแบบมาเป็น Hardware-based Software Serial interface library และเหมาะสำหรับเรื่องนี้ได้ เพราะถูกใช้กับ NB-IoT module ไปแล้ว เลยต้องใช้ NeoSoftSerial ที่เป็น Software Serial แทน เลยต้องสร้างฟังก็ชั่นตรวจจับ $GPGGA sentence เอง

2. ข้อมูลที่ส่งมาจาก GPS จะอยู่ในรูป NMEA sentence (อ่านรายละเอียด​เพิ่มเติมได้ที่นี่ครับ)​ ซึ่งพิกัดที่ได้จะอยู่ในรูป degree และ minute ถ้าจะเอาไปใช้จริงต้องแปลงให้อยู่ในรูป degree อย่างเดียว​ก่อนครับ

ปัญหา​สำคัญ​ที่เจอกลับเป็นตอนส่งครับ เนื่องจากเมื่อเอาข้อมูลทั้งหมดมาต่อกัน ต่อให้จัดรูปแบบ CSV แล้วก็ยังยาวเกิน 32 ตัวอักษร ทำให้ไม่สามารถส่งข้อมูลออกไปได้ (คือมันจะยัง encode เป็น hex string ได้ แต่จะขึ้น error กลับมา)​

ผมเลยต้องแก้ปัญหา​โดยการแยกกันส่ง GPS และรหัสเสาแล้วเชื่อมกันผ่าน sequence number แต่ละครั้งในการส่ง และ encode ตัวเลขต่างๆ ทั้งรหัสเสาและ sequence number ให้อยู่ใยรูปฐาน 36 เพื่อให้สั้นที่สุด (โดยที่ยังไม่ต้องสร้าง function encode ต่างหาก)​ ก่อนจะส่งออกไปครับ

กว่าจะส่งได้ครบก็เล่นเอาหัวร้อนไปไม่น้อยเลย 😰

น้องกุ้งถึงกับหัวร้อน~

ส่วน server

ตัว server จริงๆ ก็ไม่มีอะไรมากครับ เพราะตัว protocol UDP ที่ใช้ในการส่งข้อมูลจาก NB-IoT ไม่ได้ซับซ้อนมาก บวกกับเสียเวลาไปกับตัว module มามากพอแล้ว เลยทำแค่แปลงตัวเลขกลับมาเป็นฐาน 10 และ 16 แล้วโยนเข้า Firestore ไปประมวลผลทีหลัง

ลงมือ!

ใส่กล่องนี้แล้วอย่าลืมเปิด Bucket เป็น Public ด้วย #ผิด

ผมทดลองโดยเอาไป module ไปพร้อมกับผมเมื่อวันที่ 10 พ.ค. ตอนแรกตั้งใจว่าจะเก็บข้อมูลระหว่างเดินทางจาก มจธ. ไปบ้านหม้อด้วย (ไปซื้ออุปกรณ์ทำโปรเจ็คมาดองเพิ่ม) แต่ปรากฎว่า server มีปัญหา internet ระหว่างทาง เลยบันทึกได้ถึงแค่ช่วงตลาดบางปะกอกเท่านั้นเอง แต่ผลที่ได้น่าพึงพอใจดีครับ สามารถเก็บได้ครบมั้ง Cellular ID ความแรงของสัญญาณ และพิกัดที่เก็บข้อมูลเลย

ดูแผนที่เต็มได้ที่นี่ครับ

สรุปปิดท้าย

ผมมองว่า DEVIO NB-SHIELD I อาจจะยังไม่เหมาะนักสำหรับผู้ที่เริ่มต้นจะทำ IoT device นะครับ เพราะ Ecosystem, document เองก็ยังไม่ค่อยโอเคเท่าไหร่สำหรับผม (แม้แต่ AIS Magellan ที่โม้ซะดิบดีว่าเหมาะสำหรับงานนี้ก็ยังไม่มีแม้แต่ UDP server ให้บริการ) การพัฒนาเองยังค่อนข้างกินเวลาพอสมควร แต่ผมค่อนข้างชอบที่ทำเป็น Arduino Uno breakout board นะครับ มันทำให้ง่าย ไม่รุงรังมากนัก

อาจจะต้องให้เวลาทีมงานอีกสักนิดครับ เพราะว่ากันตามตรง NB-IoT เองก็ยังค่อนข้างใหม่อยู่

คงต้องรอ True และ CAT ปล่อยบอร์ดของตัวเองบ้าง ถ้ามีโอกาสผมจะนำมารีวิวอีกทีนะครับ

น้องกุ้ง (เอบินะ) ขอลาไปก่อนค่า…

สวัสดีครับ