PolyMO: สัตว์เลี้ยง ESP32 ที่ป่วยเมื่อเรา Doomscroll
ถ้าคำเตือน Screen Time บนโทรศัพท์เด้งขึ้นมาแล้วเรากดข้ามทุกครั้ง จะเกิดอะไรขึ้น ถ้าคราวนี้คนที่รับผลจากการ Doomscroll ไม่ใช่เราโดยตรง แต่เป็นสัตว์เลี้ยงตัวเล็กบนโต๊ะ?
นั่นคือแนวคิดของ PolyMO สัตว์เลี้ยงเสมือนแบบ Physical Device ที่สร้างจาก ESP32-S3 มีหน้าจอ AMOLED, Touch, Microphone และ Speaker อยู่ในตัว
ถ้าเราใช้แอปที่กำลังถูกติดตาม นานเกิน Allowance ตัว Pet จะเข้าสู่สถานะป่วย และค่าความอิ่มกับความสุข จะค่อย ๆ ลดลง
แต่สิ่งที่ทำให้ Project นี้น่าสนใจกว่า “Tamagotchi ที่ดู Screen Time” คือ Architecture ที่แยกหน้าที่กันชัดเจน:
ชีวิตของ Pet อยู่บน ESP32-S3 ส่วน AI หนัก ๆ ยืมพลังจากโทรศัพท์ Android และทำงานแบบ Local
Key Takeaways
- ชื่อ Project ปัจจุบันคือ PolyMO
- Hardware ใช้ Waveshare ESP32-S3 Touch AMOLED 1.8
- จอ AMOLED ขนาด 1.8 นิ้ว ความละเอียด 368×448
- UI ใช้งานใน Orientation 448×368
- มี Capacitive Touch, Microphone และ Speaker บน Board
- รองรับ Board Revision V1 และ V2
- Firmware ตรวจ SH8601 หรือ CO5300 Display Driver ตอน Runtime
- Pet Simulation และ State หลักอยู่บน ESP32-S3 ไม่ได้อยู่ใน Android
- Android ทำหน้าที่รัน Whisper, llama.cpp และ Piper
- สื่อสารระหว่าง Pet กับ Android ผ่าน BLE
- Audio ถูกส่งผ่าน Protocol โดยใช้ Opus
- Android App ไม่มี INTERNET Permission
- มี Test ที่ทำให้ Build Fail หาก INTERNET Permission ถูกเพิ่มกลับมา
- AI Model ไม่ได้ Bundle มากับ App ผู้ใช้ต้อง Import เอง
- Screen Time ถูกมองเป็น Sensor ของ Simulation
- Allowance ถูกออกแบบแบบ Per Sitting ไม่ใช่ Daily Budget
- Pet มี Satiety และ Happiness อย่างละ 0–4
- Feed ใช้ Double Tap ส่วน Play ใช้การ Shake ค้างประมาณ 3 วินาที
- Quiet Hours ถูกออกแบบไว้ช่วง 21:00–09:00
- Repository มี STL สำหรับเคส 2 แบบ แต่ไม่มี Print Settings และไม่มี Source CAD
PolyMO คืออะไร?
PolyMO เป็น Virtual Pet ที่มีตัวตนเป็น Hardware จริง ไม่ได้เป็นแค่ Character ใน Smartphone App
ตัวเครื่องมีหน้าตาเป็น Creature ขนาดวางบนโต๊ะ พร้อม AMOLED Face ที่สามารถเปลี่ยนอารมณ์ และสถานะตาม Simulation ของมันเอง
Pet สามารถ:
- หิว
- เบื่อ
- มีความสุข
- ป่วย
- เติบโตผ่าน Life Stage
- และตายได้ หากถูกละเลยตาม Logic ของ Simulation
แต่ Environment ของมันไม่ได้สร้างขึ้นมาลอย ๆ แบบ Virtual Pet ทั่วไป
หนึ่งใน Input สำคัญคือ:
พฤติกรรมการใช้โทรศัพท์ของเจ้าของ
แนวคิดหลัก: Screen Time ไม่ได้เป็นแค่สถิติที่ App เอามาโชว์ แต่กลายเป็น Sensor ที่ส่งผลต่อชีวิตของ Pet
Hardware หลักคือ Waveshare ESP32-S3 Touch AMOLED 1.8
Repository ปัจจุบันระบุ Board เป็น:
Waveshare ESP32-S3 Touch AMOLED 1.8
| ส่วน | ข้อมูลจาก Project |
|---|---|
| MCU | ESP32-S3 |
| Display | 1.8-inch AMOLED |
| Native Resolution | 368 × 448 |
| UI Orientation | 448 × 368 |
| Touch | Capacitive Touch |
| Audio Input | Onboard Microphone |
| Audio Output | Onboard Speaker |
| Phone Link | Bluetooth Low Energy |
รองรับ Board V1 และ V2
Project รองรับ Hardware Revision ทั้ง V1 และ V2
Firmware ตรวจ Display Panel Driver ตอน Runtime ว่าเป็น:
- SH8601
- หรือ CO5300
ตรงนี้ช่วยให้ Code ไม่ต้องถูกแยกเป็นสอง Project เพียงเพราะ Board Revision ใช้ Panel Driver ต่างกัน
ESP32 กับ Android แบ่งงานกันยังไง?
นี่คือส่วนที่น่าสนใจที่สุด ของ Architecture
PolyMO ไม่ได้พยายามยัด Whisper, LLM และ Text-to-Speech ลง ESP32-S3 ทั้งหมด
แทนที่จะทำแบบนั้น ผู้สร้างแบ่งระบบเป็นสองฝั่ง:
ESP32-S3 — ตัว Pet
- แสดง Face
- อ่าน Touch
- รับเสียงจาก Microphone
- เล่นเสียงออก Speaker
- เก็บ Pet State
- รัน Simulation
- ดูแล Life Stage
- ดูแล Satiety / Happiness
- ดูแล Sick / Dead State
Android — Compute ที่ Pet ยืมใช้
- อ่าน Screen Time
- รัน Whisper สำหรับ Speech Recognition
- รัน llama.cpp สำหรับ Language Model
- รัน Piper สำหรับ Voice
- จัดการ AI Model Files
- ส่งและรับข้อมูลผ่าน BLE
↓
Microphone บน ESP32-S3
↓
BLE + Opus Audio
↓
Android Phone
↓
Whisper
↓
llama.cpp
↓
Piper
↓
BLE + Audio กลับไปที่ Pet
↓
Speaker บน PolyMO
อย่าสรุปว่า ESP32-S3 รัน LLM: AI Model หนัก ๆ รันบน Android Phone ส่วน ESP32-S3 ดูแล Hardware และ Simulation ของ Pet
โทรศัพท์เป็นสมองที่ยืมมา แต่ชีวิตของ Pet อยู่บนตัวมันเอง
Design ของ PolyMO ตั้งกฎสำคัญไว้ว่า:
Pet owns its own life.
หมายความว่า State ของ Pet ไม่ได้ผูกชีวิตไว้กับ Android App จน App ปิดแล้วทุกอย่างหยุด
ตัว ESP32-S3 มี:
- Flash สำหรับ Persistent State
- RTC สำหรับเวลา
- Screen
- Touch
- Microphone
- Speaker
- IMU
ถ้าไม่ได้เชื่อมโทรศัพท์อีกเลย Pet ยังสามารถมี State และใช้ชีวิตต่อได้
สิ่งที่หายไปคือ Compute จากโทรศัพท์ สำหรับภาษาและเสียง AI
Design Lesson: ถ้า Simulation อยู่บน Phone ทั้งหมด Hardware ด้านนอกก็จะกลายเป็น Remote Display มากกว่าจะเป็น Virtual Pet ที่มีชีวิตของตัวเอง
Doomscroll แล้ว Pet ป่วยยังไง?
Android ส่งข้อมูล Screen Time ให้ Pet ในฐานะ Input ของ Simulation
ถ้าผู้ใช้ อยู่ใน Tracked App นานเกิน Allowance:
↓
ใช้งานต่อเนื่องเกิน Allowance
↓
Screen-time Event
↓
PolyMO เข้าสถานะ Sick
↓
Satiety + Happiness ลดต่อเนื่อง
↓
วางโทรศัพท์ / ออกจาก App
↓
Condition สามารถจบลง
ทำไมต้องคิดแบบ Per Sitting?
Design ตั้งใจใช้ Allowance แบบ:
ต่อการใช้งานหนึ่ง Sitting
ไม่ใช่ Daily Budget ที่รวม Usage ทั้งวันแล้วค่อยเทียบ
เหตุผลคือ Daily Total มีแต่เพิ่มขึ้น
ถ้า Pet ป่วยเพราะเกิน Budget ตั้งแต่ตอนเช้า ตัวเลขรวมจะไม่ลด จนกว่าจะเปลี่ยนวัน
แต่แบบ Per Sitting ทำให้:
วางโทรศัพท์ → พฤติกรรมเปลี่ยน → Pet สามารถฟื้นได้
ตัวเลข 5 นาทีที่ปรากฏใน Design Document เป็นตัวอย่าง UI: บทความนี้จะไม่ฟันธงว่า Default Doomscroll Limit ของ PolyMO ต้องเป็น 5 นาที หากไม่มี Current Configuration ยืนยันค่าดังกล่าว
Pet มีสอง Score หลัก: Satiety และ Happiness
Simulation ใช้ Score สองค่า:
| Score | Range | เพิ่มจาก | ลดจาก |
|---|---|---|---|
| Satiety | 0–4 | Feeding | Decay และลดเร็วขึ้นเมื่อ Sick |
| Happiness | 0–4 | Playing | Decay และลดเร็วขึ้นเมื่อ Sick |
Project ตั้งใจใช้คำว่า Satiety หรือความอิ่ม แทนการเรียกว่า Hunger Score
เพราะระบบกำหนด:
ค่ามาก = ดี
ทั้ง Satiety และ Happiness
จึงลดโอกาสเขียน Logic ที่ชื่อ Variable อ่านสวนทางกับความหมายจริง
เมื่อไร Pet ถึงตาย?
Design กำหนด Death Condition เป็นกรณีที่:
Satiety = 0 และ Happiness = 0 ต่อเนื่องเป็นเวลานาน
ต้องเป็น:
AND
ไม่ใช่ OR
ดังนั้น Pet ที่หิวมากแต่ยังมี Happiness หรืออิ่มแต่ไม่มี Happiness จะไม่ตายทันที
ตายแล้วไม่ได้ Respawn อัตโนมัติ
Death ถูกเก็บเป็น State เพื่อให้ Reset เป็น Action ที่เจ้าของต้องทำเอง
Hardware README ระบุว่า สามารถกด:
BOOT ค้าง 5 วินาที
เพื่อ Reset Dead Pet โดยไม่ต้องมีโทรศัพท์ อยู่ใกล้ ๆ
เลี้ยง Pet ยังไง? ไม่ได้มีปุ่ม Feed แบบเกมทั่วไป
PolyMO ใช้ Interaction จาก Hardware จริง
Feed
ใช้:
Double Tap
การใช้ Double Tap ตั้งใจลดการ Trigger โดยไม่ได้ตั้งใจ จากการแตะหรือวางอุปกรณ์
Play
ใช้:
Shake ค้างประมาณ 3 วินาที
แทนการใช้ Threshold จาก Accelerometer แค่ครั้งเดียว ซึ่งอาจเกิดขึ้น จากการขยับอุปกรณ์โดยไม่ได้ตั้งใจ
Cooldown
Feeding และ Playing มี Cooldown:
5 วินาที
Design เดิมเคยใช้ 60 วินาที ก่อนถูกลดลงเป็น 5 วินาที
หาก Score อยู่ที่ 0 Cooldown จะถูกยกเว้น เพื่อไม่ให้ Pet ที่กำลังต้องการการดูแล ปฏิเสธ Interaction แบบไม่จำเป็น
Quiet Hours: Pet ไม่ควรกลายเป็นของที่ปลุกเจ้าของตอนตีสาม
Design Document กำหนด Quiet Hours:
21:00–09:00
ในช่วงนี้:
- Scores ไม่ Decay
- Pet ไม่ Call
- Death Clock ไม่เดิน
แนวคิดคือ Virtual Pet ต้องสามารถอยู่ร่วมกับเจ้าของได้ โดยไม่กลายเป็นอุปกรณ์ ที่ส่งเสียงรบกวนตอนกลางคืน จนสุดท้ายเจ้าของเลือกปิดมันทิ้ง
จุดที่น่าสนใจ: Quiet Hours เป็นกฎของตัว Pet ไม่ใช่การปล่อยให้ Android เป็นคนควบคุมทุกอย่าง ซึ่งยังสอดคล้องกับแนวคิด “Pet owns its own life”
Local AI อยู่บนโทรศัพท์ แต่ Pet เป็นคนพูดกับเรา
เวลาพูดกับ PolyMO ฝั่ง ESP32-S3 ไม่ได้พยายามรัน Speech Recognition หรือ LLM ด้วยตัวเอง
Phone เป็น Compute Engine ที่ทำงาน 3 ส่วนหลัก:
| งาน | Technology |
|---|---|
| Hearing / Speech-to-Text | Whisper |
| Thinking / Language Model | llama.cpp |
| Voice / Text-to-Speech | Piper |
Audio ระหว่าง Board กับ Phone ถูกส่งผ่าน BLE และ Project ใช้ Opus ในเส้นทาง Audio
↓
Opus Audio
↓
BLE
↓
Whisper
↓
Local LLM ผ่าน llama.cpp
↓
Piper Voice
↓
BLE
↓
PolyMO Speaker
AI Model ไม่ได้ติดมากับ App — ผู้ใช้ต้องเลือกเอง
Current Repository ระบุว่า:
No models ship with the app.
ผู้ใช้ต้อง Import Model 3 ประเภท ผ่าน System File Picker
| Role | Format | ใช้กับ |
|---|---|---|
| Thinking | .gguf |
Small Instruct Model ที่ llama.cpp โหลดได้ |
| Hearing | .bin |
Whisper Model |
| Voice | .onnx |
Piper Voice |
ดังนั้นติดตั้ง App อย่างเดียวยังไม่ครบ: ต้องเตรียม Model สำหรับ Thinking, Hearing และ Voice ให้ครบก่อน Local AI Stack จะทำงานตาม Design
Offline ไม่ได้มีแค่คำโฆษณา — App ไม่มี INTERNET Permission
Repository ระบุว่า App ไม่มี Account และไม่มี Server สำหรับการสนทนาของ Pet
Android Manifest ไม่ได้ประกาศ:
INTERNET
Permission ที่ Project ระบุมี:
BLUETOOTH_CONNECTBLUETOOTH_SCANRECORD_AUDIOPACKAGE_USAGE_STATSPOST_NOTIFICATIONSRECEIVE_BOOT_COMPLETEDFOREGROUND_SERVICEFOREGROUND_SERVICE_CONNECTED_DEVICE
PermissionCopyTest คืออะไร?
Repository มี Test ที่ตรวจ AndroidManifest.xml
ถ้ามีการเพิ่ม INTERNET Permission เข้าไปในภายหลัง:
Build จะ Fail
นี่เป็น Software Engineering Detail ที่ดีมาก: แทนที่จะเขียน README ว่า “App Offline” แล้วหวังว่าคนแก้ Code ในอนาคตจะจำได้ Project เปลี่ยน Requirement ให้เป็นสิ่งที่ Test ตรวจได้
อย่างไรก็ตาม: การไม่มี INTERNET Permission เป็นข้อเท็จจริงเกี่ยวกับ Current Android Build ไม่ควรขยายความเป็นคำกล่าว อย่าง “ปลอดภัย 100%” หรือ “ไม่มีความเสี่ยงด้าน Privacy” เกินกว่าที่ Source ยืนยัน
Hackaday ยังพูดถึง Notification ด้วย
ในบทความ Hackaday ผู้เขียนอธิบายว่า Local Agent ไม่ได้มองแค่ Screen Time แต่ยังสามารถทำงาน กับ Notification ของโทรศัพท์ด้วย
แนวคิดคือ Pet สามารถช่วยบอก หรือสรุปข้อมูลบางอย่าง โดยไม่ต้องให้เจ้าของ หยิบโทรศัพท์ขึ้นมามองหน้าจอทุกครั้ง
Hackaday ยังยกตัวอย่างว่า ผู้ใช้สามารถพูดกับ Pet และให้มันตอบกลับ เช่นถามเรื่องทั่วไป หรือให้เล่า Joke ผ่าน Local Voice Stack
ส่วน Notification เป็นรายละเอียดที่ข่าว Hackaday กล่าวถึง: ถ้าจะนำไป Build หรือแก้ App จริง ควรตรวจ Current Android Source และ Permission / Service Implementation ใน Repository เพิ่มเติม
Battery Life มีตัวเลขจากการทดสอบจริงของผู้สร้าง
Hardware README ระบุการทดลองกับ:
LiPo 1300 mAh
ผลที่วัดได้คือประมาณ:
21 ชั่วโมง 52 นาที
โดย Average Current อยู่ประมาณ:
59 mA
ส่วน Battery:
500 mAh
ให้ Runtime ประมาณ:
6 ชั่วโมง
ตัวเลขนี้เป็นผลทดสอบ Build ของผู้สร้าง: Runtime จริง สามารถเปลี่ยนตาม Battery, Brightness, Audio, BLE, Workload และสภาพ Battery จึงไม่ควรใช้เป็น Battery-life Guarantee สำหรับทุกเครื่อง
เคส 3D Print มีไฟล์ให้ แต่ Source ไม่ได้ให้ Print Recipe
ในโฟลเดอร์ hardware/ ของ Repository มี STL สำหรับเคส 2 แบบ:
PolyMO_BMO.stlPolyMO_C0F-E.stl
ผู้สร้างระบุว่า ทั้งสอง Shell:
Printable as-is
ภายในถูกออกแบบ สำหรับ:
- Waveshare ESP32-S3 Touch-AMOLED-1.8
- LiPo Cell ที่ต่อเข้ากับ MX1.25 Header ของ Board
แต่ไม่มี Print Settings
ผู้สร้างระบุชัดว่า ไม่ได้บันทึกค่า:
- Layer Height
- Orientation
- Supports
- Infill
- Material
ดังนั้นบทความนี้ จะไม่สร้างค่า PLA / PETG, 0.2 mm, 20% Infill หรือ Support Setting ขึ้นเอง
ไม่มี Source CAD
Repository มี:
Exported STL Meshes
แต่ Hardware README ระบุว่า:
ไม่มี Editable Source CAD อยู่ใน Repository
มี STL แล้วแต่ไม่มีเครื่องพิมพ์ 3D? สามารถส่งไฟล์ STL ให้ทีม Globalbyte ช่วยประเมินบริการรับพิมพ์ 3D ได้ โดยควรเลือก Material, Orientation, Support และงาน Finish ตามความต้องการจริง เพราะผู้สร้างไม่ได้ให้ Print Recipe ไว้
ตรวจสิทธิ์ก่อนนำไปผลิตเชิงพาณิชย์: Licensing Table ของ Repository อธิบาย Firmware, App และ Released APK ชัดเจน แต่ไม่ได้แจกแจง Commercial Terms ของไฟล์ STL แยกไว้ชัดเท่ากัน ควรตรวจ Repository และ License ปัจจุบันอีกครั้ง ก่อนผลิตเพื่อจำหน่าย
เรื่องชื่อ BMO / C0F-E
Hardware README ระบุว่า BMO Shell เป็น Fan Shape ที่ได้แรงอ้างอิงจาก Character และ Project ไม่ได้ Affiliated หรือ Endorsed โดยเจ้าของสิทธิ์ของ Character นั้น
ส่วนชื่อ:
C0F-E
ใช้เลข 0 โดยตั้งใจ ไม่ใช่ Typo
Firmware กับ Android App ต้องเดินไปด้วยกัน
Firmware และ Android App แชร์ Protocol ระหว่างกัน
Repository มี Protocol Definition ทั้งฝั่ง:
- ESP32 Firmware
- Android App
ทั้งสองฝั่ง มี Version Constant และ Pet รายงาน Version ตอน Connect
แต่ Current Implementation ยังไม่มีระบบ:
Compare Version อัตโนมัติ
นั่นทำให้ Firmware กับ App ที่มาจากคนละ Commit อาจ:
Pair กันได้ แต่ทำงานผิดภายหลัง
คำแนะนำจาก Repository: Flash Firmware และ Build Android App จาก Commit เดียวกัน เพื่อให้ Wire Protocol ตรงกัน
Android Build ต้องใช้ JDK 21
Repository ระบุ Requirement:
JDK 21
และเตือนว่า Kotlin 2.1 ไม่สามารถ Parse JDK 25 Class File ใน Build นี้ได้
หากใช้ System JDK ที่ใหม่เกินไป Error อาจไม่ได้บอกสาเหตุ ตรง ๆ
Android SDK ก็ต้องชี้ Path ให้ถูก
สามารถกำหนดผ่าน:
ANDROID_HOME- หรือ
sdk.dirในandroid/local.properties
โดย:
android/local.properties
ไม่ได้ Commit ไว้ใน Repository เพราะเป็น Path เฉพาะเครื่องของแต่ละคน
Clone Repo อย่างเดียวยัง Build AI Stack ไม่ครบ
Android App Link กับ Native Dependencies:
- llama.cpp
- whisper.cpp
- Piper
- Opus
- espeak-ng
Repository ไม่ได้เก็บ Third-party Source เหล่านี้ทั้งหมด ไว้ใน Git หลัก
Source รวมกัน มีขนาดประมาณ:
1.3 GB
Project มี Script:
tools/fetch-natives.sh
สำหรับดึง Source ที่เกี่ยวข้อง
แต่ Script ไม่ได้ทำทุกอย่างให้จบ: Repository เตือนว่า ยังมี Prebuilt Shared Libraries สองตัว ที่ต้องวางเอง และ Dependency บางรายการ ไม่มี Version Record ครบ ดังนั้นควรอ่าน Header ของ Script และ NOTICE ก่อน Build
หน้าตาน่ารัก แต่ Repository มี 512 Tests
Current README ระบุ Test Suite:
512 Tests
และไม่จำเป็นต้องมี Device เพื่อรัน Test ส่วนใหญ่
สิ่งที่ Test ไม่ได้มีแค่ Business Logic แต่ยังมีเรื่อง:
- WCAG Contrast Ratio
- ป้องกันการใช้ raw
.dp/.spใน UI Code - ตรวจ Generated Face Sets
- ตรวจ Color Tokens
- ตรวจ Component Roster
- ตรวจ Permission Manifest
Lesson ที่เอาไปใช้กับ Project อื่นได้: Requirement ที่สำคัญ ไม่จำเป็นต้องอยู่แค่ใน README ถ้าสามารถเปลี่ยนมัน ให้เป็น Test ที่ Fail เมื่อมีคนทำผิดได้
หน้าตาและ Personality ของ Pet ไม่ได้แก้มือทีละไฟล์
Source of Truth อยู่ใน:
design-system/faces/*.jsondesign-system/personas/*.json
จากนั้นใช้ Generator:
tools/gen-faces.pytools/gen-personas.py
เพื่อสร้าง Resource สำหรับ Firmware และ Android App
Generator ยังตรวจ Design Rules
ตัวอย่างกฎที่ Repository อธิบายไว้:
- Happy Face ต้อง Smile
- Dead Face ไม่มี Mouth
- Sad กับ Sick ต้องแยกจากกันได้
- Spiral Eye ต้องดูเป็น Spiral จริง
- Persona ต้องไม่ถาม User กลับเป็นคำถาม
- Persona ต้องไม่อ่านรายชื่อ App ออกมายาว ๆ
แนวทางนี้ ทำให้ Personality และ Visual Language ไม่ได้เป็นแค่ Design Note แต่บางกฎสามารถ Fail Build ได้จริง
Mini-games ยังไม่ควรนำไปเขียนเป็น Feature ที่เสร็จแล้ว: Design Document ระบุว่า First Run และ Mini-games ยังเป็นส่วนที่ไม่ได้ Build ใน Status ที่อ้างอิง
License ของ PolyMO ไม่ได้มีคำตอบเดียวทั้ง Project
Repository Metadata ใช้ Apache-2.0 แต่ README แจกแจง License ของแต่ละ Layer เพิ่มเติม
| ส่วน | License ตาม README |
|---|---|
pet-esp32/ Firmware |
Apache-2.0 |
| Android Source / Design System / Tools | Apache-2.0 |
| Released APK ที่ Link espeak-ng | GPL-3.0 |
เหตุผลที่ Released APK ต่างจาก Source คือ App Link กับ:
espeak-ng
ซึ่งมีผลต่อ License ของ Binary ที่นำไปแจกจ่าย
หากจะ Fork แล้วแจก APK: ควรอ่าน LICENSE, GPL Text, NOTICE และ Release Requirement ใน Repository ฉบับปัจจุบันโดยตรง บทความนี้ไม่ใช่คำแนะนำด้านกฎหมาย
Build Commands จาก Repository
PolyMO มี Source Code จริง ทั้ง ESP-IDF Firmware และ Android App ดังนั้นรอบนี้ สามารถแสดงตัวอย่าง Build Command จาก Repository ได้
Code ด้านล่างเป็นเพียง Entry Point: ไม่ใช่ Build Guide ฉบับสมบูรณ์ โดยเฉพาะ Android ยังต้องเตรียม JDK 21, Android SDK, Native Dependencies และ Model Files เพิ่มเติม
. ~/esp/esp-idf/export.sh
cd pet-esp32
idf.py build
idf.py -p /dev/cu.usbmodem* flash
หลัง Flash แล้วจอดำไม่ได้แปลว่า Build พังเสมอ: Repository ระบุว่า Display อาจยังดำอยู่หลัง Flash จนกว่าจะ Power-cycle Board ให้ถอด USB แล้วเสียบใหม่ ก่อนสรุปว่า Hardware มีปัญหา
cd android
export ANDROID_HOME="$HOME/Library/Android/sdk"
JAVA_HOME="/Applications/Android Studio.app/Contents/jbr/Contents/Home" \
./gradlew assembleDebug
tools/fetch-natives.sh
cd android
./gradlew testDebugUnitTest
tools/gen-faces.py
tools/gen-personas.py
อย่า Mix Firmware กับ App คนละ Commit: Wire Protocol ยังไม่มี Automatic Version Compatibility Check ตาม README จึงควร Build ทั้งสองฝั่ง จาก Commit เดียวกัน
ดูการทำงานจริงจากผู้สร้าง
รอบนี้มี Hero หนึ่งภาพ และวิดีโอหนึ่งตัว จึงแสดงภาพ Hero ด้านบนก่อน แล้วซ่อนวิดีโอไว้ใน Pure CSS View more
ถ้าอยากศึกษา Project นี้ ควรเริ่มจากตรงไหน?
PolyMO ไม่ใช่ Project ที่มีแค่ ESP32 Firmware ไฟล์เดียว
ถ้าจะตามให้ทัน แนะนำแยกเรียนเป็น Layer
เริ่มจาก Hardware ก่อน
ทำความเข้าใจ Waveshare ESP32-S3 Touch AMOLED 1.8, Display Revision, Touch, Audio และ BLE
อ่าน Pet Simulation
แยกให้ได้ว่า Satiety, Happiness, Sick, Mood, Life Stage และ Death เป็นคนละ State กันยังไง
ดู BLE Protocol
เพราะ Firmware และ Android ต้องคุยกันผ่าน Shared Protocol และควรอยู่ Commit เดียวกัน
ค่อยเข้า Local AI
แยก Whisper, llama.cpp และ Piper ออกจากกัน จะเข้าใจง่ายกว่า คิดว่าทั้งหมดคือ “AI Model ตัวเดียว”
ค่อย Build Android
เตรียม JDK 21, Android SDK และ Native Dependencies ก่อน
เลือก AI Models
เตรียม GGUF, Whisper BIN และ Piper ONNX ตาม Format ที่ App รองรับ
ปิดงานด้วย Enclosure
เมื่อ Hardware และ Software ทำงานแล้ว ค่อยเลือก STL และหา Print Setting ที่เหมาะกับเครื่องพิมพ์ ของตัวเอง
สำหรับ Maker ไทย จุดที่เอาไปต่อยอดได้ไม่ใช่แค่ “Pet น่ารัก”
ถ้าแกะ Architecture ออกเป็นชิ้น ๆ PolyMO เป็น Reference สำหรับหลายเรื่อง:
- ESP32-S3 UI
- AMOLED Display
- Capacitive Touch
- BLE Protocol
- Audio Streaming
- Opus
- Local Speech Recognition
- Local LLM
- Local Text-to-Speech
- Android Usage Statistics
- Persistent Device State
- RTC-based Simulation
- 3D Printed Product Enclosure
- Automated Test / Design-system Workflow
ถ้ากำลังทำ Project ที่ไม่ใช่ Virtual Pet ก็ยังสามารถเอา Pattern อย่าง:
ESP32 เป็น Physical Interface + Phone เป็น Local Compute Engine
ไปประยุกต์กับ Gadget, Controller, Voice Interface หรือ Interactive Device อื่นได้
กำลังหา ESP32 Board หรืออยากทำเคส 3D Print? สามารถสอบถามทีม Globalbyte เรื่อง Development Board, Module, อุปกรณ์ Maker หรือส่ง STL เพื่อประเมินบริการรับพิมพ์ 3D ได้ โดยควรเช็ก Compatibility และ Stock ก่อนสั่งซื้อทุกครั้ง
Project นี้มีหลาย Layer — แนะนำเปิดต้นฉบับควบคู่กัน
โดยเฉพาะถ้าจะ:
- Flash Firmware
- Build Android App
- เปลี่ยน BLE Protocol
- แก้ Simulation
- เปลี่ยน AI Model
- ใช้ Notification Features
- Build Native AI Dependencies
- แก้ Faces หรือ Personas
- พิมพ์ Enclosure
- แจก APK
FAQ: PolyMO, ESP32 และ Local AI
PolyMO คืออะไร?
เป็น Physical Virtual Pet ที่ใช้ ESP32-S3 และผูก Pet Simulation เข้ากับ Screen Time ของ Android Phone
ใช้ ESP32 รุ่นไหน?
Project ใช้ Waveshare ESP32-S3 Touch AMOLED 1.8
จอมีความละเอียดเท่าไร?
Panel มี Resolution 368 × 448 และ UI ใช้แบบ Rotate เป็น 448 × 368
ESP32 รัน Llama เองไหม?
ไม่ llama.cpp, Whisper และ Piper รันบน Android Phone ส่วน ESP32-S3 ดูแล Pet, Display, Touch, Audio และ Simulation
ESP32 กับโทรศัพท์คุยกันอย่างไร?
ใช้ Bluetooth Low Energy และ Project มี Shared Protocol ระหว่าง Firmware กับ Android App
เสียงส่งยังไง?
Architecture ใช้ Opus Audio ในการส่งเสียง ระหว่าง Pet กับ Phone ผ่าน BLE
AI ทำงานบน Cloud ไหม?
Current Project ออกแบบให้ AI Stack ทำงานบนโทรศัพท์ แบบ Local และ Android App ไม่ประกาศ INTERNET Permission
App มี Server หรือ Account ไหม?
Current README ระบุว่าไม่มี Account และไม่มี Server สำหรับระบบนี้
Model ติดมากับ App หรือไม่?
ไม่ ผู้ใช้ต้อง Import GGUF, Whisper BIN และ Piper ONNX เอง
Pet ป่วยเพราะอะไร?
เมื่อผู้ใช้ อยู่ใน Tracked App ต่อเนื่องเกิน Allowance Screen-time Event จะทำให้ Pet เข้าสถานะ Sick ตาม Simulation
Allowance เป็นรายวันไหม?
Design ใช้แบบ Per Sitting เพื่อให้การวางโทรศัพท์ สามารถเปลี่ยนสถานะ และทำให้ Loop ฟื้นตัวได้
ค่า 5 นาทีคือ Default ใช่ไหม?
Design Document มีตัวอย่าง UI ที่ใช้ 5 นาที แต่บทความนี้ ไม่ยืนยันว่าเป็น Default Threshold ของ Current Build
Pet มี Status อะไรหลัก ๆ?
Simulation มี Satiety, Happiness, Sick, Mood, Life Stage และ Death เป็นส่วนสำคัญ ที่แยกหน้าที่กัน
Feed Pet ยังไง?
ใช้ Double Tap ตาม Design เพื่อเพิ่ม Satiety
เล่นกับ Pet ยังไง?
ใช้การ Shake ค้างประมาณ 3 วินาที เพื่อเพิ่ม Happiness
Action มี Cooldown ไหม?
มี 5 วินาที ตาม Current Design และ Cooldown ถูกยกเว้นเมื่อ Score อยู่ที่ 0
Pet ตายเมื่อไร?
เมื่อ Satiety และ Happiness เป็น 0 พร้อมกันต่อเนื่อง เป็นเวลานาน ตาม Death Logic
ตายแล้ว Reset ยังไง?
Hardware README ระบุว่าสามารถกด BOOT ค้าง 5 วินาที เพื่อ Reset Dead Pet ได้โดยไม่ต้องใช้โทรศัพท์
กลางคืน Pet ยังหิวไหม?
Design มี Quiet Hours 21:00–09:00 ซึ่ง Scores ไม่ Decay, Pet ไม่ Call และ Death Clock ไม่เดิน
Battery 1300mAh อยู่ได้กี่ชั่วโมง?
ผู้สร้างวัดได้ 21 ชั่วโมง 52 นาที ที่ Average Current ประมาณ 59 mA บน Build ของตนเอง
มีไฟล์ 3D Print ให้หรือไม่?
มี STL อย่างน้อย 2 Shell ในโฟลเดอร์ hardware ของ Repository
ควรพิมพ์ PLA 0.2mm 20% Infill ใช่ไหม?
Source ไม่ได้ให้ Material, Layer Height, Orientation, Support หรือ Infill จึงไม่ควรสร้าง Setting ขึ้นเองจากบทความนี้
มี Source CAD ไหม?
Hardware README ระบุว่าไม่มี Editable Source CAD มี Exported STL Meshes ให้ใช้งาน
ต้องใช้ JDK อะไร?
Repository กำหนด JDK 21 สำหรับ Android Build
มี Mini-games แล้วหรือยัง?
Design Document ระบุว่า Mini-games ยังเป็นส่วนที่ไม่ได้ Build ใน Status ที่อ้างอิง
สามารถใช้ Firmware กับ App คนละ Version ได้ไหม?
ไม่ควร Repository เตือนว่า Protocol Version ยังไม่มี Automatic Compatibility Check จึงควร Build ทั้งสองจาก Commit เดียวกัน
จุดว้าวของ PolyMO ไม่ใช่แค่ “AI Pet” แต่คือการแบ่งระบบที่คิดมาดี
ถ้ามองจากภายนอก มันอาจดูเหมือน Virtual Pet หน้าตาน่ารัก ที่เพิ่ม AI เข้ามาอีกตัว
แต่พอแกะ Architecture จะเห็นว่าผู้สร้าง แยกแต่ละ Layer ค่อนข้างชัด:
↓
Pet Simulation บน ESP32-S3
↓
Satiety / Happiness / Sick / Death
Voice Input
↓
BLE + Opus
↓
Whisper + llama.cpp + Piper บน Android
↓
Voice กลับออก Speaker ของ Pet
ผลคือ Pet ไม่ได้เป็นเพียง หน้าจอ Remote ของ AI บนโทรศัพท์
และโทรศัพท์ ก็ไม่ได้เป็นสถานที่ ที่เก็บชีวิตของ Pet ทั้งหมด
ESP32-S3 ดูแลสิ่งที่ทำให้มัน “เป็น Pet” ส่วน Android ทำงานหนัก ที่เหมาะกับโทรศัพท์มากกว่า
สำหรับสาย Maker นี่จึงเป็น Project ที่น่าแกะทั้งในมุม Embedded, BLE, Local AI, Android, Product Design และ 3D Printing พร้อมกัน
References / แหล่งข้อมูลต้นฉบับ
อยากทำ ESP32 Gadget แบบมีจอ หรืออยากพิมพ์เคสให้ Project?
PolyMO เป็นตัวอย่างที่ดีว่า Project หนึ่งชิ้น สามารถรวม ESP32, Display, Touch, BLE, Audio, Android และ Local AI เข้าด้วยกันได้
ถ้ากำลังเริ่ม Project แนว ESP32, IoT, Interactive Gadget, Display Device หรือ Maker Electronics สามารถสอบถามทีม Globalbyte เรื่อง Board, Module และอุปกรณ์ที่เหมาะกับโจทย์ได้
และถ้ามีไฟล์ STL สำหรับ Enclosure แต่ไม่มีเครื่องพิมพ์ สามารถส่งไฟล์ เพื่อสอบถามบริการรับพิมพ์ 3D ของ Globalbyte และประเมิน Material / งาน Finish ก่อนผลิตได้
สำหรับไฟล์ PolyMO ผู้สร้างไม่ได้ระบุ Print Settings ไว้ จึงควรประเมิน Orientation, Support, Material และ Tolerance ตามเครื่องพิมพ์ และงานจริง