โซลูชันนี้ประกอบด้วยThingy:91 โดย Nordic Semiconductor ที่มีเฟิร์มแวร์ที่กำหนดเองโดยอิงตามตัวอย่างnRF Connect SDK (ncs) อุปกรณ์นี้มีส่วนประกอบฮาร์ดแวร์ที่จำเป็นทั้งหมดอยู่แล้ว ดังนั้นจึงเป็นฮาร์ดแวร์สำเร็จรูปอย่างแท้จริง อุปกรณ์จะส่งข้อมูลความถี่สูงไปยังค ลาวด์ ThingsBoard ผ่าน CoAP และสตรีมข้อมูลความถี่ต่ำไปยังnRF Cloud ผ่าน MQTT
นี่เป็นโครงการ DIY เนื่องจากมีความเหมาะสมระหว่างทักษะที่มีอยู่ ฮาร์ดแวร์ที่มีอยู่ และสิ่งที่จำเป็นสำหรับงาน ส่วนวิธีอื่นๆ ในการบรรลุเป้าหมายเดียวกัน
เช่นเดียวกับโครงการใดๆ ก็ตาม เราต้องเริ่มต้นด้วยข้อกำหนดของโครงการ
ฉันกำลังมองหาการสร้างโซลูชั่นที่มีคุณสมบัติต่อไปนี้:
กรณีการใช้งานจะเป็น:
ตามความต้องการจะมีส่วนประกอบที่เชื่อมต่อกันหลายส่วน:
อุปกรณ์
สำหรับอุปกรณ์นี้ ฉันเลือก Thingy:91 ซึ่งเป็นแพลตฟอร์มการสร้างต้นแบบสำหรับNordic nRF9160 SiP (ระบบในแพ็คเกจ) nRF91 เป็นไมโครโปรเซสเซอร์ที่มีโมเด็มเซลลูลาร์ที่ออกแบบมาสำหรับแอพพลิเคชั่นพลังงานต่ำและ IoT Thingy เพิ่มเซ็นเซอร์ แบตเตอรี่ และกล่องใส่ให้กับ nRF91 เพื่อสร้างอุปกรณ์ที่มีความสามารถซึ่งสามารถตั้งโปรแกรมให้ทำสิ่งต่างๆ ได้มากมาย ทั้งนี้ ควรกล่าวถึงว่ายังมีอุปกรณ์อื่นๆ ในกลุ่ม Thingy เช่น Thingy:52 และ Thingy:53 ซึ่งเน้นที่ Bluetooth, Zigbee และ Matter ทุกครั้งที่กล่าวถึง Thingy ในบทความนี้ ฉันหมายถึง Thingy:91 เซลลูลาร์
ฉันเลือก Thingy เพราะมีชิ้นส่วนที่จำเป็นสำหรับโครงการนี้ครบถ้วนแล้ว และฉันไม่จำเป็นต้องเชื่อมต่อโมดูลแยกกันหรือบัดกรีอะไรเลย Thingy มีเครื่องวัดความเร่งสองตัว คือ ADXL362 และ ADXL372 แต่ 372 เป็นเครื่องวัดแรงกระแทกสูง ฉันจึงใช้เครื่องวัด 362 ซึ่งมีความไวต่อแรงกระแทกมากกว่า Thingy ยังมีกล่องหุ้ม แบตเตอรี่ ไฟ LED และตัวอย่างโค้ดโอเพนซอร์สมากมาย Thingy มีราคาประมาณ 120 เหรียญ แต่ฉันมีเครื่องนี้จากโครงการอื่นที่ทำให้ตัดสินใจได้ง่ายขึ้น หากคุณยังไม่มี Thingy นี่อาจเป็นการลงทุนที่ดี เนื่องจากเป็นอุปกรณ์เอนกประสงค์ คุณจึงใช้เป็นเซ็นเซอร์วัดการสั่นสะเทือนได้ในวันนี้ และเป็นอย่างอื่นในวันพรุ่งนี้ได้
โปรโตคอลการสื่อสาร
อุปกรณ์ IoT จำนวนมากรายงานค่าเมตริกที่เปลี่ยนแปลงช้าๆ เมื่อเวลาผ่านไป เช่น อุณหภูมิ หรือรายงานเฉพาะเหตุการณ์ เช่น การเปิด/ปิดประตู ซึ่งไม่ใช่ในกรณีนี้ ในกรณีนี้ ฉันกำลังมุ่งเป้าไปที่โซลูชันที่สามารถติดตามค่าเมตริกได้บ่อยถึง 1 เฮิรตซ์ ซึ่งสามารถแปลงเป็นข้อมูลจำนวนมากที่อาจทำให้การเชื่อมต่อ แผนข้อมูล เซิร์ฟเวอร์แบ็กเอนด์ และอื่นๆ เสียหายได้
ปัญหาอีกประการหนึ่งเมื่อคุณพึ่งพาซอฟต์แวร์สำเร็จรูปเป็นหลักก็คือ คุณจะถูกจำกัดให้ใช้เฉพาะโปรโตคอลที่อุปกรณ์ของคุณ แบ็กเอนด์ของคุณ และซอฟต์แวร์ของอุปกรณ์เหล่านั้นรองรับ ตัวเลือกทั้งหมดเหล่านี้มีความเกี่ยวข้องกันในที่สุด
โปรโตคอลที่ฉันพิจารณาคือ:
โดยที่เพย์โหลดจะเป็น JSON, Protobuf หรือการเข้ารหัสไบนารีแบบกำหนดเอง
เนื่องจากข้อมูลหลักเป็นชุดข้อมูลแบบต่อเนื่องและไม่ใช่สตรีมข้อมูลที่ส่งคำสั่งหรือเหตุการณ์ ฉันจึงตัดสินใจว่าไม่จำเป็นต้องมีการส่งข้อมูลที่เชื่อถือได้ นอกจากนี้ ฉันยังตัดสินใจไม่ต้องการการเข้ารหัสด้วยเหตุผลเดียวกัน นอกจากนี้ ยังเป็นวิธีการแบบ DIY ไม่ใช่ผลิตภัณฑ์เชิงพาณิชย์ ทั้งหมดนี้ช่วยลดค่าใช้จ่ายและเราสามารถละเลย HTTPS, MQTT แทน TLS และ CoAP แทน DTLS ซึ่งเราจะต้องใช้ในกรณีอื่น
แบนด์วิธ
หากเรารายงานตัวอย่างหนึ่งทุกๆ 10 วินาที หลังจากหนึ่งเดือนจะได้ตัวอย่าง 260,000 ตัวอย่าง โอเวอร์เฮดของแต่ละตัวอย่างสร้างความแตกต่างอย่างมากในกรณีนี้ หากตัวอย่างหนึ่งต้องการ 50 ไบต์ ก็จะรวมเป็น 13MB/เดือน อย่างไรก็ตาม หากตัวอย่างหนึ่งต้องการ 1,000 ไบต์ ก็จะรวมเป็น 260MB/เดือน ซึ่งอาจมีต้นทุนที่สำคัญ ขึ้นอยู่กับแผนข้อมูลของคุณ การส่งไบต์มากขึ้นยังทำให้แบตเตอรี่มีอายุใช้งานสั้นลงและทำให้ใช้งานในพื้นที่ที่มีสัญญาณต่ำได้ยากขึ้น
การแบ่งแบตช์และความหน่วงเวลา
วิธีหนึ่งที่เป็นไปได้ในการลดแบนด์วิดท์คือการวัดแบบแบตช์ร่วมกัน ซึ่งจะช่วยปรับปรุงอัตราส่วนข้อมูลต่อค่าใช้จ่ายทั่วไป ซึ่งจะมีความสำคัญสำหรับเซ็นเซอร์ที่ใช้งานตลอดทั้งปีมากกว่าการใช้งานเป็นครั้งคราว ข้อเสียคือจะเพิ่มความล่าช้าให้กับข้อมูลใน UI ทำให้คุณอาจไม่เห็นการวัดล่าสุดที่เกิดขึ้น ฉันตัดสินใจที่จะไม่ใช้การวัดแบบแบตช์ แต่เป็นสิ่งที่สามารถเพิ่มได้ในอนาคตหากจำเป็น
แบ็คเอนด์และ UI
เพื่อให้โครงการนี้สมเหตุสมผลในแง่ของเวลา ฉันต้องใช้โซลูชันที่มีอยู่สำหรับแบ็กเอนด์และฟรอนต์เอนด์ (UI) โดยควรใช้สองส่วนที่ผสานรวมกัน เรื่องนี้ใช้ได้กับโครงการเชิงพาณิชย์ด้วย การพัฒนาสิ่งที่มีอยู่แล้วเป็นบริการทั่วไปในราคาที่แข่งขันได้นั้นไม่สมเหตุสมผล
ฉันยังคิดอยู่ว่าจะใช้บริการคลาวด์หรือโฮสต์แพ็คเกจบางอย่างบนทรัพยากรคอมพิวเตอร์ที่มีอยู่ของตัวเองดี ทั้งสองกลยุทธ์เป็นตัวเลือก แต่ฉันเอนเอียงไปทางบริการคลาวด์ด้วยเหตุผลสองประการ ประการแรก ฉันไม่ต้องการเปิดเผยบริการในเครือข่ายส่วนตัวของฉันให้กับอินเทอร์เน็ต และประการที่สอง การใช้บริการที่มีการใช้งานอยู่แล้วจะทำให้มีงานติดตั้งและกำหนดค่าน้อยลง
ฉันได้พิจารณาแนวทางแก้ปัญหาต่อไปนี้:
ฉันเลือก ThingsBoard สำหรับการสตรีมข้อมูลหลัก (ความถี่สูง) เนื่องจากสามารถใช้ CoAP แบบไม่ต้องเชื่อมต่อและเนื่องจากมี UI ที่ปรับแต่งได้ดี โปรดส่งข้อความส่วนตัวหากคุณต้องการแนะนำบริการอื่นๆ สำหรับจุดประสงค์นี้
ตัวอย่างแผงควบคุม ThingsBoard
ผลข้างเคียงที่เราจะอธิบายในหัวข้อถัดไปคือ โซลูชันยังรายงานข้อมูลความถี่ต่ำ (ประมาณทุกๆ 15 นาที) ไปยัง nRF Cloud นอกจากข้อมูลการสั่นสะเทือนแล้ว การรวบรวมสถานะแบตเตอรี่ ตำแหน่งอุปกรณ์ และพารามิเตอร์อื่นๆ ที่ไม่เปลี่ยนแปลงมากนักยังมีประโยชน์อีกด้วย การรวม nRF Cloud จะส่งผ่านช่อง MQTT ที่ปลอดภัย และ (ทางเลือก) อนุญาตให้ส่งคำสั่ง "AT" ของโมเด็มจากเซิร์ฟเวอร์ไปยังอุปกรณ์
จนถึงตอนนี้ ฉันได้อธิบายการออกแบบทางเทคนิคและพบส่วนประกอบสำเร็จรูปหลายชิ้นที่เราสามารถใช้เพื่อนำโซลูชันที่ต้องการไปใช้ ฮาร์ดแวร์ที่จำเป็นทั้งหมดพร้อมใช้งานแล้ว ส่วนแบ็คเอนด์และฟรอนต์เอนด์พร้อมใช้งาน ฉันเลือกโปรโตคอลการสื่อสารที่รองรับผ่านสแต็กของโซลูชัน ส่วนเดียวที่ฉันไม่มีคือซอฟต์แวร์สำหรับ Thingy ที่จะทำสิ่งที่จำเป็นสำหรับมัน ซอฟต์แวร์สำหรับอุปกรณ์ฝังตัวของไมโครคอนโทรลเลอร์เรียกว่าเฟิร์มแวร์
เฟิร์มแวร์
เฟิร์มแวร์สำหรับ nRF91 ซึ่งเป็นแกนหลักของ Thingy ได้รับการพัฒนาโดยใช้ “ nRF Connect SDK ” ซึ่งเป็นชุดพัฒนาซอฟต์แวร์จาก Nordic Semiconductor NCS มีพื้นฐานมาจากZephyr ซึ่งเป็นระบบปฏิบัติการโอเพ่นซอร์สแบบเรียลไทม์ (RTOS) การสืบทอดฟังก์ชัน nRF Cloud จากซอร์สโค้ดพื้นฐานทำให้ฉันสามารถพัฒนาส่วนการตรวจจับแยกจากส่วนการสื่อสารได้ ในตอนแรก ฉันเพิ่มการรองรับการสุ่มตัวอย่างเซ็นเซอร์และการคำนวณเมตริกการสั่นสะเทือน เมตริกการสั่นสะเทือนเป็นเพียงผลรวมของความแตกต่างในแกน 3 แกนของค่ามาตรความเร่งระหว่างตัวอย่างที่ต่อเนื่องกันสองตัวอย่าง เมื่อคำนวณค่าดังกล่าวแล้ว ฉันสามารถอัปโหลดไปยัง nRF Cloud เพื่อยืนยันว่าใช้งานได้และเพื่อให้มี POC ขนาดเล็ก เมื่อทำเสร็จแล้ว ฉันจึงเพิ่มการรองรับสำหรับการส่งเมตริกในความถี่ที่สูงขึ้นไปยังเซิร์ฟเวอร์ ThingsBoard โดยใช้โปรโตคอล CoAP ซอร์สโค้ดสำหรับโครงการมีอยู่ในgithub
การบูรณาการเซ็นเซอร์
เซ็นเซอร์ใน Zephyr ถูกแยกเป็น API โดยAPI ของเซ็นเซอร์ช่วยให้สามารถใช้เซ็นเซอร์ต่างๆ ผ่านอินเทอร์เฟซเดียวได้ โดยแยกตรรกะทางธุรกิจ คำจำกัดความ และตรรกะของไดรเวอร์ออกจากกัน API ช่วยให้สามารถอ่านค่าได้ตามต้องการ รวมถึงการตอบสนองต่อทริกเกอร์ (การเคลื่อนไหว การขัดจังหวะ ฯลฯ) การเพิ่มการรองรับเครื่องวัดความเร่ง (และเซ็นเซอร์อื่นๆ ในทำนองเดียวกัน) ประกอบด้วย 3 ขั้นตอน:
แบบจำลองนี้อาจดูแปลกสำหรับคนที่เคยชินกับแบบจำลองที่เรียบง่ายและ "แบนราบ" กว่า เช่น แบบจำลองที่คุณมีในกรอบงาน Arduino ซึ่งทุกอย่างเป็นเพียงโค้ด แบบจำลอง Zephyr มีความซับซ้อนมากกว่าและทำให้ง่ายต่อการเปลี่ยนไปใช้แบบจำลอง IC เซ็นเซอร์อื่นหรือบอร์ดอื่นโดยไม่ต้องเปลี่ยนแปลงโค้ดหรือแยกสาขาในโค้ด ต้นทุนหลักของการแยกส่วนนี้คือเส้นโค้งการเรียนรู้ที่สูงชันกว่า แต่ก็มีข้อดีมากมาย โดยเฉพาะอย่างยิ่งสำหรับโปรเจ็กต์ขนาดใหญ่
การบูรณาการ CoAP
สำหรับ CoAP มี API ให้เลือกใช้งาน 2 ตัว ได้แก่CoAP API ระดับล่างที่เป็นส่วนหนึ่งของ Zephyr และCoAP utils API ระดับสูงกว่าที่ Nordic เพิ่มเข้ามาและเป็นส่วนหนึ่งของ nRF Connect SDK API ระดับสูงกว่ามีฟังก์ชันการทำงานที่จำเป็นสำหรับโปรเจ็กต์นี้และจะช่วยประหยัดเวลาทำงานของเราได้ ฉันได้นำโค้ด c มาใช้เพื่อส่งข้อมูลไปยัง ThingsBoard โดยใช้ CoAP utils API ฉันใช้ คำจำกัดความจุดสิ้นสุด การอัปโหลด CoAP สำหรับการส่งข้อมูลทางไกลของ ThingsBoard เพื่อดูรายละเอียดเกี่ยวกับวิธีจัดรูปแบบ uri และเพย์โหลด
การเชื่อมโยงทุกสิ่งเข้าด้วยกัน
โค้ดเพิ่มเติมบางส่วนในวงจรตรรกะทางธุรกิจหลักจะช่วยเชื่อมโยงทุกอย่างเข้าด้วยกัน โดยจะดึงค่าจากส่วนประกอบการสั่นสะเทือนและส่วนประกอบการจัดการแบตเตอรี่แล้วส่งข้อมูลดังกล่าวไปยังคลาวด์ในช่วงเวลาต่างๆ
ผลลัพธ์จากมุมมองของผู้ใช้ปลายทางคืออุปกรณ์ขนาดเล็กพกพาสะดวกที่คุณสามารถติดเข้ากับเครื่องจักรหรือท่อทุกชนิด จากนั้นคุณสามารถเปิดเว็บเพจและดูผลลัพธ์แบบเรียลไทม์ได้
เมื่อดูจากกราฟ คุณจะสามารถระบุได้ว่ามีบางสิ่งเกิดขึ้นหรือไม่ และเกิดขึ้นเมื่อใด การวิเคราะห์ที่แน่นอนจะขึ้นอยู่กับกรณีการใช้งานที่แน่นอน ตัวอย่างเช่น ในกราฟด้านล่าง คุณจะเห็นกิจกรรมที่เกิดขึ้นซ้ำๆ ในระบบสองประเภท ประเภทแรกคือช่วงเวลาหนึ่งชั่วโมงที่เกิดขึ้นทุก 5-6 ชั่วโมง และประเภทที่สองคือช่วงเวลา 10 ชั่วโมงที่เกิดขึ้นในเวลากลางคืน
ผลข้างเคียงของการใช้ตัวอย่าง nRF Cloud คือเราสามารถมีข้อมูลตำแหน่งและอุณหภูมิที่เป็นทางเลือกได้
แบตเตอรี่ขนาด 1,400 mAh สามารถใช้งานได้นานกว่า 2 วัน โดยส่งตัวอย่างการสั่นสะเทือนทุกๆ 20 วินาที แบตเตอรี่สามารถชาร์จจนเต็มได้ภายใน 3 ชั่วโมงจากแหล่งจ่ายไฟ USB โดยแต่ละแพ็กเก็ตจะมีขนาดประมาณ 60-70 ไบต์ UDP ไม่จำเป็นต้องเชื่อมต่อใดๆ
ฉันได้อธิบายขั้นตอนการสร้างอุปกรณ์ IoT แบบเซลลูลาร์ DIY โดยเริ่มต้นด้วยชุดข้อกำหนดและสร้างโซลูชันที่ปรับแต่งให้เหมาะกับข้อกำหนดเหล่านั้น ซึ่งส่วนใหญ่ประกอบด้วยส่วนประกอบสำเร็จรูป ส่วนประกอบบางส่วนเป็นฮาร์ดแวร์ บางส่วนเป็นเฟิร์มแวร์ บางส่วนเป็นบริการออนไลน์ แต่เมื่อนำมารวมกันก็ทำให้สามารถพัฒนาโซลูชันต้นทุนต่ำได้ ต้นทุนเพียงอย่างเดียวในโครงการนี้คือเวลา และฉันประมาณว่าฉันใช้เวลา 10-20 ชั่วโมงในการค้นคว้าและนำตัวเลือกต่างๆ ไปใช้ เนื่องจากฉันเผยแพร่โครงการเป็นโอเพ่นซอร์ส ครั้งหน้าหากใครก็ตามจะลองทำอะไรที่คล้ายกัน อุปสรรคจะยิ่งน้อยลงไปอีก
จากมุมมองทางเทคนิค การปรับปรุงบางอย่างสามารถทำได้ เช่น การสื่อสารข้อมูลสามารถทำให้มีประสิทธิภาพและปลอดภัยยิ่งขึ้น ตัวอย่างเช่น การวัด N แต่ละครั้งสามารถรวมเป็นชุดและส่งในแพ็กเก็ต CoAP หนึ่งแพ็กเก็ตได้ ซึ่งอาจต้องมีบริการตัวแยกประเภทในแบ็กเอนด์
ปัญหาบางประการยังคงเกิดขึ้น เช่น การอ่านค่ามาตรความเร่งแตกต่างกันเมื่ออุปกรณ์ได้รับพลังงานจาก USB และจากแบตเตอรี่ ควรตรวจสอบสาเหตุของปัญหานี้ และอาจเกี่ยวข้องกับความแตกต่างของแรงดันไฟฟ้า สัญญาณรบกวนจากส่วนประกอบอื่น หรือความแตกต่างของนาฬิกาในสถานะพลังงานต่ำ อย่างไรก็ตาม ในตอนนี้ เซ็นเซอร์จะทำงานตามที่ฉันต้องการ และเนื่องจากนี่เป็นโครงการ DIY ฉันจึงไม่มีปัญหาอะไร