Программный стек для управления GSM модулем
STMicroelectronics славится лучшими микроконтроллерами, Quectel – модулями беспроводной связи (GSM, GPS).
В продолжение новостей от 07.12.2012г. и 28.01.2013г. инженеры компании "Промэлектроника" написали небольшой программный стек по объединению продукции этих производителей. В качестве контроллера был взят STM32F051R8T6, а в качестве модуля GSM связи – M95. На базе этого железа был построен элемент охранной системы: SMS оповещение одного абонента сотовой связи при замыкании/размыкании двух проводов («сухие контакты»). В качестве исходного сигнала может выступить детектор присутствия, геркон (размыкающийся при открытии двери или окна), датчик пожарной системы и т.д. Смысл приложения простой: сработал датчик – отправилась SMS-ка.
Для того чтобы построить макет программы такого приложения достаточно поработать пару дней. Материалов, предоставляемых фирмой Quectel, для работы с её продукцией вполне достаточно, а STMicroelectronics вообще предоставляет исходники программ, подлежащие копированию в свой текст программы, главное знать, что и откуда копировать. Тем не менее правильная работа с GSM модулем требует особой техники.
Во-первых, GSM модуль общается с внешним хост-контроллером посредством текстовых сообщений, т.е. требуется распознавание текста.
Во-вторых, текстовых сообщений – очень большое количество, что означает:
а) огромную таблицу текста = много потребного места в памяти программ,
б) весьма длительный поиск нужной строки, по которой определится реакция на сообщение.
В-третьих, модуль может выдать одно и то же сообщение, на которое потребуется своя реакция в зависимости от его состояния.
При построении макета программы всеми этими нюансами можно пренебречь, однако, изделие, подлежащее продаже, должно адекватно реагировать на сообщения модуля (или корректно игнорировать их).
Идеальное построение программы хост-контроллера для работы с GSM-модулем:
- Контроллер должен выполнять определённые действия с GSM модулем только по его запросам либо по требованию основной программы приложения. В целом это означает расположение программ-обработчиков событий в векторах прерываний.
- Прерывание должно быть коротким, что означает быстрое определение значения текстового сообщения.
С учётом того, что весь объём текстовых сообщений GSM модуля исчисляется килобайтами, если не десятками килобайт, задача может стать непосильной для небыстрого контроллера. Инженеры компании "Промэлектроника" видят решение этой задачи вводом таблицы состояний. Для каждого состояния характеризуется небольшой набор текстовых сообщений. Например, если требуется авторизация, и вы не ввели PIN-код (или другой код SIM-карты, если это требуется), то нет смысла регистрироваться в сети или ждать сигнала готовности модуля к звонкам (или других подобных сигналов). Или после авторизации не имеет смысла сравнивать тексты, связанные с авторизацией SIM-карты. Таким образом, вводя понятие «Состояние GSM модуля» в программе, мы резко сокращаем количество ожидаемых хост-контроллером текстовых сообщений.
Чем характеризуется состояние? В первую очередь номером – это координата в линейном массиве всех возможных состояний модуля. Как выглядит программа: например, программа задала вопрос о необходимости авторизации SIM-карты – это нулевое состояние. На этот вопрос может прийти несколько ответов: во-первых, «эхо» заданного вопроса – вы сможете сравнить информацию, которую отправили с той, которую получил модуль, во-вторых, «авторизация не нужна», в-третьих, «авторизация нужна» с требованием ввести такой-то тип пароля. В данном случае при получении первого типа сообщения вы останетесь в том же нулевом состоянии, при получении сообщения второго типа – вы перейдёте, например, в состояние номер 15 – ожидание готовности модуля, при получении сообщения 3-го типа перейдёте в состояние номер 5 – ввод пароля, откуда в случае успеха перейдёте в состояние 15.
Кроме номера, у состояния есть ещё два параметра: тексты, которые ожидаются от модуля, и функции, которые контроллер будет выполнять при получении конкретного сообщения. На каждое сообщение – своя функция. Таким образом, количество функций равно количеству видов ожидаемых сообщений. И то и другое обозначается указателем. Итак, модуль прислал текстовое сообщение, совпавшее с тем, что расположено по такому-то указателю в данном состоянии. В ответ, машина, обрабатывающая состояния, вызвала соответствующую функцию, которая отработала событие, возможно, поменяла состояние и т.д. Возвращаясь к номеру состояния, отметим, что при переходе от одного состояния к другому функция, осуществляющая переход по новому номеру состояния, достаёт из массива указатель на новый массив указателей строк и функций нового состояния. Этот тяжёлый фразеологический оборот проще воспринять рисунком:
Рисунок 2
Комментарий к рисунку 2: если мы, находясь в состоянии 3, получаем текст «+CPIN: READY», то автоматически вызывается функция, реагирующая на это событие. По логике работы GSM модуля функция «void READY(void)» выполнит запрос регистрации в сотовой сети с переходом в соответствующее состояние.
Получилась такая вот небольшая операционная система, которую мы можем предложить потенциальному заказчику по запросу.
Поскольку работа с GSM модулем по большому счёту идёт в векторах прерываний, параллельно может выполняться процесс основной программы. В нашем случае – это питание самого GSM модуля подъёмом напряжения 3В до уровня 4В на катушке с внешним ключом, выполняемый силами того же самого микроконтроллера (вообще, этот процесс – тоже расположен в прерываниях, так что можно ещё навесить основную задачу).