Наконец-то мне удалось заняться изучением, пожалуй самого популярного в DIY среде GSM модуля — GSM900. Что такое GSM модуль? Это устройство, которое реализует функции сотового телефона. Другими словами, GSM900 позволяет звонить другим абонентам сотовой сети, принимать звонки, отправлять и принимать SMS-сообщения. А еще, разумеется, передавать данные по протоколу GPRS.
Мне этот модуль понадобился для вполне конкретной цели: появился проект системы освещения, управляемой дистанционно. Проще всего эта задача решается SMS-сообщениями: отправил одну sms — свет включился, отправил другую — выключился. Никаких пультов не надо, а телефон есть у всех (даже у бомжей). Собственно, в этой статье я рассмотрю именно этот вариант использования модуля GSM900.
Прошивка
Волею судеб, у меня в руках оказался модуль GSM900A. Прочитав первый попавшийся форум про оживление этой штуки, выяснилось, что буква A в названии означает принадлежность модуля к азиатскому региону. А следовательно, работать с нашими операторами он не станет. Уныние 🙁
Благо, в следующих постах на том же форуме содержалась успокаивающая информация:) Оказалось, что не всё так плохо, и чтобы модуль заработал в нашем регионе, его нужно попросту перепрошить. Этот процесс хорошо описан в блоге нашего соратника Alex-EXE: прошивка «all in one» sim900
Попробую сделать то же самое, но еще более подробно, и с учетом особенностей моего модуля.
Если у вас правильный модуль и прошивка не требуется, можно сразу прыгать на раздел №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-команд.
Первое что мы скажем модулю будет самая примитивная AT-команда: «AT». Это такой своеобразный ping, на который модуль должен ответить словом «OK».
AT
Если все прошло успешно, и модуль действительно ответил нам «OK», отправляем команду настройки скорости:
AT+IPR=115200
В конце команды должен стоять служебный символ возврата каретки — CR. В ASCII таблице он имеет код 13 (или 0x0D в шестнадцатеричной системе). Символ подставится автоматически, если вы поставите галку «+CR» напротив строки ввода в нашем терминале. В других терминалах тоже есть подобные настройки.
В ответ на введенную команду снова получим — «OK».
Данная настройка понадобится нам для ускорения процедуры прошивки. В противном случае, как указал в своем блоге Alex-EXE, прошивка займет около часа.
Настройка программы
После того, как все провода воткнуты в нужные места, и модуль подготовлен к прошивке, запускаем приложение SIM900 Series download Tools Develop. Настройка программы состоит всего из нескольких пунктов:
- в поле Target указываем целевой чип. Почему-то у меня не вышло залить прошивку на SIM900A, так что я выбрал «SIM900»;
- выбираем правильный порт в поле Port;
- Baud Rate ставим в 115200;
- наконец, указываем файл прошивки в поле Core File (файл с расширением cla).
С настройкой всё.
Прошивка
Теперь выполняем строго и последовательно шесть важных шагов.
- Подключаем к модулю питание (наши 4 аккумулятора). Должна загореться красная лампа питания, а лампа статуса должна начать мигать.
- Подключаем USB-UART к компьютеру.
- Замыкаем провод RST на землю (помним, что все это время он болтался в воздухе).
- Нажимаем в программе кнопку Start Download.
- Считаем в уме до трех, и отрываем 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
В общем, все просто. Этого нам вполне достаточно для реализации задуманного. Для более глубокого изучения возможностей GFM900 рекомендую почитать еще одну статью Alex-EXE: at-команды gsm модема sim900
Взаимодействие с микроконтроллерами
Вообще, чтобы управлять внешними устройствами вовсе не обязательно спаривать модуль GSM900 с другим микроконтроллером. В этот модуль можно зашить свою программу, которая будет делать всё что угодно со свободными GPIO выводами. Однако, в большинстве готовых плат GPIO не разведены, поэтому для создания прототипа задуманного устройства воспользуемся самой простой Arduino Uno/Nano.
Общаться Arduino и GSM900 будут всё по тому же UART интерфейсу. Для этого соединим эти два устройства по следующей схеме:
GSM900 | GND | VCC_MCU | SIMT | SIMR |
Ардуино Уно | GND | +5V | RX | TX |
Теперь составим программу, которая будет ловить СМС-ки, и зажигать светодиод на ноге №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 секунды. Разумеется, вместо светодиода можно включать/выключать мощное реле, к которому подключен котел отопления в загородном доме.
К размышлению
Данный модуль является устаревшим. Рекомендуем использовать более свежие модули SIM800.
Здравствуйте! А как реализовать например чтоб ардуино по GSM модулю отправил СМС на мой номер о включении определенного объекта включившегося по таймеру. И при этом процесс отображался на ЖК дисплее там же на месте (объекте) и ещё при выключении ещё раз отправил СМС мне о выключении обънета. Пожалуйста помогите! Я не силен в программировании и не ругайте если вопрос задал не правильный
Кстати дЖеСэМ модуль у меня SIM900 и ардуино уно и еще ЖК дисплей 2004 уже имеются. С электроникой дружу с детство. Вот только программу писать ещё не научился. Пользуюсь готовыми скетчами если мне подходит.:)
Здравствуйте, на моем модуле есть два светодиода, горит только красный, а другой(синий) мигал пару секунд, когда я тронул провод от RST, он был в воздухе. Когда в терминале набираю AT ничего не выходит, хотя написано connected. Питание поставлено 2А, 5В. В чем может быть проблема?
Причины могут быть разные. Как вариант, проверьте, передаете ли вы после команды символ CR (0x0D)?
Привет Олег, ( у меня все грустно, попробовал как вы сказали,
но у меня в flashe type: not detected
что посоветуешь(
Это в какой момент ошибка возникает?
Пытаюсь оживить SIM900 Не могу никак сконектится. Сделал как у вас написано а он в ответ кидает кракозябры какие то. Что делать даже не знаю
Скорость последовательного порта правильная стоить? Обычно кракозябры от неправильно скорости бывают. Рекомендую попробовать разные скорости обмена.
Как только не менял скорости. Но достиг результата переустановкой перемычки поперек на средние пины. Вычитал, что это переход в режим UART. Все нормально вроде терминал ожил но выдает вместо OK — АТ. Уже третий день бьюсь.
вот что отвечает
http://s05.radikal.ru/i178/1611/b3/5a1ea3cf2023.jpg
Это называется «эхо» модуль повторяет то что ты ему отправил.
Здравствуйте, при подключении Rx Tx беза GND будут одни крокозябры, а описание на gsm модуль нашёл лишь спустя 3 дня, и понять не мог, почему каракули
Ребята подскажите, как реализовать в вашем коде по дозвону управлением светодиодом, если номер есть на сим карте то он звонок примет, сбросит и включит светодиод, если номера в сим нет то просто трубку скинет.