Плата расширения Arduino GSM

Плата расширения Arduino GSM с помощью библиотеки GSM позволяет Ардуино подключаться к Интернету, отправлять и получать SMS-сообщения, а также совершать голосовые вызовы.

Что касается совместимости, то плата расширения работает с Arduino Uno "из коробки". Для работы с Arduino Mega, Mega ADK и Leonardo требуются небольшие модификации. Arduino Due на данный момент не поддерживается.

Библиотека GSM включается в состав Arduino IDE, начиная с версии 1.0.4.

Что такое GSM

GSM - это международный стандарт для мобильных телефонов (аббревиатура от "Global System for Mobile Communications" - глобальная система для мобильных коммуникаций). Иногда его также называют стандартом 2G (поскольку это сотовая сеть второго поколения). Среди всего прочего, GSM позволяет осуществлять входящие и исходящие голосовые звонки, отправлять и принимать текстовые сообщения (SMS - Simple Message System), а также обмениваться данными (через GPRS).

Что такое GPRS

GPRS - это технология пакетной передачи данных (аббревиатура от "General Packet Radio Service"), которая в идеале может обеспечить скорость передачи в 56-114 кбит в секунду.

Ряд других технологий, таких, как SMS, базируются именно на технологии GPRS. Плата расширения Arduino GSM позволяет также использовать пакетную передачу данных для доступа к сети Интернет. Подобно библиотекам Ethernet и WiFi, библиотека GSM позволяет Ардуино работать как в качестве клиента, так и в качестве. При этом для отправки или получения веб-страниц используются традиционные http-запросы.

Роль мобильного оператора

Для того, чтобы можно было работать в мобильной сети, необходимо быть абонентом мобильного оператора (неважно, на предоплаченном тарифе или по контракту), иметь GSM-совместимое устройство (например, плату расширения Arduino GSM или мобильный телефон), а также SIM-карту (Subscriber Identity Module). Оператор мобильной сети предоставляет SIM-карту, на которой может храниться такая информация, как мобильный номер, некоторое количество контактов и SMS-сообщений.

Для того, чтобы можно было выходить в Интернет через GPRS (в том числе и для возможности Ардуино работать с веб-страницами), необходимо получить у оператора сети имя точки доступа (APN - Access Point Name), а также имя пользователя и пароль. Для получения дополнительной информации о возможностях Ардуино по работе с данными, см. страницу Подключение к Интернет.

SIM-карты

Помимо платы расширения GSM и самого Ардуино, вам также понадобится SIM-карта. Взаимодействие с провайдером связи осуществляется посредством SIM-карты. Провайдер продает вам SIM-карту и обеспечивает GSM-покрытие сети той области, где вы находитесь (или осуществляет роуминг с той компанией, у которой покрытие сети охватывает ваше месторасположение).

Как правило, с каждой SIM-картой ассоциирован специальный защитный код (PIN-код), состоящий из четырех цифр. Не теряйте этот номер, поскольку он необходим для подключения устройства к мобильной сети. Если же вы потеряли свой PIN-код, то для его восстановления необходимо будет связаться с мобильным оператором. Некоторые SIM-карты автоматически блокируются, если набрать неверный PIN-код несколько раз. Поэтому перед его набором лучше еще раз заглянуть в документацию, поставляющуюся вместе с SIM-картой.

Использование PUK-кода (PIN Unlock Code) позволяет сбросить потерявшийся PIN-код с помощью Ардуино или платы расширения GSM. PUK-код также указан в документации к вашей SIM'ке.

Пример изменения PIN-кода с помощью PUK показан в примере PIN Management, который находится в папке "tools" в комплекте с библиотекой GSM.

Стандартом предусмотрено несколько разных размеров SIM-карт; плата расширения Arduino GSM поддерживает карты форм-фактора mini-SIM (25 мм в длину и 15 мм в ширину).

Примечания о SIM-карте от Telefonica/Bluevia, входящей в комплект поставки

Плата расширения Arduino GSM идет в комплекте с SIM-картой Telefonica/Bluevia, которая ориентирована на работу в M2M-приложениях (machine to machine), где используется непосредственная связь между двумя устройствами. Вместе с тем, плата расширения может работать абсолютно с любыми SIM-картами - использовать какую-то определенную вовсе не требуется. Поэтому вы можете использовать SIM-карту любого провайдера, работающего в вашем регионе.

SIM-карта от Bluevia поддерживает роуминг и может работать в любой из поддерживаемых GSM-сетей. Ее территория покрытия довольно велика - от Америки вплоть до Европы. Более подробную информацию о зонах покрытия, а также список поддерживаемых сетей по странам вы можете найти на этой странице.

Активация SIM-карты осуществляется компанией Bluevia. В небольшой брошюре, поставляемой вместе с Arduino GSM, приведены подробные инструкции о том, как зарегистрировать и активировать свою SIM-карту в режиме онлайн, а также добавить средства на свой счет. Во время активации SIM-карта должна быть вставлена во включенную плату расширения, которая подсоединена к Arduino.

По умолчанию, на SIM-карте нет PIN-кода, однако его можно задать с помощью класса GSMPIN библиотеки GSM.

Поставляемую в комплекте SIM-карту нельзя использовать для совершения голосовых звонков. Она позволяет только отправлять и получать SMS-сообщения от других SIM-карт в сети Bluevia.

Также невозможно создать сервер, принимающий входящие запросы из глобальной сети Интернет. Однако SIM-карта от Bluevia позволяет обрабатывать запросы, поступающие от других SIM-карт в пределах сети Bluevia.

Поэтому для использования всех возможностей Arduino GSM, в том числе осуществления голосовых звонков и других функций, необходимо подобрать другого оператора и SIM-карту. Имейте ввиду, что различные операторы ведут разную политику относительно своих SIM-карт, поэтому перед окончательным выбором не забудьте выяснить, какие типы подключений поддерживаются вашим оператором. 

Подключение платы расширения

Приведенные ниже инструкции относятся, прежде всего, к Arduino Uno. Если же вы используете Arduino Mega, Mega ADK или Leonardo, то следуйте этим инструкциям. Плата расширения GSM на данный момент не поддерживает Arduino Due.

Для начала работы с платой расширения, необходимо вставить SIM-карту в соответствующий разъем. Для этого сдвиньте металлическую скобу вправо и поднимите холдер SIM-карты вверх.

Вставьте SIM-карту в пластиковый холдер лицевой стороной вверх (так, чтобы ее металлические контакты были направлены к плате). Вырез SIM-карты должен находиться возле металлической скобы.

Задвиньте SIM-карту в холдер до упора.

Прижмите холдер с SIM-картой к плате и передвиньте металлическую скобу обратно (влево), чтобы зафиксировать его положение.

После того, как вы вставили SIM-карту, подключите плату расширения к Ардуино, закрепив ее над ним.

Для загрузки программ в плату, подсоедините ее к компьютеру посредством USB-кабеля. После этого для прошивки достаточно нажать кнопку Upload в среде Ардуино. После того, как программа будет загружена в Ардуино, его можно отключить от компьютера и запитать от внешнего источника.

Цифровые выводы 2, 3 и 7 зарезервированы для взаимодействия Ардуино с радио-модемом, поэтому их нельзя использовать в своих скетчах. Взаимодействие между модемом и Ардуино осуществляется посредством выводов 2 и 3 с помощью библиотеки Software Serial. Вывод 7 отвечает за перезагрузку модема.

Когда светится желтый светодиод - это означает, что модем включен и можно пытаться подключиться к сети.

В первых версиях Arduino GSM для включения модема нужно было нажимать кнопку Power. Если у вас одна из таких версий (и она не включается автоматически) - можно припаять перемычку между контактами CTRL/D7 на обратной стороне печатной платы, после чего устройство будет включаться автоматически при подаче питания на Ардуино.

Плата расширения должна работать где угодно, где есть покрытие GSM. Перед покупкой, убедитесь, что в той местности, где вы планируете ее использовать, имеется покрытие GSM-сети.

Библиотека GSM

Взаимодействие Arduino с GSM-платой расширения осуществляется с помощью библиотеки GSM. Большая часть ее функций служит для обработки данных, голоса и SMS-сообщений. Также в ней предусмотрено несколько вспомогательных функций для работы с PIN-кодом SIM-карты и получения различной информации о модеме. Дополнительную информации и примеры работы - см. в справке по библиотеке GSM.

Проверка модема и сетевого соединения

В приведенной ниже программе определяется IMEI-номер модема. В каждом модеме это уникальный номер, использующийся для идентификации устройств, которые могут подключаться к сети GSM. После считывания IMEI, Ардуино выводит на последовательный порт информацию об имени сети, к которой подключился модем, а также текущую мощность сигнала.

// импортируем библиотеку GSM
#include <GSM.h>

// PIN код
#define PINNUMBER ""

// инициализируем экземпляр библиотеки
GSM gsmAccess(true);     // указываем параметр 'true' для включения отладки
GSMScanner scannerNetworks;
GSMModem modemTest;

// переменные для хранения данных
String IMEI = "";

// сообщения для программы Serial Monitor
String errortext = "ERROR";

void setup()
{
  // инициализируем интерфейс последовательной передачи данных
  Serial.begin(9600);
  Serial.println("GSM networks scanner");
  scannerNetworks.begin();

  // состояние соединения
  boolean notConnected = true;

  // запускаем GSM-плату расширения
  // если на вашей SIM-карте установлен PIN-код, необходимо указать его в кавычках
  // в качестве параметра метода begin()
  while(notConnected)
  {
    if(gsmAccess.begin(PINNUMBER)==GSM_READY)
      notConnected = false;
    else
    {
      Serial.println("Not connected");
      delay(1000);
    }
  }

  // получаем параметры модема
  // IMEI, уникальный идентификатор модема
  Serial.print("Modem IMEI: ");
  IMEI = modemTest.getIMEI();
  IMEI.replace("\n","");
  if(IMEI != NULL)
    Serial.println(IMEI);

  // текущая сеть
  Serial.print("Current carrier: ");
  Serial.println(scannerNetworks.getCurrentCarrier());

  // получаем мощность сигнала и BER
  // мощность сигнала измеряется по шкале 0-31. 31 означает мощность > 51dBm
  // BER - это Bit Error Rate (частота возникновения ошибок). Шкала: 0-7 scale. 99=не определено
  Serial.print("Signal Strength: ");
  Serial.print(scannerNetworks.getSignalStrength());
  Serial.println(" [0-31]");
}

void loop()
{
  // сканируем существующие сети, отображаем список сетей
  Serial.println("Scanning available networks. May take some seconds.");

  Serial.println(scannerNetworks.readNetworks());

    // имя текущей сети
  Serial.print("Current carrier: ");
  Serial.println(scannerNetworks.getCurrentCarrier());

  // получаем мощность сигнала и BER
  // мощность сигнала измеряется по шкале 0-31. 31 означает мощность > 51dBm
  // BER - это Bit Error Rate (частота возникновения ошибок). Шкала: 0-7 scale. 99=не определено
  Serial.print("Signal Strength: ");
  Serial.print(scannerNetworks.getSignalStrength());
  Serial.println(" [0-31]");

}

Отправка SMS-сообщений

После успешного подключения к сети с помощью программы, приведенной выше, можно протестировать другие возможности платы расширения. В приведенной ниже программе показан пример подключения к GSM-сети и отправки SMS-сообщения на указанный вами номер.

#include <GSM.h>

#define PINNUMBER ""

// инициализируем библиотеку
GSM gsmAccess; // для включения отладки необходимо указать параметр 'true'
GSM_SMS sms;

// массив символов, представляющий собой телефонный номер для отправки SMS
// измените номер 1-212-555-1212 на тот номер
// который у вас есть под рукой
char remoteNumber[20]= "12125551212";  

// массив символов текстового сообщения
char txtMsg[200]="Test";

void setup()
{
  // инициализируем последовательный интерфейс
  Serial.begin(9600);

  Serial.println("SMS Messages Sender");

  // состояние соединения
  boolean notConnected = true;

  // запускаем GSM-плату расширения
  // если на вашей SIM-карте установлен PIN-код, необходимо указать его в кавычках
  // в качестве параметра метода begin()
  while(notConnected)
  {
    if(gsmAccess.begin(PINNUMBER)==GSM_READY)
      notConnected = false;
    else
    {
      Serial.println("Not connected");
      delay(1000);
    }
  }
  Serial.println("GSM initialized");
  sendSMS();
}

void loop()
{
// здесь ничего
}

void sendSMS(){

  Serial.print("Message to mobile number: ");
  Serial.println(remoteNumber);

  // текст SMS
  Serial.println("SENDING");
  Serial.println();
  Serial.println("Message:");
  Serial.println(txtMsg);

  // отправка сообщения
  sms.beginSMS(remoteNumber);
  sms.print(txtMsg);
  sms.endSMS(); 
  Serial.println("\nCOMPLETE!\n");  
}

Подключение к Интернет

Для подключения к сети Интернет недостаточно только SIM-карты и тарифного плана - необходима кое-какая дополнительная информация от вашего мобильного оператора. У каждого провайдера есть определенное имя точки доступа APN (Access Point Name), которая является своего рода мостом между сотовой сетью и глобальной сетью Интернет. Иногда с этой точкой доступа ассоциированы имя пользователя и пароль. Например, имя точки доступа (APN) у Bluevia - bluevia.movistar.es, а имя пользователя и пароль - отсутствуют.

На этой странице приведен список данных по различным операторам (он может быть уже не актуальным). Информацию о точке доступа и имени пользователя/пароле лучше уточнить у своего оператора.

В нижеследующей программе показан пример, как можно скачать файл arduino.cc/latest.txt и вывести его содержимое.

Примечание: некоторые мобильные операторы блокируют входящий IP-трафик. Простые клиентские операции (как в данной программе), как правило, работают без проблем..

//подключаем библиотеку GSM
#include <GSM.h>

// PIN-код в случае необходимости
#define PINNUMBER ""

// информация о точке доступа APN от мобильного оператора
#define GPRS_APN       "GPRS_APN" // пропишите свою точку доступа GPRS APN
#define GPRS_LOGIN     "login"    // пропишите свой логин для GPRS
#define GPRS_PASSWORD  "password" // пропишите свой пароль для GPRS

// инициализируем экземпляры библиотек
GSMClient client;
GPRS gprs;
GSM gsmAccess;

// в этом примере осуществляется скачивания файла по URL "http://arduino.cc/latest.txt"

char server[] = "arduino.cc"; // базовый URL
char path[] = "/latest.txt"; // путь к файлу
int port = 80; // номер порта, 80 для HTTP

void setup()
{
  // инициализируем последовательный интерфейс
  Serial.begin(9600);
  Serial.println("Starting Arduino web client.");
  // состояние соединения
  boolean notConnected = true;

  // запускаем плату расширения GSM
  // указываем PIN-код установленной SIM-карты как параметр функции gsmAccess.begin()
  while(notConnected)
  {
    if((gsmAccess.begin(PINNUMBER)==GSM_READY) &
        (gprs.attachGPRS(GPRS_APN, GPRS_LOGIN, GPRS_PASSWORD)==GPRS_READY))
      notConnected = false;
    else
    {
      Serial.println("Not connected");
      delay(1000);
    }
  }

  Serial.println("connecting...");

  // при успешном подключении - выводим соответствующее сообщение через последовательный порт:
  if (client.connect(server, port))
  {
    Serial.println("connected");
    // посылаем HTTP-запрос:
    client.print("GET ");
    client.print(path);
    client.println(" HTTP/1.0");
    client.println();
  } 
  else
  {
    // если соединение с сервером установить не удалось:
    Serial.println("connection failed");
  }
}

void loop()
{
  // если есть входящие байты, поступившие от сервера,
  // считываем их и выводим в последовательный порт:
  if (client.available())
  {
    char c = client.read();
    Serial.print(c);
  }

  // если сервер отключился, останавливаем клиент:
  if (!client.available() && !client.connected())
  {
    Serial.println();
    Serial.println("disconnecting.");
    client.stop();

    // и больше ничего не делаем:
    for(;;)
      ;
  }
}

Голосовые звонки

Модем в Arduino GSM также позволяет совершать голосовые звонки. Для того чтобы говорить и слышать второго абонента, необходимо добавить к Ардуино динамик и микрофон.

На обратной стороне платы расширения расположены специальные контактные площадки, обозначенные метками M1P и M1N. Это положительный и отрицательный выводы для подключения микрофона. Контактные площадки, обозначенные как S1P и S1N, соответственно, - положительный и отрицательный выходы, к которым подключается динамик.

На странице 43 в документации к модему приведен пример схемы для подключения наушников:

В следующей программе показан пример работы Ардуино с голосовыми вызовами. С помощью программы Serial Monitor на компьютере можно ввести телефонный номер или завершить звонок. После того, как в терминале появится сообщение READY, можно ввести номер телефона и нажать Enter.

#include <GSM.h>

// PIN-код
#define PINNUMBER ""

// инициализируем экземпляры классов библиотеки
GSM gsmAccess; // для включения отладки необходимо указать параметр 'true'
GSMVoiceCall vcs;

String remoteNumber = "";  // номер телефона, на который будем звонить
char charbuffer[20];

void setup()
{

  // инициализируем последовательный интерфейс
  Serial.begin(9600); 

  Serial.println("Make Voice Call");

  // состояние соединения
  boolean notConnected = true;

  // запускаем GSM-плату расширения
  // если на вашей SIM-карте установлен PIN-код, необходимо указать его в кавычках
  // в качестве параметра метода begin()
  while(notConnected)
  {
    if(gsmAccess.begin(PINNUMBER)==GSM_READY)
      notConnected = false;
    else
    {
      Serial.println("Not connected");
      delay(1000);
    }
  }

  Serial.println("GSM initialized.");
  Serial.println("Enter phone number to call.");

}

void loop()
{

  // накапливаем поступающие символы в строку:
  while (Serial.available() > 0)
  {
    char inChar = Serial.read();
    // если это символ новой строки, значит необходимо совершить звонок:
    if (inChar == '\n')
    {
      // проверяем, чтобы телефонный номер был не слишком длинным:
      if (remoteNumber.length() < 20)
      {
        // показываем набираемый номер телефона:
        Serial.print("Calling to : ");
        Serial.println(remoteNumber);
        Serial.println();

        // звоним на удаленный номер
        remoteNumber.toCharArray(charbuffer, 20);

        // проверяем, не взяли ли трубку на том конце
        if(vcs.voiceCall(charbuffer))
        {
          Serial.println("Call Established. Enter line to end");
          // ожидаем поступления новой строки
          while(Serial.read()!='\n' && (vcs.getvoiceCallStatus()==TALKING));          
          // и кладем трубку
          vcs.hangCall();
        }
        Serial.println("Call Finished");
        remoteNumber="";
        Serial.println("Enter phone number to call.");
      } 
      else
      {
        Serial.println("That's too long for a phone number. I'm forgetting it"); 
        remoteNumber = "";
      }
    } 
    else
    {
      // добавляем последний символ к отправляемому сообщению:
      if(inChar!='\r')
        remoteNumber += inChar;
    }
  } 
}

Что дальше?

Теперь, когда вы разобрались с основным функционалом платы расширения, загляните в справку по библиотеке GSM - там вы найдете информацию об основных функциях и API библиотеки, а также примеры ее использования. Для получения дополнительной технической информации, см. страницу с описанием платы расширения Arduino GSM