เส้นทางสู่ remote experiment lab — ก้าวแรก ไอเดีย

Supachai Vorapojpisut
2 min readJun 16, 2020

--

จุดเริ่ม

ปัญหา COVID-19 นำมาสู่ยุค New Normal ที่ social distancing กลายเป็นเงื่อนไขหนึ่งในกิจกรรมต่างๆที่มีคนมารวมกลุ่มกัน สถาบันการศึกษาเป็นหนึ่งในองค์กรที่ถูกผลกระทบแบบเต็มๆ เพราะจากห้องบรรยายที่นักเรียนนักศึกษานั่งใกล้ๆกัน กลายเป็นต้องเว้นระยะห่างอย่างน้อย 1 เมตร ทำให้การจัดห้องเรียนต้องปรับกันยกใหญ่ แต่การเว้นระยะจะส่งผลกระทบต่อการสอนปฏิบัติการมากกว่าการบรรยายเสียอีก เพราะเราจะทำการทดลองอย่างไรโดยให้นักศึกษาเว้นระยะห่างระหว่างกัน อีกวาระหนึ่งที่ผมคิดมาสักพักแล้วจากการสังเกตทักษะในการทำงานของนักศึกษาคือ นักศึกษาจำนวนหนึ่งแม้จะทำปฏิบัติการแบบปกติแต่มักจะทำตามขั้นตอนในคู่มือแลปไปเรื่อยๆ ซึ่งส่วนหนึ่งเกิดจากปัญหาของตัวคู่มือแลปที่เขียนแบบขั้นตอนมากเกินไป ไม่มีการประเมินหลังการฝึกฝนแต่ละขั้นตอน สำหรับการเขียนรายงานหลังจากทำแลป ก็อย่างที่ทราบกันคือลอกกันมาด้วยจำนวนพอสมควร เพราะ … ลืมไปแล้วว่าทำอะไรมาบ้าง การ ‘ได้’ เรียนรู้จากวิชาปฏิบัติการจึงอยู่ในระดับที่ผมเองยังไม่พอใจ โดยเฉพาะเมื่อวิชาบรรยายที่สอนอยู่ ต้องใช้ทักษะด้านฮาร์ดแวร์/ซอฟต์แวร์ประกอบด้วย

ผมจึงใช้ช่วงเวลาปิดเทอมนี้ในการเตรียมแลปที่เป็นแบบ remote experiment ซึ่งนักศึกษาจะสามารถทดลองกับอุปกรณ์จริงผ่านการสั่งการด้วยคอมพิวเตอร์จากที่ไหนก็ได้ ความท้าทายของการสร้าง remote experiment เพื่อเรียนรู้การทำปฏิบัติการแบบออนไลน์ สำหรับนักศึกษาสัก 30 คน (กลุ่มตัวอย่างสำหรับภาค 1/2563) ได้อย่างไร หลังจากไปรีวิวหัวข้อ remote experiment ในวงวิชาการมาแล้วเพิ่มไอเดียอีกหน่อยเกี่ยวกับสิ่งที่อยากให้นักศึกษาได้จากการเรียนรู้เลยสรุปความท้าทายออกมาได้เป็น 4 ข้อคือ

  1. เป็นการทดลองกับวงจร อุปกรณ์ และเครื่องมือจริง (ไม่ใช่ simulation)
  2. จัดคิว request ของนักศึกษาที่ขอทำการทดลองได้
  3. บันทึกกิจกรรม (เวลา คำสั่ง และผลลัพธ์) ของนักศึกษาได้
  4. สามารถทดลอง คำนวณ และแสดงผลจาก UI เดียวกันได้

ไอเดีย

ไอเดียเบื้องต้นคือ การผสานเทคโนโลยีที่ยุคนี้เปิดกว้างให้ใช้คือ Python (Jupyter + ipywidgets + Pandas + matplotlib) กับบริการ Google Cloud (ยืนยันตัวตนด้วย Google Account + บันทึกข้อมูลด้วย Firebase + จัดเก็บไฟล์ด้วย Drive) เพื่อส่งผ่าน request-result ระหว่างนักศึกษาและเครื่องมือแลป แต่ฝั่งคุมฮาร์ดแวร์ยังคงต้องใช้ LabVIEW เพื่อความสะดวกในการจัดการเครื่องมือวัดทั้งเครื่องกำเนิดสัญญาณ ออสซิลโลสโคป รวมทั้งอุปกรณ์ DAQ ผมลองเขียนไอเดียออกมาเป็น 2 รูปที่แสดงถึง flow ของการเชื่อมโยงระหว่างนักศึกษากับตัวแลป

Flow ของการเชื่อมโยงจากนักศึกษาไปยังแลป

Flow ของการทำ remote experiment เริ่มจากส่วน UI สำหรับให้นักศึกษากำหนดเงื่อนไขของการทดลองและการวัดได้ ส่วน UI ผมไม่คิดที่จะสร้างเป็นแอพพลิเคชันเฉพาะเหมือนหลายงานวิจัยด้าน remote experiment ซึ่งไม่คุ้มที่จะต้องพัฒนา 1 แอพพลิเคชันสำหรับแต่ละการทดลอง (วิชาปฏิบัติการส่วนใหญ่มีอย่างน้อย 10 การทดลอง) แต่การทำแอพพลิเคชันเดียวที่รองรับทุกการทดลองก็จะกลายเป็นซับซ้อนเกินไป (บั๊กเพิ่มตามขนาดซอฟต์แวร์) ผมจึงเลือกใช้เครื่องมือของภาษา Python คือ Jupyter Notebook ร่วมกับไลบรารี ipywidgets ทำให้สามารถมี widget รับเงื่อนไขการทดลองได้ รวมทั้งยังสามารถใช้ไลบรารีของภาษา Python เช่น urllib สำหรับเชื่อมต่ออินเตอร์เน็ต Pandas สำหรับประมวลผลข้อมูล และ matplotlib สำหรับวาดกราฟ ซึ่งสอดคล้องกับการบันทึก ประมวล และแสดงผลการทดลอง ส่วนการเปิดเผยโค้ด Python ของแต่ละ cell ใน Notebook ไม่ถือว่าเป็นเรื่องใหญ่สำหรับผม กลับดีเสียอีกหากมีนักศึกษาบางคนที่อาจเกิดความสนใจ จากนั้นไปศึกษาต่อยอดการใช้งาน Python ในงานอื่นๆ

การยืนยันตัวตนของนักศึกษาเป็นอีกเรื่องที่วุ่นวายหากต้องมาพัฒนาเซิร์ฟเวอร์เอง เลยเลือกใช้บริการที่อิงบน Google Cloud เพื่อให้สามารถใช้ Google Account มาเป็นกลไกยืนยันว่าเป็นนักศึกษาที่จะต้องทำการทดลอง (งานนี้เปิดให้บุคคลภายนอกไม่ได้ เดี๋ยวนักศึกษาไม่ได้ทำ) ส่วนเซิร์ฟเวอร์ที่จะเป็นช่องรับ request (ส่งเงื่อนไขการทดลอง) ผมเลือกบริการ Firebase แบบไม่ต้องคิดมาก เพราะสะดวกในการบันทึกข้อมูล มีไลบรารีฝั่งไคลเอนต์ที่เป็นภาษา Python สามารถสร้าง REST API โดยใช้ cloud function และรองรับการยืนยันตัวตนของ Google นอกจากนี้เรื่องสำคัญที่สุดคือ ฟรี (แค่ 30 คน คงไม่ over โควตา) การออกแบบ API เพื่อรองรับการทดลองที่ยังไม่แน่นอน เลยมองที่โพรโทคอล JSON-RPC เพื่อให้ไม่ต้องไปเพิ่ม REST endpoint ตามการทดลองที่อาจเปลี่ยนไปมา

Flow ในลำดับถัดมาจะเกี่ยวข้องกับการส่ง request ไปทำการทดลองที่ห้องแลป ซึ่งปัญหาใหญ่คงหนีไม่พ้น firewall ของคณะฯที่น่าจะเหมือนๆกันในทุกสถาบันการศึกษา ผมจึงเลือกที่จะใช้แนวคิด poll แทนโดยเมื่อคอมพิวเตอร์ที่คุม experiment ว่างครบ 1 นาที จะเชื่อมต่อไปที่ Firebase เพื่อเช็คว่ามี request ใหม่หรือไม่ นอกจากไม่มีปัญหาถูกบล็อกแล้ว วิธีนี้ยังง่ายกว่าในการ map จาก request ของนักศึกษามายังการทดลองแต่ละหัวข้อ โดยระบุชื่อหัวข้อการทดลองใน payload เพื่อไป query เฉพาะ request ที่เกี่ยวข้อง ผมเลือกจะเขียนโค้ดส่วนนี้ด้วย Python เพราะ LabVIEW ยังมีข้อจำกัดในการบันทึก clip ด้วยเว็บแคม เลยเลือกใช้ไลบรารี OpenCV มาบันทึกแทน รวมทั้งการเขียนโค้ดเชื่อมต่อกับเซิร์ฟเวอร์จะง่ายกว่า

การทดลองที่เกี่ยวกับวงจรไฟฟ้าย่อมต้องใช้เครื่องมือวัดซึ่งแบ่งออกเป็นเครื่องมือวัดที่เจอได้ทั่วไปในห้องปฏิบัติการ เช่น เครื่องกำเนิดสัญญาณ ออสซิลโลสโคป และอุปกรณ์ประเภท DAQ ที่มีช่อง I/O แบบหลากหลาย การเขียนโค้ด Python หรือภาษาอื่นในส่วนนี้ถือว่าเป็นงานหินเกินไป เลยเลือกใช้ LabVIEW ที่เป็นซอฟต์แวร์มีลิขสิทธิ์ แต่มีตัวช่วยคือ LabVIEW Community Edition ที่เปิดให้ดาวน์โหลดมาใช้ฟรีสำหรับคนทั่วไปเพื่อทดลองได้ การใช้งานกับเครื่องมือวัดจะต้องติดตั้ง NI-VISA เพิ่มแล้วไปดาวน์โหลดไดรเวอร์ของตัวเครื่องมือวัดมาลงในไดเร็กทอรี instr.lib ของ LabVIEW ส่วนการใช้งานอุปกรณ์ DAQ จะติดตั้งเป็น NI-DAQmx ซึ่งจะใช้งานได้เลยหากเป็นผลิตภัณฑ์ของบริษัท NI ส่วนโค้ดที่เรียกว่า VI ใน LabVIEW จะรอคำสั่งจาก Python ผ่านทาง socket แล้วทำการเริ่มต้นทดลองไปพร้อมๆกับการบันทึก clip โดยผลการทดลองจากเครื่องมือวัด/DAQ จะถูกบันทึกเป็นไฟล์ CSV

Flow ของการส่งผลลัพธ์จากแลปมายังนักศึกษา

Flow ของการส่งผลลัพธ์ทดลองกลับจะอยู่ในรูปแบบของไฟล์ทั้งหมด โดยข้อมูลจากเครื่องมือวัด/อุปกรณ์ DAQ จะอยู่ในรูปของไฟล์ CSV ในขณะที่ภาพ video แสดงหน้าจอที่เห็นจากออสซิลโลสโคปจะเป็นไฟล์ mp4 การเลือกบันทึกภาพหน้าจอของออสซิลโลสโคปด้วยเว็บแคมทั้งที่มีไฟล์ CSV ของ raw data จากการวัดอยู่แล้ว เพราะการได้เห็นการเปลี่ยนแปลงของหน้าจอจะทำให้นักศึกษาเข้าใจถึงผลกระทบของการตั้งค่าเครื่องมือวัดที่ไม่เหมาะสม การส่งไฟล์ข้อมูลกลับจะแบ่งออกเป็น 2 ทางคือ

  • อัพโหลดไฟล์ไปที่ Google Drive แล้วสร้าง link สำหรับแชร์
  • แจ้งกลับไปทาง Firebase ว่าผลการทดลองเสร็จแล้ว โดยอาจเพิ่มการส่ง email ไปยังนักศึกษาด้วย

เมื่อนักศึกษาต้องการข้อมูลจะทำการ run ส่วนโค้ดใน cell สำหรับร้องขอ link ของไฟล์ข้อมูลจาก Firebase จากนั้นจึงเรียกใช้ cell อื่นๆเพื่อวิเคราะห์และแสดงผลข้อมูลต่อไป

終わりに (ในตอนท้าย)

ผมเขียน post นี้เพื่อบันทึกความทรงจำว่าช่วงปิดเทอมหลัง COVID-19 ได้ทำงานอะไรไป รวมทั้งเพื่อแชร์ไอเดียในการคิดงานสำหรับผู้สนใจ บทความหน้าจะอธิบายถึงโค้ด Python ส่วนแรกที่เป็น UI สำหรับรับค่า setting ของการทดลอง รวมทั้งการพัฒนาโค้ดฝั่ง Firebase สำหรับยืนยันตัวตนและจัดลำดับ request ของการทดลอง

--

--

Supachai Vorapojpisut
Supachai Vorapojpisut

Written by Supachai Vorapojpisut

Assistant Professor at Thammasat University

No responses yet