در قسمت قبل وارد دنیای OpenCpu شدیم و نحوه پروگرام کردن ماژول mc60 رو یاد گرفتیم، همچنین یک برنامه ساده برای کار با بخش پیامک ماژول نوشتیم و دریافت و ارسال پیامک رو انجام دادیم. حالا توی این قسمت میخوایم کمی بیشتر جلو بریم و پروژه ساخت ردیاب با استفاده از این ماژول رو انجام بدیم. برای این کار اطلاعات مکان رو از بخش GNSS ماژول دریافت کرده و اونها رو به یک سرور ارسال میکنیم، سپس از طریق یک آدرس اینترنتی آخرین مکان ارسال شده رو روی نقشه میبینیم.
با این آموزش از سیسوگ همراه باشید.
استفاده از RTOS
یک امکان فوقالعاده دیگه ای هم که این ماژول داره این هست که از RTOS پشتیبانی میکنه (اگه باهاش آشنایی ندارید یه سر به اینجا بزنید) ما هم میخوایم توی این آموزش نحوه استفاده از اون رو هم بهتون آموزش بدیم. همین طور برای شروع ساخت ردیاب باید بدونیم که بخش GNSS ماژول از بخش اصلی جداست و باید به صورت سخت افزاری اون رو متصل کنیم که در قسمت اول کامل توضیح دادیم.
برای اینکه بتونیم تابعهایی رو که میخوایم به صورت موازی اجرا بشند رو معرفی کنیم به کامپایلر از فایل “custom/config/custom_task_cfg.h” استفاده میکنیم که به این شکل هست:
1 2 3 4 5 6 7 8 9 | /*---------------------------------------------------------------------------------------------------- | Task Entry Function | Task Id Name | Task Stack Size (Bytes) | Default Value1 | Default Value2 | *----------------------------------------------------------------------------------------------------*/ TASK_ITEM(proc_main_task, main_task_id, 10*1024, DEFAULT_VALUE1, DEFAULT_VALUE2) TASK_ITEM(proc_reserved1, reserved1_id, 5*1024, DEFAULT_VALUE1, DEFAULT_VALUE2) TASK_ITEM(proc_reserved2, reserved2_id, 5*1024, DEFAULT_VALUE1, DEFAULT_VALUE2) ... |
حالا ما میایم و تابعهای خودمون رو بهش اضافه میکنیم که به این صورت میشه:
1 2 3 4 5 6 7 8 9 10 11 12 | /*---------------------------------------------------------------------------------------------------- | Task Entry Function | Task Id Name | Task Stack Size (Bytes) | Default Value1 | Default Value2 | *----------------------------------------------------------------------------------------------------*/ TASK_ITEM(proc_main_task, main_task_id, 10*1024, DEFAULT_VALUE1, DEFAULT_VALUE2) TASK_ITEM(proc_reserved1, reserved1_id, 5*1024, DEFAULT_VALUE1, DEFAULT_VALUE2) TASK_ITEM(proc_reserved2, reserved2_id, 5*1024, DEFAULT_VALUE1, DEFAULT_VALUE2) TASK_ITEM(proc_subtask1, subtask1_id, 5*1024, DEFAULT_VALUE1, DEFAULT_VALUE2) TASK_ITEM(proc_subtask2, subtask2_id, 10*1024, DEFAULT_VALUE1, DEFAULT_VALUE2) TASK_ITEM(proc_subtask3, subtask3_id, 5*1024, DEFAULT_VALUE1, DEFAULT_VALUE2) ... |
توی پارامتر اول نام تابع رو معرفی میکنیم، پارامتر دوم یک شناسه برای هر تابع هست و پارامتر سوم میزان stack مورد نیاز برای هر تابع رو مشخص میکنه.
تست دریافت از GPS
برای ساخت ردیاب ما میخوایم بدونیم موقعیت GPS پیداشده یا نه، به همین خاطر اون رو با یک led روی ماژول مشخص میکنیم. برای همین اون پین رو مشخص میکنیم و بعد از اون اولین کار این هست که بعد از آماده شدن RIL بخش GPS ماژول را روشن کنیم (خط 18). این تابع اصلیمون هست:
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 | void proc_main_task(s32 taskId) { s32 ret; ST_MSG msg; Ql_GPIO_Init(LED_1, PINDIRECTION_OUT, PINLEVEL_LOW, PINPULLSEL_PULLUP); Ql_GPIO_SetLevel(LED_1, PINLEVEL_LOW); while (TRUE) { Ql_OS_GetMessage(&msg); switch (msg.message) { case MSG_ID_RIL_READY: APP_DEBUG("LOAD LEVEL 1 (RIL READY)\r\n"); Ql_RIL_Initialize(); RIL_STATUS = 1; GPSPower(1); break; case MSG_ID_URC_INDICATION: APP_DEBUG("Received URC: type: %d\r\n", msg.param1); switch (msg.param1) { case URC_GSM_NW_STATE_IND: APP_DEBUG("GSM Network Status:%d\r\n", msg.param2); break; case URC_GPRS_NW_STATE_IND: APP_DEBUG("GPRS Network Status:%d\r\n", msg.param2); if (NW_STAT_REGISTERED == msg.param2 || NW_STAT_REGISTERED_ROAMING == msg.param2) { APP_DEBUG("LOAD LEVEL 2 (NETWORK REGISTERED)\r\n"); stable = 1; } break; } break; } } } |
همچنین متغیر stable رو در زمانی که بخش GPRS آماده بود 1 میکنیم (خط 33).
اینجا هم میتونید لیست پینها و اینکه کدوم میتونند GPIO یا نوع دیگه ای باشند رو ببینید ما پین 35 رو استفاده میکنیم.
مدیریت زیر وظیفهها
حالا اولین subtask (زیر وظیفه) رو به خوندن از سریال اختصاص میدیم.
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 | //Read serial port void proc_subtask1(s32 TaskId) { s32 ret; ST_MSG msg; ST_UARTDCB dcb; Enum_SerialPort mySerialPort = UART_PORT1; dcb.baudrate = 115200; dcb.dataBits = DB_8BIT; dcb.stopBits = SB_ONE; dcb.parity = PB_NONE; dcb.flowCtrl = FC_NONE; Ql_UART_Register(mySerialPort, CallBack_UART_Hdlr, NULL); Ql_UART_OpenEx(mySerialPort, &dcb); Ql_UART_ClrRxBuffer(mySerialPort); APP_DEBUG("START PROGRAM (SISOOG.COM)\r\n"); while (TRUE) { Ql_OS_GetMessage(&msg); switch (msg.message) { case MSG_ID_USER_START: break; default: break; } } } |
دومی رو برای بهروزرسانی اطلاعات مکانی. در ابتدا یک وقفه 1 ثانیه داریم که اطلاعات ما هر 1 ثانیه بروز بشوند.
سپس بررسی میکنیم که بخش RIL آماده هست یا نه؟
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 | //Update location data proc_subtask2(s32 TaskId) { while (1) { Ql_Sleep(1000); if (RIL_STATUS = 1 ) { iRet = RIL_GPS_Read("RMC", RMC_BUFFER); if (RIL_AT_SUCCESS != iRet) { APP_DEBUG("Read %s information failed.\r\n", "RMC"); } else { if (RMC_BUFFER[30] == 'A') { Ql_GPIO_SetLevel(LED_1, PINLEVEL_HIGH); Ql_Sleep(50); Ql_GPIO_SetLevel(LED_1, PINLEVEL_LOW); Ql_Sleep(50); Ql_GPIO_SetLevel(LED_1, PINLEVEL_HIGH); Ql_Sleep(50); Ql_GPIO_SetLevel(LED_1, PINLEVEL_LOW); } else if (RMC_BUFFER[30] == 'V') { Ql_GPIO_SetLevel(LED_1, PINLEVEL_HIGH); Ql_Sleep(50); Ql_GPIO_SetLevel(LED_1, PINLEVEL_LOW); } } } } } |
اگر RIL آماده بود، اطلاعات رو با فرمت RMC میخونیم که جزئیاتش رو میتونید توی تصویر ببینید:
بعد از اون چک میکنیم که اگر کاراکتر 30ام برابر A بود (به معنی بهدست آمدن موقعیت) LED دو بار چشمک بزند و در غیر این صورت فقط یکبار.
و سومین تسک رو برای ارسال دیتاها به سرور استفاده میکنیم که در ابتدا مقدار پارامتر location رو برابر مکان بهدست اومده میکنه و اون رو توی یک متغیر میریزیم و با تابع HTTP_Program اون رو به سرور به صورت post ارسال میکنیم.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | // Send location data to server proc_subtask3(s32 TaskId) { while (1) { Ql_Sleep(3000); if (stable == 1) { Ql_strcpy(postMsg, "location="); Ql_strcat(postMsg, RMC_BUFFER); Ql_strcat(postMsg, "\0"); HTTP_Program(); } } } |
این هم تابع خواندن سریال که دستورات رو میتونیم توش مشخص کنیم. به طور مثال با فرستادن دستور GPSOff بخش GPS رو خاموش میکنیم یا با location آخرین موقعیت رو میخونیم.
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 | static void CallBack_UART_Hdlr(Enum_SerialPort port, Enum_UARTEventType msg, bool level, void *customizedPara) { switch (msg) { case EVENT_UART_READY_TO_READ: { char *p = NULL; s32 totalBytes = ReadSerialPort(port, m_RxBuf_Uart, sizeof(m_RxBuf_Uart)); if (totalBytes <= 0) { break; } if (Ql_strstr(m_RxBuf_Uart, "GPSOn")) { APP_DEBUG("ok\r\n"); GPSPower(1); break; } if (Ql_strstr(m_RxBuf_Uart, "GPSOff")) { APP_DEBUG("ok\r\n"); GPSPower(0); break; } if (Ql_strstr(m_RxBuf_Uart, "location")) { APP_DEBUG("ok\r\n"); APP_DEBUG("%s \r\n", RMC_BUFFER); break; } break; } } } |
این هم از کدها به صورت کامل:
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 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 | #ifdef __CUSTOMER_CODE__ #include "custom_feature_def.h" #include "ril.h" #include "ril_util.h" #include "ril_telephony.h" #include "ql_stdlib.h" #include "ql_error.h" #include "ql_trace.h" #include "ql_uart.h" #include "ql_system.h" #include "ril_network.h" #include "ril_http.h" #include "ql_timer.h" #define APN_NAME "mcinet\0" #define APN_USERID "" #define APN_PASSWD "" s32 stable = 0; s32 SENDING_TO_SERVER = 0; s32 rep = 0; s32 RIL_STATUS = 0; s32 iRet = 0; static u32 Stack_timer = 0x102; static u32 ST_Interval = 3000; static s32 m_param1 = 0; static u32 m_rcvDataLen = 0; char HTTP_URL_ADDR[100] = "http://mahdi2001h.ir/utils/location.php\0"; u8 RMC_BUFFER[1000]; u8 postMsg[300] = ""; u8 arrHttpRcvBuf[10 * 1024]; Enum_PinName LED_1 = PINNAME_RI; #define SERIAL_RX_BUFFER_LEN 2048 char m_RxBuf_Uart[SERIAL_RX_BUFFER_LEN]; #define DEBUG_ENABLE 1 #if DEBUG_ENABLE > 0 #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__); \ if (UART_PORT2 == (DEBUG_PORT)) \ { \ Ql_Debug_Trace(DBG_BUFFER); \ } \ else \ { \ Ql_UART_Write((Enum_SerialPort)(DEBUG_PORT), (u8 *)(DBG_BUFFER), Ql_strlen((const char *)(DBG_BUFFER))); \ } \ } #else #define APP_DEBUG(FORMAT, ...) #endif #define SERIAL_RX_BUFFER_LEN 2048 static Enum_SerialPort m_myUartPort = UART_PORT1; static u8 m_RxBuf_Uart1[SERIAL_RX_BUFFER_LEN]; static void Timer_handler(u32 timerId, void *param); static void CallBack_UART_Hdlr(Enum_SerialPort port, Enum_UARTEventType msg, bool level, void *customizedPara); static s32 ATResponse_Handler(char *line, u32 len, void *userData); static void HTTP_Program(); void proc_main_task(s32 taskId) { s32 ret; ST_MSG msg; Ql_GPIO_Init(LED_1, PINDIRECTION_OUT, PINLEVEL_LOW, PINPULLSEL_PULLUP); Ql_GPIO_SetLevel(LED_1, PINLEVEL_LOW); while (TRUE) { Ql_OS_GetMessage(&msg); switch (msg.message) { case MSG_ID_RIL_READY: APP_DEBUG("LOAD LEVEL 1 (RIL READY)\r\n"); Ql_RIL_Initialize(); RIL_STATUS = 1; GPSPower(1); break; case MSG_ID_URC_INDICATION: APP_DEBUG("Received URC: type: %d\r\n", msg.param1); switch (msg.param1) { case URC_GSM_NW_STATE_IND: APP_DEBUG("GSM Network Status:%d\r\n", msg.param2); break; case URC_GPRS_NW_STATE_IND: APP_DEBUG("GPRS Network Status:%d\r\n", msg.param2); if (NW_STAT_REGISTERED == msg.param2 || NW_STAT_REGISTERED_ROAMING == msg.param2) { APP_DEBUG("LOAD LEVEL 2 (NETWORK REGISTERED)\r\n"); stable = 1; } break; } break; } } } //Read serial port void proc_subtask1(s32 TaskId) { s32 ret; ST_MSG msg; ST_UARTDCB dcb; Enum_SerialPort mySerialPort = UART_PORT1; dcb.baudrate = 115200; dcb.dataBits = DB_8BIT; dcb.stopBits = SB_ONE; dcb.parity = PB_NONE; dcb.flowCtrl = FC_NONE; Ql_UART_Register(mySerialPort, CallBack_UART_Hdlr, NULL); Ql_UART_OpenEx(mySerialPort, &dcb); Ql_UART_ClrRxBuffer(mySerialPort); APP_DEBUG("START PROGRAM (SISOOG.COM)\r\n"); while (TRUE) { Ql_OS_GetMessage(&msg); switch (msg.message) { case MSG_ID_USER_START: break; default: break; } } } //Update location data proc_subtask2(s32 TaskId) { while (1) { Ql_Sleep(1000); if (RIL_STATUS = 1) { iRet = RIL_GPS_Read("RMC", RMC_BUFFER); if (RIL_AT_SUCCESS != iRet) { APP_DEBUG("Read %s information failed.\r\n", "RMC"); } else { if (RMC_BUFFER[30] == 'A') { Ql_GPIO_SetLevel(LED_1, PINLEVEL_HIGH); Ql_Sleep(50); Ql_GPIO_SetLevel(LED_1, PINLEVEL_LOW); Ql_Sleep(50); Ql_GPIO_SetLevel(LED_1, PINLEVEL_HIGH); Ql_Sleep(50); Ql_GPIO_SetLevel(LED_1, PINLEVEL_LOW); } else if (RMC_BUFFER[30] == 'V') { Ql_GPIO_SetLevel(LED_1, PINLEVEL_HIGH); Ql_Sleep(50); Ql_GPIO_SetLevel(LED_1, PINLEVEL_LOW); } } } } } // Send location data to server proc_subtask3(s32 TaskId) { while (1) { Ql_Sleep(3000); if (stable == 1) { Ql_strcpy(postMsg, "location="); Ql_strcat(postMsg, RMC_BUFFER); Ql_strcat(postMsg, "\0"); HTTP_Program(); } } } static void HTTP_RcvData(u8 *ptrData, u32 dataLen, void *reserved) { APP_DEBUG("<-- Data coming on http, total len:%d -->\r\n", m_rcvDataLen + dataLen); if ((m_rcvDataLen + dataLen) <= sizeof(arrHttpRcvBuf)) { Ql_memcpy((void *)(arrHttpRcvBuf + m_rcvDataLen), (const void *)ptrData, dataLen); } else { if (m_rcvDataLen < sizeof(arrHttpRcvBuf)) { u32 realAcceptLen = sizeof(arrHttpRcvBuf) - m_rcvDataLen; Ql_memcpy((void *)(arrHttpRcvBuf + m_rcvDataLen), (const void *)ptrData, realAcceptLen); APP_DEBUG("<-- Rcv-buffer is not enough, discard part of data (len:%d/%d) -->\r\n", dataLen - realAcceptLen, dataLen); } else { APP_DEBUG("<-- No more buffer, discard data (len:%d) -->\r\n", dataLen); } } m_rcvDataLen += dataLen; } static void HTTP_Program() { s32 ret; m_rcvDataLen = 0; ret = RIL_NW_SetGPRSContext(Ql_GPRS_GetPDPContextId()); APP_DEBUG("START SEND TO SERVER\r\n"); ret = RIL_NW_SetAPN(1, APN_NAME, APN_USERID, APN_PASSWD); APP_DEBUG("<-- Set GPRS APN, ret=%d -->\r\n", ret); ret = RIL_NW_OpenPDPContext(); APP_DEBUG("<-- Open PDP context, ret=%d -->\r\n", ret); ret = RIL_HTTP_SetServerURL(HTTP_URL_ADDR, Ql_strlen(HTTP_URL_ADDR)); APP_DEBUG("<-- Set http server URL, ret=%d -->\r\n", ret); ret = RIL_HTTP_RequestToPost(postMsg, Ql_strlen((char *)postMsg)); APP_DEBUG("<-- Send post-request, ret=%d -->\r\n", ret); ret = RIL_HTTP_ReadResponse(120, HTTP_RcvData); APP_DEBUG("READ SERVER RESPONSE (dataLen=%d) \r\n", m_rcvDataLen); ret = RIL_NW_ClosePDPContext(); APP_DEBUG("<-- Close PDP context, ret=%d -->\r\n", ret); } static s32 ReadSerialPort(Enum_SerialPort port, /*[out]*/ u8 *pBuffer, /*[in]*/ u32 bufLen) { s32 rdLen = 0; s32 rdTotalLen = 0; if (NULL == pBuffer || 0 == bufLen) { return -1; } Ql_memset(pBuffer, 0x0, bufLen); while (1) { rdLen = Ql_UART_Read(port, pBuffer + rdTotalLen, bufLen - rdTotalLen); if (rdLen <= 0) { break; } rdTotalLen += rdLen; } return rdTotalLen; } void GPSPower(int status) { if (status == 1) { iRet = RIL_GPS_Open(1); if (RIL_AT_SUCCESS != iRet) { APP_DEBUG("GPS is on \r\n"); } else { APP_DEBUG("Power on GPS Successful.\r\n"); } } else if (status == 0) { iRet = RIL_GPS_Open(0); if (RIL_AT_SUCCESS != iRet) { APP_DEBUG("GPS is off \r\n"); } else { APP_DEBUG("Power off GPS Successful.\r\n"); } } } static void CallBack_UART_Hdlr(Enum_SerialPort port, Enum_UARTEventType msg, bool level, void *customizedPara) { switch (msg) { case EVENT_UART_READY_TO_READ: { char *p = NULL; s32 totalBytes = ReadSerialPort(port, m_RxBuf_Uart, sizeof(m_RxBuf_Uart)); if (totalBytes <= 0) { break; } if (Ql_strstr(m_RxBuf_Uart, "GPSOn")) { APP_DEBUG("ok\r\n"); GPSPower(1); break; } if (Ql_strstr(m_RxBuf_Uart, "GPSOff")) { APP_DEBUG("ok\r\n"); GPSPower(0); break; } if (Ql_strstr(m_RxBuf_Uart, "location")) { APP_DEBUG("ok\r\n"); APP_DEBUG("%s \r\n", RMC_BUFFER); break; } break; } } } #endif // __CUSTOMER_CODE__ |
دقت کنید که آدرس سرور رو در متغیر HTTP_URL_ADDR (خط 30) قرار دادیم.
راه اندازی سرور
حالا میریم سراغ سرور
من کدهای سمت سرور رو با php نوشتم و فقط یک کد ساده هست که کلیات کار رو برای ساخت ردیاب متوجه بشید.
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 | <?php if (!isset($_POST['location'])) { header("Location: " . file_get_contents("loc.txt")); exit(); } $Data = explode(",", $_POST['location']); $lat = convert($Data[3]); $lon = convert($Data[5]); $addr = "https://www.google.com/maps/@"; file_put_contents("loc.txt", $addr . $lat . "," . $lon . ",18z"); echo "Data logged"; function convert($in) { $string = explode(".", $in / 100); $dgree = $string[0] * 60; $string[1] = $string[1] * (pow(10, 6 - count(str_split($string[1])))); $min = ($string[1] / 10000); $min = $min + $dgree; return $min / 60; } ?> |
در ابتدا بررسی میشه که آیا مقداری توسط post به صفحه ارسال شده یا نه، اگر شده باشه اطلاعات رو بر اساس, جدا میکنه و توی یک آرایه میریزه.
بعد از اون نیاز هست که ما یک تبدیل واحد برای طول و عرض جغرافیایی داشته باشیم که تابع convert اینکار رو انجام میده.
سپس طول و عرض جغرافیایی با آدرس مپ گوگل ترکیب میشه و توی یک فایل ذخیره میشه.
حالا اگر ما با مرورگر به همین صفحه بیایم چونکه مقدار post ارسال نمیکنیم شرط اول اجرا میشه و مارا به آدرسی که توی فایل ذخیره شده هدایت میکنه که آخرین نقطه فرستاده شده هست.
دقت کنید که جایی که این فایل رو در سرور یا هاست ذخیره میکنید در کنارش یک فایل خالی با نام “loc.txt” بسازید.
در این بخش میتونید به همه قسمتهای سری آموزش ماژول mc60 دسترسی پیدا کنید:
- کار با ماژول تمام عیار mc60 – قسمت اول – برد راه انداز
- کار با ماژول تمام عیار mc60 – قسمت دوم – راه اندازی OpenCPU
- کار با ماژول تمام عیار mc60 – قسمت چهارم – OpenCPU و تکمیل ردیاب
- کار با ماژول تمام عیار mc60 – قسمت پنجم – ساخت MP3 Player
- کار با ماژول تمام عیار mc60 – قسمت ششم – نمایشگر oled
- کار با ماژول تمام عیار mc60 – قسمت هفتم – کار با MQTT
- کار با ماژول تمام عیار mc60 – قسمت هشتم – کدنویسی با Eclipse
سلام
یه سوال ابتدایی دارم!
منظور از RIL در الکترونیک چیه؟
بعد از متن “تست دریافت از GPS” در خط پایین اومده که “بعد از اون اولین کار این هست که بعد از آماده شدن RIL بخش GPS ماژول را روشن کنیم (خط 18). این تابع اصلیمون هست”
ممنون
سلام
در واقع در الکترونیک معنی خاصی نداره
این یک اصطلاح مربوط به Open Cpu ماژول های کوییکتل هست
مخفف Radio Interface Layer هست و در واقع توابعی هستند که به کمک اونها میتونیم با هسته اصلی ماژول ارتباط بگیریم
ممنونم استاد
سلام وقتی سرور خودم می ذارم صفحه سفید می یاد کسی می دونه مشکلش چیه
برای تست باید دانش برنامه نویسی سایت رو داشته باشید که بتونید مشکل رو پیدا کنید
یا نکته دقیق تری بگید که بتونم راهنمایی کنم
سلام من برد راه انداز شما را دارم همین کد را داخلش ریختم برای این که چک کنم اصن موقعیت مکانی را پیدا می کنه یا نه که دیدم این اتفاق نمی افته آیا باید تغییری در سخت افزار بدم یا خیر
سلام
با توجه به توضیحاتی که توی این قسمت آموزش و قسمت های قبل داده شده باید بررسی کنید که در چه مرحله ای مشکل دارید و مشکل رو دقیق تر بازگو کنید تا بتونم بهتون جواب بدم
ig.o:(.rodata+0x40): undefined reference to
proc_subtask1'
proc_subtask2′./custom/config/sys_config.o:(.rodata+0x54): undefined reference to
./custom/config/sys_config.o:(.rodata+0x68): undefined reference to `proc_subtask3′
collect2.exe: error: ld returned 1 exit status
make: *** [APPGS3MDM32A01.elf] Error 1
توی فایل کانفیگ اون توابع رو اضافه کردم ولی این میاد موقع بیلد کردن
این ارور میگه که این سه تا تابع جایی قابل دسترسی نیست ، یعنی شما توی فایل main.c خودتون این سه تا تابع رو اضافه نکردید
خیلی ممنونم ازتون
این اکلیپس قلق زیاد داره، سرویس شدم
باید بعد از هر تغییر حتما فایل رو سیو بزنیم بعد کامپایل کنیم تا تغییراتو بشناسه، اونم سیو نزده بودم هی ارور میداد
برا بقیه هم همینطوره؟ یا تنظیم خاصی داره
برای همه موارد ایکلیپس تنظیمات داره
اگر نگاه کنید توی تنظیمات گزینه ای داره که قبل از کامپایل ذخیره کنه
ایکلیپس برای هر جزییاتی تنظیماتی داره 🙂
سلام وقت بخیر
چطور میشه صدای نویز رو از میکروفن MC60 حذف کرد؟
خازن های 33پیکو و 10 پیکو رو گذاشتم. اما بازهم در طول تماس بازم صدای نویز شنیده میشه.
سلام
بهتره که بخش audio بر اساس این داکیومنت طراحی بشه
کیفیت خازن های مورد استفاده هم خیلی مهمه.
همچنین لازمه از کنار منابع نویز رد نشه همینجور بهتره بصورت تفاضلی و موازی دو تا ورودی میکروفن کشیده بشه
سلام وقت بخیر
بنده ماژول رو راه اندازی کردم با برد داخل سایت شما
مشکلم اینه که مقدار gps صفر بر می گرده و هیچ تغییری هم نمی کنه ولی مابقی ماژول به درستی کار می کنه
+QGNSSRD: $GNRMC,082731.950,V,,,,,0.00,0.00,280622,,,N*5C
$GNVTG,0.00,T,,M,0.00,N,0.00,K,N*2C
$GNGGA,082731.950,,,,,0,0,,,M,,M,,*55
$GPGSA,A,1,,,,,,,,,,,,,,,*1E
$GLGSA,A,1,,,,,,,,,,,,,,,*02
$GPGSV,1,1,03,01,,,21,30,,,23,14,,,22*7F
$GLGSV,1,1,01,81,,,*6D
$GNGLL,,,,,082731.950,V,N*67
آنتن gps هم پسیوه فرقی داره ؟
باید کار دیگه ای بکنم ؟
سلام
این برد برای استفاده از آنتن اکتیو طراحی شده ، برای استفاده از آنتن پسیو ، مقاومت زیر برد رو دمونتاژ کنید.
دقت کنید که آنتن نباید زیر سقف باشه و باید رو به آسمون باشه
سلام وقت بخیر برای بردMC60 IOT باید کدوم مقاومت دمونتاژ بشه و نبود این مقاومت چه تاثیری داره؟ ممکنه برای چه عملیاتی مشکل به وجود بیاد؟
سلام. برد MC60 IOT روی خودش آنتن پسیو داره و اصلا مداری برای آنتن اکتیو نداره که بخواید حذفش کنید.
سلام خسته نباشید من همین مراحل را رفتم ولی وقتی کد را کامپایل میکنم وارنینگ های زیادی میگیریم همچنین ارور های زیر که مربوط به proc_reserved1و proc_reserved2 و RIL_GPS_Openهستند توی کتابخونه custom_task_cfg.h طبق آموزش رفتم و اون توابع را اضافه کردم اما همچنان این ارور ها رو دارم ممنون میشم راهنمایی کنید
build/gcc/obj/custom/config/sys_config.o:(.rodata.TaskConfig+0x14): undefined reference to
proc_reserved1'
proc_reserved2′build/gcc/obj/custom/config/sys_config.o:(.rodata.TaskConfig+0x28): undefined reference to
build/gcc/obj/custom/main.o: In function
$LCFI0':
RIL_GPS_Open’custom/main.c:(.text.GPSPower+0xa): undefined reference to
value:0, p:883161ae, addend:0, symbol:0
custom/main.c:(.text.GPSPower+0xa): relocation truncated to fit: R_MIPS16_26 against
RIL_GPS_Open'
RIL_GPS_Open’custom/main.c:(.text.GPSPower+0x42): undefined reference to
value:0, p:883161e6, addend:0, symbol:0
custom/main.c:(.text.GPSPower+0x42): relocation truncated to fit: R_MIPS16_26 against
RIL_GPS_Open'
$LCFI11′:build/gcc/obj/custom/main.o: In function
custom/main.c:(.text.proc_subtask2+0x1a): undefined reference to
RIL_GPS_Read'
RIL_GPS_Read’value:0, p:88316566, addend:0, symbol:0
custom/main.c:(.text.proc_subtask2+0x1a): relocation truncated to fit: R_MIPS16_26 against
make/gcc/gcc_makefiledef:82: recipe for target ‘build/gcc/APPGS5MDM32A01.elf’ failed
make: *** [build/gcc/APPGS5MDM32A01.elf] Error 1
سلام
ارور داره به proc_reserved1 گیر میده که اصلا ما کاری باهاش نداریم!
احتمالا فایلی رو اشتباه پاک کردید یا تغییر دادید
یک بار دیگه sdk رو اکسترکت کنید و اول با یک کد ساده (مثلا یه blink) از روند کامپایل و پروگرامتون مطمئن بشید و بعد کد ها رو ویرایش کنید
سلام
بعد از متصل شدن به اینترنت و گرفتن ip هیچکدوم از دستورات MQTT اجرا نمیشه و توی ترمینال به صورت At-Command پاسخ +CME ERROR: 100 رو دریافت میکنم.در انتها هم log ترمینال رو میتونید ببینید. ممنون میشم اگر راهنمایی بفرمایید.
Serial port COM8 opened
AT
OK
AT+CPIN?
+CPIN: READY
OK
AT+CREG?
+CREG: 0,1
OK
AT+CGREG?
+CGREG: 0,1
OK
AT+QIMODE=0
OK
AT+QICSGP=1,”mcinet”
OK
AT+QIREGAPP
OK
AT+QICSGP?
+QICSGP: 1
OK
AT+QIACT
OK
AT+QILOCIP
21.44.26.101
AT+QMTOPEN=0,”tb-srv.abreman.ir”,”1883″
+CME ERROR: 100
Serial port COM8 closed
سلام ممنون از آموزش خوبتون.بنده همین کد شما رو با همین ادرس سرورتون داخل ماژول میریزم سخت افرار موقعیت با چراغ چشمک زن اعلام میکنه ولی داخل نقشه مکان پیدا نمیکنه ایا غیر از این کد تنظیم دیگری باید انجام داد؟
سلام برشما
بهتره که اطلاعات رو به سروری که خودتون تنظیم میکنید ارسال کنید(این سرور برای نمونه هست).
در عین حال تنظیماتی نیاز نیست ، اگر سخت افزار به درستی راه اندازی بشه نباید مشکلی توی نمایش اطلاعات باشه.
سلام ممنون از آموزش خوبتون.من همین کد روی ماژول میریزم اطلاعات با چراغ چشمک زن دریافت میشه ولی داخل نقشه سرورتون مکان دریافت نمیشه مشکل از کجا هست غیر از این کدتون تنظیم خاصی باید انجام داد؟
این gps دقتش چند متر هست؟
توی فروشگاهتون سه تاmc60 هست کدومش قابلیت gps داره چون ننوشته
دوست عزیز این GPS هم مشابه نمونه های مشابه هست و دقتش در بهترین حالت زیر 2.5 متر هست
همه نمونه هایی که هست GNSS دارند
سلام خسته نباشید
برای فرستادن اطلاعات به سرور
در خط 221 برنامه (ret = RIL_NW_SetAPN(1, APN_NAME, APN_USERID, APN_PASSWD ایا لازم هست که یوزر و پسوردی وارد بشه ؟؟
ااگر لازمه ؟ نیاز به یوزر و پسورد ftp سرور وجود دارد یا خیر ؟؟
ممنون میشم راهنمایی کنید …
سلام
این پارامترها برای اتصال به شبکه تلفن هست اگر همون APN_NAME رو وارد کنیم کافی هست ، مثل کاری که در گوشی انجام میدیم.
برای بحث ftp هم ، شما میتونید از example هایی که توی sdk هست استفاده بکنید، توی اونها تابعی به نام RIL_FTP_QFTPOPEN هست که خودش همه اطلاعات ftp رو دریافت میکنه ، از جمله آدرس سرور و یوزر و پسورد و …
خیلی ممنون از توضیحات خوب و اموزش های مفید شما
سلام. وقت بخیر. ببخشید؛ کدی که برای سمت سرور نوشتید رو من داخل سرور خودم گذاشتم ولی هیچ چیزی نشون نمیده و فقط یه صفحه سفید نشون میده.
این هم آدرسش:
http://mstcorporation.gigfa.com/index.php
اشکال از چیه؟
آیا باید برای بار اول، ماژول، مختصات رو بفرسته تا نقشه گوگل نمایان بشه یا اینکه نه، اگر هم نفرسته، نقشه گوگل باید نشون داده بشه؟
ممنون از کمک شما.
سلام. بله حداقل یکبار باید دیتا فرستاده بشه تا نقشه نشون داده بشه
ممنون از شما. یعنی هیچ چیز دیگه ای نباید کنار این کد باشه؟
چون من فایل های سرور خودتون رو میدیدم، انگار از API استفاده کردین. یک پوشه به نام map کنار فایل location.php وجود داشت. همچنین چندتا پوشه دیگه هم بود.
اینا مورد نیاز هست با نه؟!
سلامی دوباره. ببخشید آقا مهدی؛ من وقتی سرور شما رو میذارم داخل کد ماژول، به درستی اطلاعات مکان ارسال میشه به سایتتون و داخل فایل loc.txt شما هم میشینه. ولی وقتی من سرور خودم رو میگذارم داخل کد های ماژول، با توجه به شرط اول کدی که در سمت سرور هست، سرور من هیچ داده ای رو دریافت نمیکنه. چرا؟؟ وقتی محتویات فایل loc.txt شما رو میگذارم داخل فایل loc.txt خودم، خب با توجه به شرط اول سرور، نقشه گوگل به همراه همون نقطه فایل loc دیده میشه به خوبی. اما هرکاری میکنم، سرور من هیچ داده ای رو نمیگیره.
تنظیمات سایت یا سرور مهم است؟ کار خاصی باید کرد؟
این هم از گزارش پورت سریال:
Set http server URL, ret=0
Send post-request, ret=0
Data coming on http, total len:853
READ SERVER RESPONSE (dataLen=853)
Close PDP context, ret=0
START SEND TO SERVER
Set GPRS APN, ret=0
– Open PDP context, ret=0
Set http server URL, ret=0
Send post-request, ret=0
Data coming on http, total len:853
READ SERVER RESPONSE (dataLen=853)
Close PDP context, ret=0 –>
وقتی به سایت شما میفرستم اطلاعات رو، datalen 22 میشه ولی از من همیشه 853 هست. برای یه سایت دیگه هم میفرستادم، اون 0 بود.
اجازه دسترسی نوشتن هم دادم برای فایل سرورم که اسمش index.php هست. ولی بازهم هیچی به هیچی…
لطفا کمک کنید. خیلی خیلی ممنونم از شما.
سلام
نکته اول اینکه تمام چیزی که شما نیاز دارید همان کدی هست که در بالا هست و هیچ چیز دیگری لازم نیست.
برای تست کد سمت سرورتون برای راحتی کار میتونید از نرم افزار هایی مانند postman استفاده کرده و دیتایی که ماژول باید بفرسته رو نرم افزاری بنویسید.
توی کدتون هم این خط رو بزارید “ini_set(‘display_errors’, 1);” تا اگه اروری سمت سرورتون هست بتونید بررسیش کنید.
در ضمن ممکنه چون از هاست رایگان استفاده میکنید یکسری امکانات رو براتون فعال نکرده باشند!
سلام. درست میفرمایید. حتما بررسی میکنم و نتیجه را همینجا جهت استفاده دیگران از این تجربه، به اشتراک خواهم گذاشت انشاءالله…
سلام. وقت بخیر. ببخشید که خیلی دیر دارم نتیجه کار رو میگم ولی خب احساس کردم باید اعلام کنم:
دلیل اینکه اطلاعات من، از ماژول به سرور ارسال نمیشد، این بود که من سرور رایگان انخاب کرده بودم. بعد که دیدم مشکل حل نمیشه، آقا مهدی و چندتن از دوستان فرمودند ممکنه مشکل از سروری باشه که سایتت رو توش راه اندازی کردی. چون سرور های رایگان، محدودیت هایی دارند.
رفتم سرور پولی خریدم، یکماهه 15 ت خریدم. برای تست. دیدم مشکلم حل شد.
دوستان توی برنامه نویسی سایتتون، اگه نیاز به کمک داشتید، میتونم کمک کنم که راحت توی نقشه نشان، با آپدیت هر چند ثانیه یکبار به صورت خودکار، موقعیت مکانی رو راحت ببینید.
این هم ایمیل من:
mstcompany2012@gmail.com
سلام. وقت بخیر. ببخشید؛ کدی که برای سمت سرور نوشتید رو من داخل سرور خودم گذاشتم ولی هیچ چیزی نشون نمیده و فقط یه صفحه سفید نشون میده.
این هم آدرسش:
http://mstcorporation.gigfa.com/index.php
اشکال از چیه؟
آیا باید برای بار اول، ماژول، مختصات رو بفرسته تا نقشه گوگل نمایان بشه یا اینکه نه، اگر هم نفرسته، نقشه گوگل باید نشون داده بشه؟
ممنون از کمک شما.
سلام
کسی با ذخیره سازی اطلاعات برروی حافظه خود MC60 کار کرده من example مربوط example_memory.c رو کارکردم اما دقیقا متوجه نشدم چطور روی حافظه ذخیره میشه ///
آیا کسی موفق شده یکسری اطلاعات رو ذخیره کنه روی خود mc60 ؟؟// ممنون میشم نظرتون رو بگین
سلام دوست عزیز
چه طور اطلاعاتی و با چه حجمی رو میخواید ذخیره کنید
mc60 دو مدل حافظه داره – یکی فایل سیستمش هست که میتونید فایل روش ذخیره کنید و دستورات سطح بالا برای کار باهاش داره و یکی دیگه حافظه محدودی داره در حد ۵۰۰ بایت که مثل eeprom میمونه و برای ذخیره سازی تنظیمات مناسب هست.
با سلام
بنده برنامه های مربوط به example فایل sdk رو نتونستم با موفقیت کامپایل کنم .
به طور مثال من برای کامپایل کردن example_call.c من مراحل زیر را رفتم اما کامپایل نشد
1) سورس کد مربوط به همینو کپی و داخل فایل main.c پیس کردم
2) C_PREDEF=-D __EXAMPLE_CALL__ رو داخل فایل gcc_makefile قرار دادم
3 ) کامپایل کردم make clean & make new
————————-
طی سه گام بالا من موفق نشدم ممنون میشم منو راهنمایی کنید
مشکل بنده رفع شد // فقط نیازی نبود که که برنامه رو به داخل فایل main بریزم // فقط تغییرات اعمالی در gcc_makefile شامل میشود .
مثال من برای کامپایل کردن example_call.c من مراحل زیر را رفتم و به خوبی کار میکرد>>>
1) C_PREDEF=-D __EXAMPLE_CALL__ رو داخل فایل gcc_makefile قرار دادم
2)کامپایل کردم make clean & make new
متشکر که تجربه خودتون رو به اشتراک گذاشتید 🙂
سلام
ممنون از آموزش های خوبتون در رابطه با MC60 /// فوق العاده بودین
!!! در تابع Ql_Sleep بیشتر از 500 میلی ثانیه وقفه انجام نمیده و ماکسیسم همون 500 میلی ثانیه است یعنی هر چه بالاتر بزنیم باز هم همون 500 میلی وقفه را انجام خواهد
دلیل این امر هم خود کوکیتل این چنین بیان کرده که بیشتر از این ممکن باعث تداخل در ارسال و دریافت گردد // صفحه ای 34 آموزش open cpu Mc60
شما چطور از تاخیر 3 یا 1 ثانیه ای استفاده کرده اید ؟
سلام دوست عزیز
خب میتونید از یک حلقه استفاده کنید و این مقدار تاخیر را چند باره تکرار کنید
با عرض سلام و خسته نباشید
چرا وقتی کامند AT+QGNSSC=1 ارسال میکنم مقدار خیلی زیادی عدد بر می گردونه؟
سلام. وقت بخیر.
ببخشید من یه مشکل بزرگ دارم و اون هم اینه که: با نرم افزار qnavigator که برنامه و کدهای پیش فرض خود شرکت quectel هم روش نصب هستش، اقدام به خواندن موقعیت مکانی میکنم. ولی چه با آنتن اکتیو(همراه با تغذیه) و چه با پسیو(بدون تغذیه) فقط اطلاعات زمانی رو خیلی سریع دریافت میکنه و اطلاعات مکان رو یا دریافت نمیکنه، یا بعد از حدود یک ساعت دریافت میکنه.
وقتی هم اطلاعات مکانی رو دریافت میکنه، حداقل به 4 تا ماهواره وصله و به 10 تا هم میرسه و دقت فوق العاده بالا میره. و تا چند ساعت هم اگه خاموش نشه ماژول، خیلی خوب اطلاعات مکانی رو نشون میده. اما وقتی ماژول رو خاموش میکنم و بعد از چندثانیه یا بعد چند ساعت، ماژول رو روشن میکنم، میبینم که اصلا نمیتونه اطلاعات مکان رو دریافت کنه. حتی ممکنه اطلاعات زمان و تاریخ هم نتونه بدست بیاره. به نظرتون چرا اینجوری میشه؟؟
این رو هم بگم به دلیل فضای کم، از یک باطری 200 میلی آمپری استفاده کردیم ولی دوسر تغذیه، خازن 1500میکرو گذاشتیم که خوب میتونه جبران جریان لحظه ای رو بکنه و در تماس و پیامک هیچ مشکلی نداریم، بخش تغذیه gnss هم ارور نمیده ولی موقعیت مکانی رو به این شکل نشون میده که گفتم. مثل دوستمون، از 1000 بار کد فرستادن، بعد از مدت زیادی، اطلاعات مکان رو دریافت میکنه و فیکس هم میشه و خیلی هم خوبه، ولی وقتی خاموشش میکنیم و همون لحظه یا مدت زیادی روشنش میکنیم، دوباره روز از نو و روزی از نو…
خواهشا دوستان کمک کنید. ممنون از همگی.
سلام دوست عزیز
من حدس میزنم انتن شما واقعا مناسب نیست
انتن تون به آسمون دید داره؟
انتن اکتیو استفاده میکنید مقاومت ده اهم را برای بایاس تغذیه مدار اکتیو قرار میدید؟
سلام. ممنون از پاسخ شما.
یه سقف واسطه ما و آسمون هست ولی وقتی که مکان رو بدست میاره، دقتش بالاست با وجود اینکه یک سقف هم دارم، ولی ارتفاع محل نسبتا بالاست(پشت بام).
اونوقت برای اکتیو، 10 آهن هم گذاشتم و از اونجا که میخوایم جریانمون کنترل شده باشه، تغذیه آنتن رو با یه pnp قطع و وصل میکنیم.
ارتفاع مهم نیست
انتن ترجیحا باید اسمون را ببینه حداقل برای تست های اولیه
در ضمن پیشنهاد میکنم از انتن پسیو استفاده کنید که هم مشکل تغذیه نداشته باشید و هم گیرندگی مناسب
ولی اگر هم قراره با مداری ولتاژ ار قطع و وصل کنید پیشنهاید میکنم تا رسیدن به نتیجه تست های مناسب اون را بای پس کنید
ببخشید چجوری بای پس کنم؟
خب مستقیما ولتاژ GNSS_VCC را با یک مقامت ده اهم و سلف کوچیک به انتن وصل کنید شبیه شماتیک
خب همین کار رو انجام دادم. تغذیه با مقاومت 19 اهم، به آنتن وصل شده. اگر میبینید دلیل دیگه ای نباید باشه، من یه آنتن دیگه بگیرم امتحان کنم.
ممنون.
سلام
بخش GNSS را فعال کرده ام و آنتن هم اکتیو است و در فضای باز نیز قرار داده ام ولی موقعیت جغرافیایی و… را دریافت نمی کند.
فقط بعضی وقت ها موقعیت را می فرستد. (1 در 1000)
به نظر شما مشکل کجاست؟
باتشکر
سلام
نکته اول اینکه مرجع شما برای طراحی مدار کجا بوده؟ ( برای آنتن اکتیو باید یک بخش تغذیه جرئی به مدار آنتن GNSS اضافه کنید ) میتونید از رفرنس دیزاینی که توی قسمت اول گفته شده کمک بگیرید.
و دوم اینکه منظورتون از اینکه 1 در 1000 میفرسه این هست که خیلی دیر به دیر میفرسته و یا اینکه میفرسته ولی مکان فیکس نشده؟
چون معمولا وقتی فیکس شد اگر جابجاش نکنید دیگه نباید مکانش از دست بره.
میتونید برای اطمینان ، مستقیم اطلاعات دریافتی رو از پایه GNSS_TXD بخونید (هر 1 ثانیه یکبار اتوماتیک ارسال میشه) تا ببینید مشکل از برنامه هست یا سخت افزار
سلام
من همون بردی را که در قسمت اول فایل PCB آن را گذاشته اید استفاده میکنم. بخش تغذیه آنتن هم درست می باشد.
وقتی نمونه کد قسمت سوم (ساخت ردیاب) را روی ماژول می ریزم. داده از بخش GNSS روی پورت سریال دریافت می شود . ولی فیکس نمی شود و مکان 0,0 را نشان می دهد .پس مشکل سخت افزار ندارد.
اما وقتی به صورت at commnad یا از نمونه کد gps.c خود SDK استفاده می کنم زیر مدت یک دقیقه فیکس و موقعیت را به صورت درست روی پورت سریال دریافت میکنم.
من وقتی برنامه با Qflash آپلود کردم دیگه نه کلید خاموش روشنش کار میکنه نه جی اس ام !
روی سیم کارت هم که زنگ میزنم خاموشه !
قبلش با نرم افزار qnavigator که با ATcommand کار میکردم همه چیش اوکی بود !
دوست عزیز برنامه دیفالت را یکبار بریزید روش و مجدد برنامه را پروگرم کنید
مرسی
درست شد
برنامه روش آپلود کردم
ولی متاسفانه اطلاعاتی به سرور ارسال نمیکنه !
آنتن جی پی اس بهش متصله و همچنین جی اس ام
تماس هم میگیرم با شماره بوق میخوره
سیم کارت هم شارژ داره
APN هم همون mcinet همراه اول هستش ( توی کد عوضش نکردم)
این سریال مانیتورش هستش که همینطور تکرار میشه :
START SEND TO SERVER
READ SERVER RESPONSE (dataLen=16)
این سریال مانیتورش هستش که همینطور تکرار میشه :
START SEND TO SERVER
READ SERVER RESPONSE (dataLen=16)
گویا توی کامنت سریال مانیتور حذف میشه !
START SEND TO SERVER
Set GPRS APN, ret=0
Open PDP context, ret=0
Set http server URL, ret=0
Send post-request, ret=0
Data coming on http, total len:16
READ SERVER RESPONSE (dataLen=16)
Close PDP context, ret=0
اینکه داده دریافتی 16 کاراکتر داره مشخصه که به سرور ارسال شده
اما مثل اینکه با اروری از سمت سرور مواجه میشه چون باید طول داده در یافتی مطابق پیام “Data logged” یازده کاراکتر داشته باشه (البته اگه کد رو تغییر نداشته باشید)
یک بار به صورت دستی ارسال کنید به سرور داده رو ببینید ارور نداشته باشه
با سلام
در هنگام کار کردن با قسمت GNSS وقتی دستور AT+QGNSSRD برای UART اصلی فرستاده میشود تا اطلاعات GPS دریافت شود. خطا میدهد و error شماره 7103 میدهد…!!!
اشکال از کجاست ؟؟؟
اگه دارید از opencpu استفاده میکنید فکر نمیکنم این دستور کار کنه و لازمه به مثال خود شرکت برای خواندن موقعیت مراجعه کنید.
سلام
دقت کنید که قبل از ارسال دستور خواندن ، دستور روشن کردن GPS رو توسط AT+QGNSSC=1 رو ارسال کنید
حتی اگه از پایه enable برای تغذیه GPS استفاده نمیکنید.
سلام وقت بخیر
به خاطر مطالب جذاب سایتتون خیلی ممنونم.
بعضی از توابعی که در کدهاتون استفاده کردین برای من نا مفهوم هستند. میخواستم ببینم داکیومنتی برای استفاده از این توابع و آرگومان هایی که در ورودی دریافت میکنن هست؟
برای مثال بیاد توضیح بده تابع Ql_UART_Registe چیه و چه ورودی هایی رو باید بهش بدیم.
ممنون
سلام
میتونید از فایل Quectel_MC60-OpenCPU_User_Guide_V1.1.pdf
کمک بگیرید.
به طور مثال شرح تابعی که گفتید در صفحه 75 همین فایل موجود هست.
سلام خدا قوتتتتتتتت
عید پیشاپیش مبارک
این عکسی که بعد از متن “اینجا هم میتونید لیست پینها و اینکه کدوم میتونند GPIO یا نوع دیگه ای باشند رو ببینید ما پین 35 رو استفاده میکنیم.
” گذاشتین که حالت های مختلف کاری برای هر پایه رو توضیح داده توی کدوم دیتاشیت اومده؟ برای m66 هم همچین اطلاعاتی هست؟
سلام در دیتاشیت hardware میتونید پیدا کنید
بله هست به همین دقت وجود داره
بنام خداوند بزرگ و بلند مرتبه
با سلام به همگی دوستان و بزرگواران.
خدا قوت به نویسندگان و تهیه کنندگان پروژه عالی و دوست داشتنی ماژول mc60 شرکت کوکتل .
در قسمت دوم سری آموزش های این ماژول تمامی داکیومنت های مورد نیاز کار دانلود و طبق شرحی که آمده بود نرم افزارهای مربوط نصب گردید .
ولی در قسمت گرفتن خروجی از نمونه مثال چشمک زن با خطا مواجه گردید.
در صورت امکان روی این قسمت از پروژه ها و مراحل انجام دادن آنها بصورت گرافیکی و انیمیشن بگذارید. تا قابل فهم برای افراد مبتدی و خواهان یادگیری باشد.
به امید موفقیت
پشمام
بابا دست خوش
خیلی کارت درسته
سلام
خواهش میکنم?