====== GPRS Shield v2 ======
Это плата расширения, позволяющая Arduino работать в сетях сотовой связи по технологиям GSM/GPRS для приёма и передачи данных, SMS и голосовой связи. С ней вы сможете  управлять удалёнными объектами с помощью мобильного телефона. Сейчас доступна [[amp>product/arduino-gprs-shield?utm_source=man&utm_campaign=gprs-shield&utm_medium=wiki | новая версия GPRS Shield]].
GPRS Shield потребляет очень большое количество энергии при в момент установки связи с сетью и работы с ней.
Питания только через разъём USB не достаточно. 
Для нормальной работы модуля необходимо использовать дополнительный [[amp>collection/wall-supplies?utm_source=man&utm_campaign=quad-v2&utm_medium=wiki|источник питания]] 7-9 В или 7-12 В в зависимости от версии шилда.
{{ :продукты:gprs-shield:3.jpg?nolink&700 |}}
===== Различие версий =====
Обратите внимание на версию вашего GPRS-Shield!
В первой версии GPRS-Shield напряжение питания шилда составляло не более 9 В.
В новой ревизии обвязка питания была изменена и теперь допускает питание до 12 В. 
{{ :продукты:gprs-shield:gprs_vs.png?nolink |}}
===== Подключение и настройка ===== 
  - Установите SIM-карту на GPRS Shield, а GPRS Shield — на управляющую платформу, например Arduino или [[amp>product/iskra-neo?utm_source=man&utm_campaign=gprs-shield&utm_medium=wiki | Iskra Neo]]. 
  - Убедитесь в наличии и правильности соединения джамперов на плате GPRS устройства:
    * ''RX'' и ''TX'' с ''0'' и ''1'' пином соответственно; 
    * ''PK'' с ''2'' пином;
    * ''ST'' с ''3'' пином.
  - Подключите внешнюю антенну через SMA-разъём.
  - Скачайте и установите [[https://github.com/amperka/gprs-shield| библиотеку]] , для управления GPRS-устройством.
{{ :продукты:gprs-shield:6.jpg?nolink&700 |}}
GPRS Shield общается с управляющей платой по протоколу [[видеоуроки:6-serial-и-processing|UART]] и дополнительными сигнальными пинами — ''PK'' и ''ST''.
На всех платах Iskra и Arduino присутствует хотя бы один аппаратный UART — [[https://www.arduino.cc/en/Reference/Serial|HardwareSerial]]. Если же по каким то причинам он занят другим устройством, можно воспользоваться программным UART — [[https://www.arduino.cc/en/Reference/SoftwareSerial|SoftwareSerial.]]
==== Подключение к Arduino Leonardo ====
На платах с микроконтроллером ''ATmega32U4'' — [[amp>product/iskra-neo?utm_source=man&utm_campaign=gprs-shield&utm_medium=wiki | Iskra Neo]], [[amp>product/arduino-leonardo?utm_source=man&utm_campaign=gprs-shield&utm_medium=wiki | Arduino Leonardo]], [[amp>product/arduino-leonardo-eth?utm_source=man&utm_campaign=gprs-shield&utm_medium=wiki | Arduino Leonardo ETH]] и [[amp>product/arduino-yun?utm_source=man&utm_campaign=gprs-shield&utm_medium=wiki | Arduino Yún]] данные по USB передаются через объект ''Serial'', а общение через пины ''0'' и ''1'' осуществляется с помощью объекта ''Serial1''. Через него и будем общаться с GPRS Shield-ом. 
В качестве примера отправим SMS на указанный номер с GPRS Shield’a. Прошейте управляющую плату скетчем приведённым ниже. Если открыть монитор последовательного порта, можно проследить порядок действий.
// библиотека для работы с GPRS устройством
#include 
// создаём объект класса 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 M0 ====
На плате [[amp>product/arduino-m0?utm_source=man&utm_campaign=gprs-shield&utm_medium=wiki | Arduino M0]] с микроконтроллером ''ATSAMD21G18'' данные по USB передаются через объект ''SerialUSB'', а общение через пины ''0'' и ''1'' осуществляется с помощью объекта ''Serial1''. Через него и будем общаться с GPRS Shield-ом. 
В качестве примера отправим SMS на указанный номер с GPRS Shield’a. Прошейте управляющую плату скетчем приведённым ниже. Если открыть монитор последовательного порта, можно проследить порядок действий.
// библиотека для работы с GPRS устройством
#include 
// создаём объект класса GPRS и передаём в него объект Serial1 
GPRS gprs(Serial1);
// можно указать дополнительные параметры — пины PK и ST
// по умолчанию: PK = 2, ST = 3
// GPRS gprs(Serial1, 2, 3);
 
void setup()
{
  // открываем последовательный порт для мониторинга действий в программе
  // для Arduino M0 — это объект SerialUSB
  SerialUSB.begin(9600);
  // открываем Serial-соединение с GPRS Shield
  Serial1.begin(9600);
  // ждём, пока не откроется монитор последовательного порта
  // для того, чтобы отследить все события в программе
  while (!SerialUSB) {
  }
  SerialUSB.print("Serial init OK\r\n");
  // включаем GPRS шилд
  gprs.powerOn();
  // проверяем есть ли связь с GPRS устройством
  while (!gprs.init()) {
    // если связи нет, ждём 1 секунду
    // и выводим сообщение об ошибке
    // процесс повторяется в цикле
    // пока не появится ответ от GPRS устройства
    delay(1000);
    SerialUSB.print("Init error\r\n");
  }
  // выводим сообщение об удачной инициализации GPRS Shield
  SerialUSB.println("GPRS init success");
  // отправляем сообщение по указанному номеру с заданным текстом
  gprs.sendSMS("+79263995140", "Hello SMS from Amperka!");
}
 
void loop()
{
}
==== Подключение к Arduino Uno ====
На плате [[amp>product/arduino-uno?utm_source=man&utm_campaign=gprs-shield&utm_medium=wiki | Arduino Uno]] с микроконтроллером [[amp>product/avr-atmega328?utm_source=man&utm_campaign=gprs-shield&utm_medium=wiki | ATMega328]] есть только один аппаратный UART, который отвечает за передачу данных через пины ''1'' и ''0'', а также передачу по USB. Это означает невозможность использовать одновременно отладку по USB и общение с GPRS Shield-ом.
Решение проблемы — программный UART. Снимите джампера с ''RX'' и ''TX'' GPRS Shield’a и с помощью [[amp>product/wire-fm?utm_source=man&utm_campaign=gprs-shield&utm_medium=wiki | проводов «мама-папа»]] перебросьте на свободные пины управляющей платы.
{{ :продукты:gprs-shield:gprs-shield_scheme_uno.png |}}
На этой картинке мы перекинули управляющие пины ''RX'' и ''TX'' с ''0'' и ''1'' пина Arduino Uno — на ''10'' и ''11'' пин соответственно.
В качестве примера отправим SMS на указанный номер с GPRS Shield’a. Прошейте управляющую плату скетчем приведённым ниже. Если открыть монитор последовательного порта, можно проследить порядок действий.
// библиотека для работы с GPRS устройством
#include 
 
// библиотека для эмуляции Serial порта
// она нужна для работы библиотеки GPRS_Shield_Arduino
#include 
// создаём объект 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 ====
На платах [[amp>product/arduino-mega-2560?utm_source=man&utm_campaign=gprs-shield&utm_medium=wiki | Arduino Mega2560]], [[amp>product/arduino-adk?utm_source=man&utm_campaign=gprs-shield&utm_medium=wiki | Arduino ADK]] и [[amp>product/arduino-due?utm_source=man&utm_campaign=gprs-shield&utm_medium=wiki | Arduino Due]] аппаратный UART, который отвечает за передачу данных через пины ''1'' и ''0'', отвечает также за передачу по USB. Это означает невозможность использовать одновременно UART для коммуникации с GPRS Shield’om и отладки по USB.
Но на платах такого форм-фактора есть ещё дополнительно 3 аппаратных UART:
  * **Serial1:** пины ''19(RX1)'' и ''18(TX1)''
  * **Serial2:** пины ''17(RX2)'' и ''16(TX2)'';
  * **Serial3:** пины ''15(RX3)'' и ''14(TX3)''.
Для подключение GPRS Shield’a к одному из UART, снимите джампера с ''RX'' и ''TX'' и с помощью [[amp>product/wire-fm?utm_source=man&utm_campaign=gprs-shield&utm_medium=wiki | проводов «мама-папа»]] перебросьте на свободные пины управляющей платы.
{{ :продукты:gprs-shield:gprs-shield_scheme_3xuart.png |}}
На этой картинке мы перекинули управляющие пины ''RX'' и ''TX'' с ''0'' и ''1'' пина Arduino Mega 2560 — на ''TX1'' и ''RX1'' пин соответственно.
В качестве примера отправим SMS на указанный номер с GPRS Shield’a. Прошейте управляющую плату скетчем приведённым ниже. Если открыть монитор последовательного порта, можно проследить порядок действий.
// библиотека для работы с GPRS устройством
#include 
// создаём объект класса 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, воспользуйтесь скетчем, приведенным ниже. Не забудьте подключить наушники и микрофон в соответствующие разъёмы на плате, чтобы вы смогли слышать абонента, а он вас. Если открыть монитор последовательного порта, можно проследить порядок действий.
// библиотека для работы с GPRS устройством
#include 
 
// номер на который будем звонить
#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 и передаём в него объект 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. Ниже представлен пример отправки текстового сообщения.
// библиотека для работы с GPRS устройством
#include 
 
// номер на который будем отправлять сообщение
#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 порта.
// библиотека для работы с GPRS устройством
#include 
// длина сообщения
#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:+FCLASS,+CGSM\\ OK |Возможности модуля|
|  AT+GMM  |SIMCOM_SIM900\\ OK|Идентификатор модуля|
|  AT+GMR  |Revision:1137B09SIM900M64_ST\\ OK|Ревизия|
|  AT+GSN  |01322600XXXXXXX\\ OK|IMEI|
В документе с {{:продукты:gprs_shield:gprs-shield_sim900_at_commands.pdf|перечнем AT-команд}} можно найти документацию на все поддерживаемые команды.
==== Пример скетча для работы с использованием AT-команд ====
// библиотека для работы с GPRS устройством
#include 
 
// создаём объект класса 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:gprs_shield_annotation3.png?nolink& |}}
==== Модуль SIM900 ====
SIM900 — представитель GSM/GPRS-модулей компании SIMCom. Это — сердце GPRS Shield.
==== Разъём микрофона и наушников ====
Если подключить наушники и микрофон в соответствующие разъёмы, во время звонка с абонентом можно будет общаться точно так же как и по обычному телефону.
==== Слот для SIM-карты ====
Слот для подключения стандартной сим-карты — Mini Sim. Если у вас сим-карта другого размера, Micro Sim или Nano Sim, воспользуйтесь специальными переходниками.
==== Контакты выбора управляющих пинов ====
^  Контакты GPRS Shield  ^  Контакты Arduino  ^  Использование  ^ 
|  RX и TX  |  0 и 1  |Используются для выбора управляющих пинов c микроконтроллером.|    
|  PK  |  2  |Используется для включения модуля. Для этого на него необходимо подать высокий уровень на 3 секунды, а затем подать низкий уровень на эту же ножку.|
|  ST  |  3  |Информационный пин о состоянии включения GPRS Shield. Если высокий уровень — шилд включён, если низкий — выключен.|
Если в вашем проекте какие-нибудь из этих пинов уже заняты другим устройством, вы можете использовать любой другой свободный цифровой пин. Для этого необходимо снять джампер напротив занятого пина и припаять проводок между луженым отверстием рядом со снятым джампером и таким же отверстием рядом с нужным пином.
==== Гнездо для батарейки ====
Гнездо для батарейки [[amp>product/battery-cr1225?utm_source=man&utm_campaign=product-permalink&utm_medium=wiki | CR1225]], обеспечивающей работу встроенных часов реального времени. Нужна только при использовании команд, связанных с часами.
==== Разъём для внешней антенны ====
SMA-разъём для подключения внешней антенны. Без неё сигнал будет очень слабым.
==== Индикатор состояния сети ====
У модуля есть два информационных светодиода — ''ON'', который загорается после включения модуля и ''AIR'', который мигает в зависимости от состояния сети.
Возможные режимы ''AIR'' (Горит/Не горит):
  * 64мс/800мс — сеть не найдена;
  * 64мс/3000мс — сеть найдена;
  * 64мс/300мс — идет обмен по GPRS.
===== Принципиальная и монтажная схемы ====
{{:продукты:gprs_shield:gprs-shield_g5_schematic.png?direct&350 |}}
{{ :продукты:gprs_shield:gprs-shield-g5-layout-nv.png?direct&300|}}
===== Характеристики =====
  * Поддержка частот 850/1800 МГц
  * Класс передачи данных GPRS multi-slot class 10/8
  * Соответствие стандарту GSM фазы 2/2+
  * Поддержка TCP/UDP протоколов
  * Полное управление при помощи АТ-команд: 
      * Стандартный набор – GSM 07.07 & 07.05
      * Расширенный набор – SIMCOM AT
  * Возможность подключения аудио гарнитуры и микрофона
  * Интерфейс UART 1200–115200 (9600 по умолчанию) бит/с
  * Разъём для сим-карты
  * Энергопотребление:в зависимости от текущего режима работы и может колебаться от 20-30мА до 500мА. Также возможны кратковременные скачки до 2-3А, особенно в процессе поиска сети или при приеме/передачи данных. В спящем режиме: 1.5 мА.
  * Выполнен в форм-факторе Arduino
  * Напряжение питания Vin: 7—12 В
===== Ссылки =====
  * [[https://github.com/amperka/gprs-shield|Библиотека SIM900 для удобства работы с платой]]
  * [[http://wiki.amperka.ru/js:gprs-shield|Описание библиотеки для Iskra JS]]
  * [[http://wiki.amperka.ru/projects:smart-power|Пример использования: SMS-розетка]]
  * {{:продукты:gprs_shield:gprs-shield_sim900_at_commands.pdf|мануал для изучения AT команд}}
  * [[https://github.com/amperka/hardware-drawings/blob/master/arduino-gprs-shield-V2.svg|Векторное изображение GPRS Shield]]
  * [[amp>product/arduino-gprs-shield?utm_source=man&utm_campaign=gprs-shield&utm_medium=wiki | Новая версия GPRS Shield]]