Программируем GSM-модуль M680 OpenCPU

от автора


Вероятно, ни для кого не секрет, что некоторые GSM-модули поддерживают загрузку приложений и могут работать без внешнего управляющего контроллера. Хочу рассказать о небольших экспериментах с одним таким модулем — Neoway M680 OpenCPU.

Возможность загрузки приложений напрямую в модуль хороша тем, что позволяет уменьшить размеры и стоимость устройства. Не всегда это является лучшим решением, но в некоторых случаях может оказаться действительно полезным. Кстати, размер самого M680 OpenCPU – 1,5 на 1,8 см., так что устройство может получиться действительно небольшим.
Доступные интерфейсы: UART — 2 шт., SPI или I2C, ADC — 3 шт., GPIO — 15 шт, USB 1.0, PCM, аналоговых микрофонных входа – 2 шт., аналоговых аудио-выхода – 3 шт.

В общем, я решил попробовать подключить напрямую к GSM-модулю кнопку и при её нажатии выполнить простое действие – куда-нибудь позвонить или послать SMS. Кнопку припаял к небольшой отладочной плате модуля, на которой уже есть держатель SIM-карты, разъемы питания и антенны, чтобы сэкономить время. Питание — от батарейки сотового телефона.

В результате получился вот такой макет:

Документацию по модулю и OpenCPU можно найти тут:
Neoway M680 OpenCPU

У ЭФО можно получить примеры работы с модулем, которые здорово помогают при старте.
Управление модулем AT-командами из приложения осуществляется через виртуальный UART. Для звонка на телефонный номер требуется послать на виртуальный UART всего лишь одну команду: ATD+7xxxxxxxxxx;, где +7xxxxxxxxxx — нужный номер. Поэтому совершение звонка по какому-либо событию — вероятно, одно из наиболее простых приложений.

Простая программа, которая звонит на заданный номер при нажатии на кнопку, выглядит так:

/*****************************************************************************  * Interrupt pin 40 - make a call to phone number +7xxxxxxxxxx  *****************************************************************************/  #ifdef __EXAMPLE_HELLOWORLD__ #include "neoway_openplatform.h"  U8 AT_MAKE_CALL[] = "ATD+7xxxxxxxxxx;\r";	// AT-команда совершения звонка на номер +7xxxxxxxxxx  void Neoway_UserInit(void) { 	Neoway_StopWatchdog();	//Остановить watchdog 	Neoway_InterruptInit(44,NEOWAY_INT_10);                   //Установить GPIO 44 (pin 40) как прерывание 10 	Neoway_InterruptSetDebounceTime(NEOWAY_INT_10,40);		  //Установить  время дребезга контактов (40 тиков) 	Neoway_InterruptSetPolarity(NEOWAY_INT_10,NEOWAY_TRUE);    //Установить полярность сигнала – высокий уровень или передний фронт 	Neoway_InterruptSetTriggerMode(NEOWAY_INT_10,NEOWAY_FALSE); //Прерывание по уровню сигнала }  void Neoway_UserTask1(NeowayMsgTypeStruct msg_type,NeowayModuleTypeEnum mod_type) { 	switch(msg_type.msg_id) 	{ 		case NEOWAY_MSG_ID_INT_NOTIFY10: 				Neoway_VirtualUartSend(NEOWAY_MOD_USER1, AT_MAKE_CALL, strlen(AT_MAKE_CALL));	// Позвонить на наш номер 			break; 		default : 			break; 	} }  void Neoway_IntResponse(NeowayIntNumEnum int_no,NeowayModuleTypeEnum mod_id) { 	if(int_no==NEOWAY_INT_10) 	{ 		Neoway_SendMsgTask(mod_id,NEOWAY_MOD_USER1,NEOWAY_MSG_ID_INT_NOTIFY10,NULL,0); // В качестве реакции на полученное прерывание послать сообщение NEOWAY_MSG_ID_INT_NOTIFY10 в task1 	} }  void Neoway_RegisterCallbackFunction(void) { 	Neoway_RegisterCallBack(NEOWAY_KB_ID_USER_TASK_1,(U32)Neoway_UserTask1);	//Регистрация функции Neoway_UserTask1 	Neoway_RegisterCallBack(NEOWAY_KB_ID_INT_RESPONSE,(U32)Neoway_IntResponse);	//Регистрация функции Neoway_IntResponse }  #endif 

В качестве входа прерывания используется GPIO 44, контакт 40. Вход прерывания через кнопку подключен к выводу VDD_EXT, контакт 36. При замыкании кнопки вызывается функция Neoway_IntResponse, которая посылает сообщение в Neoway_UserTask1, а та, в свою очередь, инициирует звонок на заранее определенный номер.
Конечно, в этой простой программе нет проверок и пр., но, тем не менее, она отлично работает.

Если заменить

U8 AT_MAKE_CALL[] = "ATD+7xxxxxxxxxx;\r";

на

U8 AT_SMS_TEXT_MODE[] = "AT+CMGF=1\r"; U8 AT_SEND_SMS[] = "AT+CMGS=\"+7xxxxxxxxxx\"\r"; U8 AT_MESSAGE[] = "Hello_HABR!\x1A";

и

Neoway_VirtualUartSend(NEOWAY_MOD_USER1, AT_MAKE_CALL, strlen(AT_MAKE_CALL));

на

Neoway_VirtualUartSend(NEOWAY_MOD_USER1, AT_SMS_TEXT_MODE, strlen(AT_SMS_TEXT_MODE)); Neoway_VirtualUartSend(NEOWAY_MOD_USER1, AT_SEND_SMS, strlen(AT_SEND_SMS)); Neoway_VirtualUartSend(NEOWAY_MOD_USER1, AT_MESSAGE, strlen(AT_MESSAGE));

то при нажатии на кнопку модуль будет посылать SMS “ Hello_HABR!” на номер +7xxxxxxxxxx.

В качестве компилятора я использовал RVDS, взятый на одном из торрентов.
Для компиляции запускаем файл cmd.bat из папки с примером, при успешном завершении среди прочего появляется надпись:
*******************************************************
Done
The target image is in the ‘build’ directory.
*******************************************************
файлы прошивки появляются в папке build.
Если что-то пошло не так — помогает build.log из той же папки.

Для загрузки приложения в модуль через UART используется программа FlashTool:
FlashTool

Порядок загрузки такой:

1. Запускаем FlashTool, выставляем COM-порт, скорость.
2. Нажимаем кнопку Download Agent и выбираем файл MTK_AllInOne_DA.bin из папки с программой.
3. Нажимаем кнопку Scatter/Config File и выбираем файл NEOWAY60S_MOD_11B_BB.cfg из папки build.
4. Cнимаем галку PRIMARY_MAUI, оставляем только галку ROM1.
5. Нажимаем кнопку Download и после этого включаем питание модуля.
6. При успешной загрузке появляется окно «OK» с зеленым кругом – после этого можно перезагрузить модуль и протестировать полученный результат.

Надеюсь, кому-нибудь пригодится, спасибо за внимание!

ссылка на оригинал статьи http://geektimes.ru/post/259052/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *