این روزها اکثر دستگاه های الکترونیکی کاربرپسند یک رابط گرافیکی دارند (البته همیشه هم لازم نیست?)و بیشتر الکترونیکی ها دنبال راه اندازی یک گرافیک خوب روی محصولاتشان هستند ، اکثرا هم از میکروهای شرکت stm استفاده میکنند اما مدتی است که قیمت این میکروکنترلر ها بسیار افزایش داشته و غیر از آن بعضی جاها اصلا جوابگو نیستند یا اصلا دلیلی ندارد که از یک میکروکنترلر که شامل بخش های جانبی زیادی (منظور تایمر یا adc و dac و … ) است برای کارها استفاده کنیم که اصلا نیازی به آنها نداریم. پس بهتراست که برای هر کاری سراغ چیزی که باید برویم! در قسمت قبل نحوه ساخت ایمیج لینوکس و اجرای آن روی تراشه F1C100S را آموزش دادیم و در این قسمت هم میخواهیم سراغ راه اندازی یک رابط گرافیکی با کتابخانه lvgl و اجرای آن روی برد sinux f1 برویم پس با سیسوگ همراه باشید.
شاید برای شما مفید باشد : آموزش امبدد لینوکس از مقدماتی تا پیشرفته
LVGL
LVGL یک رابط گرافیکی اُپن سورس است که از تاچ اسکرین هم پشتیبانی میکند و دارای کامپوننت های مختلفی مثل windows, buttons, labels, lists, charts و … است که قابل ویرایش نیز هستند. افکت های مختلفی مثل شفافیت ، سایه، انیمیشن های مختلف و … هم از امکانات دیگر این کتابخانه هستند.
برای اینکه گرافیک خودمان را با استفاده از کتابخانه ی LVGL طراحی کنیم مرحله اول دانلود فایلها هست، یک پوشه برای پروژه خودمان میسازیم و با گیت پروژههای زیر رو دریافت میکنیم:
1 2 3 4 | mkdir gui cd gui git clone --branch v8.0.0 https://github.com/lvgl/lvgl.git git clone --branch v8.0.0 https://github.com/lvgl/lv_drivers.git |
حال لازم است که فایلهای زیر را در پوشه اصلی خود کپی کرده و نامهای آن را تغییر دهیم:
1 2 | cp lvgl/lv_conf_template.h lv_conf.h cp lv_drivers/lv_drv_conf_template.h lv_drv_conf.h |
و تغییرات زیر را درفایل lv_drv_conf.h
قرار دهیم :
در خط 10:
1 | #if 1 /*Set it to "1" to enable the content*/ |
در خط 275:
1 | # define USE_FBDEV 1 |
و تغییرات زیر را درفایل lv_conf.h
اعمال می کنیم:
در خط 10:
1 | #if 1 /*Set it to "1" to enable content*/ |
در خط 275:
1 | #define LV_FONT_MONTSERRAT_28 1 |
حال یک فایل با نام main.c ساخته و کدهای زیر را در آن قرار میدهیم
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 | #include "lvgl/lvgl.h" #include "lv_drivers/display/fbdev.h" #include <unistd.h> #include <stdio.h> #define DISP_BUF_SIZE (128 * 1024) int main(void) { /*LittlevGL init*/ lv_init(); /*Linux frame buffer device init*/ fbdev_init(); /*A small buffer for LittlevGL to draw the screen's content*/ static lv_color_t buf[DISP_BUF_SIZE]; /*Initialize a descriptor for the buffer*/ static lv_disp_draw_buf_t disp_buf; lv_disp_draw_buf_init(&disp_buf, buf, NULL, DISP_BUF_SIZE); /*Initialize and register a display driver*/ static lv_disp_drv_t disp_drv; lv_disp_drv_init(&disp_drv); disp_drv.draw_buf = &disp_buf; disp_drv.flush_cb = fbdev_flush; disp_drv.hor_res = 480; disp_drv.ver_res = 272; lv_disp_drv_register(&disp_drv); static lv_style_t label_1; lv_style_set_text_font(&label_1, &lv_font_montserrat_28); lv_obj_t *label = lv_label_create(lv_scr_act()); lv_obj_add_style(label, &label_1, 0); lv_label_set_recolor(label, true); lv_label_set_text(label, "#0062ff SISOOG.COM#"); lv_obj_align(label, LV_ALIGN_CENTER, 0, 0); lv_obj_t *label_2 = lv_label_create(lv_scr_act()); lv_label_set_long_mode(label_2, LV_LABEL_LONG_SCROLL_CIRCULAR); /*Circular scroll*/ lv_obj_set_width(label_2, 250); lv_label_set_text(label_2, "Create GUI with lvgl lib on F1C100S with Embedded linux"); lv_obj_align(label_2, LV_ALIGN_CENTER, 0, 30); while (1) { lv_tick_inc(5); lv_task_handler(); usleep(5000); } return 0; } |
نوبت کامپایل برنامه هست! لازم است که در ابتدا فایلی با نام Makefile ساخته و کدهای زیر را در آن بریزیم، باید در خط 4 مسیر کامپایلر خود را مشخص کنیم که من در اینجا مسیر کامپایلر buildroot را دادم و شما باید مسیر را بر اساس سیستم خود تغییر دهید.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 | # # Makefile # CC = ~/projects/buildroot-sinux/output/host/bin/arm-buildroot-linux-gnueabi-gcc LVGL_DIR_NAME ?= lvgl LVGL_DIR ?= ${shell pwd} CFLAGS ?= -O3 -g0 -I$(LVGL_DIR)/ -Wall -Wshadow -Wundef -Wmaybe-uninitialized -Wmissing-prototypes -Wno-discarded-qualifiers -Wall -Wextra -Wno-unused-function -Wundef -Wno-error=strict-prototypes -Wpointer-arith -fno-strict-aliasing -Wno-error=cpp -Wuninitialized -Wmaybe-uninitialized -Wno-unused-parameter -Wno-missing-field-initializers -Wtype-limits -Wsizeof-pointer-memaccess -Wno-format-nonliteral -Wno-cast-qual -Wunreachable-code -Wno-switch-default -Wno-switch-enum -Wreturn-type -Wmultichar -Wformat-security -Wno-ignored-qualifiers -Wno-error=pedantic -Wno-sign-compare -Wno-error=missing-prototypes -Wdouble-promotion -Wclobbered -Wdeprecated -Wempty-body -Wtype-limits -Wstack-usage=1024 -Wno-unused-value -Wno-unused-parameter -Wno-missing-field-initializers -Wuninitialized -Wmaybe-uninitialized -Wall -Wextra -Wno-unused-parameter -Wno-missing-field-initializers -Wtype-limits -Wsizeof-pointer-memaccess -Wno-format-nonliteral -Wpointer-arith -Wno-cast-qual -Wmissing-prototypes -Wunreachable-code -Wno-switch-default -Wswitch-enum -Wreturn-type -Wmultichar -Wno-discarded-qualifiers -Wformat-security -Wno-ignored-qualifiers -Wno-sign-compare LDFLAGS ?= -lm LDFLAGS +=-lts BIN = myGUI #Collect the files to compile MAINSRC = ./main.c include $(LVGL_DIR)/lvgl/lvgl.mk include $(LVGL_DIR)/lv_drivers/lv_drivers.mk OBJEXT ?= .o AOBJS = $(ASRCS:.S=$(OBJEXT)) COBJS = $(CSRCS:.c=$(OBJEXT)) MAINOBJ = $(MAINSRC:.c=$(OBJEXT)) SRCS = $(ASRCS) $(CSRCS) $(MAINSRC) OBJS = $(AOBJS) $(COBJS) ## MAINOBJ -> OBJFILES all: default %.o: %.c $(CC) $(CFLAGS) -c $< -o $@ echo "$(CC) $<" default: $(AOBJS) $(COBJS) $(MAINOBJ) $(CC) -o $(BIN) $(MAINOBJ) $(AOBJS) $(COBJS) $(LDFLAGS) clean: rm -f $(BIN) $(AOBJS) $(COBJS) $(MAINOBJ) |
حال باید در ترمینال دستور زیر رو وارد کنیم تا برنامه کامپایل شود
1 | make |
یک فایل خروجی با نام myGUI
تولید میشود که برنامه گرافیکی ماست.
وقتی داریم با سیستمهای امبدد کار میکنیم معمولاً پردازنده هدف، سختافزار ضعیفی دارد و کامپایل کردن روی آن زمانبر و در برخی موارد غیرممکن است پسروی سیستم خودمان کامپایل کرده و خروجی را روی سختافزار خود انتقال داده و اجرا میکنیم مثل کاری که در بالا انجام دادیم.
پیشنهاد میکنم در این رابطه، این مطلب رامطالعه کنید.
امبدد لینوکس – قسمت ششم – Toolchain یا زنجیرهای از ابزارهای لازم برای ساختن همه چیز (بخش دوم)
برنامه UMTPRD
حالا نکتهای که میخواهیم در باره ی آن صحبت کنیم همینجاست!
آن هم برای انتقال دادن فایل خروجی روی سختافزار، اکثر چیپهای لینوکسی که با آنها کار میکنیم دارای شبکه هستند یا بهصورت lan و یا بهصورت Wifi و برای انتقال فایل از بستر شبکه استفاده میکنیم و با دستور scp یا دستورات مشابه فایلها را انتقال میدهیم، اما F1C100S اینطور نیست و ما شبکه را در آن نداریم (البته که توی برد sinux f1 ماژول Wifi رو اضافه کردیم اما اکثر بردهایی که f1c100s دارند یا بردی که ممکنه در آینده بزنید احتمال زیاد دارای ماژول Wifi نیست پس ما این رو در نظر نمیگیریم ولی راه دیگری که با کمک برنامه UMTPRD بردمان را با یک کابل usb به سیستم وصل کرده که در آن برد ما بهعنوان یک دستگاه ذخیرهسازی شناخته میشود و به فایلهای ما در سیستم دسترسی پیدا میکند.
کانفیگ buildroot که در قسمت قبل نحوه استفاده از آن را آموزش دادیم این پکیج را هم در ایمیج ما نصب میکند و میتوانید از آن استفاده کنید فقط لازم است که سوییچ usb و کلید otg برد sinux f1 را روی حالت device قرار دهیم و با یک کابل usb آن را به سیستم متصل کنیم.
حال فایل myGUIرا روی برد در مسیر /root/ کپی میکنیم و با دستور زیر آن را اجرا میکنیم:
1 2 | chmod +x myGUI ./myGUI |
(دستورات بالا همونطور که میدونید باید در ترمینال برد اجرا بشه?)
در زیر میتوانید خروجی برنامه را مشاهده کنید:
اگر احیاناً زیاد با الکترونیک آشنا نیستید و دنبال LCD که من از آن استفاده کردم میگردید میتوانید از طریق این لینک در فروشگاههای مرتبط این نمایشگر را پیدا کنید
مشخصات lcd:
-4.3 Inch TFT LCD Module
– With 24-bit RGB interface (standard 40PIN interface), compatible with most current true color Interface 4.3
– Resolution 480×272
در قسمتهای بعدی در پروژههایی که انجام میدهیم بیشتر با کتابخانه گرافیکی lvgl آشنا میشویم و از امکانات دیگر آن هم استفاده میکنیم اما شما میتوانید جلوتر پیش برید و زودتر گرافیکهای خود را طراحی کنید از این لینک هم میتوانید برای آشنا شدن با دیگر امکانات این کتابخانه استفاده کنید.
دانلود رایگان شماتیک و PCB برد توسعه SINUX F1
فایل های طراحی رو میتونید به صورت رایگان از گیت هاب من دریافت کنید!
در این بخش میتونید به همه قسمتهای سری آموزش کار با تراشه F1C100S دسترسی پیدا کنید:
سلام
این قطعه چه lcd هایی رو ساپورت میکنه؟
LVDS یا TTL
سلام. lvds ساپورت نمیکنه در قسمت اول آموزش بخش “بخش سوم – تاچ و ال سی دی” دقیقتر میتونید بررسی کنید
Hi brother!
I’m really happy to see your training. This training will have really helped me to forward completing my own project.
thanks a lot for your training.
Hi there, glad to see that we helped you competing your project
Hi
Your Welcome 🙂
سلام
یک نکته ای که به درد بقیه هم ممکنه بخوره
وقتی میخواین کدها رو از اینجا کپی کنین دقت کنین که بعضی اعداد فارسی کپی میشن و موقع make به مشکل میخوره..
روی متن اگه چندبار کلیک کنین یک حالتی میشه که میتونین درست کپی کنین
نگاه کردم مثل اینکه MIPI پشتیبانی نمی کنه درسته؟
طبق شماتیک شما فکر کنم از ال سی دی RGB666 استفاده کردین ..من یک ال سی دی RGB565 دارم و 40 پین هم هست، برای این کد رو چه جوری باید تغییر بدم ؟
ممنون
بله، پشتیبانی نمیشه.
نیاز به تغییری نیست ، میتونید استفاده کنید از 565
ُسلام با تشکر از آموزش عالی و بی نظیرتون
قسمت تنظیمات نمایشگر که گفتین چه جوری میتونم یک ال سی دی MIPI متصل کنم؟
ممنونم
خواهش میکنم.
پشتیبانی نمیشه mipi
سلام ممنون بابت آموزش های عالی تون. من تست کرد البته روی لیچی پای نانو و خیلی خوب جواب داد.
اگر امکان داره راه اندازی تاچ اسکرین مقاومتی هم اموزشی قرار بدید. تکمیل میشه آموزش
سلام. خواهش میکنم. احتمالا در آینده این آموزش هم تهیه میشه ، اما شما میتونید با کمک این لینک و این دو خطی که در قسمت قبل بهش اشاره شد :
export TSLIB_TSDEVICE=/dev/input/event0
ts_print_raw
خودتون پیش برید
عالی بود، عالی
ممنون از زحمتی که برای آماده سازی این سری از آموزش کشیدید.
لطف دارید ، خواهش میکنم?
سلام. تشکر از آموزش خوبتون. لطفا در مورد اجرای فایل برنامه بدون سیستم عامل هم توضیح مختصری بفرمایید.
سلام
خواهش میکنم
میتونید از این لینک کمک بگیرید
https://github.com/nminaylov/F1C100s_LVGL
سلام خدمت شما.
اولا خیلی ممنون بابت آموزش خوبتون… روزهای زیادی توی صفحات انگلیسی برای چنین چیزی میگشتم که آب در کوزه بود و ما تشنه لبان میگشتیم…
دوما، بنده به شدت مبتدی هستم… توی این لینکی که گذاشتید گفته که باید با دستور
fatload mmc 0:1 80000000 firmware.bin
go 80000000
برنامه رو توی آی سی بریزیم… ولی خب… از کجا و چطور ذکر نشده و گفته نشده که آیا نیاز هست ایمیج و کرنل و سایر مخلفات ساخته بشه یا نه…
میخواستم بپرسم میشه یه راهنمایی بفرمایید که دقیقا چه بلایی باید سر فایل .bin بیاریم تا توی آی سی ریخته بشه؟
خیلی ممنون.
سلام.
آموزش جدیدی در سایت سیسوگ منتشر شده که نحوه استفاده از این کتابخانه را توضیح داده
https://sisoog.com/2022/09/11/f1c100s-baremetal/
پیشنهاد میکنم شبکه های اجتماعی سیسوگ را دنبال کنید که این مطالب رو از دست ندید?
خیلی ممنون.
پس اونجا زیاد مزاحمتون میشم.
چشم.
سلام با تشکر از مطلب خوبتون
در مورد F1c100s ، شما مورد مشابه این آی سی که اترنت هم داشته باشه رو میشناسید؟
سلام خواهش میکنم.
از چیپ V3S میتونید استفاده کنید. برد های licheepi zero از این چیپ استفاده میکنند.
ممنون از شما
میشه برای f1c100s برد رو جوری طراحی کرد که از lcd های ۵۰ pin پشتیبانی کنه؟
بله. از لحاظ دیتا نمایشگرهای 50 پین با 40 پین تفاوتی ندارند که و با یه برد مبدل ساده میشه 40 پین رو به 50 پین تبدیل کرد.
توی سایت کویرالکترونیک هم نمونه مبدل هاش موجود هست.
سلام.ممنون بابت اموزش خوبتون
حداکثر اندازه lcd و تاچ اسکرینی که میشه به این برد وصل کرد چقدره؟
7 اینچ هم میشه وصل کرد (با رزولوشن های مرسوم)؟
سلام.
در قسمت اول در “بخش سوم – تاچ و ال سی دی” رزولوشن های مختلفی که هر اینترفیس ساپورت میکنه رو قرار دادیم.
بله ، رزولوشن معمول ال سی دی های 7 اینچی 800*480 هست که توی قسمت قبل نحوه کانفیگش رو گفتیم
سلام.
ممنون از مطالبی که به اشتراک میذارید. خدا برکت بدهد.
سوال ۱: آیا میشه با QT برای این بورد اپلیکیشن نوشت؟
سوال ۲: تراشه f1c200s دو برابر این تراشه رم داره، اگه با این تراشه جایگزین بشود لازمه که چیز دیگری تغییر کند؟
سلام خواهش میکنم ?
بله میشه با qt هم نوشت ولی چون سخت افزار نسبتا ضعیفی داره بهتره که با همین lvgl که سبک تر هست باهاش کار بکنید.
نیاز به هیچ تغییری نیست هر بردی که f1c100 بوده رو میشه بجاش f1c200 مونتاژ کرد.
با سلام و سپاس از شما، انشاا… وقت شود و به صورت سخت افزاری هم بتونم در اولین تعطیلات پیش رو خروجی موارد آموزشی شما رو هم تست کنم. سپاس از شما و تیم حرفهای سیسوگ
سلام انشاا…
خواهش میکنم???
مثل همیشه عالی
ممنون از شما ???
سلام
اگ ممکنه یه آموزش هم برای پورت کردن کتابخونه LVGL روی میکروهای STM32 بزارین
ممنون
سلام. من خودم کار نکردم اما احتمالش هست در آینده ای نزدیک این کار رو انجام بدیم.
لطفا در مورد روشهای حفاظت از برنامه در برابر کپی برداری هم بنویسید.
واقعا نمیدونم دیوایس لینوکسی تا چه حد تو این زمینه قابل اعتماد هستند