در مطلب قبل به معرفی ماژول و نحوه برقراری ارتباط با آن پرداختیم و در این مطلب قصد داریم که به نحوه استفاده از SDK ماژول بپردازیم و با هم یک پروژه کوچک (Hello World!) انجام دهیم تا با این ماژول بیشتر آشنا شوید و بتوانید برنامه ی خود را روی ماژول بریزید. کار با SDK ماژول سخت نیست چراکه خود شرکت برای شما کدهایی به عنوان مثال آماده کرده که میتوانید از آنها استفاده کنید. در این SDK تمام قابلیتهای ماژول مثل تماس، پیامک، پروتکل های ارتباطی مثل MQTT، آپدیت از راه دور، مدیریت مصرف و چندین و چند قابلیت دیگر با مثال آورده شده که کار شما را برای توسعه محصول آسان میکند. لازم به ذکر است که در این آموزش از لینوکس Debian استفاده شده است هرچند که اگر از ویندوز استفاده میکنید جای نگرانی نیست چراکه قسمتهایی که باهم تفاوت دارند توضیح داده میشود.
ابزار ما برای کار با ماژول، SDK برای برنامه نویسی و Qloader جهت نصب برنامه (در لینوکس) و QFlash جهت نصب برنامه روی ماژول در ویندوز است که در ادامه با روش استفاده از آن ها آشنا میشوید. ابتدا لازم است که SDK را دانلود کنید و سپس آن را از حالت zip خارج کنید و وارد دایرکتوری SDK شوید. سپس لازم است چنانچه از لینوکس استفاده میکنید تغییراتی ایجاد کنیم تا SDK بیلد شود.(اگر از ویندوز استفاده میکنید از این قسمت عبور کنید) اول از همه دسترسی Shell Scriptی که مربوط به بیلد کردن SDK هست را تغییر میدهیم و سپس خط اول آن را با این عبارت (#!/bin/bash) عوض کنید.
1 2 | chmod 777 build_all.sh nano ./build_all.sh |
پس از تغییر باید اسکریپت شما به شکل زیر باشد.
برای بیلد کردن پروژه از این دستور استفاده کنید
1 | ./build_all.sh new EC200UEU_AA V01 |
اگر پروژه شما به درستی بیلد شد در دایرکتوری target خروجی چیزی را که ساختید مشاهده میکنید.
1 2 | sisoog@sisoog:~/LTE01R03A04_C_SDK_U/target/EC200UEU_AA_V01$ ls 8915DM_cat1_open.elf 8915DM_cat1_open_V01_merge.pac app 8915DM_cat1_open.map 8915DM_cat1_open_V01.pac prepack |
فایلی که باید استفاده کنید به این اسم (8915DM_cat1_open_V01_merge.pac) است.
حالا برای نصب فایل روی ماژولتان باید از (QDloader) استفاده کنید. پس از دانلود و خارج کردن آن از حالت zip نیاز است که آن را بیلد کنید. به این صورت که وارد دایرکتوری آن شده و با دستور make آن را بیلد کنید.
1 2 | sisoog@sisoog:~/QDloader_Linux_Android_V1.0.14/out$ ls QDloader |
حالا که لودر را دارید با کپی کردن فایل (8915DM_cat1_open_V01_merge.pac) که با SDK ساختید در دایرکتوری out در QDloader میتوانید کد را روی ماژولتان بریزید. برای اینکار از دستور زیر استفاده کنید.
1 | sudo ./QDloader -s /dev/ttyUSB0 -f 8915DM_cat1_open_V01_merge.pac -g EC200U |
دقت کنید که میتوانید پورت USB را با استفاده از تغییر این قسمت (/dev/ttyUSB0) در دستور بالا تنظیم کنید.
برای ساختن خروجی در ویندوز مانند زیر عمل کنید.
اگر از ویندوز استفاده میکنید لازم است CMD را با دسترسی Administrator بازکرده و به آدرس SDK بروید و سپس با دستور زیر کار بیلد کردن را انجام دهید.
build_all.bat new EC200UEU_AA V01
چنانچه به درستی انجام شده باشد خروجی به شکل زیر خواهید داشت
اگر پروژه شما به درستی بیلد شد در دایرکتوری target خروجی چیزی را که ساختید مشاهده میکنید.
نرم افزار Qflash را باز کنید و آدرس فایلی که ساختیم (8915DM_cat1_open_V01_merge.pac) را به آن بدهید و دکمه استارت را بزنید. چنانچه کار با موفقیت انجام شود باید خروجی مانند زیر داشته باشیم.
خب اگر تا الان همه چیز خوب پیش رفته به سراغ تغییر کد ماژول میرویم. به دایرکتوری SDK بر میگردیم و فایل (ql_int.c) را ادیت میکنیم. این فایل را در دایرکتوری زیر پیدا میکنید.
1 | sisoog@sisoog:~$ nano LTE01R02A05_C_SDK_U/components/ql-application/init/ql_int.c |
تابع (ql_ledcfg_app_init();) را پیداکنید و آن را از حالت کامنت خارج کنید و سپس با کلیک سمت راست و (go to defenition) یا در VsCode با (F12) وارد فایل (led_cfg_demo.c) شوید.
میتوانیم برنامه ای که در این فایل وجود دارد را به سه قسمت تقسیم کنیم. قسمت اول که در انتهای فایل قرار دارد مربوط به ساخت یک تسک توسط OS است.
1 2 3 4 5 6 7 8 9 10 | void ql_ledcfg_app_init(void) { QlOSStatus err = QL_OSI_SUCCESS; err = ql_rtos_task_create(&ledcfg_task, 1024, APP_PRIORITY_NORMAL, "ql_ledcfgdemo", ql_ledcfg_demo_thread, NULL, 1); if( err != QL_OSI_SUCCESS ) { QL_LEDCFGDEMO_LOG("led config demo task created failed"); } } |
قسمت دوم تابعی است که لازم است توسط OS اجرا شود.
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 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 | static void ql_ledcfg_demo_thread(void *param) { QL_LEDCFGDEMO_LOG("led config demo thread enter, param 0x%x", param); /*** LPG open ***/ ql_pwm_open(PWM_LPG); QL_LEDCFGDEMO_LOG("led config start"); /* set NET_MODE */ ql_pin_set_func(QL_PIN_GPIO1, QL_PIN_GPIO1_FUNC_ZSP_CTS); //Pin126 set zsp_uart_cts, two pins can't set the same GPIO ql_pin_set_func(QL_PIN_NET_MODE, QL_PIN_NET_MODE_FUNC_GPIO); ql_gpio_init(QL_GPIO_NET_MODE, GPIO_OUTPUT, PULL_NONE, LVL_LOW); ql_event_t event; ql_ledcfg_callback_register(_ledcfg_demo_cb); while(1) { if( ql_event_try_wait(&event) != 0 ) { continue; } if( event.id == QUEC_LEDCFG_EVENT_IND ) { switch( event.param1 ) { case IND_SIM_NOT_INSERT: case IND_SIM_INITIALIZING: case IND_SIM_PIN_LOCK: case IND_SIM_CPIN_READY: case IND_SEARCHING: case IND_CAMP_ON_CELL: case IND_REGISTERING: QL_LEDCFGDEMO_LOG("led config slow twinkle [%d]", event.param1); ql_pwm_lpg_enable(QL_LED_TWINKLE_SLOW_PERIOD, QL_LED_TWINKLE_SLOW_ONTIME); break; case IND_STANDBY: case IND_PDP_ACTIVING: case IND_PDP_ACTIVED: case IND_SOCKET_SET_UP: case IND_PDP_DEACTIVING: QL_LEDCFGDEMO_LOG("led config fast twinkle [%d]", event.param1); ql_pwm_lpg_enable(QL_LED_TWINKLE_FAST_PERIOD, QL_LED_TWINKLE_FAST_ONTIME); break; case IND_DATA_TRANSMIT: QL_LEDCFGDEMO_LOG("led config speed twinkle [%d]", event.param1); ql_pwm_lpg_enable(QL_LED_TWINKLE_SPEED_PERIOD, QL_LED_TWINKLE_SPEED_ONTIME); break; case IND_DIALING: QL_LEDCFGDEMO_LOG("led config keep on [%d]", event.param1); ql_pwm_lpg_enable(QL_LED_TWINKLE_ON_PERIOD, QL_LED_TWINKLE_ON_ONTIME); break; default: QL_LEDCFGDEMO_LOG("led config error!"); break; } if( event.param2 == IND_NET_TYPE_4G ) { QL_LEDCFGDEMO_LOG("led config network is 4G"); ql_gpio_set_level(QL_GPIO_NET_MODE, LVL_HIGH); } else { QL_LEDCFGDEMO_LOG("led config network is not 4G"); ql_gpio_set_level(QL_GPIO_NET_MODE, LVL_LOW); } } } ql_rtos_task_delete(NULL); } |
قسمت سوم کد مربوط به توابع لاگ است.
1 2 3 | #define QL_LEDCFGDEMO_LOG_LEVEL QL_LOG_LEVEL_INFO #define QL_LEDCFGDEMO_LOG(msg, ...) QL_LOG(QL_LEDCFGDEMO_LOG_LEVEL, "ql_LEDCFGDEMO", msg, ##__VA_ARGS__) #define QL_LEDCFGDEMO_LOG_PUSH(msg, ...) QL_LOG_PUSH("ql_LEDCFGDEMO", msg, ##__VA_ARGS__) |
برای اینکه بتوانیم LED روی برد را خاموش و روشن کنیم باید تابع (static void ql_ledcfg_demo_thread(void *param)) را به دلخواه خودمان تغییر دهیم. مثلا برای خاموش و روشن شدن LED مربوط به NET Status تابع را به شکل زیر تغییر میدهیم.
1 2 3 4 5 6 7 8 9 10 11 12 | static void ql_ledcfg_demo_thread(void *param) { ql_pin_set_func(QL_PIN_NET_MODE, QL_PIN_NET_MODE_FUNC_GPIO); ql_gpio_init(QL_GPIO_NET_MODE, GPIO_OUTPUT, PULL_NONE, LVL_LOW); while(1) { ql_gpio_set_level(QL_GPIO_NET_MODE,1); ql_rtos_task_sleep_s(1); ql_gpio_set_level(QL_GPIO_NET_MODE,0); ql_rtos_task_sleep_s(1); } } |
پس از اینکه کد را نوشتید برای کامپایل کد از دستور زیر استفاده میکنیم.
1 | ./build_all.sh new EC200UEU_AA V01 |
سپس در دایرکتوری (target) فایل (8915DM_cat1_open_V01_merge.pac) را پیداکنید و در دایرکتوری (out) لودر (QDloader_Linux_Android) قراردهید و با دستور زیر ماژول را پروگرم کنید.
1 | sudo ./QDloader -s /dev/ttyUSB0 -f 8915DM_cat1_open_V01_merge.pac -g EC200U |
پس از اینکه ماژول با موفقیت پروگرم شد باید LED مربوط به NET Status به صورت چشمک زن خاموش و روشن شود.
امیدوارم از این آموزش استفاده لازم را برده باشید. منتظر آموزش بعدی ما باشید 🙂
وبسایت: http://www.arvidtek.com
www.arvidtek.com | گروه مهندسی آرویدتک | فعال حوزه الکترونیک و مخابرات | فروشگاه تخصصی قطعات الکترونیک
مقالات بیشترمرسی از آموزش قدم به قدمت، واقعاً کمک کرد تا SDK رو راحت ستاپ کنم. من که با ویندوز کار میکنم و همه چیز خوب پیش رفت، منتظر قست بعدی هستم!
نویسنده شو !
سیسوگ با افتخار فضایی برای اشتراک گذاری دانش شماست. برای ما مقاله بنویسید.