หน้าแรก ดูโปรเจกต์ทั้งหมด
Intermediate

โปรเจกต์ วิธีทำให้ Coffee Machine ของคุณไม่มีวันน้ำแห้ง

ใช้ Classification Model แบบง่ายเพื่อตรวจสอบล่วงหน้าว่า Water Tank จำเป็นต้อง Refill หรือไม่ก่อนทำ Coffee!

โปรเจกต์ วิธีทำให้ Coffee Machine ของคุณไม่มีวันน้ำแห้ง

รายการอุปกรณ์และเครื่องมือ

1x Arduino® UNO R4 WiFi
-
1x ST X-NUCLEO-IKS01A3
-

รายละเอียดและวิธีทำ

เป้าหมายของบทเรียนนี้คือการตรวจจับว่าเมื่อใดที่เครื่องชงกาแฟกำลังจะหมดน้ำก่อนที่มันจะเกิดขึ้น เพราะการใช้งานปั๊มของเครื่องโดยไม่มีน้ำอาจทำให้ตัวเครื่องเสียหายได้

เราจะทำด้วยวิธีที่ไม่รบกวนระบบเดิมเลย โดยเราจะติดแค่ Board Arduino พร้อมกับ Accelerometer ไว้บนเครื่องชงกาแฟ

เราจะใช้ NanoEdge AI Studio (เครื่องมือฟรี) เพื่อสร้าง AI Model โดยอัตโนมัติ ซึ่งสามารถจำแนกได้ว่าเสียงกริ่งประตูกำลังดังหรือเป็นเพียงเสียงรบกวนพื้นหลัง

ไม่ต้องกังวล คุณไม่จำเป็นต้องมีความรู้เรื่อง AI ก็สามารถทำตามบทเรียนนี้ได้ :)

ขั้นตอนที่ 1: การตั้งค่า (Setup)

ขั้นแรกให้เสียบ Shield ของ STMicroelectronics เข้ากับ Board Arduino จากนั้นใช้ blu tack (หรือกาวอเนกประสงค์อื่นๆ) เพื่อติด Board เข้ากับเครื่องชงกาแฟ

ใน Arduino IDE:

ตรวจสอบให้แน่ใจว่าคุณเลือก COM port ที่ถูกต้อง: Tools > Port และเลือกอันที่ถูกต้อง

เลือก Board ที่ถูกต้อง:

  1. Tools > Boards > Arduino Renesas UNO R4 boards > Arduino UNO R4 WIFI
  2. หากคุณหาไม่เจอ ให้คลิกที่ Tools > Boards > Boards Manager..., ค้นหา UNO R4 และติดตั้ง Package

ขั้นตอนที่ 2: เก็บข้อมูล Accelerometer

เราใช้ STMicroelectronics X-NUCLEO-ISK01A3 สำหรับ LSM6DSO ของมัน หากคุณมี Accelerometer รุ่นอื่น ก็สามารถใช้งานได้

ในการรับ Code สำหรับ Datalogging เราจะใช้ NanoEdge AI Studio Datalogger generator สำหรับ Arduino

  1. เปิด NanoEdge AI Studio
  2. ไปที่ Data logger Generator
  3. เลือก Arduino
  4. เลือก LSM6DSO
  5. เลือกค่า Data rate สูงสุด (1667Hz), Range เป็น 8 และ Buffer size เป็น 512
  6. คลิก Generate Data Logger

NanoEdge จะส่งออกไฟล์ .zip ที่มีไฟล์ .ino ซึ่งคุณสามารถนำไปใช้ใน Arduino IDE ได้โดยตรง:

  1. แตกไฟล์และเปิดไฟล์ .ino
  2. Import Library ที่จำเป็น (Wire และ STM32duino LSM6DSO) และ Flash Code

Code ถูกแนบไว้ด้านล่างในชื่อ main_datalogging.c

โดยปกติแล้ว Code จะมีส่วนที่คอมเมนต์ไว้สำหรับ Library ของ NanoEdge AI แต่เราจะใช้งานในภายหลัง หลังจากสร้าง Model เสร็จแล้ว

ขั้นตอนที่ 3: NanoEdge AI Studio

NanoEdge AI Studio เป็น Software ฟรีที่พัฒนาโดย STMicroelectronics เพื่อช่วยให้ผู้ใช้งาน Embedded สร้าง AI Model ได้อย่างง่ายดาย และมันใช้งานง่ายมาก:

  1. เลือกประเภทของโปรเจกต์
  2. Import ข้อมูล
  3. ค้นหา Model ที่ดีที่สุดตามข้อมูลของคุณ
  4. ทดสอบ
  5. Compile และใช้งานด้วย Function เพียงไม่กี่อย่าง

ในที่นี้เราจะทำโปรเจกต์ตรวจจับความผิดปกติ (Anomaly detection - AD) เราต้องการตรวจจับสถานการณ์ปกติที่มีน้ำสำหรับชงกาแฟ และสถานการณ์ที่ผิดปกติเมื่อไม่มีน้ำเหลืออยู่แล้ว

เราสามารถเลือกทำเป็น Model แบบ N class classification ได้เช่นกัน แต่จะกล่าวถึงเพิ่มเติมในช่วงท้าย

ใน Project Settings:

  1. ตั้งชื่อโปรเจกต์
  2. เลือก Arduino R4 Wifi เป็น Target
  3. เลือก Sensor: Accelerometer 3 axis
  4. เลือกใส่ขีดจำกัดสำหรับ FLASH และ RAM ได้ตามต้องการ (สำหรับการค้นหา Model)

ใน Regular signals:

ที่นี่เราจะบันทึกสัญญาณปกติ ในกรณีของเราคือตอนที่เครื่องชงกาแฟมีน้ำเพียงพอสำหรับชงกาแฟ

คุณสามารถเลือกได้ว่าจะ Import ข้อมูลที่มีอยู่แล้ว (ไฟล์ .txt หรือ .csv) หรือจะบันทึกโดยตรงใน NanoEdge

  1. สิ่งที่คุณต้องการบันทึกคือตอนที่เครื่องกำลังชงกาแฟ
  2. หลีกเลี่ยงสัญญาณที่ว่างเปล่า (เมื่อเครื่องไม่ได้ทำอะไรเลย)
  3. เก็บข้อมูลประมาณ 50 ถึง 100 Buffers

วิธีบันทึกข้อมูลใน NanoEdge โดยตรง:

  1. คลิก ADD SIGNAL
  2. จากนั้นเลือก FROM SERIAL (USB)
  3. แล้วคลิก START/STOP เพื่อเก็บข้อมูล (ตรวจสอบให้แน่ใจว่าเลือก COM port ถูกต้อง)
  4. เมื่อเสร็จแล้ว คลิก CONTINUE แล้วกด IMPORT
  5. เปลี่ยนชื่อไฟล์หากคุณต้องการ

ใน Abnormal signals:

ทำแบบเดิม แต่ทำตอนที่มีน้ำไม่เพียงพอหรือไม่มีน้ำเลยสำหรับการชงกาแฟ

Benchmark:

ตอนนี้เมื่อเรามีข้อมูล 2 ประเภทแล้ว เราสามารถสั่งให้ NanoEdge AI Studio นำข้อมูลเหล่านี้มาสร้าง AI Library ที่ประกอบด้วย Model และ Parameter ต่างๆ รวมถึงการทำ Preprocessing กับข้อมูลของเรา เช่น FFT เป็นต้น

คลิกที่ New Benchmark แล้วเลือกข้อมูลทั้งสองประเภทจากนั้นคลิก Start

ระหว่างการทำ Benchmark จะมีการทดสอบชุดค่าผสมนับแสนรายการเพื่อค้นหาสิ่งที่ทำงานได้ดีที่สุดกับข้อมูลที่ให้ไว้

คะแนน (Score) คือตัวชี้วัดที่พิจารณาจาก Accuracy โดยรวมของ Model และการใช้ RAM กับ FLASH

เมื่อคุณได้ค่า Accuracy ตั้งแต่ 90% ขึ้นไป คุณสามารถหยุดการทำ Benchmark ได้ มันอาจใช้เวลาหลายชั่วโมงในการพยายามค้นหา Library ที่เหมาะสมที่สุด แต่ในที่นี้หากเราได้อันที่ใช้งานได้ก็เพียงพอแล้ว

Validation:

ในการตรวจสอบ (Validation) เป้าหมายคือการทดสอบว่า Model ที่พบระหว่างการทำ Benchmark นั้นทำงานได้กับข้อมูลใหม่หรือไม่ สิ่งที่อาจเกิดขึ้นกับ AI Model คือ Overfitting ซึ่งหมายความว่า Model จดจำข้อมูลได้แม่นยำเกินไปแต่ไม่รู้วิธีแยกแยะพวกมัน ผลที่ตามมาคือมันจะทำงานได้ไม่ดีกับข้อมูลที่ไม่เคยเห็นมาก่อน

เลือก 5 Model ที่ดีที่สุด คลิกที่ New Experiment และเพิ่มไฟล์ข้อมูลใหม่:

  1. ไฟล์ Learn: Model สำหรับตรวจจับความผิดปกติของ NanoEdge สามารถนำไป Retrain ได้โดยตรงบน Microcontroller ซึ่งโดยปกติจะให้ผลลัพธ์ที่ดีกว่าในลักษณะนี้ คุณสามารถ Import ไฟล์ Regular ที่ใช้ในขั้นตอนปกติได้ (คุณสามารถดาวน์โหลดได้ที่นั่น)
  2. ไฟล์ Regular: คุณต้อง Import ไฟล์ใหม่ที่มีสัญญาณปกติชุดใหม่ (คุณสามารถกลับไปที่ขั้นตอน Regular เพื่อบันทึกข้อมูลใหม่และดาวน์โหลดไฟล์หากต้องการ)
  3. ไฟล์ Abnormal: ทำเช่นเดียวกันแต่ใช้สัญญาณผิดปกติชุดใหม่

หลังจากผ่านไปสักครู่ คุณจะได้รับค่า Accuracy ใหม่สำหรับทั้ง 5 Model ที่เลือก คุณควรได้ค่า Accuracy ใกล้เคียงกับที่ได้ระหว่างการทำ Benchmark หากไม่เป็นเช่นนั้น ให้ทำ Benchmark ใหม่ด้วยข้อมูลที่มากขึ้น

Compilation:

ในที่นี้เรามีสองทางเลือก:

  1. ใช้ Model ที่ผ่านการ Train ระหว่างการทำ Benchmark
  2. ใช้ Model แต่ให้นำไป Retrain โดยตรงบน Microcontroller

หากคุณไม่ต้องการ Retrain ให้คลิกที่ Compile ได้เลย

หากคุณต้องการความรู้จากการทำ Benchmark ให้ติ๊กถูกที่ช่อง "Include knowledge from benchmark" ก่อนทำการ Compile

ผมจะเปลี่ยน Code เพียงไม่กี่บรรัดในภายหลังในบทเรียนนี้ อ่านเพิ่มเติมได้ที่นี่:

https://wiki.st.com/stm32mcu/wiki/AI:NanoEdge_AI_Library_for_anomaly_detection_(AD)

ขั้นตอนที่ 4: เพิ่ม NanoEdge ลงใน Code Arduino

ตอนนี้เมื่อเรามี Library สำหรับตรวจจับความผิดปกติแล้ว เราต้องเพิ่มมันลงใน Code Arduino ของเรา:

  1. เปิดไฟล์ .zip ที่ได้รับ จะมีโฟลเดอร์ Arduino ที่มีไฟล์ zip อีกไฟล์หนึ่งอยู่ข้างใน
  2. Import Library ใน Arduino IDE: Sketch > Include library > Add .ZIP library... และเลือกไฟล์ .zip ในโฟลเดอร์ Arduino

หากคุณใช้ Library ของ NanoEdge AI ใน Arduino IDE อยู่แล้ว: ให้ไปที่ document/arduino/library และลบโฟลเดอร์ NanoEdge ทิ้ง จากนั้นทำตามคำแนะนำด้านบนเพื่อ Import Library ใหม่

ข้อสำคัญ:

หากคุณพบข้อผิดพลาดเกี่ยวกับ RAM อาจเป็นเพราะ Library ใน NanoEdge ให้กลับไปที่ขั้นตอน VALIDATION ใน NanoEdge และเลือก Library ที่มีขนาดเล็กลง (คลิกที่รูปมงกุฎทางด้านขวา) จากนั้นทำการ Compile และนำไปเปลี่ยนใน Arduino IDE

ตัวเลือก A: Retrain ตัว Model

ใน Code ที่เราใช้สำหรับ Datalogging ให้เปลี่ยน NEAI_MODE เป็น 1 และยกเลิกคอมเมนต์ Code ต่อไปนี้:

...

#include <NanoEdgeAI.h>

...

#define NEAI_MODE 1 //0 is data logging code, 1 is detection code

...

void setup(){

...

neai_code = neai_anomalydetection_init(); //initialisation

if(neai_code != NEAI_OK) {

Serial.print("Not supported board.\n");

}

}


void loop(){

...

if(NEAI_MODE) {

if(neai_cnt < MINIMUM_ITERATION_CALLS_FOR_EFFICIENT_LEARNING) {

neai_anomalydetection_learn(neai_buffer);

Serial.print((String)"Learn: " + neai_cnt + "/" + MINIMUM_ITERATION_CALLS_FOR_EFFICIENT_LEARNING + ".\n");

neai_cnt++;

}

else {

neai_anomalydetection_detect(neai_buffer, &similarity);

Serial.print((String)"Detect: " + similarity + "/100.\n");

}

}

}

ตัวเลือก B: ใช้ความรู้จากการทำ Benchmark

หากคุณตัดสินใจเลือกใช้ความรู้จากการทำ Benchmark นี่คือสิ่งที่ต้องทำ:

  1. ในส่วน init() ของ Code ให้เพิ่ม: neai_anomalydetection_knowledge(knowledge);
  2. ใน loop() หลังจาก if(NEAI_MODE) ให้ลบคำสั่ง if (รวมถึงส่วน else { และ }) ออก

#include <NanoEdgeAI.h>

#include "knowledge.h" // DON T FORGET TO LOAD THE KNOWLEDGE


void setup(){

...

neai_code = neai_anomalydetection_init();

if (neai_code != NEAI_OK) {

Serial.print("Not supported board.\n");

} else {

neai_anomalydetection_knowledge(knowledge); //this part is to load the knowledge

}

}

void loop(){

...

if(NEAI_MODE) {

// no more learning part, but detect is the same

neai_anomalydetection_detect(neai_buffer, &similarity);

Serial.print((String)"Detect: " + similarity + "/100.\n");

}

...

}

neai_anomalydetection_detect() คือส่วนของ Code ที่ใช้ Model ในการตรวจจับ

หากค่า Similarity เป็น 100 หมายความว่าเราได้สัญญาณที่เหมือนกับข้อมูลปกติ 100% (มีน้ำเพียงพอ) หากเป็น 0 หมายความว่าไม่มีโอกาสเลยที่จะเป็นข้อมูลปกติ

ใน Code เริ่มต้นเราจะพิมพ์แค่คะแนน Similarity ออกมา คุณสามารถเขียนคำสั่ง if เพื่อแสดงคำว่า OK หากค่า Similarity สูงกว่า 90 หรือ "Not enough water, please add water" ในกรณีอื่นๆ ได้ตามใจคุณ:

if (similarity > 90){

Serial.print("OK");

} else {

Serial.print("Not enough water, please add water");

}

ขอบคุณที่อ่านจนจบครับ :)

Code

🔒 ปลดล็อก Code

สนับสนุนเพื่อรับ Source Code หรือแอปพลิเคชันสำหรับโปรเจกต์นี้

รหัสอ้างอิงโปรเจกต์: how-to-ensure-your-coffee-machine-never-runs-dry-7e6786
1999 บาท
PromptPay QR Code