GPRS Shield v3

GPRS Shield — плата расширения, позволяющая Arduino работать в сетях сотовой связи по технологиям GSM/GPRS. Модуль умеет осуществлять входящие/исходящие звонки, принимать и передавать SMS и выходить в интернет средствами GPRS.

GPRS Shield в момент поиска сети потребляет ток до 2 А. Питания только через разъём USB не достаточно. Для стабильной работы модуля используйте дополнительный источник питания от 7 до 12 В.

Подключение и настройка

  1. Установите SIM-карту в GPRS Shield, а шилд — на управляющую платформу, например Arduino или Iskra Neo.
  2. Убедитесь в наличии и правильности соединения джамперов на плате GPRS устройства:
    • TX и RX с 0 и 1 пином соответственно;
    • PK с 2 пином;
    • ST с 3 пином.
  3. Подключите внешнюю антенну через SMA-разъём.

GPRS Shield общается с управляющей платой по протоколу UART и дополнительными сигнальными пинами — PK и ST.

На всех платах Iskra и Arduino присутствует хотя бы один аппаратный UART — HardwareSerial. Если же по каким то причинам последовательный интерфейс занят другим устройством, можно воспользоваться программным UART — SoftwareSerial.

HardwareSerial

На управляющей плате Iskra JS и Arduino платах с микроконтроллером ATmega32U4 / ATSAMD21G18, данные по USB и общение через пины 0 и 1 осуществляется через два раздельных UART. Это даёт возможность подключить GPRS Shield к аппаратному UART на пинах 0 и 1.

Список поддерживаемых плат:

В качестве примера подключите модуль к Iskra Neo и отправьте SMS на указанный номер с GPRS Shield’a. Прошейте управляющую плату скетчем приведённым ниже. Откройте монитор последовательного порта для анализа действий программы.

HardwareSerialSendSMS.ino
// библиотека для работы с 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()
{
}

SoftwareSerial

Некоторые платы Arduino, например, Uno, прошиваются через пины 0 и 1. Это означает невозможность использовать одновременно прошивку/отладку по USB и общение с GPRS модулем. Решение проблемы — программный UART. Снимите джампера с TX и RX GPRS Shield’a и с помощью проводов «мама-папа» перебросьте на свободные пины управляющей платы.

В качестве примера подключите GPRS Shield к платформе Arduino Uno.

  1. Оденьте модуль сверху на управляющую платформу.
  2. Снимите джампера с пинов TX и RX GPRS Shield'a и перекиньте управляющие контакты с 0(RX) и 1(TX) — на 10 и 11 пин соответственно.

Протестируйте. Отправим SMS на указанный номер с GPRS Shield’a.

При использовании программного UART не забудьте про библиотеку SoftwareSerial.

Прошейте управляющую плату скетчем приведённым ниже. Откройте монитор последовательного порта для анализа действий программы.

SoftwareSerialSendSMS.ino
// библиотека для работы с 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()
{
}

HardwareSerial Mega

На платах форм-фактора Arduino Mega 2560 аппаратный UART, который отвечает за передачу данных через пины 1 и 0, отвечает также за передачу по USB. Это означает невозможность использовать одновременно UART для коммуникации с GPRS-модулем и отладки по USB.

Но на платах такого форм-фактора есть ещё дополнительно три аппаратных UART:

  • Serial1: пины 19(RX1) и 18(TX1);
  • Serial2: пины 17(RX2) и 16(TX2);
  • Serial3: пины 15(RX3) и 14(TX3).

Список поддерживаемых плат:

Подключите GPRS Shield к платформе Arduino Mega 2560.

  1. Оденьте модуль сверху на управляющую платформу.
  2. Снимите джампера с пинов TX и RX GPRS Shield'a и перекиньте управляющие контакты с 0(RX) и 1(TX) — на 19(RX1) и 18(TX1) пин соответственно.

Протестируйте. В качестве примера отправим SMS на указанный номер с GPRS Shield’a. Прошейте управляющую плату скетчем приведённым ниже. Откройте монитор последовательного порта для анализа действий программы.

HardwareSerialMegaSendSMS.ino
// библиотека для работы с 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

Рассмотрим несколько примеров работы GPRS Shield’a. Для каждой управляющей платы скетч будет отличаться, только лишь созданием GPRS-объекта. Подробнее в предыдущем разделе.

Исходящие звонки

Чтобы позвонить с GPRS Shield’a, воспользуйтесь скетчем, приведенным ниже. Не забудьте подключить наушники и микрофон в соответствующие разъёмы на плате, чтобы вы смогли слышать абонента, а он вас. Если открыть монитор последовательного порта, можно проследить порядок действий.

GPRSOutgoingСall.ino
// библиотека для работы с 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. Не забудьте подключить наушники и микрофон в соответствующие разъёмы на плате, чтобы вы смогли слышать абонента, а он вас.

GPRSIncomingСall.ino
// библиотека для работы с 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

Помимо приёма и совершения звонков модуль может принимать и отправлять короткие текстовые сообщения — SMS. Ниже представлен пример отправки текстового сообщения.

GPRSSendSMS.ino
// библиотека для работы с 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()
{
}

Чтение SMS

Прочитаем сообщения, которые будут поступать на сим-карту, установленную в модуль. Вся информация будет выводиться в монитор Serial порта.

GPRSReadSMS.ino
// библиотека для работы с 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);
  }
}

Работа с AT-командами

Данный раздел рассказывает о том, как работать с GPRS Shield на более низком уровне, без дополнительных библиотек. Если вам достаточно тех методов, которые предоставляет штатная библиотека, можете пропустить этот раздел.

Введение

С внешним миром модуль общается посредством AT-команд. Все команды делятся на базовые, так называемые S-команды, и расширенные, добавленные в стандартах GSM07.05–07.07. Практически все команды работают в 3 режимах — тестовом, чтения и записи.

  • В тестовом режиме возвращается OK, если команда поддерживается или возможные значения данных в параметре команды. Тестовый режим определяется окончанием команды в виде =?
  • В режиме чтения возвращаются текущие значения параметра, отличается от тестового наличием в конце просто символа ?
  • В режиме записи после = идут новые значения параметров.

Настройки порта

По умолчанию модуль настроен на 9600 8N1:

  • 9600 – скорость;
  • 8 – бит в посылки;
  • N – нет контроля чётности;
  • 1 – стоп бит.

Для проверки поддерживаются 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-команд можно найти документацию на все поддерживаемые команды.

Пример скетча для работы с использованием AT-команд

GPRSATСommands.ino
// библиотека для работы с 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());
    }
  }
}

Элементы платы

Модуль SIM800C

Сердце GPRS Shield — чип SIM800C — представитель GSM/GPRS-модулей компании SIMCom.

Разъём микрофона и наушников

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

Слот для SIM-карты

Слот для подключения стандартной сим-карты — 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 (Горит/Не горит):

  • 64мс/800мс — сеть не найдена;
  • 64мс/3000мс — сеть найдена;
  • 64мс/300мс — идет обмен по GPRS.

Характеристики

  • Поддержка частот 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

Ссылки