Shield GPRS/GSM SIM900 с антенной
SIM900 GPRS/GSM Shield Development Board Quad-Band Kit For Arduino Compatible
Модуль для работы микроконтроллерных устройств Arduino и аналогичных в сетях сотовой связи по стандартам GSM и GPRS. Ориентирован на использование в системах автоматики и управления. Обмен данными с другими модулями происходит через интерфейс UART. Shield GPRS/GSM SIM900 с антенной может сопрягаться непосредственно с микроконтроллером через интерфейс UART или работать совместно с персональным компьютером при использовании преобразователя интерфейса портПК-UART. Это возможно благодаря программной совместимости на уровне класса команд используемых для управления модемами - АТ команды.
Мониторинг объектов и управление ими происходит благодаря обмену данными в пределах досягаемости мобильной связи. Обеспечивается голосовая связь, отправка СМС, ММС и много других функций и сервисов. Работа модуля основана на компоненте SIM900.
Статья на русском из журнала о компоненте SIM900 . Компонент разработан компанией SIMCom Wireless Solutions. Сайт SIMCom имеет русскоязычную версию . Плата GSM модуля на стороне компонентов содержит соединители для подключения антенны, наушников и микрофона. На стороне пайки платы размещены держатель батареи CR1220 3 вольта поддерживающей работу часов модуля и контейнер для установки симкарты.
Одно из применений устройства - система слежения за перемещениями транспорта совместно с ГЛОНАСС или GPS прибором. Отправка СМС сообщений позволяет использовать модуль в диспетчеризации, беспроводной сигнализации и в охранных системах. В результате происходящих событий могут отправляться различные СМС: “Аварийный стоп лифта 2 дома №34”, “Дверь автомобиля открыта”, “Подвал открыт”, “Напряжение 220 В выключено”, “Входная дверь дачи открыта”, “Включено освещение”, “Температура в теплице ниже критической”. Модуль незаменим для контроля и управления подвижными объектами, перемещающимися на большие расстояния. Или в случае удаления оператора на большое расстояние от стационарного объекта.
Shield GPRS/GSM SIM900 с антенной дает широкие возможности изучения работы компонента SIM900. Монтаж компонента SIM900 выполняется по самым современным технологиям из-за чего припаять к печатной плате SIM900 в лабораторных условиях весьма затруднительно. Имея модуль с установленным SIM900 можно проводить эксперименты по применению компонента SIM900. При использовании в собственных разработках компонента SIM900 появляется возможность отладки программного обеспечения и проверки схемотехнических решений.
Характеристики
Питание
напряжение, В
номинальное 5
диапазон 4,8-5,2
ток
обычный режим 50-450 мА
в спящем режиме 1,5 мА
предельный импульсный 2 А
Поддерживает симкарты питанием 1,8 и 3 В
Диапазоны связи 850, 900, 1800, 1900 МГц
Поддерживает сеть 2G
Мощность передачи в различных диапазонах
1 Вт 1800 и 1900 МГц
2 Вт 850 и 900 МГц
Соответствует стандарту GSM фазы 2/2+
Встроенные протоколы TCP и UDP
Класс передачи данных GPRS multi-slot class 10/8
Аудиокодеки HR, FR, EFR, AMR, подавление эха
CSD до 14,4кбит/сек
PPP стек
MUX (07.10)
Протоколы HTTP и FTP
Есть возможность отправлять сигналы DTMF и проигрывать записи как на автоответчике
Поддержка часов реального времени RTC
Температура, ℃
воздуха при работе -30...75
хранения -45...90
размеры 86 х 58 х 19 мм
Компоненты управления
Переключателем Power select устанавливается источник питания: внешний, подключенный к коаксиальному соединителю или источник питания микроконтроллерного модуля Arduino.
Кнопкой Power key включается или выключается питание при нажатии и удерживании в течение 2 с.
Индикация
О состоянии модуля сообщают 3 светодиода:
PWR (зеленый) - индикатор питания модуля,
Status (красный) - индикатор питания компонента SIM900,
Net Light (зеленый) - соединение с сетью.
Сообщения светодиода Net Light.
Выключен - SIM900 не работает.
Мигает с интервалами, указано в секундах:
0,064 включен и 0,8 выключен - сеть не обнаружена,
0,064 включен и 0,3 выключен - сеть обнаружена,
0,064 включен, 0,03 выключен - GPRS подключен.
Контакты
Компонент SIM900 содержит порт UART, его сигналы выведены на выводы компонента и соединены с перемычками, устанавливающими с какими контактами модуля Shield GPRS/GSM SIM900 будет соединен порт UART компонента SIM900 с D0, D1 или D7, D8.
UART Shield GPRS/GSM можно подключнить: к аппаратному интерфейсу МК через контакты TXD и RXD модуля Shield GPRS/GSM, для этого используются D0, D1. Или к программно эмулируемому средствами ардуино, для этого используются контакты D7 и D8 модуля Shield GPRS/GSM. Полный интерфейс UART имеет 10 сигналов выведенных на контакты в углу платы: R1, DCD, DSR, CTS, RTS, GND, 2V8, TX, RX, DTR.
12 подписанных контактов цифровых линий ввода-вывода GPIO расположены в углу платы. Имеется 2 контакта выходных сигналов с широтно-импульсной модуляцией PWM1, PWM2. Вход АЦП контакт ADC. Интерфейс встроенного счетчика времени имеет 4 контакта. Обозначение контактов: DISP_CLK, DISP_DATA, DISP_D/C, DISP_CS.
Контакт D9 используется для программного контроля включения или выключения SIM900.
На плате установлен соединитель для подключения антенны.
Назначение выводов компонента SIM900.
Внешнее включение и выключение питания
Включить или выключить питание модуля можно с помощью сигнала на управляющем входе D9. Для изменения состояния на D9 подается импульс продолжительностью 1 с. Изменение состояния происходит спустя 3,2 с после начала импульса.
Включение модуля. Графики напряжения питания модуля, внешнего управляющего импульса и индикатора питания STATUS.
При управлении модулем руководящим устройством включение должно происходить без применения кнопки Power key, т. е. сразу после подачи питания. Для этого в программу МК следует добавить несколько команд.
Void powerUpOrDown()
{
pinMode(9, OUTPUT);
digitalWrite(9,LOW);
delay(1000);
digitalWrite(9,HIGH);
delay(2000);
digitalWrite(9,LOW);
delay(3000);
}
Эту группу команд в программе можно использовать и для выключения модуля. Также выключить GSM модуль можно посылая AT команду.
Наконец-то мне удалось заняться изучением, пожалуй самого популярного в DIY среде GSM модуля — GSM900. Что такое GSM модуль? Это устройство, которое реализует функции сотового телефона. Другими словами, GSM900 позволяет звонить другим абонентам сотовой сети, принимать звонки, отправлять и принимать SMS-сообщения. А еще, разумеется, передавать данные по протоколу GPRS.
Мне этот модуль понадобился для вполне конкретной цели: появился проект системы освещения, управляемой дистанционно. Проще всего эта задача решается SMS-сообщениями: отправил одну sms — свет включился, отправил другую — выключился. Никаких пультов не надо, а телефон есть у всех (даже у бомжей). Собственно, в этой статье я рассмотрю именно этот вариант использования модуля GSM900.
1. Прошивка
Волею судеб, у меня в руках оказался модуль GSM900A. Прочитав первый попавшийся форум про оживление этой штуки, выяснилось, что буква A в названии означает принадлежность модуля к азиатскому региону. А следовательно, работать с нашими операторами он не станет. Уныние 🙁
Благо, в следующих постах на том же форуме содержалась успокаивающая информация:) Оказалось, что не всё так плохо, и чтобы модуль заработал в нашем регионе, его нужно попросту перепрошить. Этот процесс хорошо описан в блоге нашего соратника Alex-EXE: прошивка «all in one» sim900
Попробую сделать то же самое, но еще более подробно, и с учетом особенностей моего модуля.
Если у вас правильный модуль и прошивка не требуется, можно сразу прыгать на раздел №2.
Инструменты
Итак, для начала подготовим все необходимые инструменты. Во-первых, непосредственно для прошивки потребуется приложение SIM900 Series download Tools Develop, которое можно легко найти в интернете ().
Во-вторых, пригодится и сам файл прошивки 1137B02SIM900M64_ST_ENHANCE, который тоже легко добывается ().
Наконец, в-третьих, нам нужен будет хороший терминал для экспериментов с модулем. Обычно я использую TeraTerm, но в этот раз его возможностей нехватило (или я не разобрался). Пришлось установить монстра с гениальным названием .
Подключение к 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».
Если все прошло успешно, и модуль действительно ответил нам «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 Мб памяти.
2. Эксперименты с GSM модулем
Попробуем теперь выполнить разные полезные операции с модулем. Для начала, введем ПИН-код (если он есть):
AT+CPIN=8899
Ответ модуля будет таким:
CPIN: READY.
После этого получим от модуля немного информации.
AT+GMR - идентификатор прошивки. AT+GSN - IMEI. AT+CPAS - состояние (0 – готов к работе, 2 – неизвестно, 3 – входящий звонок, 4 – голосовое соединение). AT+COPS? - информация об операторе.
Телефонные вызовы
Теперь наберем какой-нибудь номер. Делается это с помощью команды:
ATD+790XXXXXXXX;
Точка с запятой в конце команды очень важна, на забудьте про неё!
Если во время UART сеанса на устройство кто-нибудь позвонит, вернется сообщение:
Ответить на звонок (взять трубку) можно командой:
Если к модулю подключены наушники и микрофон, то можно пообщаться с удаленным абонентом как по обычному сотовому телефону.
Завершает вызов команда:
Отправка 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
3. Взаимодействие с микроконтроллерами
Вообще, чтобы управлять внешними устройствами вовсе не обязательно спаривать модуль 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 Загружаем программу на Arduino, и тестируем систему. Если всё сделано правильно, отправка SMS сообщения на устройство приведет к включению светодиода на 2 секунды. Разумеется, вместо светодиода можно включать/выключать мощное реле, к которому подключен котел отопления в загородном доме. Обзор платы GSM/GPRS SIM900 Shield
Плата Arduino GPRS/GSM Shield (рисунок 1) предоставляет нам возможность использовать для удаленного приема и передачи данных мобильной GSM-связи. Осуществить это можно тремя способами: используя отправку/прием коротких текстовых сообщений (SMS); отправкой голосовых (аудио) команд на основе технологий CSD (стандартная технология передачи данных в сети GSM) и/или DTMF (двухтональный многочастотный аналоговый сигнал, используемый для набора телефонного номера); используя пакетную передачу данных на основе технологии GPRS. Плата построена на базе модуля SIMCom SIM900. Также на ней расположены: слот для SIM-карты; джек 3,5 мм для аудио-входа и выхода; разъём для внешней антенны. Общение с платой производится через serial-соединение с помощью набора AT-команд. С помощью перемычек на плате возможно установить используемые для коммуникации контакты: аппаратные 0- 1-й или 2-3 (на некоторых платах) 7- 8-й для работы через SoftwareSerial. Рисунок 1. GPS GPRS shield. Плату GSM GPRS SIM900 Shield можно включить двумя способами: аппаратным (нажатие кнопки PWRKEY); программным. Подключение к плате Arduino Плата GSM GPRS SIM900 Shield сделана в формате шилда для плат Ардуино. Контакты шилда (гребенки) легко вставляются в разъемы платы, образуя при этом "бутерброд" (рисунок 2). Рисунок 2. Установка GPS GPRS shield на плату Arduino. Рассмотрим управление модулем GSM GPRS shield с помощью AT-команд. Для этого установим модуль на и подключим её к компьютеру. Arduino-скетч отправки и получения данных между компьютером и модулем GSM GPRS shield через плату показан в листинге 1. Листинг 1 #include // создание объекта SoftwareSerial grs(7, 8); // RX, TX // скорость обмена #define GSMbaud 9600 Serial.begin(9600); gsm.begin(GSMbaud); Serial.println("Start"); if (Serial.available()) { str1 = Serial.readStringUntil("\n"); str1.toCharArray(buffer, hh.length() + 1); gsm.write(buffer); gsm.board.write("\n"); if (gsm.available()) { Serial.write(gprs.read()); Загружаем скетч на плату ардуино, открываем монитор последовательного порта и набираем команды установки режима: Команда проверки подключения модуля к GPRS-сети, которую при ответе COMMAND NO RESPONSE необходимо постоянно повторять Подключаемся к точке доступа оператора связи. Для Билайн: AT + CGDCONT = 1, "IP", "internet.beeline.ru" AT + CSTT = "internet.beeline.ru","", "" Установка интернет-соединения: AT + CGACT = 1,1 Обращение к интернет-ресурсу Весь процесс подключения представлен на рисунке 3. Рисунок 3. Процесс работы с модулем GSM GPRS SIM800 в мониторе последовательного порта. Рассмотрим пример использования отправки sms-сообщений при уменьшении температуры воздуха в помещении ниже определенного значения. Нам потребуются следующие детали: модуль GSM GPRS Shield – 1 шт; sim-карта сотового оператора с положительным балансом; блок питания 12В – 1 шт; Схема подключения показана на рисунке 4. Рисунок 4. Схема подключения для отправки sms-сообщений при низких значениях температуры воздуха. Приступим к написанию скетча. Каждые 30 секунд получаем данные влажности и температуры с датчика DHT11. Используем библиотеку DHT. При значении температуры ниже критического отправляем sms на номер указанный в константе PHONE. И делаем паузу на 10 минут. Содержимое скетча показано в листинге 2. Листинг 2 // подключение библиотек #include #include "DHT.h" // телефон для отправки sms #define PHONE_NUMBER "+7928222222" // создание объектов SoftwareSerial gsm(7, 8); DHT sensorDHT(2, DHT22); // пороговое значение температуры #define TEMPP 18 unsigned long millissend; // запуск последовательного порта Serial.begin(9600); // запуск датчика DHT sensorDHT.begin(); // запуск SoftwareSerial gsm.begin(9600); if (millis()-millissend>30*1000) { // показания каждые 30 секунд? // получение данных с датчика DHT int h = sensorDHT.readHumidity(); int t = sensorDHT.readTemperature(); if(t // отправить sms // ждем 10 минут delay(10*60*1000); millissend=millis(); // отправка sms void SendSMS(int t) { // установка text mode gsm.print("AT+CMGF=1\r"); // телефон gsm.println(PHONE_NUMBER); gsm.println("\""); // отправить данные t // окончание передачи gsm.println((char)26); Загружаем скетч, проверяем событие прихода sms-сообщения на выбранный номер телефона при критическом значении температуры. Рисунок 5. Схема в сборе. Создадим прошивку получения данных при отправке sms-сообщения на sim-карту, находящийся в модуле GSM GPRS shield. Содержимое скетча показано в листинге 3. Листинг 3 // подключение библиотек #include #include "DHT.h" // создание объектов SoftwareSerial gsm(7, 8); DHT sensorDHT(2, DHT22); // переменные String phone = "" String str1 = ""; // boolean isSMS = false; // подключение последовательного порта Serial.begin(9600); // запуск датчика DHT // запуск SoftwareSerial gsm.begin(9600); // Настройка приёма сообщений gsm.print("AT+CMGF=1\r"); gsm.print("AT+IFC=1, 1\r"); gsm.print("AT+CPBS=\"SM\"\r"); gsm.print("AT+CNMI=1,2,2,1,0\r"); if (gsm.available()) { char c = gsm.read(); if ("\r" == c) { if (isSMS) { // текущая строка - sms-сообщение, if (!str1.compareTo("tmp")) { // текст sms - tmp // отправить sms на приходящий номер // получение данных int t = dht.readTemperature(); // AT-команда установки text mode gsm.print("AT+CMGF=1\r"); // номер телефона получателя gsm.println("AT + CMGS = \""); gsm.println(phone); gsm.println("\""); // сообщение – данные температуры // окончание передачи gsm.println((char)26); Serial.println(currStr); if (str1.startsWith("+CMT")) { Serial.println(str1); // выделить из сообщения номер телефона phone=str1.substring(7,19); Serial.println(phone); // если текущая строка начинается с "+CMT", // то следующая строка является сообщением else if ("\n" != c) { str1 += String(c); Загружаем скетч на плату, отправляем sms-сообщение с текстом tmp на sim-карту и получаем в ответ sms-сообщение с данными температуры. 1. Нет связи с Arduino по последовательному порту. Проверьте питание платы. Проверьте правильность установки перемычек. 2. Не отправляются sms-сообщения Проверьте наличие внешнего питание GSM GPRS shield. Проверьте баланс sim-карты. Опыт использования SIM900, описанный ниже будет более полезен тем, кто уже успел немного поработать с модулем. Для тех же читателей, кто только начинает изучение данной микросхемы и планирует использовать её для обмена данными через интернет мы подготовили серию уроков на эту тему. Вот . Итак, SIM900 – GSM-модуль компании SIM COM, управляется AT-командами, умеет посылать SMS, совершать звонки, организовывать прямое CSD-соединение, обмениваться информацией по GPRS. В моих руках оказалась заказанная из Китая отладочная плата SIM900 GPRS shield – совместимая с платформой Arduino. На плате находится сам чип SIM900, разъёмы для микрофона и наушников, переключатель источника питания (от внешнего разъёма или от Arduino), антенна, несколько светодиодов для индикации режимов работы, разъём для батарейки (если нужны часы реального времени), кнопка включения/выключения. Хорошее описание я нашёл на wiki производителя
. Там же приведён код для управления модемом в различных режимах. Как заявляет нам производитель плата отлично совместима с Arduino Uno. Действительно, плата SIM900 просто втыкается в Uno и сразу же начинает работать. Однако, как выяснилось, Arduino Uno может оказаться «слабоватой» для реализации некоторых функций, но об этом я расскажу чуть ниже. С Arduino Mega плата работает с некоторыми ограничениями. Это связано с тем, что у Меги в отличие от Uno пины 7 и 8, недоступны для использования в качестве software serial (программный USART). Это решается переключением интерфейса USART на ноги 0 и 1, для этого на плате SIM900 предусмотрены джамперы. Вообще, плату можно подключить к любому контроллеру с интерфейсом USART. Например, пробовал управлять модемом с помощью контроллера STM32F4. Испытания модуля для обмена SMS-сообщениями и звонков прошли «на УРА»! Модуль справился с этими задачами без особых проблем, для этого я просто скопировал c того же сайта
, скомпилировал и прошил в Arduino Uno вот этот код: Для того, чтобы посылать модулю команды, его нужно подключить к компьютеру. Это можно сделать, используя USB порт Arduino. На компьютере для этого нужен любой монитор COM-порта. Его можно скачать отсюда
, а можно использовать монитор, встроенный в Arduino IDE. Всё, что делает прошитая программа Arduino, — «ловит» команды пользователя и посылает их модулю, а затем возвращает пользователю ответы SIM900. Таким образом, передавая модулю AT-команды в ручном режиме, я опробовал приём и передачу SMS-сообщений, а подключив в соответствующие разъёмы микрофон и наушники — воспользовался модулем SIM900 в качестве мобильного телефона. Свои первые опыты по передаче данных через GPRS я начал, используя для управления SIM900 платформу Arduino UNO (просто потому, что она была под рукой). Для начала купил хостинг с сервером под Apatche и развернул на нём простейшее приложение, которое умело отвечать на GET-запросы. Получилось! Я все так же посылал команды с ПК контроллеру Arduino, который в свою очередь пересылал их SIM900. Всё работало корректно до тех пор, пока GET-запросы были достаточно короткими (до 100 символов). Но как только запросы стали длиннее — начались сбои: запросы передавались не полностью. Было замечено, что глюки могут появиться или исчезнуть даже при увеличении/уменьшении управляющей программы Arduino на несколько строк. Впоследствии выяснилось, что сбои связаны с программным USARTом, которой Arduino UNO использует для общения с SIM900, т.к. такой USART целиком и полностью зависит от программного цикла ядра контроллера. При малом количестве данных, они успевают передаваться всегда, а при увеличении их количества — результат передачи зависит от длительности программного цикла. Вывод из всего вышесказанного: использовать программный USART при общении с SIM900 НЕЛЬЗЯ
, особенно когда речь идёт о большом количестве передаваемых данных. У Arduino Uno всего один «железный» интерфейс USART, который был занят под обмен с ПК, поэтому пришлось отказаться от UNO, заменив её на Arduino Mega, которая не страдает недостатком «железных» USARTов. После такой «рокировки» работа устройства стала стабильной и корректной. Изучая руководство по управлению модемом, я обнаружил что существует две группы AT-команд. Первая группа используется для передачи данных через встроенный TCP-IP стек, а вторая использует HTTP протокол уже реализованный внутренней логикой SIM900. Сколько я ни мучал Google и Яндекс пытаясь узнать, чем же отличаются данные способы, каковы плюсы и минусы каждого из них, — ничего не нашёл, поэтому попробовал оба и делюсь своим практическим опытом тут. Оба способа рабочие и имеют право на существование. TCP-IP стек немного сложнее инициализируется (больше команд нужно передать модулю), им немного сложнее управлять. Для того, чтобы передать запрос, необходимо открыть соединение, дождаться ответа и корректно закрыть его. HTTP — это, говоря простыми словами, браузер встроенный в SIM900. Он прост в инициализации, для того чтобы начать обмен с сервером необходимо открыть сеанс. При этом открытие и закрытие соединения при каждом запросе и решение других «организационных задач» ложиться на плечи SIM900. Это удобно, к тому же передача данных таким способом происходит несколько быстрее, как раз из-за того, что у SIM900 быстрее получается выполнять все «вспомогательные операции», чем это может делать управляющий контроллер. Таким образом, при выборе способа обмена я все-таки остановился на протоколе HTTP. В самом начале своей работы по передаче данных по GPRS я допустил ошибку, которая стоила мне не одного дня мучений. Не имея достаточного опыта работы по взаимодействию с сервером посредством GET-запросов, я, набравшись поверхностных знаний в интернете, составил запрос вида: GET http://xxx.ru/d_command.php?UC=1111 HTTP/1.1 Этот запрос не является корректным, однако его отлично «кушал» браузер и прокси сервер, с которого я отправлял запросы для отладки — именно поэтому я считал запрос верным. Самое удивительное то, что SIM900 тоже отлично справлялся с «плохим» запросом (а отправлял запросы я тогда через TCP-IP стек). Однако, в один прекрасный день сервер начал отвечать на такие запросы ошибкой 404. Произошло это по так и не выясненным обстоятельствам, то ли хостинг-провайдер поменял алгоритмы обработки запроса (он открещивается от этого), то ли это сделал мобильный оператор. Но факт остаётся фактом. Тогда же я попробовал передать тот же запрос через HTTP — всё работало. Объясняется это тем, что внутренний HTTP протокол модуля SIM900 (как я уже говорил, по-сути встроенный браузер) умеет сам правильно «распарсивать» некорректные запросы и транслировать в сеть уже в правильном виде. Это еще один плюс (сомнительный, конечно же) использования HTTP, поскольку позволяет программисту некоторые неточности. А вообще, конечно, запрос должен быть написан правильно и выглядеть вот так: GET /d_command.php?UC=1111 HTTP/1.1 С таким корректным запросом SIM900 успешно обменивается и через TCP-IP стек, и через HTTP. Иногда при обмене по GPRS возникают ситуации, после которых модуль может зависнуть. Этому виной могут быть некорректные данные, пришедшие по сети и загнавшие в ступор SIM900, или помехи на линии обмена модуля и контроллера, при которых SIM900 получил «не то, что ждал», или ещё какие-то неведомые проблемы. Производитель чипа предупреждает о том, что это может происходить и предлагает в таких случаях перезагружать модуль с помощью специальной последовательности импульсов, подаваемых на вход PWRKEY. Однако, как выяснилось, это не всегда помогает — после такой перезагрузки модуль может «проснуться» всё ещё «глюкнутым». И об этом тоже нас предупреждает производитель, если внимательно читать DataSheet на модуль. Вот что рекомендуется в документации: NOTE: It is recommended to cut off the VBAT power supply directly instead of using external reset pin when SIM900 can not respond to the AT command “AT+CPOWD=1” and PWRKEY pin. Поэтому самым правильным способом перезагрузки модуля является полное снятие с него питания (с ножки VBAT), выдержка некоторой паузы (хотя бы секунду на всякий случай) и повторная подача питания. Для перезагрузки модуля на плате лучше предусмотреть реле или транзисторный ключ, управляемый контроллером. В дальнейшем я планирую выпустить серию статей-уроков, в которых расскажу как организовать обмен между серверным веб-приложением и SIM900, начиная с покупки хостинга у провайдера заканчивая написанием кода управляющих программ. До свидания! Следите за обновлениями на LAZY SMART
. Управление модулем GSM GPRS SIM900 с помощью AT-команд
Пример отправки sms-сообщений с платы Arduino
Часто задаваемые вопросы FAQ
SIM900: SMS-сообщения и звонки
//Serial Relay - Arduino will patch a
//serial link between the computer and the GPRS Shield
//at 19200 bps 8-N-1
//Computer is connected to Hardware UART
//GPRS Shield is connected to the Software UART
#include
Передача данных по GPRS с помощью SIM900
SIM900: TCP-IP стек или HTTP? Что лучше?
Некорректный GET-запрос на сервер
HOST: xxx.ru
HOST: xxx.ruЗависание SIM900
Заключение