🏗️ ساختار پروژه EVM-ESP32 – راهنمای کامل معماری و توسعه

📋 فهرست محتوا

  • معرفی پروژه

  • فلسفه طراحی

  • معماری لایه‌ای

  • ساختار دایرکتوری

  • کامپوننت‌های اصلی

  • سیستم ماژولار

  • مدیریت منابع

  • گردش کار توسعه

🎯 معرفی پروژه

EVM-ESP32 یک فریم‌ورک پیشرفته و یکپارچه برای اجرای برنامه‌های JavaScript روی میکروکنترلر ESP32 است. این پروژه با رویکرد Common Peripheral Framework طراحی شده که امکان مدیریت یکپارچه سخت‌افزار را فراهم می‌کند.

✨ فلسفه طراحی

ایجاد یک سیستم embedded با قابلیت‌های سطح بالا:

  • 🔄 توسعه سریع: نوشتن برنامه به زبان JavaScript بدون نیاز به کامپایل

  • 🔧 مدیریت یکپارچه: کنترل تمام سخت‌افزارها با APIهای استاندارد

  • 📱 رابط کاربری: پشتیبانی کامل از رابط‌های گرافیکی با LVGL

  • 🌐 اتصال شبکه: شبکه‌های مختلف (WiFi, MQTT, HTTP, FTP, WebSocket)

  • کارایی: بهینه‌سازی برای منابع محدود embedded

🎯 اهداف کلیدی

  1. انتزاع سخت‌افزار: پنهان کردن پیچیدگی‌های سخت‌افزاری

  2. قابلیت حمل: اجرای کدهای یکسان روی پلتفرم‌های مختلف

  3. امنیت: اجرای برنامه‌ها در محیط sandboxed

  4. کارایی: استفاده بهینه از منابع محدود

  5. قابلیت توسعه: سیستم ماژولار و قابل گسترش

🏗️ معماری لایه‌ای

مدل چهار لایه‌ای EVM-ESP32

text
لایه ۱: درایورهای سخت‌افزار و سیستم ← ESP32 SDK / FreeRTOS / LVGL
لایه ۲: ماژول‌های EVM ← APIهای استاندارد سخت‌افزاری
لایه ۳: موتورهای JavaScript ← QuickJS / MuJS / JerryScript / Duktape
لایه ۴: برنامه‌های کاربر ← JavaScript Applications

لایه ۱: زیرساخت سخت‌افزاری

  • ESP-IDF: چارچوب رسمی توسعه ESP32

  • FreeRTOS: سیستم عامل real-time برای مدیریت تسک‌ها

  • درایورهای سخت‌افزاری: کنترل مستقیم GPIO، ADC، PWM، I2C، SPI

  • LVGL: کتابخانه گرافیکی برای رابط کاربری

لایه ۲: ماژول‌های EVM

  • Common Peripheral Framework: رابط یکپارچه برای همه سخت‌افزارها

  • APIهای استاندارد: توابع ثابت برای همه ماژول‌ها

  • مدیریت منابع: تخصیص هوشمند حافظه و منابع

  • سیستم رویداد: مدیریت رویدادهای ناهمزمان

لایه ۳: موتورهای JavaScript

  • پشتیبانی از چند موتور: QuickJS، MuJS، JerryScript، Duktape

  • مترجم و کامپایلر: تبدیل JavaScript به کد قابل اجرا

  • مدیریت حافظه: Garbage Collection و مدیریت heap

  • ماژول‌های استاندارد: console، timer، fs، process

lvgl java esp32
سیستم عامل سبک ای وی ام در پلتفرهای مختلف

لایه ۴: برنامه‌های کاربر

  • برنامه‌های مستقل: هر برنامه در محیط خود اجرا می‌شود

  • سیستم فایل: ذخیره‌سازی در SPIFFS یا SD Card

  • مدیریت برنامه: نصب، حذف، به‌روزرسانی

  • رابط کاربری: صفحات LVGL با کنترل کامل

📁 ساختار دایرکتوری

ساختار منطقی پروژه

text
📁 evm-esp32/
    📁 هسته اصلی سیستم/core
        📁 ماشین مجازی EVM/evm_core
        📁 مدیریت برنامه‌ها/app_manager
        📁 مدیریت منابع/resource_manager
    📁 موتورهای JavaScript/engines
        📁 ✅ QuickJS (ES2020)/quickjs
        📁 ✅ MuJS (ES5)/mujs
        📁 ✅ JerryScript (ES5.1)/jerryscript
        📁 ✅ Duktape (ES5-ES6)/duktape
    📁 مدیریت سخت‌افزار/hardware
        📁 درایورهای سطح پایین/drivers
        📁 فریم‌ورک مشترک/common_peripheral
        📁 پیاده‌سازی ESP32/esp32_specific
    📁 ماژول‌های سیستم/modules
        📁 ماژول‌های سیستمی/system_modules
        📁 ماژول‌های شبکه/network_modules
        📁 ماژول‌های گرافیکی/gui_modules
    📁 سیستم ذخیره‌سازی/storage
        📁 حافظه فلش داخلی/spiffs
        📁 کارت حافظه خارجی/sd_card
        📁 مدیریت دوگانه/dual_storage
    📁 برنامه‌های کاربر/applications
        📁 برنامه‌های سیستمی/system_apps
        📁 برنامه‌های کاربران/user_apps
        📁 مثال‌های آموزشی/examples

ساختار فیزیکی (برای ESP-IDF)

text
📁 evm-esp32/
    📁 کد اصلی برنامه/main
        main.c
        evm_launcher.c
        system_init.c
    📁 کامپوننت‌های ESP-IDF/components
        📁 موتور JavaScript/evm_engine
        📁 مدیریت سخت‌افزار/hardware_manager
        📁 کتابخانه گرافیکی/lvgl
        📁 شبکه و پروتکل‌ها/mongoose
        📁 سیستم فایل/file_system
    📁 جدول پارتیشن‌ها/partitions
    📁 تنظیمات SDK/sdkconfig
    📁 فایل‌های کامپایل/build

🔧 کامپوننت‌های اصلی

۱. 🧠 هسته EVM (EVM Core)

وظایف اصلی:

  • مدیریت موتورهای JavaScript

  • اجرای برنامه‌های کاربر

  • مدیریت حافظه و منابع

  • ارتباط بین ماژول‌ها

ویژگی‌ها:

  • ✅ پشتیبانی از چند موتور

  • ✅ مدیریت sandboxed environment

  • ✅ Garbage Collection پیشرفته

  • ✅ Debugging و profiling

۲. 📱 مدیر برنامه (App Manager)

وظایف اصلی:

  • اسکن و شناسایی برنامه‌ها

  • بارگذاری و اجرای برنامه‌ها

  • مدیریت چرخه زندگی برنامه‌ها

  • کنترل دسترسی و مجوزها

گردش کار:

text
۱. اسکن دایرکتوری apps/ 🔍
۲. ایجاد لیست برنامه‌های موجود 📋
۳. بارگذاری برنامه انتخاب شده 🚀
۴. اجرای برنامه در محیط ایزوله ⚡
۵. پاک‌سازی منابع بعد از اتمام 🧹

۳. 🔌 مدیر سخت‌افزار (Hardware Manager)

معماری Common Peripheral Framework:

c
// ساختار یکپارچه برای تمام peripheral ها
typedef struct {
    evm_val_t jobject;                    // آبجکت JavaScript
    void* platform_data;                  // داده‌های پلتفرم خاص
    bool initialized;                     // وضعیت مقداردهی اولیه
} peripheral_t;

ماژول‌های پشتیبانی شده:

  • GPIO (کنترل پین‌های دیجیتال)

  • ADC (خواندن مقادیر آنالوگ)

  • PWM (مدولاسیون عرض پالس)

  • I2C/SPI/UART (ارتباطات سریال)

  • WiFi/Network (اتصال شبکه)

  • File System (مدیریت فایل)

۴. 🎨 سیستم گرافیکی (GUI System)

معماری مبتنی بر LVGL:

text
درایورهای ESP32 ← LVGL Core v8 ← ماژول LVGL ← برنامه کاربر

ویژگی‌ها:

  • ✅ پشتیبانی از تمام ویجت‌های LVGL

  • ✅ مدیریت حافظه پیشرفته

  • ✅ انیمیشن و ترنزیشن

  • ✅ پشتیبانی از فونت فارسی

  • ✅ بهینه‌سازی برای نمایشگرهای کوچک

۵. 🌐 سیستم شبکه (Network System)

پشته شبکه کامل:

text
WiFi Driver ← LwIP Stack ← Mongoose Core ← برنامه کاربر

سرویس‌های شبکه:

  • HTTP Server: REST API برای کنترل دستگاه

  • WebSocket Server: ارتباط real-time دوطرفه

  • MQTT Broker/Client: پیام‌رسانی IoT

  • FTP Server: انتقال فایل از راه دور

  • DNS/DHCP Client: مدیریت آدرس‌های شبکه

🧩 سیستم ماژولار

ساختار ماژول‌ها

هر ماژول دارای:

  1. فایل پیاده‌سازی (module_name.c)

  2. فایل هدر (module_name.h)

  3. فایل binding (module_binding.js)

  4. مستندات (README.md)

طبقه‌بندی ماژول‌ها

ماژول‌های سیستمی (اجباری)

text
📦 ماژول‌های سیستمی/system_modules
    console.c          # کنترل خروجی و لاگ
    process.c          # اطلاعات سیستم
    timer.c            # زمان‌بندی و تایمر
    file_system.c      # مدیریت فایل
    memory.c           # مدیریت حافظه

ماژول‌های سخت‌افزاری (بر اساس نیاز)

text
📦 ماژول‌های سخت‌افزاری/hardware_modules
    gpio.c             # کنترل پین‌های دیجیتال
    adc.c              # خواندن مقادیر آنالوگ
    pwm.c              # کنترل موتور و LED
    i2c_spi_uart.c     # ارتباطات سریال
    touch.c            # سنسورهای لمسی

ماژول‌های شبکه (اختیاری)

text
📦 ماژول‌های شبکه/network_modules
    wifi.c             # اتصال WiFi
    http_client.c      # درخواست‌های HTTP
    mqtt.c             # پروتکل MQTT
    websocket.c        # ارتباط real-time
    ftp.c              # انتقال فایل

ماژول‌های گرافیکی (برای رابط کاربری)

text
📦 ماژول‌های گرافیکی/gui_modules
    lvgl_core.c        # هسته LVGL
    widgets.c          # ویجت‌های استاندارد
    themes.c           # تم‌ها و استایل‌ها
    images.c           # مدیریت تصاویر

⚡ مدیریت منابع

سلسله مراتب حافظه

text
SD Card Storage (تا 32GB) ← آهسته، برای ذخیره‌سازی بلندمدت
SPI PSRAM (4-8MB) ← متوسط، برای برنامه‌های کاربر
Internal SRAM (320KB) ← سریع، برای سیستم و kernel
CPU Cache (8KB) ← بسیار سریع، برای داده‌های حیاتی

تخصیص هوشمند حافظه

c
void* evm_malloc(size_t size, mem_type_t type) {
    switch(type) {
        case MEM_CRITICAL:   return heap_caps_malloc(size, MALLOC_CAP_INTERNAL);
        case MEM_LARGE:      return heap_caps_malloc(size, MALLOC_CAP_SPIRAM);
        case MEM_PERSISTENT: return malloc_spiffs(size);
        default:             return malloc(size);
    }
}

مدیریت CPU و انرژی

توزیع تسک‌ها بین هسته‌ها:

  • هسته ۰ (PRO CPU): رابط کاربری، مدیریت سیستم

  • هسته ۱ (APP CPU): اجرای JavaScript، پردازش داده

مدیریت انرژی:

  • تنظیم خودکار فرکانس CPU

  • خواب عمیق در حالت بیکاری

  • خاموش کردن ماژول‌های غیرضروری

🔄 گردش کار توسعه

مراحل توسعه یک برنامه

text
۱. نوشتن کد JavaScript 📝
۲. انتقال به دستگاه (FTP/USB/SD Card) 🔧
۳. اجرای برنامه از لانچر 🚀
۴. دیباگ و تست (Serial Monitor) 🐛
۵. بسته‌بندی برای توزیع 📦

ابزارهای توسعه

برای توسعه‌دهندگان:

  • VS Code با پلاگین ESP-IDF

  • Serial Monitor برای دیباگ

  • ESP-IDF Tools برای کامپایل

  • Git برای کنترل نسخه

برای کاربران نهایی:

  • لانچر گرافیکی برای اجرای برنامه‌ها

  • FTP Server برای انتقال فایل

  • Web Interface برای مدیریت از راه دور

  • OTA Updates برای به‌روزرسانی

🎯 مزایای کلیدی معماری EVM-ESP32

۱. 🚀 سرعت توسعه بالا

  • نوشتن برنامه به جای کد C

  • کتابخانه‌های آماده برای تمام سخت‌افزارها

  • تست سریع بدون نیاز به کامپایل

۲. 🔧 قابلیت نگهداری آسان

  • کدهای ماژولار و مستقل

  • مستندات کامل

  • سیستم مدیریت خطا

۳. 📱 تجربه کاربری بهتر

  • رابط گرافیکی با LVGL

  • کنترل از راه دور با وب

  • به‌روزرسانی آسان

۴. 🌐 قابلیت اتصال گسترده

  • پشتیبانی از پروتکل‌های مختلف

  • ارتباط با سرویس‌های ابری

  • شبکه‌های محلی و اینترنت

۵. ⚡ بهینه‌سازی منابع

  • مدیریت هوشمند حافظه

  • مصرف انرژی بهینه

  • استفاده از سخت‌افزار دو هسته‌ای

🔮 آینده پروژه

توسعه‌های آتی

کوتاه‌مدت (۳-۶ ماه):

  • ✅ بهبود پایداری سیستم

  • ✅ افزودن ماژول‌های جدید

  • ✅ بهینه‌سازی عملکرد

میان‌مدت (۶-۱۲ ماه):

  • 📦 Package Manager برای ماژول‌ها

  • ☁️ اتصال به سرویس‌های ابری

  • 🤖 Machine Learning روی دستگاه

بلندمدت (۱۲+ ماه):

  • 🔄 پشتیبانی از پلتفرم‌های دیگر

  • 🎮 موتور بازی دو بعدی

  • 🔊 پردازش صوت real-time

🏁 نتیجه‌گیری

EVM-ESP32 یک معماری پیشرفته و جامع برای سیستم‌های embedded مبتنی بر JavaScript ارائه می‌دهد که:

از نظر فنی:

  • 🏗️ معماری لایه‌ای برای جداسازی نگرانی‌ها

  • 🧩 سیستم ماژولار برای قابلیت توسعه

  • مدیریت منابع هوشمند برای کارایی بالا

  • 🔌 Common Peripheral Framework برای یکپارچگی سخت‌افزار

از نظر کاربردی:

  • 🚀 توسعه سریع برنامه‌های embedded

  • 📱 تجربه کاربری غنی با رابط گرافیکی

  • 🌐 اتصال گسترده با دنیای خارج

  • 🔧 نگهداری آسان با کدهای ماژولار

این معماری نه تنها یک راه‌حل فنی، بلکه یک پلتفرم کامل برای نسل بعدی دستگاه‌های هوشمند embedded فراهم می‌آورد که در آن مرز بین توسعه embedded و توسعه وب محو می‌شود.

لایه حافظهنوعاندازهکاربردسرعت
کش پردازندهداخلی۸ کیلوبایتدستورات پردازندهبسیار سریع
حافظه داخلیداخلی۳۲۰ کیلوبایتداده‌های سیستمیسریع
SPI RAMخارجی۴-۸ مگابایتحافظه موقتمتوسط
کارت SDخارجیتا ۳۲ گیگابایتبرنامه‌ها و داده‌هاآهسته

📦 لینک‌های مرجع و منابع

🔗 مخزن گیت‌هاب ESP32 EVM:
https://github.com/hadipic/esp32-evm-bin?tab=readme-ov-file

🔗 کانال تلگرام EVM:
https://t.me/esp32_evm