การแนะนำ
ในบทความนี้ เราจะพูดถึงวิธีสร้างโปรเจ็กต์การบันทึกข้อมูลที่สั่งให้ VEX Robot รวบรวมข้อมูลด้วย VEX Brain และบันทึกเป็นไฟล์ CSV บนการ์ด SD เพื่อการวิเคราะห์ข้อมูล
การบันทึกข้อมูลเป็นเครื่องมืออันทรงพลังที่เราสามารถใช้เพื่อช่วยเหลือการวิจัยทางวิทยาศาสตร์ ดำเนินการทดลองของเราเอง และแก้ปัญหาเฉพาะได้ มีงานที่สนุกสนานและน่าตื่นเต้นมากมายที่เราสามารถขับเคลื่อน VEX Robot ให้สำเร็จได้ด้วยการบันทึกข้อมูล ต่อไปนี้เป็นตัวอย่างบางส่วน:
- รวบรวมข้อมูลด้วย Distance Sensor เพื่อคำนวณความเร็วของหุ่นยนต์
- ขับเคลื่อนหุ่นยนต์ไปรอบๆ ห้องเรียนและรวบรวมข้อมูลด้วย Optical Sensor เพื่อสังเกตการเปลี่ยนแปลงของแสงในสถานที่ต่างๆ
- พาหุ่นยนต์ออกผจญภัยและบันทึกข้อมูลพิกัด GPS เพื่อสร้างแผนที่
ทักษะการเขียนโค้ดที่จำเป็นสำหรับการพัฒนาโครงการบันทึกข้อมูล
- ใช้คำสั่งต่างๆ เพื่อรวบรวมข้อมูลด้วย VEX Brain/Sensors และเพิ่มลงในโครงสร้างข้อมูล
- เขียนข้อมูลลงในไฟล์ Comma-Separated Values (CSV) บนการ์ด SD
ฮาร์ดแวร์ที่จำเป็นสำหรับการบันทึกข้อมูล:
- สมอง VEX (IQ, V5, EXP)
- การ์ด SD
- เซ็นเซอร์หนึ่งตัวหรือเซ็นเซอร์หลายตัว (อุปกรณ์เสริมตามข้อมูลที่ต้องการ)
รับข้อมูลจากเซ็นเซอร์
เราสามารถตั้งโปรแกรม VEX Robot (IQ, V5, EXP) เพื่อจับข้อมูลจากเซ็นเซอร์ต่อไปนี้:
- เซ็นเซอร์เฉื่อย
- เซ็นเซอร์วัดระยะ
- ออปติคัลเซนเซอร์
- วิชันเซนเซอร์
- เซนเซอร์ตรวจจับการหมุน (V5, EXP)
- เซ็นเซอร์ GPS (V5)
หมายเหตุ: สมอง VEX IQ (รุ่นที่ 2) และสมอง VEX EXP มีเซ็นเซอร์เฉื่อยในตัว เราสามารถรวบรวมข้อมูลเซนเซอร์เฉื่อยด้วย VEX Brians เหล่านี้ได้
ในบทความนี้ เราจะพัฒนาโครงการบันทึกข้อมูลที่รวบรวมข้อมูลความเร่งด้วย VEX IQ Brain (2nd) และจัดเก็บไว้ในการ์ด SD
ก่อนอื่น เราต้องเขียนโปรแกรมสั้นๆ เพื่อรับค่าที่อ่านได้จาก Timer และ Inertial Sensor ที่สร้างใน VEX IQ Brain (ตัวที่ 2)
- ในตอนเริ่มต้นของโปรแกรมนี้ เราจะต้องนำเข้าโมดูล Python เพื่อควบคุม VEX IQ Brain (2nd) และดึงข้อมูลจากโมดูลดังกล่าว ดังนั้น ให้เริ่มด้วยการเพิ่มคำแนะนำเหล่านี้ลงในโปรเจ็กต์
-
# ไลบรารีนำเข้า
จากการนำเข้า vex *
# Brain ควรถูกกำหนดโดยค่าเริ่มต้น
brain = Brain()
brain_inertial = Inertial() - ถัดไป เพิ่มโค้ดเพื่อประกาศตัวแปร
numOfDataEntriesเพื่อจัดเก็บจำนวนรายการข้อมูลสำหรับการบันทึก ประกาศตัวแปรpolling_delay_msecเพื่อจัดเก็บค่าช่วงเวลาสำหรับการอ่านข้อมูล และสร้างตัวแปรสตริงว่างdata_bufferเพื่อจัดเก็บ ข้อมูลที่อ่านจากเซ็นเซอร์ -
numOfDataEntries = 100
polling_delay_msec = 50
data_buffer = "" - เนื่องจากเราจะใช้ค่าปัจจุบันของตัวจับเวลาเพื่อเพิ่มค่า Timestamp ให้กับข้อมูล เราจึงต้องรีเซ็ตค่าตัวจับเวลากลับเป็น 0 วินาทีก่อนที่จะเริ่มรวบรวมข้อมูล
-
# เพิ่มโค้ดเริ่มต้นตัวจับเวลา
brain.timer.clear() - ก่อนที่จะใช้คำสั่งดึงข้อมูลจาก VEX IQ Brain (ตัวที่ 2) และบันทึกข้อมูลลงในบัฟเฟอร์ เราต้องทำความเข้าใจก่อน
คำสั่งต่อไปนี้จะเพิ่มค่าตัวจับเวลาปัจจุบันต่อท้ายตัวแปรdata_bufferในรูปแบบเฉพาะมาแจกแจงสตริงรูปแบบ
“%1.3f”:- “%”: แนะนำตัวระบุการแปลง
- “1”: ระบุจำนวนหลักขั้นต่ำที่จะปรากฏในสตริง
- “.3”: ระบุจำนวนตำแหน่งทศนิยมที่จะรวมไว้ในตัวเลขที่จัดรูปแบบ
- “f”: ระบุว่าค่าที่จะจัดรูปแบบเป็นตัวเลขทศนิยม
ดังนั้นเราจึงสามารถใช้สตริงรูปแบบ “%1.3f” เพื่อจัดรูปแบบตัวเลขทศนิยมที่มีความกว้างขั้นต่ำ 1 หลักและมีทศนิยม 3 ตำแหน่ง
- ตอนนี้เราสามารถอ่าน Timer และค่าความเร่งของ Inertial Sensor ที่สร้างขึ้นใน VEX IQ Brain (ตัวที่ 2) แล้วจึงผนวกข้อมูลเข้ากับตัวแปร
data_bufferในรูปแบบที่ระบุ -
# คำสั่งในการเขียนข้อมูลลงบัฟเฟอร์
data_buffer += "%1.3f" % brain.timer.value() + "\n"
data_buffer += "%1.3f" % brain_inertial.acceleration(XAXIS) + ","
data_buffer += "%1.3f" % brain_inertial.acceleration(YAXIS) + ","
data_buffer += "%1.3f" % brain_inertial.acceleration(ZAXIS) + "\n"
หมายเหตุ: “\n” คืออักขระขึ้นบรรทัดใหม่ เป็นการระบุว่าบรรทัดสิ้นสุดที่นี่และเป็นจุดเริ่มต้นของบรรทัดใหม่
- จากนั้น เพื่อบันทึกรายการข้อมูลจำนวนหนึ่งลงในตัวแปร
data_bufferเราสามารถใช้สำหรับลูปเพื่อดำเนินการคำสั่งซ้ำๆ เพื่อดึงข้อมูลและผนวกข้อมูลเข้ากับตัวแปรdata_bufferสำหรับการวนซ้ำจำนวนหนึ่ง กลยุทธ์ของเราคือการใช้ค่าของตัวแปรnumOfDataEntriesเพื่อกำหนดจำนวนการวนซ้ำ -
# การสร้างข้อมูล
สำหรับ i ในช่วง (0, numOfDataEntries):
# คำสั่งในการเขียนข้อมูลลงในบัฟเฟอร์
data_buffer += "%1.3f" % brain.timer.value() + "\n"
data_buffer += "%1.3f" % brain_inertial.acceleration(XAXIS) + ","
data_buffer += "%1.3f" % brain_inertial.acceleration(YAXIS) + ","
data_buffer += "%1.3f" % brain_inertial.acceleration(ZAXIS) + "\n"
- จนถึงขณะนี้ โปรแกรมของเราจะบันทึกข้อมูลโดยเร็วที่สุด อย่างไรก็ตาม เราต้องการบันทึกข้อมูลในช่วงเวลาที่กำหนด ดังนั้นเราจึงสามารถใช้ฟังก์ชัน
wait()ในสำหรับลูปเพื่อหยุดโปรแกรมชั่วคราวเพื่อเพิ่มช่วงเวลาเฉพาะระหว่างการอ่านสองครั้ง เราใช้ค่าของตัวแปรpolling_delay_msecเพื่อกำหนดค่าของช่วงเวลา -
# การสร้างข้อมูล
สำหรับ i ในช่วง (0, numOfDataEntries):
# คำสั่งในการเขียนข้อมูลลงในบัฟเฟอร์
data_buffer += "%1.3f" % brain.timer.value() + "\n"
data_buffer += "%1.3f" % brain_inertial.acceleration(XAXIS) + ","
data_buffer += "%1.3f" % brain_inertial.acceleration(YAXIS) + ","
data_buffer += "%1.3f" % brain_inertial.acceleration(ZAXIS) + "\n"
wait(polling_delay_msec, MSEC)
ยินดีด้วย! เราได้เสร็จสิ้นโปรแกรมเพื่อรับการอ่าน (ข้อมูลความเร่ง) จากเซ็นเซอร์เฉื่อยที่สร้างขึ้นในสมอง VEX ต่อไป เราจะมาดูวิธีเขียนข้อมูลลงในไฟล์ CSV บนการ์ด SD
# ไลบรารีนำเข้า
จาก vex import *
# Brain ควรถูกกำหนดโดยค่าเริ่มต้น
brain = Brain()
brain_inertial = Inertial()
numOfDataEntries = 100
polling_delay_msec = 50
data_buffer = ""
# เพิ่มรหัสการเริ่มต้นตัวจับเวลา
brain.timer.clear()
# การสร้างข้อมูล
สำหรับ i ในช่วง (0, numOfDataEntries):
# คำสั่งในการเขียนข้อมูลไปยังบัฟเฟอร์
data_buffer += "%1.3f" % brain.timer.value() + "\n"
data_buffer += "%1.3f" % brain_inertial.acceleration(XAXIS) + ","
data_buffer += "%1.3f" % brain_inertial.acceleration(YAXIS) + ","
data_buffer += "%1.3f" % brain_inertial.acceleration(ZAXIS) + "\n"
wait(polling_delay_msec, MSEC)
การแนบการ์ด SD เข้ากับสมอง VEX
ก่อนที่จะเขียนข้อมูลลงไฟล์ในการ์ด SD ให้ใส่การ์ด SD ลงในช่องเสียบการ์ด SD ของ VEX Brain ก่อน
หมายเหตุ: ฟอร์แมตการ์ด SD เป็น FAT32 เพื่อเขียนข้อมูล เราขอแนะนำให้ใช้การ์ด SD ที่มีขนาด 32GB หรือน้อยกว่า
เพื่อให้แน่ใจว่าการเขียนข้อมูลลงไฟล์ในการ์ด SD สามารถทำได้ภายใต้สภาวะที่เหมาะสม เราจะต้องเพิ่มโค้ดเพื่อตรวจสอบว่าใส่การ์ด SD ลงใน VEX IQ Brain อย่างถูกต้องหรือไม่ (อันดับที่ 2)
- ใช้ฟังก์ชัน
brain.sdcard.is_inserted()เพื่อตรวจสอบว่าเสียบการ์ด SD แล้วหรือไม่ หากไม่ได้ใส่การ์ด SD ให้แสดงข้อความที่เกี่ยวข้องบนหน้าจอ VEX IQ Brain และกดโปรแกรมค้างไว้ -
# หยุดโปรแกรมหากไม่ได้ใส่การ์ด SD
หมายเหตุ:
หากไม่ได้ใส่ brain.sdcard.is_inserted():
brain.screen.set_cursor(1,1)
brain.screen.print("SD Card Missing")
while(True):
wait(5, MSEC)ฟังก์ชัน brain.sdcard.is_inserted()คืนค่า True ถ้าการ์ด SD ถูกเสียบเข้าไปใน Brain
การเขียนข้อมูลลงในไฟล์ CSV บนการ์ด SD
จนถึงตอนนี้โปรแกรมของเราสามารถรวบรวมข้อมูลด้วย VEX IQ Brain (ตัวที่ 2) ได้แล้ว เพื่อให้โครงการบันทึกข้อมูลเสร็จสมบูรณ์ เราจำเป็นต้องเขียนข้อมูลลงในไฟล์ Comma-Separated Values (CSV) บนการ์ด SD เพื่อการตรวจสอบและวิเคราะห์ในอนาคต
- เมื่อเขียนข้อมูลประเภทต่างๆ ลงในไฟล์ CSV เราต้องการทราบว่าแต่ละคอลัมน์มีข้อมูลประเภทใด ในการทำเช่นนี้ เราสามารถเพิ่มข้อความส่วนหัว CSV ต่อท้ายตัวแปร
data_bufferก่อนที่จะบันทึกข้อมูล
ดังนั้นให้เพิ่มโค้ดเพื่อประกาศตัวแปรcsvHeaderTextเพื่อจัดเก็บข้อความส่วนหัว CSV เพื่อระบุชื่อคอลัมน์สำหรับไฟล์ CSV และประกาศตัวแปรsd_file_nameเพื่อเก็บชื่อของไฟล์ CSV ที่จะเขียนลงใน การ์ด SD -
csvHeaderText = "เวลา, x, y, z"
sd_file_name = "myDataPY.csv"
หมายเหตุ: ตรวจสอบให้แน่ใจว่าส่วนหัวอยู่ในลำดับเดียวกันกับข้อมูลที่จัดเก็บไว้ในตัวแปร data_buffer
- จากนั้น ให้เพิ่มข้อความส่วนหัว CSV ต่อท้ายสตริง
data_bufferก่อนสตริงสำหรับลูปสำหรับการรวบรวมข้อมูล -
# สร้าง CSV Header
data_buffer = csvHeaderText + "\n"
# การสร้างข้อมูล CSV
สำหรับ i ในช่วง (0, numOfDataEntries):
# คำสั่งในการเขียนข้อมูลไปยังบัฟเฟอร์
data_buffer += "%1.3f" % brain.timer.value() + "\n"
data_buffer += "%1.3f" % brain_inertial.acceleration(XAXIS) + ","
data_buffer += "%1.3f" % brain_inertial.acceleration(YAXIS) + ","
data_buffer += "%1.3f" % brain_inertial.acceleration(ZAXIS) + "\n"
wait(polling_delay_msec, MSEC
- ก่อนที่จะเขียนข้อมูลลงไฟล์ในการ์ด SD เรามาทำความเข้าใจเกี่ยวกับการใช้ฟังก์ชัน
brain.sdcard.savefile()กันก่อน
คำสั่งนี้เขียนข้อมูลที่จัดเก็บไว้ในตัวแปรdata_bufferลงในไฟล์ CSV ที่มีชื่อบนการ์ด SD
มาทำลายมันกัน:-
brain.sdcard.savefile(): ฟังก์ชั่นบันทึก bytearray ลงในไฟล์ที่มีชื่อบนการ์ด SD ฟังก์ชันส่งคืนจำนวนไบต์ที่เขียนลงในไฟล์
-
sd_file_name: พารามิเตอร์แรกของฟังก์ชัน ระบุชื่อไฟล์ที่จะเขียน ในโปรเจ็กต์นี้ ชื่อไฟล์จะถูกจัดเก็บไว้ในตัวแปร
sd_file_name -
bytearray(datat_buffer,'utf-8'): พารามิเตอร์ตัวที่สองของฟังก์ชัน แสดงถึง bytearray ที่จะเขียนลงในไฟล์
-
- bytearray(): วิธีการสร้าง bytearray ที่ไม่แน่นอน ในคำสั่งนี้ เราใช้มันเพื่อแปลงสตริงเป็นไบต์เทียร์เรย์โดยระบุการเข้ารหัส
- data_buffer: พารามิเตอร์แรกของวิธีการ บ่งชี้แหล่งที่มาที่จะแปลงเป็นไบต์เทียร์เรย์ ในโปรเจ็กต์นี้ แหล่งที่มาคือข้อมูลที่จัดเก็บไว้ในตัวแปร
data_buffer - 'utf-8': พารามิเตอร์ตัวที่สองของเมธอด ระบุการเข้ารหัสที่ระบุซึ่งใช้ในการเข้ารหัสสตริง การเข้ารหัสคือ 'utf-8' ในคำสั่งนี้
-
-
- หลังจาก
สำหรับลูปสำหรับการรวบรวมข้อมูล ให้ใช้ฟังก์ชันbrain.sdcard.savefile()เพื่อเขียนข้อมูลที่จัดเก็บไว้ในตัวแปรdata_bufferไปยังไฟล์ CSV บนการ์ด SD นอกจากนี้ เพิ่มโค้ดเพื่อตรวจสอบค่าส่งคืนจากฟังก์ชันbrain.sdcard.savefile()เพื่อตรวจยืนยันว่าข้อมูลถูกเขียนลงในไฟล์สำเร็จหรือไม่ และแสดงข้อความที่เกี่ยวข้องบน VEX IQ Brain Screen เพื่อรับผลตอบรับแบบเรียลไทม์ -
# การสร้างข้อมูล CSV
หมายเหตุ:
สำหรับ i ในช่วง (0, numOfDataEntries):
# คำสั่งในการเขียนข้อมูลลงในบัฟเฟอร์
data_buffer += "%1.3f" % brain.timer.value() + "\n"
data_buffer += "%1.3f" % brain_inertial.acceleration(XAXIS) + ","
data_buffer += "%1.3f" % brain_inertial.acceleration(YAXIS) + ","
data_buffer += "%1.3f" % brain_inertial.acceleration(ZAXIS) + "\n"
wait(polling_delay_msec, MSEC)
# เขียนข้อมูลลงใน SD Card
brain.screen.set_cursor(4,1)
if brain.sdcard.savefile(sd_file_name, bytearray(data_buffer,'utf-8')) == 0:
brain.screen.print("ข้อผิดพลาดการเขียน SD")
else:
brain.screen.print("ข้อมูลที่เขียน")ฟังก์ชัน brain.sdcard.savefile()จะส่งคืนจำนวนไบต์ที่เขียนลงในไฟล์ ในโปรเจ็กต์นี้ เราใช้มันเพื่อเขียนข้อมูลที่รวบรวมไปยังไฟล์ CSV ดังนั้นจำนวนไบต์ที่เขียนลงในไฟล์จะต้องมากกว่าศูนย์ กล่าวอีกนัยหนึ่ง หากฟังก์ชันbrain.sdcard.savefile()ส่งคืนค่า 0 เราสามารถสรุปได้ว่าข้อมูลไม่ได้ถูกเขียนลงในไฟล์สำเร็จ มิฉะนั้นข้อมูลจะถูกเขียนลงในไฟล์
ยินดีด้วย! เราได้พัฒนาโครงการบันทึกข้อมูลที่รวบรวมข้อมูลความเร่งด้วย VEX IQ Brain (2nd) และจัดเก็บไว้ในไฟล์ CSV ในการ์ด SD ต่อไป เราจะมาดูวิธีเปิดไฟล์ CSV เพื่อการวิเคราะห์ข้อมูล
# การนำเข้าไลบรารี
จากการนำเข้า vex *
# Brain ควรถูกกำหนดโดยค่าเริ่มต้น
brain = Brain()
brain_inertial = Inertial()
csvHeaderText = "time, x, y, z"
sd_file_name = "myDataPY.csv"
polling_delay_msec = 50
numOfDataEntries = 100
data_buffer = ""
# หยุดโปรแกรมหากไม่ได้ใส่การ์ด SD
หากไม่เป็นเช่นนั้น brain.sdcard.is_inserted():
brain.screen.set_cursor(1,1)
brain.screen.print("SD Card Missing")
while(True):
wait(5, MSEC)
# เพิ่มเซ็นเซอร์ใดๆ & รหัสการเริ่มต้นตัวจับเวลาที่นี่
brain.timer.clear()
# สร้าง CSV Header
data_buffer = csvHeaderText + "\n"
# การสร้างข้อมูล CSV
สำหรับ i ในช่วง (0, numOfDataEntries):
# คำสั่งในการเขียนข้อมูลลงในบัฟเฟอร์
data_buffer += "%1.3f" % brain.timer.value() + ","
data_buffer += "%1.3f" % brain_inertial.acceleration(XAXIS) + ","
data_buffer += "%1.3f" % brain_inertial.acceleration(YAXIS) + ","
data_buffer += "%1.3f" % brain_inertial.acceleration(ZAXIS) + "\n"
wait(polling_delay_msec, MSEC)
# เขียนข้อมูลลงใน SD Card
brain.screen.set_cursor(4,1)
ถ้า brain.sdcard.savefile(sd_file_name, bytearray(data_buffer,'utf-8')) == 0:
brain.screen.print("SD Write Error")
มิฉะนั้น:
brain.screen.print("Data Written")
การเปิดไฟล์ CSV เพื่อการวิเคราะห์ข้อมูล
เมื่อเขียนข้อมูลลงในไฟล์ CSV บนการ์ด SD แล้ว เราสามารถใช้แอปพลิเคชันสเปรดชีตเพื่อเปิดไฟล์สำหรับอ่านและวิเคราะห์ข้อมูลได้
หมายเหตุ: แอปพลิเคชันสเปรดชีตที่พบบ่อยที่สุด 2 รายการคือ Google ชีตและ Microsoft Excel ในบทความนี้ เราจะใช้ Google ชีต (แบบเว็บ) เพื่อเปิดไฟล์ CSV บนการ์ด SD ขั้นตอนการใช้งานแอพพลิเคชั่นอื่นก็คล้ายกัน
- ถอดการ์ด SD ออกจากช่องเสียบการ์ด SD ของ VEX IQ Brain หากคอมพิวเตอร์มีช่องเสียบการ์ด Micro SD ในตัว เราสามารถใส่การ์ด SD ลงในช่องนั้นได้โดยตรง มิฉะนั้น ให้เสียบการ์ด SD ลงในอะแดปเตอร์การ์ด SD จากนั้นเชื่อมต่ออะแดปเตอร์เข้ากับคอมพิวเตอร์
- ลงชื่อเข้าใช้บัญชี Google ของเราและเปิด Google ชีต สร้างสเปรดชีตใหม่
- ในสเปรดชีต ให้เปิดเมนู “ไฟล์” เลือก “นำเข้า” -> “อัปโหลด” -> “เรียกดู” จากนั้นเลือกไฟล์ CSV บนคอมพิวเตอร์ หลังจากอัปโหลดไฟล์ CSV แล้ว ให้คลิกปุ่ม “นำเข้าข้อมูล” หลังจากนำเข้าข้อมูลแล้ว คลิก “เปิดทันที” เพื่อดูข้อมูลที่รวบรวมไว้ในไฟล์ CSV
- (ไม่บังคับ) วิธีง่ายๆ วิธีหนึ่งในการวิเคราะห์ข้อมูลคือการวาดกราฟ จากนั้นมองหาแนวโน้มของข้อมูล ในสเปรดชีต ให้เปิดเมนู “แทรก” และเลือก “แผนภูมิ” เพื่อวาดกราฟโดยใช้ข้อมูลในไฟล์ CSV กราฟต่อไปนี้เป็นผลลัพธ์ของข้อมูลการเร่งความเร็วที่รวบรวมด้วย VEX IQ Brain (2nd)
หมายเหตุ: เราสามารถใช้ ตัวแก้ไขแผนภูมิ เพื่อเลือกประเภทแผนภูมิอื่นหรือแก้ไขแผนภูมิตามความต้องการของเรา
เมื่อถึงจุดนี้ เราได้เสร็จสิ้นโครงการบันทึกข้อมูลที่รวบรวมข้อมูลด้วย VEX IQ Brain (2nd) และบันทึกเป็นไฟล์ CSV บนการ์ด SD นอกจากนี้เรายังได้เรียนรู้วิธีอ่านไฟล์ CSV บนการ์ด SD โดยใช้ Google ชีต และยังได้สร้างกราฟสำหรับการวิเคราะห์เพิ่มเติมอีกด้วย อะไรต่อไป? เรามาลองวางแผนการทดลองที่น่าตื่นเต้นยิ่งขึ้นโดยใช้ VEX Robot สำหรับการบันทึกข้อมูล เพื่อสังเกตว่าปัจจัยด้านสิ่งแวดล้อมที่เปลี่ยนแปลงส่งผลต่อข้อมูลประเภทต่างๆ อย่างไร และทำความเข้าใจโลกรอบตัวเราให้ลึกซึ้งยิ่งขึ้น