GSM модуль SIM900A. Прошивка и использование

Наконец-то мне удалось заняться изучением, пожалуй, самого популярного в DIY-среде GSM-модуля — GSM900. Что такое GSM-модуль? Это устройство, которое реализует функции сотового телефона. Другими словами, GSM900 позволяет звонить другим абонентам сотовой сети, принимать звонки, отправлять и принимать SMS-сообщения. А ещё, разумеется, передавать данные по протоколу GPRS.

Мне этот модуль понадобился для вполне конкретной цели: появился проект системы освещения, управляемой дистанционно. Проще всего эта задача решается SMS-сообщениями: отправил одну SMS — свет включился, отправил другую — выключился. Никаких пультов не надо, а телефон есть у всех. Собственно, в этой статье я рассмотрю именно этот вариант использования модуля GSM900.

Прошивка

Волею судеб, у меня в руках оказался модуль GSM900A. Прочитав первый попавшийся форум про оживление этой штуки, выяснилось, что буква A в названии означает принадлежность модуля к азиатскому региону. А следовательно, работать с нашими операторами он не станет. Уныние :(

Благо, в следующих постах на том же форуме содержалась успокаивающая информация. Оказалось, что не всё так плохо, и чтобы модуль заработал в нашем регионе, его нужно попросту перепрошить.

Совет

Если у вас правильный модуль и прошивка не требуется, можно сразу прыгать на раздел №2.

Инструменты

Итак, для начала подготовим все необходимые инструменты. Во-первых, непосредственно для прошивки потребуется приложение SIM900 Series download Tools Develop, которое можно легко найти в интернете.

Во-вторых, пригодится и сам файл прошивки 1137B02SIM900M64_ST_ENHANCE, который тоже легко добывается.

Наконец, в-третьих, нам нужен будет хороший терминал для экспериментов с модулем. Обычно я использую TeraTerm, но в этот раз его возможностей не хватило (или я не разобрался). Пришлось установить монстра с гениальным названием Terminal.

Подключение к USB-UART мосту

Теперь подключаем линии RX и TX к мосту. В качестве последнего я использовал CP2102.

Предупреждение

В моём случае, вопреки логике, RX и TX моста соединялись с RX и TX GSM-модуля симметрично (а не крест-накрест, как принято).

Также следует запитать модуль от стабильного и мощного источника, так как пиковый ток на модуле может достигать 2 А (якобы). Подойдут 4 аккумулятора типоразмера AA. Полная схема включения выглядит так:

SIM900

CP2102 GND

GND

CP2102 +5V

VCC_MCU

CP2102 RX

SIMR

CP2102 TX

SIMT

Внешний источник +5В

VCC5

Внешний источник GND

GND

RST

Примечание

У данной модели нет кнопки сброса, так что для прошивки нам потребуется на пару секунд кинуть контакт RST на землю. Для этого мы пока оставим его висеть в воздухе.

Предварительная настройка модуля

Перед тем, как приступить к прошивке, мы соединимся с модулем и изменим ему скорость UART. Для этого запустим терминал Terminal, выберем правильный порт и установим скорость обмена — 9600. После этого жмём Connect.

Всё общение с модулем происходит посредством AT-команд.

Программа Terminal с подключением к SIM900A

Первое, что мы скажем модулю, будет самая примитивная AT-команда: «AT». Это такой своеобразный ping, на который модуль должен ответить словом «OK».

AT

Если всё прошло успешно, и модуль действительно ответил нам «OK», отправляем команду настройки скорости:

AT+IPR=115200

В конце команды должен стоять служебный символ возврата каретки — CR. В ASCII-таблице он имеет код 13 (или 0x0D в шестнадцатеричной системе). Символ подставится автоматически, если вы поставите галку «+CR» напротив строки ввода в нашем терминале. В других терминалах тоже есть подобные настройки.

В ответ на введённую команду снова получим «OK».

Данная настройка понадобится нам для ускорения процедуры прошивки. В противном случае прошивка займёт около часа.

Настройка программы

После того, как все провода воткнуты в нужные места, и модуль подготовлен к прошивке, запускаем приложение SIM900 Series download Tools Develop. Настройка программы состоит всего из нескольких пунктов:

  • в поле Target указываем целевой чип. Почему-то у меня не вышло залить прошивку на SIM900A, так что я выбрал «SIM900»;

  • выбираем правильный порт в поле Port;

  • Baud Rate ставим в 115200;

  • наконец, указываем файл прошивки в поле Core File (файл с расширением .cla).

С настройкой всё.

Прошивка

Теперь выполняем строго и последовательно шесть важных шагов.

  1. Подключаем к модулю питание (наши 4 аккумулятора). Должна загореться красная лампа питания, а лампа статуса должна начать мигать.

  2. Подключаем USB-UART к компьютеру.

  3. Замыкаем провод RST на землю (помним, что всё это время он болтался в воздухе).

  4. Нажимаем в программе кнопку Start Download.

  5. Считаем в уме до трёх и отрываем RST от земли.

Ждём 6 минут до завершения прошивки.

Что мы имеем после прошивки

Во-первых, модуль теперь умеет работать с нашими операторами. Во-вторых, мы поставили расширенную прошивку, среди особенностей которой, к примеру, получение координат модуля по сотовым вышкам, работа с электронной почтой и доступ к дополнительным 2,5 МБ памяти.

Эксперименты с GSM-модулем

Попробуем теперь выполнить разные полезные операции с модулем. Для начала введём ПИН-код (если он есть):

AT+CPIN=8899

Ответ модуля будет таким:

+CPIN: READY.

После этого получим от модуля немного информации.

AT+GMR - идентификатор прошивки.
AT+GSN - IMEI.
AT+CPAS - состояние (0 – готов к работе, 2 – неизвестно, 3 – входящий звонок, 4 – голосовое соединение).
AT+COPS? - информация об операторе.

Телефонные вызовы

Теперь наберём какой-нибудь номер. Делается это с помощью команды:

ATD+790XXXXXXXX;

Важно

Точка с запятой в конце команды очень важна, не забудьте про неё!

Если во время UART-сеанса на устройство кто-нибудь позвонит, вернётся сообщение:

RING

Ответить на звонок (взять трубку) можно командой:

ATA

Если к модулю подключены наушники и микрофон, то можно пообщаться с удалённым абонентом как по обычному сотовому телефону.

Завершает вызов команда:

ATH0

Отправка SMS

Сначала включим текстовый режим сообщений:

AT+CMGF=1

и установим кодировку:

AT+CSCS= "GSM"

Модуль поддерживает и другие кодировки, более удобные для автоматических систем. Но нам для экспериментов удобнее всего использовать именно GSM-режим, в котором телефон задаётся цифрами, а текст сообщений пишется в ASCII-кодировке.

Теперь отправим кому-нибудь сообщение:

AT+CMGS="+79123456789"

В конце команды необходимо добавить сразу два служебных символа: CR и LF. В Terminal это можно сделать галочкой CR=CR+LF, либо вручную добавив в конце строки: AT+CMGS="+79123456789"&0D&0A.

После ввода этой команды, в ответ будет получен символ «>», означающий начало ввода сообщения. Пишем какой-нибудь текст:

Hello World!

В конце сообщения нам нужно будет передать один из двух специальных символов. Чтобы отправить сообщение, введём символ из ASCII-таблицы с номером 26. Чтобы отменить отправку — символ с номером 27.

В используемом нами терминале для отправки символа по коду можно использовать одно из двух выражений: в шестнадцатеричном формате — $1A, и в десятичном — #026.

Приём SMS

Если во время сеанса на устройство придёт SMS, вернётся сообщение формата:

+CMTI: "SM",4

здесь 4 — это номер входящего непрочитанного сообщения.

Чтобы прочитать текст этого сообщения, введём:

AT+CMGR=4

В ответ получим:

+CMGR: "REC READ","+790XXXXXXXX","","13/09/21,11:57:46+24"
 Hello World!
 OK

В общем, всё просто. Этого нам вполне достаточно для реализации задуманного.

Взаимодействие с микроконтроллерами

Вообще, чтобы управлять внешними устройствами, вовсе не обязательно спаривать модуль GSM900 с другим микроконтроллером. В этот модуль можно зашить свою программу, которая будет делать всё что угодно со свободными GPIO-выводами. Однако, в большинстве готовых плат GPIO не разведены, поэтому для создания прототипа задуманного устройства воспользуемся самой простой Arduino Uno/Nano.

Общаться Arduino и GSM900 будут всё по тому же UART-интерфейсу. Для этого соединим эти два устройства по следующей схеме:

GSM900

GND

VCC_MCU

SIMT

SIMR

Arduino Uno

GND

+5V

RX

TX

Теперь составим программу, которая будет ловить SMS-ки и зажигать светодиод на ноге №13 на пару секунд. Этим мы имитируем управление неким внешним устройством.

const String spin = "1234";
const int rel_pin = 13;
String ss = "";

// Отправка пин-кода
void sendPin(){
    String cmd = "AT+CPIN="+spin+char(0x0D);
    Serial.print(cmd);
}

// Включение светодиода на 2 секунды
void receiveSMS(String s){
    digitalWrite(rel_pin, HIGH);
    delay(2000);
    digitalWrite(rel_pin, LOW);
}

// Разбор строки, пришедшей из модуля
void parseString(String src){
    bool collect = false;
    String s = "";
    for( byte i=0; i<src.length(); i++ ){
        if( src[i] == '+' ){
            collect = true;
        }
        else if( src[i] == ':' ){
            if( s == "CMTI" )
                receiveSMS(s.substring(i+1));
            collect = false;
        }
        else if(collect){
            s += src[i];
        }
    }
}

// Получение строки, пришедшей из модуля
void receiveString(){
    static byte b;
    if( Serial.available() ){
        b = Serial.read();
        if( b == 0x0D ){
            parseString(ss);
            ss = "";
        }
        else{
            ss += char(b);
        }
    }
}

void setup() {
    pinMode(rel_pin, OUTPUT);
    delay(4000); // Дадим время на запуск модуля
    Serial.begin(115200);
    delay(500);
    sendPin();
    delay(1000);
}

void loop() {
    receiveString();
}

Загружаем программу на Arduino и тестируем систему. Если всё сделано правильно, отправка SMS-сообщения на устройство приведёт к включению светодиода на 2 секунды.

Совет

Разумеется, вместо светодиода можно включать/выключать мощное реле, к которому подключен котёл отопления в загородном доме.

К размышлению

Важно

Данный модуль является устаревшим. Рекомендуем использовать более свежие модули — SIM800C.