KryonOS: เปลี่ยน ESP32 ให้เป็น Mini Computer เขียนแอปด้วย JavaScript
ปกติอยากเปลี่ยนโปรแกรมบน ESP32 เรามักแก้ Code, Compile แล้ว Flash Firmware ใหม่ แต่ KryonOS ลองเปลี่ยนแนวคิดนั้น: Flash ระบบหลักครั้งหนึ่ง แล้วแยก Application ออกมาเป็น JavaScript App ที่ติดตั้งและอัปเดตภายหลังได้
ผลลัพธ์คือ ESP32 ที่มีหน้าจอ สามารถมี Launcher, File Manager, App Store, JavaScript Runtime และ Hardware API จนให้ประสบการณ์ใกล้เคียง Mini Computer มากกว่า Development Board ที่รัน Firmware โปรแกรมเดียว
- KryonOS เป็น Open-source GUI OS และ JavaScript App Runtime สำหรับ ESP32
- Current Repository ฝัง Duktape 2.7.0 เป็น JavaScript Engine
- แอปถูกแยกเป็น Folder ที่มี app.json และ main.js
- มี App Store สำหรับติดตั้งและอัปเดต App ผ่าน Wi-Fi โดยไม่ต้อง Flash OS ใหม่ทุกครั้ง
- Current Runtime ใช้ API หลักในรูป System.* และ FS.*
- Official API Guide ระบุ Heap ใช้งานได้ประมาณ 90KB ต่อ Script เมื่อ Wi-Fi ปิด
- System.delay() มีบทบาททั้ง Delay และ Trigger Garbage Collection ตาม API Guide
- Default Reference Hardware คือ ESP32 + ILI9341 2.8" + XPT2046 Touch
- Display/Touch ใช้ VSPI ขณะที่ microSD ใช้ HSPI
- M5Stack Cardputer, CYD และ LilyGO T-HMI ยังถูกระบุเป็น Experimental Support
KryonOS คืออะไร?
KryonOS เป็น Open-source GUI Operating System และ JavaScript App Runtime ที่ออกแบบมาสำหรับ ESP32
ระบบมีองค์ประกอบที่ปกติเราอาจคุ้นจาก Computer หรือ Smartphone มากกว่า MCU เช่น:
- Application Launcher
- File Explorer
- Text Editor
- App Store / Installer
- JavaScript Runtime
- Hardware API
- Touch UI
แต่ทั้งหมดนี้ยังทำงานอยู่บนข้อจำกัดของ ESP32 ทั้งเรื่อง RAM, Storage และ Processing Resource
ต่างจาก Firmware ESP32 แบบเดิมยังไง?
Workflow แบบ Arduino / ESP32 ทั่วไปมักเป็น:
หากต้องการเปลี่ยน Application ก็มักต้องแก้ Firmware และ Flash ใหม่
KryonOS แยก System Firmware ออกจาก Application:
ติดตั้ง Runtime + GUI + System Services
Flash ครั้งเดียว แล้วลง JavaScript App ได้ยังไง?
KryonOS มี Duktape JavaScript Runtime อยู่ใน System Firmware ทำให้ App ไม่จำเป็นต้องถูก Compile เข้าไปเป็น C++ Firmware ชุดใหม่ทุกครั้ง
เมื่อผู้ใช้เปิด App OS จะโหลด JavaScript Entry Point แล้ว Runtime เป็นตัว Execute Application
Hardware Function ที่ปกติต้องเรียกผ่าน C++ ถูก expose เป็น JavaScript API เช่น:
- วาด Graphics
- อ่าน Touch
- ควบคุม GPIO
- อ่าน Analog Input
- ใช้ PWM
- อ่าน/เขียน File
- ดูข้อมูล System
App หนึ่งตัวประกอบด้วยอะไร?
Official App Development Guide กำหนดโครง App เป็น Folder ที่มีอย่างน้อยสองไฟล์หลัก:
MyAwesomeApp/
├── app.json
└── main.js
app.json
เป็น Metadata ของ Application ใช้บอกชื่อ, Package Name, Version, Author, Category, API Level และข้อมูลสำหรับตรวจ Update
main.js
เป็น Entry Point ของ Application ที่ถูกโหลดเมื่อผู้ใช้เปิด App จาก Launcher
{
"name": "Hello World",
"packageName": "com.kryonos.helloworld",
"version": "1.0.0",
"metaUrl": "https://raw.githubusercontent.com/Haris16-code/KryonOS-AppStore/refs/heads/main/categories/Demos/hello_world/app.json",
"api": 1,
"author": "KryonOS Team",
"type": "App",
"category": "Utility",
"description": "A simple Hello World application.",
"changelog": ""
}
Current App Development Guide ระบุว่า API Level ปัจจุบันของ Application ควรเป็น 1
Duktape 2.7.0 รัน JavaScript แบบไหน?
CNX ระบุว่า KryonOS ใช้ Duktape 2.x ขณะที่ Current Source Repository มี Duktape Header ที่ระบุ Version 2.7.0
Duktape ทำหน้าที่เป็น Embedded JavaScript Engine ภายใน ESP32 และ KryonOS ใช้ C++ Binding เชื่อม JavaScript เข้ากับ Hardware และ System Service
Application Logic
JavaScript Runtime
ES5, ES6 และ Syntax ที่ต้องระวัง
Official JavaScript API Guide วางพื้นฐาน Runtime ไว้ที่ ECMAScript 5 / 5.1 และระบุว่ามี ES6 Built-in บางส่วน
Guide ระบุว่า Syntax สมัยใหม่บางประเภทไม่รองรับ เช่น:
- Arrow Function
- let
- const
- ES6 Class Syntax
- Template Literal
ถ้าต้องการ Compatibility สูงสุด วิธีที่ปลอดภัยกว่าคือเขียน App ด้วย Syntax แบบ ES5 และตรวจ Application ตัวอย่าง ที่ตรงกับ Runtime Version ที่กำลังใช้งาน
Graphics.* หรือ System.*? Official Docs มี Conflict
CNX และ App Development Guide มี Hello World ตัวอย่างที่เรียก:
Graphics.fillScreen()
แต่เมื่อตรวจ Current Runtime Source จะพบว่า Drawing Function ถูก Register อยู่ใต้ Global Object:
System
เช่น:
- System.fillScreen()
- System.drawString()
- System.setTextColor()
- System.createSprite()
- System.gpio.pinMode()
Current Official App Store ก็ใช้ System.* ตรงกับ Runtime Source
Hello World จาก Current Official App Store
แทนที่จะใช้ Hello World จาก Documentation ที่ API Naming ไม่ตรงกับ Runtime ปัจจุบัน ตัวอย่างด้านล่างมาจาก Current Official KryonOS App Store
// Hello World Test App
// Clears the screen to blue, then writes white text
System.fillScreen(0x001F); // TFT_BLUE
System.drawString("Hello from HarixOS JS!", 20, 50);
System.drawString("JavaScript is working!", 20, 80);
System.drawString("This is running natively", 20, 110);
System.drawString("on your ESP32!", 20, 140);
Concept สำคัญคือ Application ไม่ต้องมี Arduino setup() และ loop() แบบ Sketch ทั่วไป แต่เขียน Logic ลงใน main.js สำหรับ Runtime ของ KryonOS
RAM ประมาณ 90KB หมายความว่าอะไร?
CNX ระบุว่า KryonOS App มี Memory ใช้งานค่อนข้างจำกัด และ Official JS API Guide ให้รายละเอียดเพิ่มว่า:
ประมาณ 90KB ของ usable free RAM ต่อ Script เมื่อ Wi-Fi ปิด
สิ่งที่ผู้พัฒนา App ต้องระวังคือ:
- Array ขนาดใหญ่
- String ขนาดใหญ่
- Image Buffer
- Animation Loop ที่ Allocate Object ซ้ำ ๆ
- Sprite ที่ต้องการ Contiguous Memory จำนวนมาก
ทำไม System.delay() เกี่ยวกับ Garbage Collection?
ใน KryonOS System.delay(ms) ไม่ได้มีไว้หยุดโปรแกรมอย่างเดียว
Official API Guide ระบุว่า Function นี้ยังสั่ง C++ Kernel ให้ทำ Garbage Collection เพื่อช่วยลด Memory Fragmentation
Guide ยังเตือนว่า หาก Application มี Infinite Loop ควรมี System.delay() อยู่ใน Loop เพื่อลดความเสี่ยง Heap Exhaustion
Graphics และ Mini-Sprites ทำงานยังไง?
Documentation มีถ้อยคำเรื่อง Rendering ที่ดูเหมือนขัดกันระหว่าง Direct-to-glass กับ Double Buffering แต่ Current Runtime Source ช่วยแยกได้ชัดขึ้น
Default
Drawing Function เช่น System.fillScreen() หรือ System.drawLine() จะวาดไปยัง TFT โดยตรง เมื่อยังไม่ได้เปิด Sprite Buffer
Optional Sprite Buffer
หาก App เรียก:
- System.createSprite(width, height)
- System.bindSprite(true)
Drawing Command จะถูกส่งไปยัง Off-screen Sprite Buffer และใช้:
System.pushSprite(x, y)
เพื่อส่ง Frame ไปยังหน้าจอ
Project จึงแนะนำแนวคิด Sliced Rendering คือแบ่ง Buffer เป็นส่วนเล็ก ๆ แทนการ Allocate Full-screen Framebuffer ก้อนเดียว
Current Runtime ยังพยายาม Fallback จาก 16-bit ไป 8-bit Sprite หาก Allocation แบบ 16-bit ไม่สำเร็จ
File System /local/ และ /sd/
KryonOS มี Unified File System ที่แยกพื้นที่ออกเป็นสองกลุ่มหลัก:
| Path | หน้าที่ |
|---|---|
| /local/ | พื้นที่ File System ภายในที่ KryonOS เปิดให้ Application ใช้ |
| /sd/ | ไฟล์บน microSD Card |
JavaScript API มี Function เช่น:
- FS.exists()
- FS.readTextFile()
- FS.writeTextFile()
- FS.appendTextFile()
- FS.listDir()
- FS.mkdir()
- FS.getFileSize()
- FS.getFreeSpace()
- FS.mountSD()
Reference Hardware ต้องใช้อะไร?
Current README ระบุ Stable Reference Setup เป็น:
- ESP32 Development Board
- ILI9341 2.8-inch TFT Display
- XPT2046 Resistive Touch Controller
- microSD Card Module
- Breadboard / Jumper Wire สำหรับ Reference Build
| Display / Touch | ESP32 Pin |
|---|---|
| TFT CS | GPIO17 |
| TFT RESET | GPIO5 |
| TFT DC | GPIO16 |
| TFT MOSI | GPIO23 |
| TFT SCK | GPIO18 |
| TFT LED | GPIO32 |
| TFT MISO | GPIO19 |
| Touch CLK | GPIO18 |
| Touch CS | GPIO21 |
| Touch DIN | GPIO23 |
| Touch DO | GPIO19 |
| Touch IRQ | ไม่ต่อใน Default Pinout |
microSD ผ่าน HSPI
| microSD | ESP32 Pin |
|---|---|
| MOSI | GPIO13 |
| MISO | GPIO26 |
| SCK / CLK | GPIO14 |
| CS | GPIO15 |
README ยังระบุว่า Default Display / Touch Pinout ตรงกับ ESP32 Marauder v4, v6 และ v6.1
ทำไม Display กับ SD แยก SPI Bus?
Official README ระบุ Architecture ว่า:
- VSPI — Display + Touch
- HSPI — microSD
Project อธิบายว่าแยก Bus เพื่อประสิทธิภาพที่ดีขึ้น และลดปัญหา Bus Collision ระหว่าง Display/Touch กับ Storage
Board ไหน Stable และ Board ไหน Experimental?
| Hardware | สถานะใน Current README |
|---|---|
| ESP32 + ILI9341 2.8" Touch | Stable |
| M5Stack Cardputer | Experimental |
| CYD / Cheap Yellow Display | Experimental |
| LilyGO T-HMI | Experimental |
README ยัง List MCU Family ที่รองรับ ได้แก่:
- ESP32 WROOM-32
- ESP32-S2
- ESP32-S3
- ESP32-C3
CNX ยังกล่าวถึง Experimental Support สำหรับ Display Controller อื่น เช่น ST7789V2 แต่ Current Official Repository ที่ตรวจรอบนี้ไม่พบรายละเอียดดังกล่าว จึงไม่ถือเป็น Official Support ที่ล็อกไว้ในบทความนี้
Flash KryonOS ด้วย Binary หรือ PlatformIO
Official README ให้สองแนวทางหลัก
วิธีที่ 1 — Precompiled Binary
Download Binary จาก Releases แล้วใช้ esptool.py หรือ Official ESP Flash Download Tool
esptool.py --chip esp32 --port COM3 --baud 921600 write_flash -z \
0x1000 bootloader.bin \
0x8000 partitions.bin \
0x10000 firmware.bin
pio run -t upload
App Store ช่วยลดการ Flash Firmware ยังไง?
KryonOS มี App Store / Installer สำหรับ Download และ Install JavaScript Application ผ่าน Wi-Fi
Metadata ใน app.json มีทั้ง:
- packageName
- version
- author
- description
- api
- metaUrl
App Development Guide ระบุว่า metaUrl ใช้สำหรับตรวจ Version ใหม่ของ App
นี่ทำให้ App Update สามารถเกิดแยกจาก OS Firmware แทนที่จะต้อง Recompile KryonOS ทั้งระบบ
KryonOS ต่างจาก Espruino ใน Concept ไหน?
CNX เปรียบเทียบ KryonOS กับ Espruino เพราะทั้งคู่เปิดทางให้ Microcontroller ใช้ JavaScript ได้
ความต่างที่บทความ CNX เน้นคือ KryonOS พยายามรวม Environment แบบ OS มากขึ้น:
- GUI
- Launcher
- File Explorer
- App Store
- Application Package
ในขณะที่ Espruino ถูกยกเป็นตัวอย่าง ของ JavaScript Interpreter / Platform สำหรับ Microcontroller
Maker ได้อะไรจาก Project นี้?
1. ESP32 ไม่จำเป็นต้องรัน Application เดียวตลอดชีวิต
KryonOS แสดงให้เห็นแนวคิด แยก Platform Firmware ออกจาก User App
2. JavaScript ทำ Hardware Control ได้ผ่าน Native Binding
GPIO, Display, Touch และ File System ถูกเปิดให้ JavaScript เรียกผ่าน C++ Binding แทนการให้ App จัดการ Hardware Driver เองทั้งหมด
3. RAM คือข้อจำกัดจริงของ Embedded JavaScript
Heap ระดับหลักสิบ KB ทำให้วิธีเขียน Application ต่างจาก Web JavaScript บน Computer อย่างชัดเจน
4. Graphics ต้องออกแบบตาม Memory
Full-screen Double Buffer อาจใหญ่เกิน Heap จึงเกิดแนวทาง Mini-Sprite และ Sliced Rendering
5. Documentation Version สำคัญ
Conflict ระหว่าง Graphics.* กับ System.* และเรื่อง const เป็นตัวอย่างชัดว่า Project ที่พัฒนาเร็วควรตรวจ Current Runtime Source และ Current App Store ควบคู่กับ Guide
โปรเจกต์นี้มีหลายส่วน แนะนำอ่าน Official Source ควบคู่กัน
โดยเฉพาะ JavaScript API, Hardware Pinout, Board Compatibility และ App Development ควรตรวจ Repository ปัจจุบัน ก่อนสร้าง Application จริง
FAQ: คำถามที่พบบ่อย
1. KryonOS คืออะไร?
เป็น GUI Operating System และ JavaScript App Runtime แบบ Open-source สำหรับ ESP32
2. KryonOS เป็น Linux หรือไม่?
ไม่ Source อธิบาย KryonOS เป็น Embedded GUI OS และ JavaScript Runtime ไม่ใช่ Linux Distribution
3. ใช้ JavaScript Engine อะไร?
Current Repository ฝัง Duktape 2.7.0
4. App ของ KryonOS เขียนด้วยไฟล์อะไร?
Standard App Folder มี app.json สำหรับ Metadata และ main.js สำหรับ Application Logic
5. ต้อง Flash Firmware ใหม่ทุกครั้งที่เปลี่ยน App ไหม?
แนวคิดของ KryonOS คือแยก App ออกจาก OS และรองรับการติดตั้ง/อัปเดต JavaScript App โดยไม่ต้อง Flash System Firmware ใหม่ทุก App
6. ใช้ Arrow Function ได้ไหม?
Official JS API Guide ระบุว่า Arrow Function ไม่รองรับ และแนะนำ Syntax ที่เข้ากับ ES5/ES5.1
7. ใช้ let หรือ const ได้ไหม?
JS API Guide ระบุว่า let/const ไม่รองรับ แต่ Current Official App Store มีบาง App ที่ใช้ const จึงควรตรวจ Runtime Version และยึด ES5 Syntax หากต้องการ Compatibility สูงสุด
8. Graphics API ใช้ Graphics.* หรือ System.*?
Current Runtime Source และ Current Official App Store ใช้ System.* เป็นหลัก แม้ App Development Guide บางตัวอย่าง ยังใช้ Graphics.*
9. แต่ละ App มี RAM 90KB แน่นอนหรือไม่?
ไม่ Official Guide ระบุประมาณ 90KB ของ usable free RAM ต่อ Script ภายใต้เงื่อนไขว่า Wi-Fi ปิด
10. System.delay() ทำอะไร?
นอกจาก Pause JavaScript Official API Guide ระบุว่า System.delay() ยัง Trigger Garbage Collection ใน Kernel ด้วย
11. KryonOS รองรับ microSD ไหม?
รองรับ และ Reference Hardware ใช้ microSD ผ่าน HSPI
12. Default Display คือรุ่นอะไร?
Stable Reference Setup ใช้ ILI9341 2.8-inch TFT ร่วมกับ XPT2046 Resistive Touch Controller
13. M5Stack Cardputer รองรับไหม?
Current Official README ระบุ Cardputer เป็น Experimental Support
14. Cheap Yellow Display รองรับไหม?
มี Experimental Support ตาม Current README
15. LilyGO T-HMI รองรับไหม?
Current README ระบุเป็น Experimental
16. รองรับ ESP32-S3 หรือไม่?
README List ESP32-S3 อยู่ใน MCU ที่รองรับ แต่ Default Stable Build Configuration และ Reference Hardware ที่ตรวจยังเน้น Classic ESP32 + ILI9341
17. Flash ด้วยอะไรได้บ้าง?
Official README ระบุ Precompiled Binary ผ่าน esptool.py หรือ ESP Flash Download Tool และสามารถ Build/Upload จาก Source ผ่าน PlatformIO ได้
18. มี App Store จริงไหม?
มี Official KryonOS-AppStore Repository และ README ของ KryonOS ระบุ App Store / Installer สำหรับดาวน์โหลดและอัปเดต App ผ่าน Wi-Fi
19. KryonOS รองรับ Bluetooth, I2C หรือ Deep Sleep API ครบแล้วหรือยัง?
README ปัจจุบันวาง Bluetooth, I2C, SPI Sensors และ Deep Sleep บางส่วนไว้ใน Roadmap ของ Hardware API จึงไม่ควรถือว่าทุกส่วนพร้อมใช้งานแล้ว
20. Source ระบุ Performance หรือ FPS ไหม?
Source ไม่ได้ให้ Benchmark หรือ FPS ที่ใช้เปรียบเทียบแบบมาตรฐาน จึงไม่สามารถระบุตัวเลข Performance เพิ่มได้
References / แหล่งข้อมูลต้นฉบับ
- CNX Software — KryonOS turns ESP32 boards into JavaScript-powered mini computer
- Hackaday — A JavaScript OS for the ESP32
- Official GitHub — Haris16-code/KryonOS
- KryonOS App Development Guide
- KryonOS JavaScript API Guide
- KryonOS Runtime — Current JavaScript Bindings
- Official KryonOS App Store Repository
ESP32 ไม่ได้มีไว้รันแค่ Firmware โปรแกรมเดียวเสมอไป
KryonOS เป็นตัวอย่างที่น่าสนใจของการเอา GUI, JavaScript Runtime, File System และ App Model มาวางบน Microcontroller โดยยังเปิดให้ App ควบคุม GPIO, Display และ Hardware ผ่าน API ได้
หากกำลังเลือก ESP32, Display หรือ Development Board สำหรับ Embedded GUI / JavaScript / IoT Project สามารถสอบถามทีม Globalbyte เรื่องบอร์ดและอุปกรณ์ที่เหมาะกับ Project ได้