ดิว.นินจา

ดิว.นินจา

Sunday, June 2, 2019

microgear.begin(5555) : สนุกกับการส่งค่าความเร่งและไจโรผ่าน NB-IoT และ NETPIE

เชื่อว่าผู้อ่านส่วนใหญ่ได้ติดตามข่าวเกี่ยวกับผลิตภัณฑ์ NB-IoT ในรูปแบบของ Arduino Shields จากค่าย AIS และ True และหลายท่านคงได้หาอุปกรณ์มาทดลองแล้ว โดยในปัจจุบันชิลด์ออกแบบมาสำหรับใช้งานกับบอร์ด Arduino UNO และ MEGA ทางทีม NETPIE ได้พัฒนาไลบรารี microgear สำหรับ NB-IoT โดยเฉพาะ ที่ใช้ได้กับผลิตภัณฑ์จากทั้งสองบริษัท โดยสร้างบทความตัวอย่างการใช้งานพื้นฐานในการอ่านค่าจากเซนเซอร์ DHT เพื่อแสดงผลบน Freeboard เมื่อติดตั้งไลบรารีตามคำแนะนำในบทความ ผู้อ่านสามารถรันโปรแกรมที่มีให้บนเว็บได้อย่างไม่มีปัญหา microgear.begin(5555); เป็นคำสั่งเริ่มต้นทำงานที่น่ารื่นเริงบันเทิงใจอย่างมากในความคิดของผู้เขียน ซึ่งทุกคนน่าจะหัวเราะอย่างเป็นสุขเมื่อเห็นการแสดงผลข้อมูลบนหน้า Freeboard คงเหมือนเป็นธรรมเนียมไปแล้วว่าตัวอย่างแรกในการเรียนรู้อุปกรณ์ใหม่ด้าน IoT คือการวัดอุณหภูมิและความชื้น ดังนั้นผู้เขียนจะพยายามนำเสนอการใช้งานทีแตกต่างออกไป ในบทความนี้เราจะศึกษาการอ่านค่าจากเซนเซอร์วัดความเร่งและความเร็วเชิงมุม (ไจโร) และส่งข้อมูลให้ NETPIE Freeboard และ Feed ผ่าน NB-IoT

ลิงก์อ้างอิง : สร้างอุปกรณ์ IoT ง่ายๆ ด้วย NETPIE และ NB-IoT โดยคุณ Sirawit จาก NEXPIE

ผู้เริ่มต้นจำนวนมากนิยมทดสอบ NB-IoT shields กับบอร์ด Arduino UNO เหมือนในบทความด้านบน เนื่องจากหาได้ง่าย ราคาต่ำ และสามารถต่อใช้งานได้ทันทีโดยไม่ต้องปรับฮาร์ดแวร์ใดๆ แต่เมื่อท่านต้องการต่อยอดโปรแกรมจากตัวอย่างมักจะเริ่มประสบปัญหา เนื่องจากหน่วยความจำไม่เพียงพอ อาการที่พบคือการทำงานค้าง หรือตัวประมวลผลรีเซ็ตตัวเอง จากการทดสอบของผู้เขียนและยืนยันโดยผู้ใช้งานอื่นคือไม่สามารถแสดงผลบน Freeboard และเขียนลง Feed ในโปรแกรมเดียวกัน

ดังนั้นเมื่อต้องการทำงานที่ยากขึ้น Arduino UNO อาจมิใช่ตัวเลือกฮาร์ดแวร์ที่ดีอีกต่อไป เราจึงต้องหันมาใช้บอร์ด Arduino ที่มีหน่วยความจำมากขึ้น นั่นคือ Arduino MEGA 2560 ตัวอย่างของบอร์ดดังแสดงในรูปที่ 1

รูปที่ 1 Arduino MEGA 2560 (ภาพจาก www.arduino.cc)

ซึ่งมีทั้งจากบริษัทผู้ผลิต Arduino โดยตรงและจากบริษัทอื่นที่ราคาต่ำกว่าและหาได้ง่ายในประเทศไทย ผู้อ่านที่คุ้นเคยกับ Form Factor ของ UNO จะพบว่าผลิตภัณฑ์รุ่น MEGA นี้ จะมีความยาวกว่าและมีคอนเนกเตอร์เพิ่มขึ้น แต่ว่าจะมีส่วนทางด้านซ้ายที่สามารถประกบชิลด์ที่ออกแบบสำหรับ UNO ได้พอดี แต่ว่าจะมีความแตกต่างของสัญญาณอยู่บ้างโดยเฉพาะส่วนของพอร์ตอนุกรม ทำให้ต้องมีการจัมป์สายเพื่อให้สามารถใช้งานกับ NB-IoT shields ได้ ผู้เขียนจะไม่ขอกล่าวถึงรายละเอียดในส่วนนี้เนื่องจากท่านสามารถอ่านได้จากบทความ การใช้ AIS NB-IoT Shield บน ARDUINO MEGA 2560 เขียนโดยคุณ Puttapong Patumrattanachot

สรุปจากบทความที่อ้างถึงนี้คือเราต้องต่อสายจาก serial 1 มาให้กับบอร์ด NB-IoT ดังรูปที่ 2 ซึ่งในการทดลองผู้เขียนใช้ชิลด์เอนกประสงค์ต่อคั่นกลางอีกชั้นหนึ่งสำหรับต่อเซนเซอร์และจอแสดงผล OLED และเพื่อความสบายใจว่าขาสัญญาณไม่ชอร์ตกันได้พับขาคอนเนกเตอร์ของชิลด์ที่ต่อกับขา 8,9 ของ Arduino MEGA ทำให้มีแต่ขา 18(TX1) และ 19(RX1) เท่านั้นที่ต่อกัน NB-IoT (ขั้นตอนนี้คงไม่จำเป็นหากไม่นิยามขา 8 หรือ 9 เป็นเอาต์พุต)

รูปที่ 2 แสดงการเชื่อมสัญญาณจาก TX1, RX1 มายังบอร์ด NB-IoT

ฮาร์ดแวร์ที่ใช้

วัตถุประสงค์ของการพัฒนาในบทความนี้คือต้องการวัดค่าความเร่งและความเร็วเชิงมุมหรือไจโรและส่งข้อมูลผ่าน NB-IoT shield ดังนั้นจึงต้องการเซนเซอร์สำหรับวัดค่าดังกล่าว ซึ่งพบว่ามีโมดูลที่ใช้ MPU6050 ที่หาได้ในประเทศไทยและมีความเหมาะสมหลายประการ เช่นมีประสิทธิภาพดี ราคาไม่สูงมาก ใช้งานง่าย วัดค่าได้ 3 มิติ การสื่อสารข้อมูลผ่านบัส I2C ทำให้ไม่เปลืองขาสัญญาณ และมีไลบรารีที่ผู้อื่นพัฒนาไว้แล้ว ผู้เขียนเลือกโมดูล GY-521 3-axis Accelerator/Gyro Module (MPU6050) จากร้าน www.arduinothai.com ขาที่ต่อใช้งานมีเพียง 4 ขาแรกของโมดูล คือ VCC = 5V, GND, SCL = 21, SDA = 20 เมื่อปล่อยขา AD0 ลอยไว้ แอดเดรส I2C ของโมดูลนี้จะเท่ากับ 0x68

ข้อมูลที่เป็นประโยชน์ : Tutorial: How to use the GY-521 module (MPU-6050 breakout board) with the Arduino Uno ในบทความนี้เราจะใช้กับ Arduino MEGA 2560 แต่หลักการเชื่อมต่อและอ่านค่าจากโมดูลจะเหมือนกัน

นอกจากนี้ยังติดตั้ง OLED SSD1306 ความละเอียด 128 x 64 เพื่อแสดงค่าบนบอร์ด ทำให้การตรวจสอบข้อมูลทำได้ง่ายขึ้น การติดตั้งเซนเซอร์และจอแสดงผลบนชิลด์อเนกประสงค์แสดงดังในรูปที่ 3

รูปที่ 3 การติดตั้งอุปกรณ์บนชิลด์อเนกประสงค์

การอ่านค่าจากเซนเซอร์

เนื่องจากเซนเซอร์มีไลบรารีสำหรับ Arduino อยู่แล้วทำให้การพัฒนาทำได้สะดวก เมื่อติดตั้งไลบรารีจะมีตัวอย่างให้สำหรับทดสอบ ในที่นี้เลือกใช้ไลบรารีที่พัฒนาโดย Jeff Rowberg เนื่องจากบทความนี้เน้นการสื่อสารผ่าน NB-IoT ดังนั้นเพื่อความง่ายจะใช้ค่าดิบที่อ่านได้จากเซนเซอร์ในการแสดงผล หากต้องการค่าในรูปแบบอื่นที่ประมวลผลโดย MPU-6050 สามารถศึกษาได้จากดาต้าชีท

เมื่อทดลองรันตัวอย่าง MPU6050_raw.ino จากไลบรารี จะเห็นการแสดงค่าผ่านพอร์ตอนุกรมดังในรูปที่ 4 ทดลองปรับเปลี่ยนทิศทางของบอร์ดและหมุนในแนวแกนต่างกันใน 3 มิติเพื่อดูการเปลี่ยนแปลงของข้อมูล

รูปที่ 4 การแสดงค่าออก Serial Monitor โดยโปรแกรมตัวอย่าง MPU6050_raw.ino

การแสดงผลบน OLED

เราจะใช้โปรแกรมตัวอย่างของ MPU 6050 เป็นต้นแบบ และเพิ่มเติมส่วนต่าง ๆ เข้าไปจนกระทั่งได้เป็นโปรแกรมที่ทำงานตามต้องการ เริ่มจากการเพิ่มส่วนแสดงผลบน OLED ซึ่งในบทความนี้จะไม่ลงรายละเอียด เพียงแต่คัดลอกโค้ดจากโปรแกรมอื่นๆ ที่มีการใช้ OLED SSD1306 นี้และดัดแปลงให้สามารถแสดงผลช้อมูลทั้งหมดที่ต้องการ ซึ่งจะเขียนเป็นฟังก์ชัน showOLED() รูปที่ 5 แสดงค่าที่ปรากฏบนจอในรูปแบบ 3 แถว 2 คอลัมน์

รูปที่ 5 การแสดงผลค่าความเร่งและไจโร 3 มิติบน OLED

การเชื่อมต่อกับ NB-IoT

ในการทดลองนี้ใช้บอร์ด NB-IoT shield ของ AIS ซึงหากผู้อ่านมีของ True ก็สามารถใช้ได้เช่นเดียวกัน ใช้โครงสร้างโค้ดเดียวกันกับตัวอย่างจากทีม NETPIE นำมาผสมผสานกับโปรแกรมที่อ่านค่าจากเซนเซอร์ โปรแกรมทั้งหมดสามารถดาวน์โหลดได้จากท้ายบทความนี้ ในส่วนนี้จะกล่าวเฉพาะส่วนสำคัญ

ในส่วนบนสุดของโปรแกรมจะมีการเลือกนิยามตามบอร์ด Arduino ที่ใช้งาน


#if defined(__AVR_ATmega328P__) || defined(__AVR_ATmega168__)      // Arduino UNO
    #include 
    AltSoftSerial bc95serial;
#elif defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)   // Arduino MEGA2560
    #define bc95serial Serial1
#endif

ส่วนนี้ต้องมีไว้เพื่อเลือกใช้ Serial1 สำหรับ Arduino MEGA 2560 โดย IDE จะเลือกให้เองเมื่อเราเลือกบอร์ดเป็น Arduino/Genuino MEGA or MEGA2560 จากเมนู

ต่อมาเป็นส่วนเรียกไลบรารีทั้งหมดที่ใช้ และส่วนนิยาม APPID, KEY, SECRET, FEEDID, FEEDAPI ซึ่งจะต้องใส่ข้อมูลให้ตรงกับที่ใช้ในบัญชี NETPIE ของผู้อ่าน

ในฟังก์ชัน setup() สอดแทรกการตั้งค่า NB-IoT จากตัวอย่างของ NETPIE โดยไม่ต้องมีการแก้ไขใดๆ จนจบด้วยเสียงหัวเราะ mg.begin(5555);

ในฟังก์ชัน loop() ค่าความเร่งและไจโรใน 3 มิติจะถูกอ่านและเก็บในตัวแปร ax, ay, az, gx, gy, gz โดยคำสั่ง


accelgyro.getMotion6(&ax, &ay, &az, &gx, &gy, &gz);

และแสดงผลบนจอ OLED โดยฟังก์ชัน showOLED() หลังจากนั้นส่งข้อมูลผ่าน NB-IoT โดยอาศับไลบรารี microgear ซึ่งดัดแปลงจากเค้าโครงจากตัวอย่างของ NETPIE โค้ดการพับลิชค่าให้กับ Freeboard เป็นดังนี้


currentmillis = millis();
if(currentmillis - lastPublish > PUBLISHPERIOD){  
    lastPublish=currentmillis;
    publishStr=(String)ax+","+(String)ay+","+(String)az+
    ","+(String)gx+","+(String)gy+","+(String)gz;
    Serial.print(F("Publishing --> "));
    Serial.println(publishStr); 
    publishStr.toCharArray(payload, MAXBUFFSIZE-1);
    mg.publish("/nbiot/mpu6050", payload);     
    Serial.print(F("Sent Signal Strength: "));
    Serial.println(BC95.getSignalStrength());
    mg.publish("/nbiot/rssi", BC95.getSignalStrength());    
}

โดย PUBLISHPERIOD นิยามไว้ 1 วินาที สังเกตความแตกต่างระหว่างไลบรารี microger ของ NB-IoT กับ ESP8266 ตรงที่เมธอด publish() จะรับค่าเป็น character array โดยไม่สามารถใส่ตัวแปร String ไปได้โดยตรง ต้องมีการแปลงข้อมูลโดยเมธอด .toCharArray() แต่ไลบรารีของ ESP8266 จะมี overload ไว้ให้ใส่ตัวแปร String ได้ ซึ่งในกรณีของ Feed ก็เช่นเดียวกัน โค้ดการเขียนข้อมูลขึ้น Feed เป็นดังนี้


if (currentmillis - lastWriteFeed > FEEDWRITEPERIOD)   {
    lastWriteFeed = currentmillis;
    feedStr = "ax:"+(String)ax+","+"ay:"+(String)ay+","
    +"az:"+(String)az; 
    Serial.print("Write Feed --> ");
    //Serial.println(feedStr);
    feedStr.toCharArray(fpayload, FEEDMAXBUFFSIZE-1);
    Serial.println(fpayload);
    mg.writeFeed(FEEDID,fpayload);
}

โดยนิยาม FEEDWRITEPERIOD ไว้เท่ากับ 15 วินาที

ปัญหาที่พบ

การส่งข้อมูลให้กับ Freeboard ไม่พบปัญหาใดๆ แต่เมื่อต้องการเขียนข้อมูลทั้ง 6 ค่าขึ้น Feed พบว่า Feed ไม่สามารถรับค่าได้ ยังไม่ทราบสาเหตุที่แน่ชัด แต่คาดเดาว่าสตริงอาจมีความยาวเกินกว่าค่าที่กำหนด เพราะเมื่อแก้ปัญหาโดยสร้าง Feed แยกกัน 2 ตัวสำหรับเก็บค่าความเร่งและไจโร สามารถเขียนค่าขึ้น Feed ทั้งสองได้โดยไม่มีปัญหา รูปที่ 6 แสดงหน้า Freeboard ที่ประกอบด้วย text+sparkline widgets และ FeedView widgets แสดงข้อมูลความเร่งและไจโรใน 3 มิติ ช่วงข้อมูลที่เปลี่ยนแปลงเกิดจากการทดสอบหมุนและเปลี่ยนทิศทางของเซนเซอร์

รูปที่ 6 การแสดงผลความเร่งและไจโร 3 มิติบน Freeboard

สรุป

บทความนี้นำเสนอตัวอย่างการใช้งาน NB-IoT เพื่อวัดค่าความเร่งและไจโรและแสดงผลบน NETPIE Freeboard สามารถนำไปประยุกต์ใช้ในงานวัดความสั่นสะเทือนของเครื่องจักร การเปลี่ยนทิศทางการเคลื่อนที่ของวัตถุ หรือตรวจจับแผ่นดินไหว ข้อจำกัดของ NB-IoT จะเป็นด้านอัตราความเร็วในการรับส่งข้อมูลต่ำ และในปัจจุบันใช้งานได้ในการแสดงผลเพียงอย่างเดียวโดยไม่สามารถสั่งงานกับอุปกรณ์ได้ แต่มีข้อดีด้านการประหยัดพลังงาน ดังนั้นเหมาะสมกับการติดตั้งในที่เข้าถึงได้ยาก โดยอาศัยพลังงานจากแบตเตอรี่หรือโซล่าเซล แต่ไม่เหมาะสำหรับการวัดค่าหรือควบคุมระบบที่มีการเคลื่อนที่รวดเร็วเช่นหุ่นยนต์หรือโดรน

โปรแกรม : MPU6050_nbiot.ino

No comments:

Post a Comment

แนะนำหนังสือ “ตัวควบคุมป้อนกลับบนอินเทอร์เน็ตโดย ESP8266”

ปัจจุบันเมื่อกล่าวถึงอุปกรณ์ IoT (Internet of Things) คงมีน้อยคนที่จะไม่รู้จัก ในยุคที่การเข้าถึงอินเทอร์เน็ตเป็นกิจวัตรประจำวันของมนุษย์เ...