Используем телефон вместо gsm-модуля для ардуино
Содержание:
- Эксперименты с GSM модулем
- Прием и чтение SMS.
- Подключение к интернету
- SIM-карта Telefonica/Movilforum
- Подключение к двигателю сотового телефона
- Код Arduino – тестирование AT команд
- Исходный код программы (скетча)
- Передача данных по TCP
- Полевые испытания
- Код Arduino – прием вызова
- Шаг 5. Код проекта
- Характеристики
- Ошибка +CSQ: 0,0
- Передача данных с подтверждением в командном режиме
- Использование GPRS в GSM модуле
- Заключение
Эксперименты с 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
Прием и чтение SMS.
В этом случае GSM модуль принимает входящее SMS и сохраняет его на SIM-карте. Плата Arduino непрерывно мониторит принятые SMS через универсальный последовательный приемопередатчик (последовательный порт). Когда мы будем видеть на экране ЖК дисплея символ, свидетельствующий о поступлении нового SMS, нам необходимо будет нажать ‘D’ чтобы прочесть это SMS. Для выполнения этих операций необходимо на GSM модуль передать следующие команды:
Когда Arduino получает индикацию ‘SMS received’ оно извлекает (находит) место хранения SMS и передает команду на GSM модуль прочесть принятое SMS. После этого на экране ЖК дисплея высвечивается сообщение ‘New Message Symbol’.
После этих команд GSM модуль передает хранившееся сообщение в Arduino, после чего Arduino извлекает главное SMS и отображает его на ЖК дисплее. После прочтения SMS на экран ЖК дисплея выдается сообщение ‘New SMS symbol’.
Более подробно все описанные процессы вы можете посмотреть в видео в конце статьи.
Подключение к интернету
Чтобы подключиться к интернету, вам понадобится, помимо SIM-карты и тарифного плана, еще и информация об APN – это то, что есть у каждого оператора связи. Это имя точки доступа, которая служит мостом между сотовой сетью и интернетом. Иногда для доступа к этой точке нужны имя пользователя и пароль. К примеру, Movilforum’овский APN – это sm2ms.movilforum.es, но ни имени пользователя, ни пароля у него нет.
Скетч ниже подключается к «arduino.cc/latest.txt» и выводит содержимое на монитор порта.
Примечание: Некоторые операторы блокируют входящий IP-трафик. Однако скетчи, использующие класс GSMClient (вроде скетча, описанного ниже), должны работать безо всяких проблем.
1 // подключаем библиотеку GSM: 2 #include <GSM.h> 3 4 // PIN-код (если нужно): 5 #define PINNUMBER "" 6 7 // Информация об APN от вашего оператора связи: 8 #define GPRS_APN "GPRS_APN" // замените "GPRS_APN" на свой APN 9 #define GPRS_LOGIN "login" // замените "login" на свой логин 10 #define GPRS_PASSWORD "password" // замените "password" на свой пароль 11 12 // инициализируем необходимые объекты из библиотеки GSM: 13 GSMClient client; 14 GPRS gprs; 15 GSM gsmAccess; 16 17 // Этот скетч-пример загружает содержимое URL’а "http://arduino.cc/latest.txt" 18 19 char server[] = "arduino.cc"; // название сайта 20 char path[] = "/latest.txt"; // путь 21 int port = 80; // порт, 80 для HTTP 22 23 void setup() 24 { 25 // инициализируем последовательную коммуникацию: 26 Serial.begin(9600); 27 Serial.println("Starting Arduino web client."); // "Запуск веб-клиента Arduino." 28 // состояние соединения: 29 boolean notConnected = true; 30 31 // Запускаем GSM-модуль. 32 // Указываем PIN-код «симки» как параметр в функции gsmAccess.begin(): 33 while(notConnected) 34 { 35 if((gsmAccess.begin(PINNUMBER)==GSM_READY) & 36 (gprs.attachGPRS(GPRS_APN, GPRS_LOGIN, GPRS_PASSWORD)==GPRS_READY)) 37 notConnected = false; 38 else 39 { 40 Serial.println("Not connected"); // "Нет соединения" 41 delay(1000); 42 } 43 } 44 45 Serial.println("connecting..."); // "Подключение..." 46 47 // Если подключение есть, сообщаем об этом на монитор порта: 48 if (client.connect(server, port)) 49 { 50 Serial.println("connected"); // "Подключено" 51 // Делаем HTTP-запрос: 52 client.print("GET "); 53 client.print(path); 54 client.println(" HTTP/1.0"); 55 client.println(); 56 } 57 else 58 { 59 // Если соединения с сервером нет: 60 Serial.println("connection failed"); // "Подключение не удалось" 61 } 62 } 63 64 void loop() 65 { 66 // Если от сервера доступны какие-то байты, 67 // считываем их и выводим на монитор порта: 68 if (client.available()) 69 { 70 char c = client.read(); 71 Serial.print(c); 72 } 73 74 // Если сервер отключен, останавливаем работу клиента: 75 if (!client.available() && !client.connected()) 76 { 77 Serial.println(); 78 Serial.println("disconnecting."); // "Отключение." 79 client.stop(); 80 81 // вечно ничего не делаем: 82 for(;;) 83 ; 84 } 85 }
SIM-карта Telefonica/Movilforum
В комплекте с GSM-модулем Arduino также идет «симка» от Telefonica/Movilforum, которая хорошо подходит для M2M-приложений, т.е. для приложений, где коммуникация будет осуществляться по принципу «машина-машина». Впрочем, использовать именно эту карту необязательно. Можно пользоваться любой «симкой», которая работает в вашем регионе.
Для приема и отправки голосовых звонков эту «симку» использовать нельзя.
Принимать и отправлять SMS-сообщения можно только от SIM-карт из сети Movilforum.
Кроме того, при использовании этой карты нельзя создавать сервер, который будет принимать входящие запросы из интернета общего пользования. Однако вы сможете получать входящие запросы от других SIM-карт из сети Movilforum.
Если вы хотите использовать голосовую и другие функции GSM-модуля, вам понадобится «симка» от другого оператора связи. У разных операторов разные подходы к использованию SIM-карт, и чтобы узнать, какие типы соединений они поддерживают, лучше обратитесь к ним напрямую.
Подключение к двигателю сотового телефона
Далее нам необходимо получить доступ к двигателю сотового телефона, который используется для его вибрирования (rumble motor). Для различных телефонов доступ к этому двигателю будет отличаться, но при помощи визуального осмотра и, при необходимости, использования поиска в сети интернет, я думаю, вы без проблем сможете найти этот двигатель в телефоне.
После этого нам необходимо припаять два провода к контактам этого двигателя. Поскольку эти двигатели во многих моделях телефонов очень миниатюрные, то для этой цели желательно использовать минимальное количество припоя и очень тонкие провода.
Затем, когда эти провода будут припаяны к контактам двигателя, нам необходимо подключить к ним мультиметр. Делается это для двух целей. Первая – узнать величину напряжения, возникающую на этих контактах. Вторая – определить какой контакт является положительным, а какой отрицательным.
Автор проекта (ссылка на оригинал приведена в конце статьи) использовал для этого свой старый телефон blackberry и с помощью мультиметра определил, что на этих контактах формируется напряжение примерно 1.5 В, что вполне подходит для подключения к Arduino.
Код Arduino – тестирование AT команд
Для отправки AT команд и взаимодействия с платой расширения SIM900 мы будем использовать монитор последовательного порта. Приведенный ниже скетч позволит Arduino связываться с платой расширения SIM900 в мониторе последовательного порта. Прежде чем приступить к подробному разбору кода, подключите Arduino к компьютеру, скомпилируйте приведенный ниже код и загрузите его в Arduino.
Открыв монитор последовательного порта, убедитесь, что выбрана опция «NL & CR»!
Скетч начинается с включения библиотеки и ее инициализации выводами Arduino, к которым подключены Tx и Rx платы расширения SIM900.
В функции мы инициализируем последовательные каналы связи между Arduino и Arduino IDE, Arduino и платой расширения SIM900 со скоростью передачи 9600 бод.
Теперь, когда мы установили базовое соединение, мы попытаемся установить связь с платой расширения SIM900, отправляя AT команды.
– это самая базовая AT команда. Она также инициализирует автоматическое определение скорости. Если всё работает, вы должны увидеть эхо символов AT, а затем ОК, сообщающее, что все в порядке, и модуль вас правильно понимает! Затем вы можете отправить несколько команд для запроса и получения информации о плате расширения, таких как:
– проверить «уровень сигнала» — первое число – это уровень в дБ, он должен быть выше 5. Чем выше, тем лучше. Конечно, это зависит от вашей антенны и местоположения!
– получить номер SIM-карты – она проверяет, что SIM карта найдена, и вы можете сверить номер, записанный на карте.
– убедиться, что вы зарегистрированы в сети. Второе число должно быть 1 или 5. 1 означает, что вы зарегистрированы в домашней сети, а 5 – в роуминге. Другие цифры, отличающиеся этих двух, означают, что вы не зарегистрированы ни в одной сети.
В основном цикле программы мы вызываем пользовательскую функцию , которая непрерывно ожидает любые входные данные от последовательного монитора и отправляет их на плату расширения SIM900 через вывод D8 (Rx платы расширения). Она также постоянно читает вывод D7 (Tx платы расширения) на случай, если плата расширения выдает какие-либо отклики.
В мониторе последовательного порта вы должны увидеть вывод, примерно такой как показан ниже.
Рисунок 16 – Базовые AT команды SIM900 GSM Shield на Arduino
Теперь вы можете свободно отправлять любые команды через монитор последовательного порта, например, те, которые показаны ниже, и которые дает дополнительную информацию о подключении к сети и состоянии аккумулятора:
– получить имя и версию платы расширения
– проверить, что вы подключены к сети
– вернуть список операторов, присутствующих в сети
– вернуть состояние литий-полимерного аккумулятора. Второе число является процентом от полного заряда (в данном случае это 93%), а третье число является фактическим напряжением в мВ (в данном случае 3,877 В)
Рисунок 17 – Получение дополнительной информации от SIM900 GSM Shield с помощью AT команд на Arduino
Для получения дополнительной информации о AT командах SIM900 смотрите документ ниже.
Исходный код программы (скетча)
Код программы также очень простой. Контакт 7 платы Arduino у нас работает как цифровой выход. А на контакте A0 мы будем считывать напряжение с выхода двигателя сотового телефона и сохранять его в переменной sensorValue. Если значение sensorValue будет больше 50 мы будем подавать логическую единицу на контакт 7, в результате чего будет загораться светодиод, подключенный к данному контакту. Если значение sensorValue будет меньше или равно 50, мы будем выключать светодиод. Также через последовательный порт мы будем передавать сообщения «Rumble on» и «Rumble off», которые будут сигнализировать о состоянии двигателя сотового телефона.
Arduino
void setup() {
Serial.begin(9600);
pinMode(7, OUTPUT);
}
void loop() {
int sensorValue = analogRead(A0);
if (sensorValue > 50)
{
digitalWrite(7, HIGH);
Serial.println(«Rumble on»);
delay(1000);
}
else
{
digitalWrite(7, LOW);
Serial.println(«Rumble off»);
delay(100);
}
}
1 |
voidsetup(){ Serial.begin(9600); pinMode(7,OUTPUT); } voidloop(){ intsensorValue=analogRead(A0); if(sensorValue>50) { digitalWrite(7,HIGH); Serial.println(«Rumble on»); delay(1000); } digitalWrite(7,LOW); Serial.println(«Rumble off»); delay(100); } |
Передача данных по TCP
Далее привожу AT команды для установки tcp соединения через GPRS.
AT команда | Ответ | Примечания |
AT+CPIN? | +CPIN: READYOK | Проверка SIM PIN |
AT+CSQ | +CSQ: 23,0 OK | Проверка уровня сигнала. Первая цифра — уровень сигнала <rssi>:0 — 115 dBm or less 1 -111 dBm 2…30 -110… -54 dBm 31 -52 dBm or greater 99 — not known or not detectableВторая цифра — количество ошибок в канале. 0 — хорошо. |
AT+CREG? | +CREG: 0,1OK | Первая цифра <n>: 0 — Disable network registration unsolicited result code 1 — Enable network registration unsolicited result code +CREG: 2 — Enable network registration unsolicited result code with location informationВторая цифра <stat>: 0 — Not registered, MT is not currently searching a new operator to register to 1 — Registered, home network — правильный вариант2 — Not registered, but MT is currently searching a new operator to register to 3 — Registration denied 4 — Unknown 5 — Registered, roaming |
AT+CGATT? | +CGATT: 1OK | Статус GPRS Service-а <stat>:0 — Detached 1 — Attached — правильный вариант |
AT+CIPSHUT | SHUT OK | Deactivate GPRS PDP Context. В доке разработчик эта команда не указана, но без неё у меня не проходила команда установки APN. |
AT+CSTT=«internet.beeline.ru»,»beeline»,»beeline» | OK | Устанавливаем APN. В примере — для оператора «Билайн». |
AT+CSTT? | +CSTT: «internet.beeline.ru»,»beeline»,»beeline» | Проверяем, что APN сохранился. |
AT+CIICR | OK | Переводим в режим беспроводного соединения (GPRS or CSD). |
AT+CIFSR | 100.89.139.161 | Получаем выделенный оператором динамический IP адрес. |
AT+CIPSTART=«TCP»,»116.228.221.51″,»8500″ | OK | Установка тестового TCP соединения с каким-то китайским тестовым сервером. |
Полевые испытания
Прошу прощения за эстетику монтажа.
Установка на входную дверь. Часть конструкции справа (непосредственно на самой двери) — магнит для срабатывания геркона.
На место постоянного использования (гараж) устройство было установлено 4 месяца назад. Для целей усиленного тестирования, функция расписания не используется (по каждому событию отправляется SMS). В среднем получается 5 SMS в день: два при входе в гараж (срабатывает датчик открытия двери и датчик освещения), два при выходе и один «ежедневный отчет». На текущий момент батареи (3x AA) держат напряжение 4.1в при включенном модеме.
Код Arduino – прием вызова
Прием звонка не требует специального кода; вы просто должны продолжать слушать плату расширения SIM900. Тем не менее, вы можете найти этот скетч очень полезным, когда вам нужно инициировать действие при получении звонка с определенного номера телефона.
Входящий вызов обычно обозначается как «» в мониторе последовательного порта, за которым следуют номер телефона и идентификатор звонящего. Чтобы принять или сбросить вызов, используются следующие AT команды:
– принимает входящий звонок.
– сбрасывает звонок. При прекращении вызова в монитор последовательного порта отправляется сообщение NO CARRIER, указывающее, что вызов не может соединиться.
Ниже приведен вывод в мониторе последовательного порта, показывающий вызов, полученный платой расширения SIM900 GSM/GPRS Shield.
Рисунок 25 – Звонок на SIM900 GSM ShieldРисунок 26 – AT команды SIM900 GSM Shield для приема вызова на Arduino
Шаг 5. Код проекта
Код также очень прост и его довольно легко понять. Скачать или скопировать код можно ниже:
void setup() { Serial.begin(9600); pinMode(7, OUTPUT); } void loop() { int sensorValue = analogRead(A0); if (sensorValue > 50) { digitalWrite(7, HIGH); Serial.println("Rumble on"); delay(1000); } else { digitalWrite(7, LOW); Serial.println("Rumble off"); delay(100); } }
В настройке void мы говорим, что вывод 7 будет выступать в качестве выходного сигнала, так как это будет наш светодиодный вывод. Затем в цикле void, мы говорим, что sensorValue является аналоговым значением pin A0, которое затем используется в выражении if.
Оператор if утверждает, что если sensorValue больше 50, то включить контакт 7, который является светодиодным выводом, и отправить обратно «Rumble On» на последовательный монитор. Если значение sensorValue меньше 50, то выключить светодиод и отправить обратно «Rumble Off» на последовательный монитор.
Откройте код в IDE Arduino, загрузите его на свою плату и протестируйте.
Характеристики
- Поддержка частот GSM 850/900/1800/1900 МГц
- Класс передачи данных GPRS multi-slot class 12
- Соответствие стандарту GSM фазы 2/2+
- Bluetooth стандарта 3.0 + EDR
- Встроенный стек TCP/IP, UDP/IP
-
Поддержка протоколов HTTP и FTP
-
Полное управление при помощи АТ-команд:
- Стандартный набор – GSM 07.07 & 07.05
- Расширенный набор – SIMCOM AT
- Возможность подключения аудио гарнитуры и микрофона
- Интерфейс UART 1200–115200 (9600 по умолчанию) бит/с
- Разъём для сим-карты
- Энергопотребление:в зависимости от текущего режима работы и может колебаться от 20-30мА до 500мА. Также возможны кратковременные скачки до 2-3А, особенно в процессе поиска сети или при приеме/передачи данных. В спящем режиме: 1.5 мА.
- Выполнен в форм-факторе Arduino
- Напряжение питания Vin: 7—12 В
- Температурный диапазон: -40 °C…+85 °C
Ошибка +CSQ: 0,0
Если команда получения уровня сигнала AT+CSQ возвращает +CSQ: 0,0, то наверняка будут проблемы с регистрацией в сети. Команда AT+CREG? вернет +CREG: 0,2 вместо +CREG: 0,1. Какие действия для разрешения ошибки:
Проверяем в другом устройстве, что SIM-ка корректно регистрируется в сети.
Вставляем в SIM800 в соответствии с пиктограммой на слоте и проверяем командой AT+CPIN, что SIM карта определилась корректно.
Командой AT+CBAND? проверяем, что SIM800 настроен на все диапазоны частот
На моем модуле, когда он нормально регистрируется в сети Билайна, результат: DCS_MODE,ALL_BANDS.
Основной момент на который обратить внимание!!! Не зависимо от того, какой ток держит блок питания или DC-DC step-down модуль, хоть 3A и вы в этом лично убеждались, попробуйте запустить SIM800 от батареи. Возьмите аккумулятор от мобильного телефона на 3,7 В или Li-Ion элемент 18650 на 3,7 V и присоедините плюс батареи к пину V_BAT , а минус — на GND.
Спустя некорое время проверяем уровень сигнала AT+CSQ
Скорее всего проблема с регистрацией разрешится.
Все GSM модули, не важно, дорогой SIM800 или дешевый M590 КРАЙНЕ чувствительны к качеству блока питания. И дело не только в токе, но и в пульсациях
Я запитывал SIM800C от разных БП с макисмальными токами до 2,1 A и он нормально включался, отвечал на AT команды, но не регистрировался в сети. После подключения на батарею TR 18650 сеть сразу нашлась.
Ниже приведены вырезки из design guide для модулей SIM800 и M590. Они почти сходятся в блоке фильтрации. Нужно ставить керамические конденсаторы на 10 pF и 33 pF (у M590 на 100 pF) для сглаживания высокочастотных пульсаций и электролитические хотя-бы на 100 uF, а лучше на 1000 uF.
Фильтры на блок питания для SIM800 Фильтры на блок питания для Neoway M590
Передача данных с подтверждением в командном режиме
AT+CIPSEND? // Проверяем максимальный размер данных, которые можно послать в сторону удаленной стороны. Этот размер зависит от сети. +CIPSEND: 1460 OK AT+CIPQSEND? // Нормальный режим передачи данных. В этом режиме каждая порция высланных данных подтверждается сообщением SEND OK, что означает, что сервер данные принял и подтвердил их получение. +CIPQSEND: 0 OK AT+CIPSEND=100 // Передача 100 байт данных. > // Приглашение. hellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohello // Размер данных не должен быть больше 1460 байт, и в конце блока данных следует байт 0x1A. SEND OK // Данные успешно переданы. AT+CIPSEND // Передача данных произвольного размера. > hellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohello // Размер данных не должен быть больше 1460 байт, и в конце блока данных следует байт 0x1A. SEND OK
Быстрая передача данных в командном режиме
AT+CIPQSEND=1 // Режим быстрой передачи данных. Этот режим подразумевает передачу данных без ожидания от сервера подтверждения о получении. OK AT+CIPSEND=100 // Передача 100 байт данных. > hellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohello DATA ACCEPT:100 // Модуль принял данные в свой буфер и вышлет их в сторону сервера в фоновом режиме. AT+CIPACK // Проверка: 300 байт передано на сервер, из них 300 байт сервером приняты и подтверждены. +CIPACK: 300,300,0 OK AT+CIPSEND // Передача данных произвольного размера происходит аналогичным образом. > hellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohello DATA ACCEPT:100 AT+CIPACK +CIPACK: 400,400,0 OK AT+CIPQSEND=0 // Нормальный режим передачи данных. OK
Прием данных в командном режиме, автоматический вывод принятых данных
AT // Модуль находится в командном режиме; OK AT OK HelloHelloHelloHelloHelloHelloHelloHelloHelloHello // Данные, принятые от сервера, выводятся из порта UART модуля автоматически. Данные выводятся как есть, и это неудобно, поэтому будут полезны следующие настройки. AT OK AT+CIPHEAD=1 // Перед блоком данных, принятых от сервера, добавлять заголовок формата +IPD,<длина блока данных>. OK AT+CIPSRIP=1 // При приеме данных показывать уведомление в виде RECV FROM:<IP адрес отправителя>,<порт>. OK
Прием данных в командном режиме, ручной вывод принятых данных
Для смены способа вывода данных требуется разорвать соединение и деактивировать контекст.
AT+CIPCLOSE // Закрытие соединения. CLOSE OK AT+CIPSTATUS OK STATE: TCP CLOSED AT+CIPSHUT // Деактивация контекста. SHUT OK AT+CIPRXGET? +CIPRXGET: 0 // Автоматический вывод принятых данных. OK AT+CIPRXGET=1 // Настройка ручного вывода данных. OK AT+CSTT OK AT+CIICR OK AT+CIFSR 100.69.113.182 AT+CIPSTART=”TCP”,”81.95.20.18”,2020 OK CONNECT OK AT OK AT OK +CIPRXGET: 1,”81.95.20.18:2020” // Уведомление о приеме данных от сервера. AT OK AT+CIPRXGET=4 // Уточнение размера принятых данных. +CIPRXGET: 4,100 // Пришло 100 байт данных. OK AT+CIPRXGET=2,20 // Вывести 20 байт в порт UART; +CIPRXGET: 2,20,80,”81.95.20.18:2020” // В буфере модуля осталось 80 байт. HelloHelloHelloHello // Запрошенные 20 байт данных. OK AT+CIPRXGET=2,20 // Вывести 20 байт в порт UART. +CIPRXGET: 2,20,60,”81.95.20.18:2020” // В буфере модуля осталось 60 байт. HelloHelloHelloHello // Запрошенные 20 байт данных. OK AT+CIPRXGET=2,60 // Вывести 60 байт в порт UART. +CIPRXGET: 2,60,0,”81.95.20.18:2020” // Приемный буфер модуля пуст. HelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHello // Запрошенные 60 байт данных. OK AT+CIPRXGET=4 // Проверка наличия данных в буфере модуля. +CIPRXGET: 4,0 // Буфер пуст. OK
Обмен данными с сервером в прозрачном режиме
Для смены режима передачи данных требуется разорвать соединение и деактивировать контекст.
AT+CIPCLOSE CLOSE OK AT+CIPSHUT SHUT OK AT+IFC=2,2 // Аппаратный контроль потока должен быть включен, чтобы избежать потери данных. OK AT+CIICR OK AT+CIFSR 100.104.155.220 AT+CIPSTART=”TCP”,”81.95.20.18”,2020 OK CONNECT // Соединение установлено.
* * *
Благодаря подробному освещению возможностей встроенного стека протоколов TCP/IP новой линейки модулей серии SIM800, выгод его применения и приведению объемного исчерпывающего примера работы со стеком в различных режимах, данная статья поможет разработчику быстро освоить материал официальных руководств по применению модулей SIMCom Wireless Solutions и послужит в разработке отправной точкой.
Использование GPRS в GSM модуле
В этом проекте мы использовали обычный GSM модуль с SIM картой для GPRS соединения. Технология GPRS в нашем проекте ответственна за передачу данных на сервер Sparkfun. Ранее на нашем сайте мы уже рассматривали передачу данных на веб-сервер с помощью Arduino и Wi-Fi модуля ESP8266, здесь же мы вместо технологии Wi-Fi применим технологию GPRS. Более подробно все описанные в статье процессы можно посмотреть на видео, приведенном в конце статьи.
GPRS расшифровывается как General Packet Radio Services и переводится как пакетная радиосвязь общего назначения. Данная технология способна обеспечивать выход в сеть интернет и работать со скоростями передачи данных 56-114 кбит/с.
При этом нет необходимости покупать какой то отдельный модуль для работы с GPRS поскольку она реализована в обычном GSM модуле. Для управления GSM модулем мы будем использовать так называемые AT команды. Далее рассмотрены некоторые из этих команд доступные для модуля SIMCOM SIM900A (на самом деле их достаточно много, информацию по ним легко найти в сети интернет), которые нам понадобятся в данном проекте.
Для передачи данных на веб-сервер с помощью технологии GPRS нам, прежде всего, необходимо инициализировать GSM модуль.
Команды для инициализации GSM модуля
AT : эта команда используется для проверки того отвечает ли GSM модуль или нет
AT+CPIN? : эта команда используется для проверки того вставлена ли SIM карта в GSM модуль или нет
ATE0 : эта команда отключает эхо, то есть чтобы модуль не повторял в ответ команды, которые мы ему передаем
ATE1 : эта команда используется для включения эхо
1 |
ATэтакомандаиспользуетсядляпроверкитогоотвечаетлиGSMмодульилинет AT+CPIN?этакомандаиспользуетсядляпроверкитоговставленалиSIMкартавGSMмодульилинет ATE0этакомандаотключаетэхо,тоестьчтобымодульнеповторялвответкоманды,которыемыемупередаем ATE1этакомандаиспользуетсядлявключенияэхо |
Команды для инициализации GPRS интернет соединения
AT+CIPSHUT : закрыть TCP порт, что означает прекращение всех соединений
AT+CGATT? : проверка имеет ли SIM карта интернет соединение или нет
AT+CSTT = «APN»,»userName»,»Pass» : соединение с интернет
(ex; AT+CSTT=»airtelgprs.com»,»»,»»)
AT+CIICR : соединение с беспроводной сетью. Проверяемая SIM карта должна иметь предоплаченный объем данных или положительный баланс
AT+CIFSR : получить IP (иногда без этой команды GSM не будет работать поэтому желательно ее использовать)
AT+CIPSTART = ”TCP”,”SERVER IP”,”PORT” : эта команда используется для создания TCP соединения с сервером который мы прописываем в поле SERVER IP
AT+CIPSEND : эта команда используется для передачи данных на сервер. After input, this command server asks for data.
1 |
AT+CIPSHUTзакрытьTCPпорт,чтоозначаетпрекращениевсехсоединений AT+CGATT?проверкаимеетлиSIMкартаинтернетсоединениеилинет AT+CSTT=»APN»,»userName»,»Pass»соединениесинтернет (ex;AT+CSTT=»airtelgprs.com»,»»,»») AT+CIICRсоединениесбеспроводнойсетью.ПроверяемаяSIMкартадолжнаиметьпредоплаченныйобъемданныхилиположительныйбаланс AT+CIFSRполучитьIP(иногдабезэтойкомандыGSMнебудетработатьпоэтомужелательноееиспользовать) AT+CIPSTART=”TCP”,”SERVER IP”,”PORT”этакомандаиспользуетсядлясозданияTCPсоединенияссерверомкоторыймыпрописываемвполеSERVER IP AT+CIPSENDэтакомандаиспользуетсядляпередачиданныхнасервер.After input,thiscommand server asks fordata. |
После ввода данных мы передаем 26 на сервер. Если все нормально, то данные будут успешно загружены на сервер и SparkFun (сервер в нашем рассматриваемом случае) отвечает что все нормально или произошла ошибка.
Заключение
Возможности микроконтроллера Arduino позволяют создать на его базе практически любой проект домашней или промышленной автоматизации. А если дополнить его комплектом подключения к сотовой сети и соответствующим образом запрограммировать, плата превратится в мощный комплекс удаленного доступа, мониторинга, оповещения и выполнения прочих задач, требующих наличия постоянной связи. GSM-модули доступны, легко устанавливаются и настраиваются, обладают низким энергопотреблением и работают везде в зоне покрытия сотовой сети.
Разумеется, использовать их как средство передачи крупных объемов данных нельзя, поскольку доступ в интернет этим классом устройств обеспечивается только через GPRS, с небольшими скоростями. Но в задачах создания дешевой и надежной охранной системы, комплекса мониторинга или хаба «умного дома» такие решения находят обширное применение — как у энтузиастов, так и профессионалов.