ARM, امبدد لینوکس, توصیه شده

کار با f1c100 به صورت baremetal – قسمت دوم (LVGL)

کار با f1c100 به صورت baremetal - قسمت دوم (LVGL)

در قسمت قبلی یاد گرفتیم که چطور یک کد ساده blink را به‌صورت بدون سیستم‌عامل (baremetal) بر روی f1c100 اجرا کنیم و دراین‌باره یک کتابخانه بسیار مفید را به شما معرفی کردیم. در این آموزش می‌خواهیم به سراغ راه‌اندازی گرافیک روی f1c100s با lvgl برویم و در این راستا یک نرم‌افزار کاربردی را هم برای طراحی گرافیک به کمک lvgl معرفی کنیم.

شاید برای شما مفید باشد: آموزش امبدد لینوکس از 0 تا 100

بررسی کد LVGL

در قسمت قبل گفتیم که کتابخانه F1C100s_projects شامل چه بخش‌هایی می‌باشد. بخش موردنیاز ما در این آموزش lvgl_demo می‌باشد که شامل یک مثال کامل برای راه‌اندازی گرافیک روی lcd است. ما در این بخش به بررسی آن می‌پردازیم.

ابتدا کد main.c را بررسی می‌کنیم:

به هدرها فقط هدر lv_demo_widgets.h اضافه‌شده که گرافیک اصلی آنجا طراحی‌شده است. خود کتابخانه lvgl برای نمایش انیمیشن‌ها و زمان‌بندی داخلی نیاز داره که تابع lv_tick_inc رو هرچند میلی‌ثانیه یک بار صدا بزنیم، برای این کار هم از تایمر استفاده‌شده و در وقفه تایمر این تابع صدا زده میشه. تابع بعدی که عملیات اصلی طراحی گرافیک را اجرا می‌کند تابع lv_demo_widgets می‌باشد که درواقع از هدر lv_demo_widgets.h فراخوانی می‌شود.

 

کامپایل و اجرای کد

کامپایل و اجرای این کد کاملاً مثل کامپایل و اجرای کد blink میمونه که در قسمت قبلی مفصل بررسی کردیم فقط این بار باید حواسمون باشه که به‌جای اسم‌های پروژه blink اسم‌های پروژه lvgl_demo رو وارد کنیم.

این هم یک تصویر از خروجی برنامه روی lcd

 

lvgl baremetal f1c100s

تصویر خروجی برنامه

معرفی نرم افزار برای کتابخانه lvgl

همیشه طراحی خود گرافیک جزو بخش‌های زمان‌بر یک پروژه دارای گرافیک هست. اما به کمک نرم‌افزار طراحی گرافیک این کار با سرعت خیلی بیشتری انجام میشه، خود lvgl نرم‌افزاری برای طراحی گرافیک نداره اما نرم‌افزارهایی هستند که به ما این قابلیت رو ارائه می‌دهند (مثل SquareLine و GUIGuider) ما در اینجا برای راه‌اندازی گرافیک روی f1c100s از نرم‌افزار GUIGUIDER شرکت nxp استفاده می‌کنیم.

ابتدا نسخه لینوکس نرم‌افزار را از این لینک دانلود کرده و با این دستور نصب می‌کنیم:

احتمالاً بعد از نصب نیاز به زدن این دستور هم هست

 

خب بعد از نصب gui guider یک محیط خیلی ساده‌ای برای کاربر باز می‌شود که به این صورت هست:

بعد از انتخاب پروژه جدید و انتخاب ورژن 7 lvgl روی simulator و با مشخص کردن اسم پروژه و سایز lcd پروژه جدیدمون رو درست می‌کنیم. محیط پروژه نرم‌افزار خیلی ساده است و با عملیات درگ و دراپ می‌شود انواع widgets ها رو استفاده کرد.

می‌توانید توی قسمت help و با انتخاب user guide توضیحات مربوط به نحوه طراحی گرافیک رو بخوانید که خیلی مفید هست.

بعد از ساختن گرافیک  با کلیک روی دکمه سبزرنگ بالا کدتون کامپایل و اجرا میشه. توی قسمت code viewer میتونید تبدیل گرافیک به کد C تون رو ببینید و با باز کردن پروژه توی vscode میتونید کد ساخته‌شده رو ادیتش کنید.

پوشه پروژه ما شامل چند فولدر هست که لازمه یک توضیحی در مورد آن‌ها بدهیم:

فولدر ها:

  • generated: شامل screen های ساخته‌شده توسط نرم‌افزار (درون این پوشه نباید به‌صورت دستی چیزی ادیت کنیم، چراکه با کامپایل کد در نرم‌افزار تغییرات ما از بین می‌ره)
  • custom: تمام کدهای خودمون رو باید در این بخش وارد کنیم
  • lvgl-simulator: کدهای شبیه‌ساز
  • lvgl: کتابخانه اصلی lvgl

 

استفاده از نرم افزار برای F1c100s

تا اینجای کار کد برای محیط دسکتاپ ساخته شد که همونطور که گفتیم میتونید با زدن دکمه سبزرنگ شبیه‌سازی کد را اجرا کنید اما برای اجرا و کامپایل کد روی f1c100 باید کد را برای اون کاستوم کنید که برای این کار از این پروژه در گیت هاب من میتونید استفاده کنید که تغییرات لازم رو در اون انجام دادم.

خب با دانلود کردن پروژه و با import فایل bare_metal_v7.guiguider در نرم‌افزار میتونید یک گرافیک ساده را مشاهده کنید که حاوی widgets های مختلفی هست ازجمله, sreen, button و chart در ادامه به بررسی کد f1c100_baremetal_lvgl می‌پردازیم.

 

بررسی کد انیمشن

گفتیم که کد گرافیکی ساخته‌شده به‌وسیله نرم‌افزار gui guider در پوشه generated اعمال می‌شود و اگر ما بخواهیم تغییر در کد انجام بدهیم باید آن را درجایی غیر از پوشه generated انجام بدهیم تا با تغییر و ذخیره تغییرات نرم‌افزار کد اعمالی ما حذف نشود. برای این کار ما تغییراتمان را در custom.c اعمال کردیم. این کد انیمشنی را برای چرخاندن needle یا همان شمارنده عدد gauge طراحی می‌کند:

در تابع custom_init اول یک شی از animation به نام a می‌سازیم سپس آن را init می‌کنیم مقدار آن را به gauge نسبت می‌دهیم بعد تابع صدازدنش را به تابع gauge_anim نسبت می‌دهیم سپس مقدار مینیمم و ماکزیمم آن را بین 0 تا 180 قرار می‌دهیم. در آخر، زمان طی کردن و تکرار انیمیشن را به ترتیب 2.5 و 1 ثانیه قرار می‌دهیم و آن را درنهایت start می‌کنیم.

 

بررسی کد uart و وقفه آن

در این کد سعی شده که با استفاده از وقفه Uart عددی که ما با استفاده از پورت سریال می‌فرستیم را بخواند و نتیجه عدد را روی یک نمایشگر gauge نشان دهد. تغییرات مربوط به یورات در فایل main.c نوشته‌شده و تغییرات مربوط به تکان دادن needle در هنگام ارسال عدد به‌وسیله پورت سریال در کد set_scr_screen.c نوشته‌شده است. که اول کد main رو بررسی می‌کنیم:

تابع muart_init وظیفه راه اندازی اولیه وقفه یوارت را برعهده دارد. تابع uart_irq_handler کار اصلی خواندن پورت سریال و ذخیره ورودی بر روی uart_buffer را انجام میدهد که در نهایت یک رشته کاراکتری به ما ارسال میکند ولی ما برای نشان دادن عدد برروی gauge نیاز به int داریم که با استفاده از دستورات:

تبدیل به int میشود و با استفاده از دستور printf روی پورت سریال نشان داده میشود، تابع dosm(&guider_ui,BufferToInt) که در خط 116 فراخوانی شده در فایل set_scr_screen.c تعریف شده که دو ورودی می‌گیرد:

این تابع عدد ورودی ارسالی را دریافت کرده و به‌جای متغیر buffer در تابع lv_gauge_set_value می‌گذارد که نهایتاً مقدار needle را روی گرافیک مشخص می‌کند.

توجه: نرم‌افزار guiguider تنها قابلیت طراحی گرافیک را دارد و کارهایی از قبیل ساخت انیمیشن باید به‌صورت دستی انجام گردد. دقت کنید که تغییرات نرم‌افزار در فایل‌های setup_scr_screen.c و setup_scr_screen2.c اعمال می‌شود.

بعدازاینکه کدمان را بررسی کردیم نوبت به کامپایل و اجرای آن می‌شود برای این کار باید به پوشه lvgl-simulator رفته و با دستور make فایل makefile که در آن قرار دارد را کامپایل کنیم:

 

نحوه اجرای برنامه روی spi nor flash دقیقاً مانند قسمت قبلی است و باید با دستور sunxi-fel انجام شود:

 

با توجه به اعمالی که تابه اینجا انجام دادیم نحوه راه‌اندازی گرافیک روی f1c100s را فرا گرفتیم، لطفا نظرات و سوالات خود را با ما به اشتراک بگذارید.

انتشار مطالب با ذکر نام و آدرس وب سایت سیسوگ، بلامانع است.

شما نیز میتوانید یکی از نویسندگان سیسوگ باشید.   همکاری با سیسوگ

نوشته های مشابه

12 دیدگاه در “کار با f1c100 به صورت baremetal – قسمت دوم (LVGL)

  1. Avatar for Iman Iman گفت:

    سلام و وقت بخیر . خیلی متشکرم بابت اطلاعات بسیار مفیدی که در اختیار همه گذاشتین .
    من همه ی مراحل را انجام دادم و جواب گرفتم واقعا عالی بودین.
    فقط الان به مرحله ای رسیدم که میخوام تاچ اسکرین GT911 رو به روش BareMetal راه اندازی کنم ولی توی راه اندازیش به مشکل خوردم .
    البته کتابخانه های GT911 توی GitHub هست ولی باید دستورات i2c میکرو رو با اون کتابخونه ترکیب کرد.
    ممنون میشم اگر راهکاری دارین برای این مشکل بفرمایین.
    پیشاپیش متشکرم بخاطر سایت خوبتون و مطالب حرفه ای که ارایه میدین.

    1. Avatar for Mahdi.h   Mahdi.h   گفت:

      سلام. خواهش میکنم.
      به نظر من xboot رو هم بررسی کنید . چراکه امکانات کامل تری داره و تاچ gt911 رو هم پشتیبانی میکنه
      https://github.com/xboot/xboot

  2. Avatar for حسین حسین گفت:

    سلام
    کتابخانه استفاده از ای سی تاچ NS2009 موجود نیست ؟
    ممکنه نحوه استفاده از ای سی تاچ NS2009 وقتی بصورت Bare Metal استفاده میکنیم را راهنمایی بفرمایید.

    1. Avatar for Zeus ‌ Zeus ‌ گفت:

      سلام فکر نمیکنم نوشتن کتابخانه اش کار سختی باشه
      باید ببینید با کدوم چیپ همخوانی داره و از درایور اون استفاده کنید.

  3. Avatar for alireza alireza گفت:

    ممون از وقتی که گذاشتید و تشکر بابت موضوع خوبتون
    میخواستم ببینم Makefile ای که GUI guider قابلیت کراس کامپایل شدن داره من از ورژن 8 استفاده کردم آیا روال به همین صورت هستش ؟
    ممنون میشم راهنمایی کنید

    1. Avatar for Mahdi.h   Mahdi.h   گفت:

      سلام.
      نسخه 8 هم قابلیت کراس کامپایل داره و روالش به همین صورت هست

  4. Avatar for علیرضا علیرضا گفت:

    با سلام و عرض ادب
    ممنون از زحماتتون و واقعا تشکر از اینکه این مطلب رو تهیه کردید
    من حقیقتش با ورژن 8 پروژه رو بردم جلو و سیمولیت کردم و با بیلد روت هم یک کامپایلر درست کردم و و SDL رو هم اد کردم و برنامه رو با Make file ای که خود GUI guider درست کرده و GCC رو مقدارش رو با مقدار کراس کامپایلر عوض کردم و کامپایل کردم و کامپایل شد و بدون ارور انجام شد ولی متاسفانه وقتی رو برد میزارم و رانش میکنم هیچ اتفاقی نمیوفته میشه لطف کنید یک توضیحی در مورد روند انجام کار بگید ؟ آیا ورژن 8 با 7 در این زمینه فرقی داره ؟آیا make file ای که GUI guider ایجاد میکنه اصلا به درد برد میخوره ؟
    ممنون

    1. Avatar for Mahdi.h   Mahdi.h   گفت:

      سلام
      این پروژه ای که در گیت هاب قرار داده شده کانفیگ هاش برای استفاده به صورت baremetal تغییر کرده و توی کدهاش تغییر ایجاد شده
      برای استفاده در لینوکس هم لازمه که کانفیگ هاش رو مطابق سیستم عاملتون تغییر بدید

  5. Avatar for محمد حسین محمد حسین گفت:

    سلام خسته نباشید
    میخاستم با نرم افزار GUI GUIDER طراحی انجام بدم برای ESP32-S3
    سردرگمم ک چجوری از فایل هایی ک GUI GUIDER خروجی میده توی اردوینو استفاده کنم
    میشه راهنمایی کنید فایل های ک GUI GUIDER بهم خروجی میده هر کدوم برا چیه
    و چجوری باید ازش توی اردوینو استفاده کنم

  6. Avatar for behzad behzad گفت:

    salam ..lotfan GUI Guider ro bara download bezariid.. mamnon. chon nemishe download kard..mersi

  7. Avatar for بهزاد عبدی بهزاد عبدی گفت:

    والله اونقدر لازم داشتم این مطلبرو..
    چون من دلفی کارم .. و با لازارووس
    کار میکردم با lvgl فقط مشکل ide داشتم ..
    خیلی عالی بود.
    تشکر کافی نیست میدونم..
    عالی هستید.

    1. Avatar for Mahdi.h   Mahdi.h   گفت:

      نظر لطفتون هست 🙂

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *