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

0231dcfefe324941b134a31ade1f1213.gif
Вероятно, ни для кого не секрет, что некоторые 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-карты, разъемы питания и антенны, чтобы сэкономить время. Питание — от батарейки сотового телефона.

В результате получился вот такой макет:
6e836d81b11c437aa75e0381b6418f1b.JPG
Документацию по модулю и 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» с зеленым кругом — после этого можно перезагрузить модуль и протестировать полученный результат.

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

© Geektimes