Вероятно, ни для кого не секрет, что некоторые 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» с зеленым кругом – после этого можно перезагрузить модуль и протестировать полученный результат.

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

Комментарии (2)


  1. vit1251
    22.07.2015 03:30
    +2

    Непойму почему не сделают аналогичный сервис для железокопателей.

    Очень хорошо получилось:

    Geektime — для всякой философии в ИТ;
    Habrahabr — для всяких там программных изысканий;
    ??? — для всяких там аппаратных изысканий;


  1. darii
    22.07.2015 09:31

    Статья отличная, хотелось бы побольше подобного про прототипирование всяких аппаратных штук. Пишут же про то, как придумали стопятьсотпервое применение Raspberry Pi, причем некоторые действительно попадаются интересные.

    Я вот до этой статьи, например, почему-то не задумывался, что для всяких DIY штукенций можно ведь заказать отдельный GSM-модуль, а не возиться с подключением телефонов типа знаменитой Моторолы с123. Было бы круто почитать про обзор как раз таких модулей с разбором плюсов-минусов, подводный камней.

    И напоследок — да, согласен с первым комментатором. На Geektime такие материалы выглядят ни к селу, ни к городу. Даёшь подлепру аппаратных изысканий!