در قسمت قبل سراغ ساخت یک mp3 player رفتیم با ماژول mc60، توی این قسمت میخوایم سراغ به بخش جدایی ناپذیر از پروژه هامون بریم و اون چیزی نیست جز نمایشگر، توی این قسمت سراغ راه اندازی نمایشگر oled با ماژول mc60 میریم، پس با سیسوگ همراه باشید…
برای کار با ماژول mc60 بیشترین چیزی که کمکمون میکنه داکیومنت و example های کاملی هست که شرکت quectel در اختیارمون گذاشته، اما برای بحث نمایشگر oled متأسفانه کد آمادهای موجود نیست، به همین دلیل من کتابخونه ای رو برای کار با نمایشگرهای oled آماده کردم که میتونید برای mc60 از اون استفاده کنید.
اول از همه لازم هست که فایل هدر و سورس رو به پروژتون اضافه کنید، برای این کار فایل oled.h
و Adafruit5x7.h
رو به پوشه include
و فایل oled.c
رو به پوشه custom
اضافه میکنیم (فایلها میتونید از گیت هاب من دریافت کنید).
کد ما برای دو سایز 128*32 و 128*64 آماده شده که باید نوع مورد نظرتون رو با define کردن توی خط 17 و 18 فایل oled.h
مشخص کنید:
1 2 | //#define Adafruit128x64 #define Adafruit128x32 |
کد زیر هم برای تست کتابخانه آماده شده که میتونید استفاده کنید:
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 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 | #define __CUSTOMER_CODE__ #ifdef __CUSTOMER_CODE__ #include "ql_type.h" #include "ql_stdlib.h" #include "ql_trace.h" #include "ql_gpio.h" #include "ql_uart.h" #include "ql_iic.h" #include "ql_error.h" #include "oled.h" ///for DEBUG/////////////////////////////////////////////////////////////////////////////////////////////////////////// #define SERIAL_RX_BUFFER_LEN 2048 #define DEBUG_PORT UART_PORT1 #define DBG_BUF_LEN 512 static char DBG_BUFFER[DBG_BUF_LEN]; #define APP_DEBUG(FORMAT, ...) \ { \ Ql_memset(DBG_BUFFER, 0, DBG_BUF_LEN); \ Ql_sprintf(DBG_BUFFER, FORMAT, ##__VA_ARGS__); \ Ql_UART_Write((Enum_SerialPort)(DEBUG_PORT), (u8 *)(DBG_BUFFER), Ql_strlen((const char *)(DBG_BUFFER))); \ } char m_Read_Buffer[SERIAL_RX_BUFFER_LEN]; //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// static void CallBack_UART_Hdlr(Enum_SerialPort port, Enum_UARTEventType msg, bool level, void *customizedPara); const u8 ant_1[] = { 0b11111111, 0b01011010, 0b00111100, 0b00011000, 0b00011000, 0b00011000, 0b00011000, 0b00011000, }; const u8 ant_2_full[] = { 0b00000001, 0b00000001, 0b00000101, 0b00000101, 0b00010101, 0b00010101, 0b01010101, 0b01010101, }; const u8 ant_low[] = { 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00010000, 0b00010000, 0b01010000, 0b01010000, }; const u8 play[] = { 0b00000000, 0b11000000, 0b11110000, 0b11111100, 0b11111111, 0b11111100, 0b11110000, 0b11000000, }; const u8 pause[] = { 0b11100111, 0b11100111, 0b11100111, 0b11100111, 0b11100111, 0b11100111, 0b11100111, 0b11100111, }; const u8 stop[] = { 0b11111111, 0b11111111, 0b11111111, 0b11111111, 0b11111111, 0b11111111, 0b11111111, 0b11111111, }; const u8 bat_1[] = { 0b11111111, 0b10000000, 0b10111111, 0b10111111, 0b10111111, 0b10111111, 0b10000000, 0b11111111, }; const u8 bat_2[] = { 0b11111100, 0b00000110, 0b00000111, 0b00000111, 0b00000111, 0b00000111, 0b00000110, 0b11111100, }; void proc_main_task(s32 taskId) { s32 ret; ST_MSG msg; // Register & open UART port Ql_UART_Register(UART_PORT1, CallBack_UART_Hdlr, NULL); Ql_UART_Open(UART_PORT1, 115200, FC_NONE); APP_DEBUG("START PROGRAM (SISOOG.COM)\r\n"); ret = Ql_IIC_Init(0, PINNAME_RI, PINNAME_DCD, TRUE); Ql_Sleep(100); ret = Ql_IIC_Config(0, TRUE, I2C_ADDRESS, 1500); oledInit(); oledClear(); oledFill(); Ql_Sleep(500); oledClear(); Ql_Sleep(500); setFont(Adafruit5x7); set2X(); setCursor(28, 0); oledPrint("Sisoog"); set1X(); setCursor(0, 3); oledPrint("Mahdi.h"); oledDraw(0, 0, bat_1); oledDraw(8, 0, bat_2); oledDraw(110, 0, ant_1); oledDraw(119, 0, ant_2_full); oledDraw(50, 3, play); oledDraw(70, 3, pause); oledDraw(90, 3, stop); while (1) { Ql_OS_GetMessage(&msg); switch (msg.message) { case 0: break; default: break; } } } static void CallBack_UART_Hdlr(Enum_SerialPort port, Enum_UARTEventType msg, bool level, void *customizedPara) { u32 rdLen = 0; s32 ret; switch (msg) { case EVENT_UART_READY_TO_READ: { Ql_memset(m_Read_Buffer, 0x0, sizeof(m_Read_Buffer)); rdLen = Ql_UART_Read(port, m_Read_Buffer, sizeof(m_Read_Buffer)); if (Ql_strstr(m_Read_Buffer, "ok")) { APP_DEBUG("ok\r\n"); } break; } } } #endif // __CUSTOMER_CODE__ |
اینجا هم میتونید توابع و عملکرد هر کدوم از توابع کتابخونه رو مشاهده کنید
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | //آماده سازی و مقدار دهی اولیه نمایشگر oledInit(); // پاک کردن صفحه oledClear(); // روشن کردن تمام پیکسل های صفحه oledFill(); //تنظیم فونت نوشتاری setFont(Font); //تغییر سایز فونت به حالت 1 برابر set1X(); //تغییر سایز فونت به حالت 2 برابر set2X(); //نمایش متن روی نمایشگر oledPrint(text); //جابجایی مکان نما setCursor(x, y); //نمایش یک آیکون oledDraw(x, y, 8_8_icon); |
سخت افزار mc60 oled
برای اتصال سخت افزاری به دلیل این که سطح ولتاژ ماژول mc60 ما 2.8 ولت هست و نمایشگر oled 5 ولت ، باید از level shifter استفاده کنیم.
در تصویر پایین میتونید اتصال سخت افزار من رو به همراه خروجی کدی که در بالا قرار دادم مشاهده کنید:
در این بخش میتونید به همه قسمتهای سری آموزش ماژول mc60 دسترسی پیدا کنید:
- کار با ماژول تمام عیار mc60 – قسمت اول – برد راه انداز
- کار با ماژول تمام عیار mc60 – قسمت دوم – راه اندازی OpenCPU
- کار با ماژول تمام عیار mc60 – قسمت سوم – ساخت ردیاب
- کار با ماژول تمام عیار mc60 – قسمت چهارم – OpenCPU و تکمیل ردیاب
- کار با ماژول تمام عیار mc60 – قسمت پنجم – ساخت MP3 Player
- کار با ماژول تمام عیار mc60 – قسمت هفتم – کار با MQTT
- کار با ماژول تمام عیار mc60 – قسمت هشتم – کدنویسی با Eclipse
سلام و خسته نباید
کارتون عالیه، اینکه این همه وقت میگذارید و برای همه مطلب مفید منتشر میکنید خیلی جای تحسین داره
آیا امکاشن هست این کتابخونه رو با درایور SH1106 هم سازگار کنید؟
سلام. لطف دارید
امروز خودم تونستم کل کتابخونه Adafruit GFX رو برای MC60 و نمایشگر SH1106 (نمایشگر 1.3 اینچ) پورت کنم
انشاالله کتابخونشو برای SSD1306 هم آماده میکنم و روی Github میگذارم که همه عزیزان استفاده کنند
بسیار عالی دوست عزیز
حتما لینک گیت هاب را هم اینجا قرار بدید که بقیه هم ببینن و استفاده کنند
سلام برای شیفت لول که استفاده کردید ، قسمت LV را به VDD_EXT وصل کردید؟
سلام.بله
سلام
در فرمان کانفیگ همان ابتدا آدرس slave ست میشود. برای ارتباط با دیوایس باید به تعداد دیوایس ها کانال تعریف و کانفیگ کنم ؟تشکر
سلام دوست عزیز
هر کانال قادر به آدرس دهی ۱۲۸ دستگاه هست، در واقع این ماژول دو کانال متفاوت برای i2cدارد یکی به شکل سخت افزاری و دیگری به شکل نرم افزاری کار میکند
کانال صفر که به شکل سخت افزاری کار میکیند انتخاب بهتری برای شما خواهد بود.
ببخشید من متوجه نشدم. اگر امکان هست دستور برای ارتباط با دو دیوایس با آدرس متفاوت با استفاده از کانال صفر را بگذارید. خیلی ممنون بابت راهنمایی
خوب – ساده است
اینجا باگ داره کتابخانه کوکیتل من که از اول خودم نوشتم کتابخانه رو برای استفاده
ولی شما هر بار قبل از استفاده از دیواس با آدرس متفاوت یک بار اینیت کنید i2c رو مشکلتون حل میشه
ممنون که راهنمایی کردید.
نکته جالبی گفتید که کتابخانه را دوباره نوشتید. سورس اصلی کتابخانه ها کجاست . من هم تا حدی که بتونم تغییر بدهم و استفاده کنم.
تشکر
دوست عزیز کتایخانه های کویکتل کلوز سورس هستند و سورس اونها در دسترس نیست
من به شکل مستقیم با رجیسترهای SOC کار کردم
شما اول باید دیتاشیت و منوال آیسی mt2503 رو پیدا کنید بر اساس اون برای قسمت مورد نظرتون کتابخانه بنویسید.
ولی این راه سختی است، همونطور که توضیح دادم قبلا به سادگی میتونید از کتابخانه خود کویکتل استفاده کنید.
سلام. اگر سطح ولتاژ 3.3 ولت باشد باز هم به level shifter نیاز هست؟
برای قرار دادن چند دیوایس روی باس iic مشکلی ندارد؟
تشکر
برای جواب دادن به این سوال لازم هست که دیتاشیت هر دو طرف ارتباط رو بررسی کنیم. توی فایل hardware design ماژول mc60 پارامتر های ولتاژی پایه ها RI و DCD که ما استفاده کردیم رو به این صورت مشخص کرده:
VILmin=0V
VILmax=0.25×VDD_EXT
VIHmin=0.75×VDD_EXT
VIHmax=VDD_EXT+0.2
VOHmin=0.85×VDD_EXT
VOLmax=0.15×VDD_EXT
که ولتاژ VDD_EXT هم برابر 2.8 هست. حالا باید پارامتر های ولتاژی پایه های دیتای ماژول رو در طرف دیگه هم به طور کامل بررسی کنیم و ببینیم که همخوانی دارند یا نه.
البته یه راه دیگه هم هست و اونم این که ماژول رو وصل کنید و ببینید کار میده یا نه ?
این نمایشگر oled خودش ولتاژ 3.3 رو هم پشتیبانی میکنه اما من نتونستم مستقیم به mc60 متصلش کنم ، اما مثلا چیپ pcf8574 رو با ولتاژ تغذیه 3.3 تونستم با mc60 ارتباط بدم.
چند دیوایس رو هم میتونید استفاده کنید.
سلام
i2c بصورت نرم افزاری پیاده سازی شده؟
سلام
خیر، به صورت سخت افزاری
البته خود sdk از i2c نرم افزاری هم پشتیبانی میکنه
تشکر
سلام
با mc60 به یه مشکل عجیب برخوردم:
سیم کارت ایرانسل هیچ مشکلی نداره اما همراه اول میزارم مینویسه:
CPIN Not INSERTED
برد رو از نویسنده همین پست گرفتم که کیفیت خوبی داره و روی هر دو اسلات سیم کارت گذاشتم اما همراه اول جواب نمیده
هم ایرانسل و هم همراه اول هردو usim و اعتباری هستن و هر دو روی گوشی های دیگه هیچ مشکلی ندارن و همین سیم کارت همراه اول رو روی ماژول m66 میزارم بدون مشکل کار میکنه
لطفا کمکم کنید…
مشکل حل شد
مشکل ضخامت سیم کارت بود!
ضخامت سیم کارت ها معمولاً 0.63 میلی متر است.
اما ضخامت سیم کارت های همراه اول که این مشکل را ایجاد کرده حدود 75/0 میلی متر بود.
این ضخامت اضافی پایه مکانیکی سوکت سیم کارت را به زمین PCB متصل می کند و مشکلاتی را ایجاد می کند.
وقتی ضخامت سیم کارت اپراتور را با کاغذ سنباده کاهش دادم (حدود 0.62 میلی متر) به درستی کار می کرد.
ممنون بابت به اشتراک گذاشتن راه حل
سلام
یه فایل راهنمای برای استفاده از دستورات at-command نوشتم (البته بیشتر جهت استفاده شخصی بوده) برای mc60 و m66 آدرس دانلود فایل رو میزارم اینجا اگر از بچه های سیسوگ هم کسی دید بدرد میخورده زحمت پست کردنش به عنوان یه راهنما با سیسوگ
فرمت libre office:
https://s18.picofile.com/file/8434085784/%D8%B1%D8%A7%D9%87%D9%86%D9%85%D8%A7%DB%8C_%D8%AF%D8%B3%D8%AA%D9%88%D8%B1%D8%A7%D8%AA_at_Command_%D9%85%D8%A7%DA%98%D9%88%D9%84_%D9%87%D8%A7%DB%8C_GSM.odt.html
فرمت pdf:
https://s19.picofile.com/file/8434085792/%D8%B1%D8%A7%D9%87%D9%86%D9%85%D8%A7%DB%8C_%D8%AF%D8%B3%D8%AA%D9%88%D8%B1%D8%A7%D8%AA_at_Command_%D9%85%D8%A7%DA%98%D9%88%D9%84_%D9%87%D8%A7%DB%8C_GSM.pdf.html
فرمت microsoft world:
https://s19.picofile.com/file/8434085768/%D8%B1%D8%A7%D9%87%D9%86%D9%85%D8%A7%DB%8C_%D8%AF%D8%B3%D8%AA%D9%88%D8%B1%D8%A7%D8%AA_at_Command_%D9%85%D8%A7%DA%98%D9%88%D9%84_%D9%87%D8%A7%DB%8C_GSM.docx.html
سلام دوست عزیز
خیلی هم عالی
دست شما هم درد نکنه حتما منتشر میشه
سلام
میخواستم بدونم برای راه اندازی lcd کاراکتری هم میشه از این کتابخونه استفاده کرد؟
سلام
خیر
سلام
آیا با mc60 میشه با پروتکل can bus کار کرد؟
سلام
mc60 CAN Interface نداره و اگر چنین قسمتی را بصورت خارجی درایو کنید میتونید از این پروتکل هم استفاده کنید