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

PolyMO ESP32-S3 virtual pet reacting to smartphone screen time
PolyMO Virtual Pet บน ESP32-S3 ที่นำการใช้โทรศัพท์มาเป็นส่วนหนึ่งของ Environment และสถานะของตัว Pet

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
คนพูดกับ PolyMO

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:

เปิด Tracked App

ใช้งานต่อเนื่องเกิน 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

Microphone

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_CONNECT
  • BLUETOOTH_SCAN
  • RECORD_AUDIO
  • PACKAGE_USAGE_STATS
  • POST_NOTIFICATIONS
  • RECEIVE_BOOT_COMPLETED
  • FOREGROUND_SERVICE
  • FOREGROUND_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.stl
  • PolyMO_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/*.json
  • design-system/personas/*.json

จากนั้นใช้ Generator:

  • tools/gen-faces.py
  • tools/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 เพิ่มเติม

ESP32-S3 Firmware Build
. ~/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 มีปัญหา

Android Debug Build
cd android
export ANDROID_HOME="$HOME/Library/Android/sdk"
JAVA_HOME="/Applications/Android Studio.app/Contents/jbr/Contents/Home" \
  ./gradlew assembleDebug
Fetch Native Sources
tools/fetch-natives.sh
Android Unit Tests
cd android
./gradlew testDebugUnitTest
Generate Faces and Personas
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

วิดีโอจากผู้สร้าง แสดงการสร้าง PolyMO และแนวคิดเชื่อม ESP32-S3 Virtual Pet เข้ากับ Screen Time และ Local AI บน Android

ถ้าอยากศึกษา Project นี้ ควรเริ่มจากตรงไหน?

PolyMO ไม่ใช่ Project ที่มีแค่ ESP32 Firmware ไฟล์เดียว

ถ้าจะตามให้ทัน แนะนำแยกเรียนเป็น Layer

1

เริ่มจาก Hardware ก่อน

ทำความเข้าใจ Waveshare ESP32-S3 Touch AMOLED 1.8, Display Revision, Touch, Audio และ BLE

2

อ่าน Pet Simulation

แยกให้ได้ว่า Satiety, Happiness, Sick, Mood, Life Stage และ Death เป็นคนละ State กันยังไง

3

ดู BLE Protocol

เพราะ Firmware และ Android ต้องคุยกันผ่าน Shared Protocol และควรอยู่ Commit เดียวกัน

4

ค่อยเข้า Local AI

แยก Whisper, llama.cpp และ Piper ออกจากกัน จะเข้าใจง่ายกว่า คิดว่าทั้งหมดคือ “AI Model ตัวเดียว”

5

ค่อย Build Android

เตรียม JDK 21, Android SDK และ Native Dependencies ก่อน

6

เลือก AI Models

เตรียม GGUF, Whisper BIN และ Piper ONNX ตาม Format ที่ App รองรับ

7

ปิดงานด้วย 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 ค่อนข้างชัด:

Screen Time

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 ตามเครื่องพิมพ์ และงานจริง

 


Blog posts