GPRS Shield — плата расширения, позволяющая Arduino работать в сетях сотовой связи по технологиям GSM/GPRS. Модуль умеет осуществлять входящие/исходящие звонки, принимать и передавать SMS и выходить в интернет средствами GPRS.
GPRS Shield в момент поиска сети потребляет ток до 2 А. Питания только через разъём USB не достаточно. Для стабильной работы модуля используйте дополнительный источник питания от 7 до 12 В.
TX
и RX
с 0
и 1
пином соответственно; PK
с 2
пином;ST
с 3
пином.
GPRS Shield общается с управляющей платой по протоколу UART и дополнительными сигнальными пинами — PK
и ST
.
На всех платах Iskra и Arduino присутствует хотя бы один аппаратный UART — HardwareSerial. Если же по каким то причинам последовательный интерфейс занят другим устройством, можно воспользоваться программным UART — SoftwareSerial.
На управляющей плате Iskra JS и Arduino платах с микроконтроллером ATmega32U4 / ATSAMD21G18
, данные по USB и общение через пины 0
и 1
осуществляется через два раздельных UART
. Это даёт возможность подключить GPRS Shield к аппаратному UART
на пинах 0
и 1
.
Список поддерживаемых плат:
В качестве примера подключите модуль к Iskra Neo и отправьте SMS на указанный номер с GPRS Shield’a. Прошейте управляющую плату скетчем приведённым ниже. Откройте монитор последовательного порта для анализа действий программы.
// библиотека для работы с GPRS устройством #include <GPRS_Shield_Arduino.h> // создаём объект класса GPRS и передаём в него объект Serial1 GPRS gprs(Serial1); // можно указать дополнительные параметры — пины PK и ST // по умолчанию: PK = 2, ST = 3 // GPRS gprs(Serial1, 2, 3); void setup() { // открываем последовательный порт для мониторинга действий в программе Serial.begin(9600); // открываем Serial-соединение с GPRS Shield Serial1.begin(9600); // ждём, пока не откроется монитор последовательного порта // для того, чтобы отследить все события в программе while (!Serial) { } Serial.print("Serial init OK\r\n"); // включаем GPRS шилд gprs.powerOn(); // проверяем есть ли связь с GPRS устройством while (!gprs.init()) { // если связи нет, ждём 1 секунду // и выводим сообщение об ошибке // процесс повторяется в цикле // пока не появится ответ от GPRS устройства delay(1000); Serial.print("Init error\r\n"); } // выводим сообщение об удачной инициализации GPRS Shield Serial.println("GPRS init success"); // отправляем сообщение по указанному номеру с заданным текстом gprs.sendSMS("+79263995140", "Hello SMS from Amperka!"); } void loop() { }
Некоторые платы Arduino, например, Uno, прошиваются через пины 0
и 1
. Это означает невозможность использовать одновременно прошивку/отладку по USB и общение с GPRS модулем. Решение проблемы — программный UART
. Снимите джампера с TX
и RX
GPRS Shield’a и с помощью проводов «мама-папа» перебросьте на свободные пины управляющей платы.
В качестве примера подключите GPRS Shield к платформе Arduino Uno.
TX
и RX
GPRS Shield'a и перекиньте управляющие контакты с 0(RX)
и 1(TX)
— на 10
и 11
пин соответственно.
Протестируйте. Отправим SMS на указанный номер с GPRS Shield’a.
При использовании программного UART не забудьте про библиотеку SoftwareSerial.
Прошейте управляющую плату скетчем приведённым ниже. Откройте монитор последовательного порта для анализа действий программы.
// библиотека для работы с GPRS устройством #include <GPRS_Shield_Arduino.h> // библиотека для эмуляции Serial порта // она нужна для работы библиотеки GPRS_Shield_Arduino #include <SoftwareSerial.h> // создаём объект mySerial и передаём номера управляющих пинов RX и TX SoftwareSerial mySerial(10, 11); // создаём объект класса GPRS и передаём в него объект mySerial GPRS gprs(mySerial); // можно указать дополнительные параметры — пины PK и ST // по умолчанию: PK = 2, ST = 3 // GPRS gprs(mySerial, 2, 3); void setup() { // открываем последовательный порт для мониторинга действий в программе Serial.begin(9600); // открываем Serial-соединение с GPRS Shield mySerial.begin(9600); // ждём, пока не откроется монитор последовательного порта // для того, чтобы отследить все события в программе while (!Serial) { } Serial.print("Serial init OK\r\n"); // включаем GPRS шилд gprs.powerOn(); // проверяем есть ли связь с GPRS устройством while (!gprs.init()) { // если связи нет, ждём 1 секунду // и выводим сообщение об ошибке // процесс повторяется в цикле // пока не появится ответ от GPRS устройства delay(1000); Serial.print("Init error\r\n"); } // выводим сообщение об удачной инициализации GPRS Shield Serial.println("GPRS init success"); // отправляем сообщение по указанному номеру с заданным текстом gprs.sendSMS("+79263995140", "Hello SMS from Amperka!"); } void loop() { }
На платах форм-фактора Arduino Mega 2560 аппаратный UART, который отвечает за передачу данных через пины 1
и 0
, отвечает также за передачу по USB. Это означает невозможность использовать одновременно UART
для коммуникации с GPRS-модулем и отладки по USB.
Но на платах такого форм-фактора есть ещё дополнительно три аппаратных UART:
19(RX1)
и 18(TX1)
;17(RX2)
и 16(TX2)
;15(RX3)
и 14(TX3)
.Список поддерживаемых плат:
Подключите GPRS Shield к платформе Arduino Mega 2560.
TX
и RX
GPRS Shield'a и перекиньте управляющие контакты с 0(RX)
и 1(TX)
— на 19(RX1)
и 18(TX1)
пин соответственно.
Протестируйте. В качестве примера отправим SMS на указанный номер с GPRS Shield’a. Прошейте управляющую плату скетчем приведённым ниже. Откройте монитор последовательного порта для анализа действий программы.
// библиотека для работы с GPRS устройством #include <GPRS_Shield_Arduino.h> // создаём объект класса GPRS и передаём в него объект Serial1 GPRS gprs(Serial1); // можно указать дополнительные параметры — пины PK и ST // по умолчанию: PK = 2, ST = 3 // GPRS gprs(Serial1, 2, 3); void setup() { // открываем последовательный порт для мониторинга действий в программе Serial.begin(9600); // открываем Serial-соединение с GPRS Shield Serial1.begin(9600); // ждём, пока не откроется монитор последовательного порта // для того, чтобы отследить все события в программе while (!Serial) { } Serial.print("Serial init OK\r\n"); // включаем GPRS шилд gprs.powerOn(); // проверяем есть ли связь с GPRS устройством while (!gprs.init()) { // если связи нет, ждём 1 секунду // и выводим сообщение об ошибке // процесс повторяется в цикле // пока не появится ответ от GPRS устройства delay(1000); Serial.print("Init error\r\n"); } // выводим сообщение об удачной инициализации GPRS Shield Serial.println("GPRS init success"); // отправляем сообщение по указанному номеру с заданным текстом gprs.sendSMS("+79263995140", "Hello SMS from Amperka!"); } void loop() { }
Рассмотрим несколько примеров работы GPRS Shield’a. Для каждой управляющей платы скетч будет отличаться, только лишь созданием GPRS-объекта. Подробнее в предыдущем разделе.
Чтобы позвонить с GPRS Shield’a, воспользуйтесь скетчем, приведенным ниже. Не забудьте подключить наушники и микрофон в соответствующие разъёмы на плате, чтобы вы смогли слышать абонента, а он вас. Если открыть монитор последовательного порта, можно проследить порядок действий.
// библиотека для работы с GPRS устройством #include <GPRS_Shield_Arduino.h> // номер на который будем звонить #define PHONE_NUMBER "+79263995140" // создаём объект класса GPRS и передаём в него объект Serial1 GPRS gprs(Serial1); // можно указать дополнительные параметры — пины PK и ST // по умолчанию: PK = 2, ST = 3 // GPRS gprs(Serial1, 2, 3); void setup() { // открываем последовательный порт для мониторинга действий в программе Serial.begin(9600); // ждём, пока не откроется монитор последовательного порта // для того, чтобы отследить все события в программе while (!Serial) { } Serial.print("Serial init OK\r\n"); // открываем Serial-соединение с GPRS Shield Serial1.begin(9600); // включаем GPRS шилд gprs.powerOn(); // проверяем есть ли связь с GPRS устройством while (!gprs.init()) { // если связи нет, ждём 1 секунду // и выводим сообщение об ошибке // процесс повторяется в цикле // пока не появится ответ от GPRS устройства delay(1000); Serial.print("GPRS Init error\r\n"); } // вывод об удачной инициализации GPRS Shield Serial.println("GPRS init success"); // сообщаем о наборе номера Serial.print("Start to call "); Serial.print(PHONE_NUMBER); // звоним по указанному номеру gprs.callUp(PHONE_NUMBER); } void loop() { }
Произведём входящий звонок на GPRS Shield. Не забудьте подключить наушники и микрофон в соответствующие разъёмы на плате, чтобы вы смогли слышать абонента, а он вас.
// библиотека для работы с GPRS устройством #include <GPRS_Shield_Arduino.h> // создаём объект класса GPRS и передаём в него объект Serial1 GPRS gprs(Serial1); // можно указать дополнительные параметры — пины PK и ST // по умолчанию: PK = 2, ST = 3 // GPRS gprs(Serial1, 2, 3); void setup() { // открываем последовательный порт для мониторинга действий в программе Serial.begin(9600); // ждём, пока не откроется монитор последовательного порта // для того, чтобы отследить все события в программе while (!Serial) { } Serial.print("Serial init OK\r\n"); // открываем Serial-соединение с GPRS Shield Serial1.begin(9600); // включаем GPRS шилд gprs.powerOn(); // проверяем есть ли связь с GPRS устройством while (!gprs.init()) { // если связи нет, ждём 1 секунду // и выводим сообщение об ошибке // процесс повторяется в цикле, // пока не появится ответ от GPRS устройства delay(1000); Serial.print("GPRS Init error\r\n"); } // вывод об удачной инициализации GPRS Shield Serial.println("GPRS init success"); // сообщаем об ожидании звонка Serial.println("Wait to call "); } void loop() { // ожидаем звонка if (gprs.ifcallNow()) { // если поступает входящий звонок // выводим сообщение Serial.println("Incoming call"); // по истечении 5 секунд берём трубку delay(5000); gprs.answer(); // выводим сообщение о начале разговора delay(1000); Serial.println("Call a conversation"); while (!gprs.ifcallEnd()) { // ждём пока месть абонент не положит трубку } // выводим сообщение о конце разговора Serial.println("Call over"); } }
Помимо приёма и совершения звонков модуль может принимать и отправлять короткие текстовые сообщения — SMS. Ниже представлен пример отправки текстового сообщения.
// библиотека для работы с GPRS устройством #include <GPRS_Shield_Arduino.h> // номер на который будем отправлять сообщение #define PHONE_NUMBER "+79263995140" // текст сообщения, которое будем отправлять #define MESSAGE "Hello from GPRS Shield" // создаём объект класса GPRS и передаём в него объект Serial1 GPRS gprs(Serial1); // можно указать дополнительные параметры — пины PK и ST // по умолчанию: PK = 2, ST = 3 // GPRS gprs(Serial1, 2, 3); void setup() { // открываем последовательный порт для мониторинга действий в программе Serial.begin(9600); // ждём пока не откроется монитор последовательного порта // для того, чтобы отследить все события в программе while (!Serial) { } Serial.print("Serial init OK\r\n"); // открываем Serial-соединение с GPRS Shield Serial1.begin(9600); // включаем GPRS-шилд gprs.powerOn(); // проверяем, есть ли связь с GPRS-устройством while (!gprs.init()) { // если связи нет, ждём 1 секунду // и выводим сообщение об ошибке; // процесс повторяется в цикле, // пока не появится ответ от GPRS-устройства delay(1000); Serial.print("GPRS Init error\r\n"); } // вывод об удачной инициализации GPRS Shield Serial.println("GPRS init success"); // сообщаем о написании и отправке СМС по указанному номеру Serial.println("Start to send message ..."); // отправляем сообщение по указанному номеру с заданным текстом gprs.sendSMS(PHONE_NUMBER, MESSAGE); } void loop() { }
Прочитаем сообщения, которые будут поступать на сим-карту, установленную в модуль. Вся информация будет выводиться в монитор Serial порта.
// библиотека для работы с GPRS устройством #include <GPRS_Shield_Arduino.h> // длина сообщения #define MESSAGE_LENGTH 160 // номер сообщения в памяти сим-карты int messageIndex = 0; // текст сообщения char message[MESSAGE_LENGTH]; // номер, с которого пришло сообщение char phone[16]; // дата отправки сообщения char datetime[24]; // создаём объект класса GPRS и передаём в него объект Serial1 GPRS gprs(Serial1); // можно указать дополнительные параметры — пины PK и ST // по умолчанию: PK = 2, ST = 3 // GPRS gprs(Serial1, 2, 3); void setup() { // открываем последовательный порт для мониторинга действий в программе Serial.begin(9600); // ждём пока не откроется монитор последовательного порта // для того, чтобы отследить все события в программе while (!Serial) { } Serial.print("Serial init OK\r\n"); // открываем Serial-соединение с GPRS Shield Serial1.begin(9600); // включаем GPRS-шилд gprs.powerOn(); // проверяем, есть ли связь с GPRS-устройством while (!gprs.init()) { // если связи нет, ждём 1 секунду // и выводим сообщение об ошибке; // процесс повторяется в цикле, // пока не появится ответ от GPRS-устройства delay(1000); Serial.print("GPRS Init error\r\n"); } // выводим сообщение об удачной инициализации GPRS Shield Serial.println("GPRS init success"); Serial.println("Please send SMS message to me!"); } void loop() { // если пришло новое сообщение if (gprs.ifSMSNow()) { // читаем его gprs.readSMS(message, phone, datetime); // выводим номер, с которого пришло смс Serial.print("From number: "); Serial.println(phone); // выводим дату, когда пришло смс Serial.print("Datetime: "); Serial.println(datetime); // выводим текст сообщения Serial.print("Recieved Message: "); Serial.println(message); } }
Данный раздел рассказывает о том, как работать с GPRS Shield на более низком уровне, без дополнительных библиотек. Если вам достаточно тех методов, которые предоставляет штатная библиотека, можете пропустить этот раздел.
С внешним миром модуль общается посредством AT-команд. Все команды делятся на базовые, так называемые S-команды, и расширенные, добавленные в стандартах GSM07.05–07.07. Практически все команды работают в 3 режимах — тестовом, чтения и записи.
OK
, если команда поддерживается или возможные значения данных в параметре команды. Тестовый режим определяется окончанием команды в виде =?
?
=
идут новые значения параметров.По умолчанию модуль настроен на 9600 8N1:
Для проверки поддерживаются AT-команды:
Команда | Ответ | Описание |
---|---|---|
AT+IPR? | +IPR: 0 OK | Скорость порта: 0 – автоматически 1200 2400 4800 9600 19200 38400 57600 115200 |
AT+ICF? | +ICF: 3,3 OK | Настройки передачи. Первый параметр: Бит в посылке чётность/стоп бит 1 – 8/0/2 2 – 8/1/1 3 – 8/0/1 4 – 7/0/2 5 – 7/1/1 6 – 7/0/1 Второй параметр – чётность: 0 – нечётный 1 – чётный 3 – нет |
AT+IFC? | +IFC: 0,0 OK | Контроль передачи данных. Первый параметр – терминалом от модуля Второй параметр – модулем от терминала 0 – нет контроля 1 – программный 2 – аппаратный |
Если вы хотите изменить их, введите AT-команду, замените знак ?
на =
и введите нужные вам параметры из таблицы.
Все настройки этих команд сохраняются в энергонезависимой памяти.
Команда | Ответ | Описание |
---|---|---|
AT+GCAP | +GCAP: +CGSM OK | Возможности модуля |
AT+GMM | SIMCOM_SIM800C OK | Идентификатор модуля |
AT+GMR | Revision:1418B08SIM800C32_BT_EAT OK | Ревизия |
AT+GSN | 8683450321ХХХХХ OK | IMEI |
В документе с перечнем AT-команд можно найти документацию на все поддерживаемые команды.
// библиотека для работы с GPRS устройством #include <GPRS_Shield_Arduino.h> // создаём объект класса GPRS и передаём в него объект Serial1 GPRS gprs(Serial1); // можно указать дополнительные параметры — пины PK и ST // по умолчанию: PK = 2, ST = 3 // GPRS gprs(Serial1, 2, 3); void setup() { // открываем последовательный порт для мониторинга действий в программе Serial.begin(9600); // ждём, пока не откроется монитор последовательного порта // для того, чтобы отследить все события в программе while (!Serial) { } Serial.print("Serial init OK\r\n"); // открываем Serial-соединение с GPRS Shield Serial1.begin(9600); // включаем GPRS шилд gprs.powerOn(); // проверяем есть ли связь с GPRS устройством while (!gprs.init()) { // если связи нет, ждём 1 секунду // и выводим сообщение об ошибке // процесс повторяется в цикле // пока не появится ответ от GPRS устройства Serial.print("GPRS Init error\r\n"); delay(3000); } // выводим сообщение об удачной инициализации GPRS Shield Serial.println("GPRS init success"); } void loop() { // считываем данные с компьютера и записываем их в GPRS Shield serialPCread(); // считываем данные с GPRS Shield и выводим их в Serial-порт serialGPRSread(); } void serialPCread() { if (Serial.available() > 0) { // если приходят данные по USB while (Serial.available() > 0) { // записываем их в GPRS Shield Serial1.write(Serial.read()); } } } void serialGPRSread() { if (Serial1.available() > 0) { // если приходят данные с GPRS Shield while (Serial1.available() > 0) { // передаём их в USB Serial.write(Serial1.read()); } } }
Сердце GPRS Shield — чип SIM800C — представитель GSM/GPRS-модулей компании SIMCom.
При подключении наушников и микрофона в соответствующие разъёмы, во время звонка с абонентом можно общаться аналогично обычному телефону.
Слот для подключения стандартной сим-карты — Mini-SIM (2FF). Если у вас сим-карта другого размера, Micro Sim или Nano Sim, воспользуйтесь специальными переходниками.
Контакты GPRS Shield | Контакты Arduino | Использование |
---|---|---|
TX и RX | 0 и 1 | Используются для выбора управляющих пинов c микроконтроллером. |
PK | 2 | Используется для включения модуля. Для этого на него необходимо подать высокий уровень на 3 секунды, а затем подать низкий уровень на эту же ножку. |
ST | 3 | Информационный пин о состоянии включения GPRS Shield. Если высокий уровень — шилд включён, если низкий — выключен. |
Если в вашем проекте какие-нибудь из этих пинов уже заняты другим устройством, вы можете использовать любой другой свободный цифровой пин. Для этого необходимо снять джампер напротив занятого пина и припаять проводок между луженым отверстием рядом со снятым джампером и таким же отверстием рядом с нужным пином.
Гнездо для батарейки CR1225, обеспечивающей работу встроенных часов реального времени. Нужна только при использовании команд, связанных с часами.
SMA-разъём для подключения внешней антенны. Без неё сигнал будет очень слабым.
У модуля есть два информационных светодиода — ST
, который загорается после включения модуля и AIR
, который мигает в зависимости от состояния сети.
Возможные режимы AIR
(Горит/Не горит):