Программируем 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:
Порядок загрузки такой:
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» с зеленым кругом — после этого можно перезагрузить модуль и протестировать полученный результат.
Надеюсь, кому-нибудь пригодится, спасибо за внимание!