เริ่มต้นใช้งานบอร์ด Cucumber
เกริ่นนำ
ในฐานะอาจารย์ ปีนี้จัดเป็นวิกฤติที่ต้องปรับการเรียนการสอนมาเป็นระบบออนไลน์แบบฉุกละหุกเนื่องจากปัญหาโควิด-19 เลยส่งผลกระทบกับการเตรียมวิชาแลปการวัดและเครื่องมือวัดที่จะให้นักศึกษามาเรียนรู้การสร้างระบบการวัดตั้งแต่การต่อเซ็นเซอร์ไปจนถึงการวิเคราะห์ข้อมูล ช่วงนี้เลยต้องมองหา solution ราคาไม่แพงเพื่อแจกให้นักศึกษาเอาไปทดลองและเรียนรู้ได้เองที่บ้าน/หอพักแบบไม่มีเครื่องมือหรืออุปกรณ์ติดไปให้ด้วย (จะให้แจกชุดเครื่องมือแลป PS-FG-scope คงไม่ไหว) ฝั่งซอฟต์แวร์สำหรับฝั่งคอมพิวเตอร์ยังดีที่บริษัท National Instruments เปิดตัวโปรแกรม LabVIEW Community Edition ให้ดาวน์โหลดมาใช้งานเองได้ จึงไม่ต้องกังวลเรื่องการแสดงผลและบันทึกค่าบนคอมพิวเตอร์ ยังมีเรื่องที่ลุ้นคือให้มหาวิทยาลัยจัดซื้อ MATLAB Campus-wide License เพื่อสะดวกต่อการเรียนรู้การประมวลผลสัญญาณแบบไปต่อยอดเป็นโครงงานหรืองานวิจัยได้
เรื่องที่ต้องคิดเรื่องแรกคือ การหาตัวฮาร์ดแวร์สำหรับการทดลองที่เปิดให้นักศึกษาสามารถได้ไอเดียของความสัมพันธ์ระหว่าง กายภาพ — สัญญาณ — ข้อมูล ซึ่งจำเป็นมากสำหรับนักศึกษาส่วนใหญ่ที่หลักการยังไม่ค่อยแม่นแถมแนวคิดของนามธรรมก็ไม่ค่อยมี ดังนั้นการเรียนแบบ simulation หรือแจกให้เฉพาะไฟล์ข้อมูลไปนั่งคำนวณ เลยถูกตัดทิ้งไปเลย เพราะขนาดให้ทำทดลองกับชุดทดลองประเภทเสียบสายตามช่องแล้วดูค่า/กราฟบนเครื่องมือวัด พอไปถามซักยังออกมาเละเทะ พอดีทาง Gravitech ออกบอร์ดใหม่ในรุ่น Cucumber รุ่น RS ที่ตั้งราคาขายไว้แค่ 405 บาทไม่รวม VAT กลับมีเซ็นเซอร์บนบอร์ดมาด้วยถึง 3 ตัวคือ
- เซ็นเซอร์ HTS221 ของ ST Microelectronics สำหรับวัดอุณหภูมิ (-40 ~ 120 °C) และความชื้น (0 ~ 100 %RH) ซึ่งเป็นช่วงที่พอเหมาะกับการวัดสภาพแวดล้อมในชีวิตประจำวัน
- เซ็นเซอร์ BMP280 ของ Bosch สำหรับวัดความดันอากาศแบบสัมบูรณ์ (300 ~ 1100 hPa) ซึ่งแม้จะไม่ละเอียดมาก (> 1 เมตร) ในการวัดความสูงแบบ altimeter แต่พอใช้ตรวจสอบสภาพแวดล้อมหรือตรวจจับความสูงของตึกได้
- เซ็นเซอร์ MPU-6050 ของ TDK InvenSense ที่ภายในประกอบด้วยเซ็นเซอร์วัดความเร่งแบบ 3 แกน (ย่านสูงสุด ±16g) และไจโรสโคปแบบ 3 แกน (ย่านสูงสุด ±2000 องศา/วินาที) ทำให้ใช้ในการตรวจจับการเคลื่อนไหวได้
การฝึกฝนการสร้างระบบการวัดมีขอบเขตที่ต้องเรียนรู้ในหลายเรื่องตั้งแต่การทำความเข้าใจเกี่ยวกับข้อดีและขีดจำกัดของเซ็นเซอร์ การวางแผนการทดลอง การอ่านค่าเซ็นเซอร์ ไปจนถึงการวิเคราะห์ข้อมูล การมีเซ็นเซอร์หลายรูปแบบจึงเอื้อให้สามารถตั้งโจทย์ที่สำหรับนักศึกษาที่มีสภาพแวดล้อมในที่พักอาศัยแตกต่างกันได้ ความท้าทายในการเตรียมหัวข้อแลปที่ต้องใช้ไอเดียหน่อยมีอยู่ 2 เรื่องคือ
- เซ็นเซอร์บนบอร์ดเป็นแบบ digital ที่เชื่อมต่อผ่าน I2C เลยต้องหาเซ็นเซอร์แอนะล็อกเพิ่ม เพื่อให้เข้าใจการแปลงแอนะล็อกเป็นดิจิตอล ่เซ็นเซอร์วัดแสงประเภท LDR ก็ถูกและตรงตามเป้าหมายพอดี
- การสอบเทียบเซ็นเซอร์ที่เรื่องปวดหัวหลักคือการหา calibration standard มาวัดเทียบ ซึ่งเดิมวางแผนว่าจะเรียนรู้ด้วยเซ็นเซอร์ load cell โดยใช้น้ำบรรจุขวดเป็นมวลมาตรฐาน พอสลับมาใช้บอร์ด Cucumber เลยต้องเปลี่ยนมาเรียนรู้การสอบเทียบเซ็นเซอร์ความเร่งโดยใช้แรงโน้มถ่วงที่กระทำกับบอร์ดบนมุมเอียงแทน ยังคงไอเดียของการสอบเทียบอยู่แต่คำนวณยากขึ้น
พอฮาร์ดแวร์ลงตัว เรื่องปวดหัวถัดมาคงต้องเป็นซอฟต์แวร์ที่นักศึกษาสาขาวิศวกรรมไฟฟ้าที่ ม.ธรรมศาสตร์ ยังอ่อนมากเรื่องการเขียนโค้ดด้วยหลายปัจจัย หากจะให้นักศึกษาทดลองด้วยบอร์ด Cucumber เลยต้องมาออกแรงเตรียมโค้ดตัวอย่างเป็นจุดเริ่มต้นให้ก่อน เลยสั่งซื้อบอร์ดมาทดลองก่อน
เนื้อหาต่อจากนี้จะเป็นการเล่าถึงประสบการณ์ในการเขียนโค้ดสำหรับชิพ ESP32-S2 บนบอร์ด Cucumber โดยใช้ ESP-IDF ร่วมกับ Visual Studio Code
hello_world บน Cucumber
บอร์ด Cucumber ใช้โมดูล ESP32-S2-WROVER โดยมีหน่วยประมวลผล ESP32-S2 ที่มีจุดเด่นทั้งในแง่ประสิทธิภาพการประมวลผล (32bit/240MHz/4MB flash/2MB RAM) และการสื่อสารไร้สายผ่านโครงข่าย WiFi แต่ตัว ESP32-S2 เป็นไมโครคอนโทรลเลอร์ที่เพิ่งเข้าสู่ตลาดช่วงปลายปี 2562 ทำให้ยังไม่รองรับการเขียนโค้ดบนแพลตฟอร์ม Arduino การพัฒนาซอฟต์แวร์ ณ เดือน พค. 63 ยังคงต้องใช้ชุดเครื่องมือพัฒนา ESP-IDF รุ่น 4.2 ของบริษัท Espressif เองที่ยังคงเป็น master development branch โดยจะต้องใช้ git ในการดาวน์โหลดมาติดตั้งเอง แน่นอนว่าการอธิบายนักศึกษาสาขาไฟฟ้าว่าด้วยเรื่อง git คืออะไรและใช้อย่างไร รวมทั้งการ build โค้ดผ่าน command line ไม่ใช่ตัวเลือกที่ดีแน่นอน ผมจึงเลือกที่จะติดตั้งและใช้งานผ่าน extension ของ ESP-IDF ของ Visual Studio Code ที่ทางบริษัท Espressif เป็นผู้พัฒนาเอง ก่อนเริ่มต้นก็เตรียมซอฟต์แวร์พื้นฐานไว้ก่อนคือ
- โปรแกรม Visual Studio Code สำหรับใช้เขียนโค้ดและใช้งาน ESP-IDF
- โปรแกรม Python 3.x ซึ่งแนะนำให้ติดตั้งเป็นรุ่น 3.6 หรือ 3.7 หากจะลองเขียนโค้ดสำหรับ OpenCV ด้วย (มีไลบรารีแบบไบนารีติดตั้งด้วย pip ได้เลย) ทั้งนี้ผมมีประสบการณ์ไม่ค่อยดีกับค่าย Anaconda จึงไม่สามารถแนะนำอะไรได้ นอกจาก
“ถอดทิ้งไปเถอะ แล้วใช้ Python จากต้นทางดีกว่า” - โปรแกรม git รุ่นสำหรับ Microsoft Windows ส่วนใครที่ใช้ Linux หรือ Mac ขอให้ติดตั้งตามวิธีการของระบบปฏิบัติการตัวเอง
หลังจากติดตั้งโปรแกรมทั้งสามตัวแล้ว ขั้นตอนต่อไปคือ การเริ่มติดตั้ง ESP-IDF extension ผ่านทางตัวเลือก extension ของ Visual Studio Code ดังรูป
หลังจาก Visual Studio Code ดาวน์โหลดไฟล์ต่างๆของ ESP-IDF extension มาติดตั้งเสร็จแล้ว จะเริ่มขั้นตอนการตั้งค่าต่างๆของ extension (หากจะแก้ไขภายหลัง ให้กดปุ่ม F1 แล้วเลือก ESP-IDF: Configure ESP-IDF extension) การตั้งค่าจะแบ่งออกเป็น 3 ขั้นตอน ได้แก่
- เลือก git และ Python ที่ติดตั้งในเครื่อง
- เลือกติดตั้ง ESP-IDF รุ่น master (development branch) และโฟลเดอร์ที่จะติดตั้ง (ตัว extension จะใช้ git ดาวน์โหลดเข้ามาในโฟลเดอร์ย่อย esp-idf) โดยมีเงื่อนไขว่าโฟลเดอร์ห้ามมี space หรือตัวอักษรไทย
- เลือกโฟลเดอร์ที่จะติดตั้งชุดโปรแกรม ESP-IDF tools (ตัว extension จะใช้ git ดาวน์โหลดมาขยายในโฟลเดอร์ย่อย .expressif) โดยมีเงื่อนไขว่าโฟลเดอร์ห้ามมี space หรือตัวอักษรไทย ขั้นตอนการติดตั้งจะใช้ pip ในการดาวน์โหลดแพคเกจและไลบรารี Python ที่เกี่ยวข้อง จึงแนะนำให้เช็คว่าคำสั่ง pip ทำงานบน command line ได้และเป็นรุ่นล่าสุดแล้ว
หลังจากติดตั้งเครื่องมือทั้งหมดแล้ว ส่วนตั้งค่า ESP-IDF extension จะแสดงปุ่มกดเพื่อใช้ยืนยันเครื่องมือต่างๆ พร้อมทั้งแสดง PATH ไปยังเครื่องมือต่างๆสำหรับเพิ่มไปยัง PATH ของระบบ รวมทั้งปุ่มกดสำหรับแสดงรายการของ project ตัวอย่าง ข้อควรระวังคือ ESP32-S2 จะมีฮาร์ดแวร์ที่แตกต่างจาก ESP32 เช่น ไม่มีส่วน bluetooth จึงควรเลือก project ตัวอย่างที่สอดคล้องด้วย
ผมเลือกสร้าง project ตัวอย่าง hello_world ซึ่งจะพิมพ์ข้อความ hello, world แล้วแสดงข้อมูลของหน่วยประมวลผลออกทาง UART สำหรับขั้นตอนที่ต้องตั้งค่าก่อนการ build แบ่งออกเป็น 3 ขั้นคือ
- กดปุ่ม F1 แล้วเลือก ESP-IDF: Set Expressif device target แล้วเลือก ESP32-S2 เป็นหน่วยประมวลผล
- เสียบสายจากบอร์ด Cucumber แล้วกดปุ่ม Win+x แล้วเลือก Device Manager เพื่อตรวจสอบพอร์ตอนุกรม COMx จากนั้นกดปุ่ม F1 แล้วเลือก ESP-IDF: Select port to use เพื่อกำหนดพอร์ตอนุกรม
- กดปุ่ม F1 แล้วเลือก ESP-IDF: Build your project
การ build ครั้งแรกจะนานพอสมควรเพราะจะคอมไพล์ทุกอย่างตั้งแต่ bootloader ไปจนถึงไลบรารีต่างๆ เช่น WiFi HTTP ฯลฯ หากต้องการตรวจสอบสถานะการ build ให้เลือกเมนู View > Output เพื่อแสดงหน้าต่างย่อยแล้วเลือกที่หัวข้อ ESP-IDF build
เมื่อ build สำเร็จ เราสามารถโปรแกรมลงบอร์ดโดยกดปุ่ม F1 แล้วเลือก ESP-IDF: Flash your project สำหรับการทำงานของ project ตัวอย่าง hello_world ดูได้จากโปรแกรม serial terminal ที่ตั้ง baud rate เป็น 115200 bps
การสร้าง project ใหม่
ผมขอทิ้งท้ายบทความนี้ด้วยการสร้าง project ใหม่แบบ clean โดยเจาะจงการปรับเงื่อนไขสำหรับบอร์ด Cucumber ซึ่งแบ่งออกเป็น 2 กลุ่มตามโมดูลคือ กลุ่ม R และกลุ่ม M ซึ่งมีข้อแตกต่างที่การมี/ไม่มีหน่วยความจำ PSRAM ขนาด 2 MB สำหรับเนื้อหาของเซ็นเซอร์ทั้ง 3 ตัวขอยกยอดไปบทความหน้า
การสร้าง project ใหม่ด้วย ESP-IDF extension เริ่มด้วยการสร้างโฟลเดอร์ใหม่แล้วใช้เมนู File > Open Folder เพื่อเข้าสู่โฟลเดอร์นั้น จากนั้นกดปุ่ม F1 เพื่อแสดงรายการของคำสั่งแล้วพิมพ์ ESP-IDF เพื่อเข้าสู่กลุ่มคำสั่งของ extension ลำดับของคำสั่งและการตั้งค่ามีดังนี้
- Create new project: ให้เลือก template-app เพื่อให้ตัว extension สร้างไฟล์พื้นฐานและโฟลเดอร์ย่อย ตัวซอร์สโค้ดจะมีเฉพาะไฟล์ main.c ในโฟลเดอร์ย่อย main ซึ่งมีส่วนโค้ดเดียวกับ hello_world
- Configure Paths: กำหนด PATH ไปยัง ESP-IDF (โฟลเดอร์ esp-idf) และ ESP-IDF tools (โฟลเดอร์ .expressif) จากนั้นเลือก Custom extra paths เพื่ออัพเดท PATH จากนั้น restart ตัว Visual Studio Code เพื่อให้ PATH อัพเดท
- Set Expressif device target: เลือก ESP32-S2 เป็นหน่วยประมวลผล ทำให้เกิดไฟล์ sdkconfig ที่ระบุรายละเอียดในการ build ที่สอดคล้องกับหน่วยประมวลผล
- Select port to use: เลือกพอร์ตอนุกรมที่เชื่อมต่อกับบอร์ด
- Launch gui configurion tool: เปิดหน้าต่างที่มีตัวเลือกต่างๆสำหรับปรับแต่งรายละเอียดของหน่วยประมวลผลและองค์ประกอบซอฟต์แวร์ต่างๆ (FreeRTOS, WiFi, HTTP, TLS, …) ตัวเลือกสำหรับโมดูล ESP32-S2-WROVER บนบอร์ด Cucumber ประกอบด้วย
- Serial flasher config: Flash size = 4MB
- Component config > ESP32S2-specific: CPU frequency = 80/160/240 MHz
- พิมพ์ SPIRAM ในช่อง search parameters เพื่อเข้าสู่ตัวเลือกพิเศษที่ไม่แสดงของ Component config > ESP32S2-specific จากนั้นเลือกเปิดใช้งานหน่วยความจำ PSRAM ตัวเลือกของขนาด RAM (Autodetect) และการเข้าถึง PSRAM (Make RAM allocatable using malloc() as well) สามารถปรับได้ตามความเหมาะสม
หลังจากตั้งค่าต่างๆแล้ว กดปุ่ม F1 แล้วเลือกกลุ่มคำสั่งในการ build และ flash ไปยังบอร์ด การแสดงผลของโค้ดจะคล้ายกับ project ตัวอย่าง hello_world โดยมีจุดแตกต่างคือ พบหน่วยความจำ PSRAM ขนาด 16 Mbit แล้ว