ชุดโครงงาน AI ขับรถ
Body 101 บทที่ 17 AI กับหุ่นยนต์ ทีมเดียวกัน · ระดับ 9 สร้างเอง AI ขับรถ
เรียบเรียงโดย นพ. สหรัฐ อังศุมาศ · ประสาทแพทย์
บทเรียน: https://www.sahawanclinic.clinic/learn/airobot#ch-build
หน้าชุดโครงงาน: https://www.sahawanclinic.clinic/learn/airobot/kit/index.html

==================================================
ในชุดนี้มีอะไร
==================================================
  ai-driver.html
      หน้าเว็บสมอง AI เปิดใน Chrome หรือ Edge บนคอมพิวเตอร์
      ปุ่มบนหน้านี้เป็นภาษาอังกฤษ: 1. Connect robot · 2. Start camera · STOP (Esc)
  ai_driver_car/ai_driver_car.ino
      โค้ดร่างกายสำหรับบอร์ด Arduino Uno ของรถจากโครงงานที่ 2 บทที่ 16
      ขา D5 D6 D9 D10 และฟังก์ชัน drive() ใช้ตามเดิม
  README_TH.txt
      ไฟล์นี้

==================================================
บอกกันตรงๆ
==================================================
หน้าเว็บทดสอบแล้วกับรถจำลองและกล้องจำลอง ยังไม่ได้ทดสอบกับรถจริงและกล้องจริง
โค้ด Arduino ทดสอบตรรกะบนคอมพิวเตอร์แล้ว แต่ยังไม่เคยคอมไพล์ลงบอร์ด
ต้องกด Verify ในโปรแกรม Arduino ก่อนใช้

==================================================
อินเทอร์เน็ตและความเป็นส่วนตัว
==================================================
- หน้า ai-driver.html โหลดไลบรารี AI สองตัวจาก cdn.jsdelivr.net
  คือ TensorFlow.js รุ่น 4.22.0 และ @teachablemachine/image รุ่น 0.8.5 (ล็อกรุ่นไว้ อย่าเปลี่ยนเป็น latest)
  และโหลดโมเดลของหนูจากเซิร์ฟเวอร์ของ Google
- ภาพจากกล้องถูกประมวลผลในเบราว์เซอร์ หน้า ai-driver.html ไม่ได้อัปโหลดภาพออกไป
- แต่ลิงก์โมเดลที่ได้จาก Upload my model เป็นลิงก์สาธารณะ ใครมีลิงก์ก็ใช้โมเดลได้
  จึงสอน AI ด้วยการ์ดลูกศรหรือท่ามือเท่านั้น ห้ามถ่ายหน้าคน
- ระหว่างฝึก Google บอกว่าภาพตัวอย่างอยู่ในคอมพิวเตอร์ของเรา เว้นแต่เลือกบันทึกโปรเจกต์ลง Google Drive

==================================================
วิธีเปิดหน้า AI Driver
==================================================
เบราว์เซอร์ยอมให้ใช้พอร์ตและกล้องเฉพาะหน้าที่ปลอดภัย คือหน้าที่เปิดจาก https หรือจาก localhost

วิธีที่ 1 ง่ายที่สุด ไม่ต้องใช้ python
  เปิด Chrome หรือ Edge ไปที่
  https://www.sahawanclinic.clinic/learn/airobot/kit/ai-driver.html
  หน้านี้อยู่บน https เบราว์เซอร์จึงนับเป็นหน้าที่ปลอดภัย ใช้ได้เลย

วิธีที่ 2 เปิดจากไฟล์ในเครื่อง ผ่าน localhost (ผู้ใหญ่ทำ)
  1. แตกไฟล์ zip ไว้ในโฟลเดอร์หนึ่ง
  2. เปิด Terminal (Mac หรือ Linux) หรือ Command Prompt (Windows) ในโฟลเดอร์ที่มีไฟล์ ai-driver.html
  3. พิมพ์คำสั่ง
         python3 -m http.server
     (ถ้าบน Windows หาคำสั่ง python3 ไม่เจอ ลอง  py -m http.server )
  4. เปิด Chrome หรือ Edge ไปที่
         http://localhost:8000/ai-driver.html
  5. เล่นเสร็จแล้ว กลับไปที่ Terminal แล้วกด Ctrl+C เพื่อปิด
  ดับเบิลคลิกไฟล์ตรงๆ อาจใช้ได้ใน Chrome แต่ยังไม่ยืนยัน

ใช้ Chrome หรือ Microsoft Edge บนคอมพิวเตอร์ Windows Mac Linux หรือ ChromeOS
ใช้ Safari ไอโฟน และไอแพดไม่ได้
Firefox รุ่นใหม่และ Chrome บน Android รุ่นใหม่รองรับแล้ว แต่ยังไม่ได้ทดสอบกับโครงงานนี้

==================================================
12 ขั้น (ทำกับผู้ใหญ่ทุกครั้ง)
==================================================
 1. ตรวจร่างกายก่อน อัปโหลดโค้ดทดสอบของบทที่ 16 วางรถบนกล่องให้ล้อลอย
    ดูว่า drive() หมุนล้อเดินหน้าทั้งสองข้าง ถ้าล้อไหนหมุนกลับ สลับสายมอเตอร์ข้างนั้น
 2. ทำการ์ด 4 ใบ ลูกศรขึ้น ซ้าย ขวา และรูปฝ่ามือ วาดให้ใหญ่และหนา
 3. สอนตาใน Teachable Machine สร้าง Image Project ตั้งชื่อกลุ่ม Forward Left Right Stop
    และเพิ่มกลุ่มที่ห้า Nothing สำหรับฉากว่างและของอื่นๆ (หน้าเว็บแปลงเป็น S ให้)
    เก็บภาพกลุ่มละอย่างน้อย 50 ภาพ ทั้งสว่าง สลัว ใกล้ ไกล มือหลายคน ในห้องที่จะขับจริง
    ถ่ายแค่การ์ดหรือมือ ห้ามถ่ายหน้า
    อย่ากดปุ่มกลับด้านภาพ (flip) ถ้าเผลอกด ให้แก้ new tmImage.Webcam(224, 224, true) เป็น false
    การแก้โค้ดต้องใช้ไฟล์ในเครื่อง แก้ ai-driver.html ในชุดนี้ด้วยโปรแกรมแก้ข้อความ
    แล้วเปิดด้วยวิธีที่ 2 (localhost) ข้างบน หน้าบนเว็บแก้ไม่ได้
 4. ฝึกแล้วทดสอบในหน้าตัวอย่าง ทุกท่าควรขึ้นถึง 80% อย่างสม่ำเสมอ ฉากว่างควรเป็น Nothing
 5. Export แล้ว Upload my model แล้วคัดลอกลิงก์ (ทุกคนที่มีลิงก์ใช้โมเดลนี้ได้)
 6. ปิดสวิตช์ถ่านไว้ เปิด ai_driver_car.ino ใน Arduino IDE กด Verify ก่อน แล้ว Upload
    จากนั้นปิดหน้าต่าง Serial Monitor
 7. เปิดหน้า AI Driver ใน Chrome หรือ Edge (วิธีที่ 1 หรือ 2 ข้างบน)
 8. วางรถบนกล่อง เปิดสวิตช์ถ่าน กด 1. Connect robot เลือกพอร์ต หน้าเว็บรอ 2 วินาทีแล้วส่ง S
    วางลิงก์โมเดล กด 2. Start camera อนุญาตกล้อง
 9. ทดสอบความปลอดภัย 8 ข้อตอนล้อลอย ต้องผ่านครบ
    [ ] ทุกท่ามือหมุนล้อถูกทาง
    [ ] ฉากว่าง ล้อหยุด
    [ ] ถือของที่ไม่เคยสอน ล้อหยุดหรืออย่างน้อยไม่เลี้ยวแปลกๆ
    [ ] แสงสลัว สังเกตว่าหยุดหรือยังทำงาน
    [ ] มือคนอื่นในบ้าน
    [ ] กด STOP ล้อหยุด
    [ ] กด Esc ล้อหยุด
    [ ] สลับไปแท็บอื่น ล้อหยุดภายในราว 1 วินาที
10. ขับบนพื้นเท่านั้น เคลียร์ที่รอบรถ ไม่มีสัตว์เลี้ยงหรือน้องเล็ก ผู้ใหญ่ถือสายให้หย่อนและอยู่ใกล้สวิตช์ถ่าน
    ใช้ความเร็วตามโค้ด กด STOP หรือ Esc ได้ทุกเมื่อ
11. ทดลองต่อ เปลี่ยน THRESHOLD เป็น 0.6 หรือ 0.95 · สลับแท็บ · เอามือปิดกล้อง · ลองในแสงที่ต่างจากตอนฝึก
    การแก้โค้ดต้องใช้ไฟล์ในเครื่อง แก้ ai-driver.html ในชุดนี้ด้วยโปรแกรมแก้ข้อความ
    แล้วเปิดด้วยวิธีที่ 2 (localhost) ข้างบน หน้าบนเว็บแก้ไม่ได้
12. เก็บของตามลำดับ กด STOP แล้วปิดสวิตช์ถ่าน แล้วถอดสาย USB แล้วถอดถ่านออกเมื่อเล่นเสร็จ

==================================================
ปลอดภัยไว้ก่อน
==================================================
- ทำกับผู้ใหญ่ทุกครั้ง
- เล่นบนพื้นเท่านั้น ห้ามบนโต๊ะ
- ใช้ความเร็วต่ำตามโค้ด
- ผู้ใหญ่อยู่ใกล้สวิตช์ถ่านตลอดเวลา
- ทดสอบล้อลอยก่อน
- นิ้วห่างล้อ
- ปิดถ่านก่อนถอดสาย
- ไม่ทิ้งให้รถวิ่งโดยไม่มีคนดู
- เรื่องถ่าน ห้ามใช้ถ่านเก่าปนใหม่ ห้ามลัดวงจร ถอดถ่านเมื่อเล่นเสร็จ
- ใช้ท่ามือหรือการ์ด ไม่ใช้หน้าคน
- ไม่ต่อแบบไร้สายในโครงงานแรก

==================================================
แก้ปัญหา
==================================================
- ขึ้นข้อความ No Web Serial here  ใช้ Chrome หรือ Edge บนคอมพิวเตอร์
- เชื่อมต่อไม่ได้  ปิด Serial Monitor หรือโปรแกรมอื่นที่จับพอร์ตอยู่
- ขึ้นข้อความ the model needs 4 classes  สะกดชื่อกลุ่มให้ตรง
- รถเลี้ยวผิดทาง  สลับสายมอเตอร์ข้างนั้น
- รถหยุดเองเป็นระยะ  แท็บต้องเปิดอยู่ด้านหน้า และ AI ต้องมั่นใจเกินเส้นเกณฑ์
  ถ้าแสงหรือฉากไม่ตรงกับตอนฝึก ให้เก็บภาพเพิ่ม
- บรรทัด AI ขึ้น F แต่รถไม่ขยับ  เช็กสวิตช์ถ่าน และเช็กว่าต่อ GND ร่วมกันตามบทที่ 16
- กล้องถูกบล็อก  เปิดจาก localhost หรือ https
