Начало работы с Arduino GSM Shield 2

Первые шаги по настройке Arduino GSM Shield 2

Примечание

Это снятый с производства продукт.

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

Шилд работает с Arduino Uno «из коробки». Шилд также будет работать с платами Mega, Mega ADK, Yun и Leonardo с незначительной модификацией. Плата Due в настоящее время не поддерживается.

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

Что такое GSM

GSM — это международный стандарт мобильной связи. Это аббревиатура, означающая Global System for Mobile Communications (Глобальная система мобильной связи). Его также иногда называют 2G, так как это сотовая сеть второго поколения.

Для использования GPRS для доступа в интернет, а также для того, чтобы Arduino мог запрашивать или обслуживать веб-страницы, необходимо получить имя точки доступа (APN) и имя пользователя/пароль у оператора сети. Дополнительную информацию об использовании возможностей передачи данных шилда смотрите в разделе «Подключение к интернету».

Помимо прочего, GSM поддерживает исходящие и входящие голосовые вызовы, службу коротких сообщений (SMS или текстовые сообщения) и передачу данных (через GPRS).

Arduino GSM shield 2 — это GSM-модем. С точки зрения мобильного оператора Arduino GSM shield выглядит как обычный мобильный телефон. С точки зрения Arduino плата GSM shield 2 выглядит как модем.

Что такое GPRS

GPRS — это технология пакетной коммутации, которая расшифровывается как General Packet Radio Service (Общая служба пакетной радиопередачи). Она может обеспечить идеализированные скорости передачи данных от 56 до 114 кбит/с.

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

Требования к оператору сети

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

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

SIM-карты

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

Обычно SIM-карты имеют четырёхзначный PIN-код, связанный с ними для обеспечения безопасности. Запишите этот номер, так как он необходим для подключения к сети. Если вы потеряете PIN-код, связанный с вашей SIM-картой, вам может потребоваться обратиться к оператору сети для его получения.

Предупреждение

Некоторые SIM-карты блокируются при слишком частом вводе неправильного PIN-кода. Если вы не уверены в PIN-коде, посмотрите документацию, которая прилагалась к вашей SIM-карте.

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

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

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

Подключение шилда

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

Для использования шилда вам потребуется вставить SIM-карту в держатель. Сдвиньте металлическую скобу от края шилда и поднимите лоток.

Открытый держатель SIM-карты

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

Вставка SIM-карты

Задвиньте SIM-карту до конца в скобу.

Задвигание SIM-карты

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

SIM-карта на шилде

После того как SIM-карта вставлена, установите шилд поверх платы Arduino.

GSM-шилд установлен на Arduino UNO

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

Использование пинов GSM-шилда 2

Цифровые пины 2, 3 и 7 зарезервированы для связи между Arduino и модемом и не могут использоваться в ваших скетчах. Связь между модемом и Arduino осуществляется через библиотеку Software Serial на пинах 2 и 3. Пин 7 используется для сброса модема.

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

Для ранних версий GSM-шилда требовалось нажать кнопку Power на шилде на несколько мгновений, чтобы включить модем. Если у вас ранняя версия шилда и он не включается автоматически, вы можете припаять перемычку к контактной площадке CTRL/D7 на обратной стороне платы, и он будет включаться при подаче питания на подключённый Arduino.

Перемычка на пине 7 GSM-шилда

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

Библиотека GSM

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

Тестирование модема и сетевого подключения

Этот скетч проверит IMEI-номер модема. Этот номер уникален для каждого модема и используется для идентификации допустимых устройств, которые могут подключаться к сети GSM. После считывания номера с модема Arduino выведет в последовательный порт название оператора сети, к которому он подключён, и уровень сигнала сети.

// import the GSM library
#include <GSM.h>

// PIN Number
#define PINNUMBER ""

// initialize the library instance

GSM gsmAccess(true);     // include a 'true' parameter for debug enabled

GSMScanner scannerNetworks;

GSMModem modemTest;

// Save data variables

String IMEI = "";

// serial monitor result messages

String errortext = "ERROR";

void setup()
{

  // initialize serial communications

  Serial.begin(9600);

  Serial.println("GSM networks scanner");

  scannerNetworks.begin();

  // connection state

  boolean notConnected = true;

  // Start GSM shield

  // If your SIM has PIN, pass it as a parameter of begin() in quotes

  while(notConnected)

  {

    if(gsmAccess.begin(PINNUMBER)==GSM_READY)

      notConnected = false;

    else

    {

      Serial.println("Not connected");

      delay(1000);

    }

  }

  // get modem parameters

  // IMEI, modem unique identifier

  Serial.print("Modem IMEI: ");

  IMEI = modemTest.getIMEI();

  IMEI.replace("\n","");

  if(IMEI != NULL)

    Serial.println(IMEI);

  // currently connected carrier

  Serial.print("Current carrier: ");

  Serial.println(scannerNetworks.getCurrentCarrier());

  // returns strength and ber

  // signal strength in 0-31 scale. 31 means power > 51dBm

  // BER is the Bit Error Rate. 0-7 scale. 99=not detectable

  Serial.print("Signal Strength: ");

  Serial.print(scannerNetworks.getSignalStrength());

  Serial.println(" [0-31]");
}

void loop()
{

  // scan for existing networks, displays a list of networks

  Serial.println("Scanning available networks. May take some seconds.");

  Serial.println(scannerNetworks.readNetworks());

    // currently connected carrier

  Serial.print("Current carrier: ");

  Serial.println(scannerNetworks.getCurrentCarrier());

  // returns strength and ber

  // signal strength in 0-31 scale. 31 means power > 51dBm

  // BER is the Bit Error Rate. 0-7 scale. 99=not detectable

  Serial.print("Signal Strength: ");

  Serial.print(scannerNetworks.getSignalStrength());

  Serial.println(" [0-31]");

}

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

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

#include <GSM.h>

#define PINNUMBER ""

// initialize the library instance

GSM gsmAccess; // include a 'true' parameter for debug enabled

GSM_SMS sms;

// char array of the telephone number to send SMS
// change the number 1-212-555-1212 to a number
// you have access to
char remoteNumber[20]= "12125551212";

// char array of the message
char txtMsg[200]="Test";

void setup()
{

  // initialize serial communications

  Serial.begin(9600);

  Serial.println("SMS Messages Sender");

  // connection state

  boolean notConnected = true;

  // Start GSM shield

  // If your SIM has PIN, pass it as a parameter of begin() in quotes

  while(notConnected)

  {

    if(gsmAccess.begin(PINNUMBER)==GSM_READY)

      notConnected = false;

    else

    {

      Serial.println("Not connected");

      delay(1000);

    }

  }

  Serial.println("GSM initialized");

  sendSMS();
}

void loop()
{
// nothing to see here
}

void sendSMS(){

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

  Serial.println(remoteNumber);

  // sms text

  Serial.println("SENDING");

  Serial.println();

  Serial.println("Message:");

  Serial.println(txtMsg);

  // send the message

  sms.beginSMS(remoteNumber);

  sms.print(txtMsg);

  sms.endSMS();

  Serial.println("\nCOMPLETE!\n");
}

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

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

Приведённый ниже скетч подключится к arduino.cc/latest.txt и выведет его содержимое.

Примечание

Некоторые операторы сети блокируют входящий IP-трафик. Вы должны иметь возможность запускать клиентские функции, такие как приведённый ниже скетч, без проблем.

// include the GSM library
#include <GSM.h>

// PIN number if necessary
#define PINNUMBER ""

// APN information obrained from your network provider
#define GPRS_APN       "GPRS_APN" // replace with your GPRS APN
#define GPRS_LOGIN     "login"    // replace with your GPRS login
#define GPRS_PASSWORD  "password" // replace with your GPRS password

// initialize the library instances

GSMClient client;

GPRS gprs;

GSM gsmAccess;

// This example downloads the URL "http://arduino.cc/latest.txt"

char server[] = "arduino.cc"; // the base URL
char path[] = "/latest.txt"; // the path
int port = 80; // the port, 80 for HTTP

void setup()
{

  // initialize serial communications

  Serial.begin(9600);

  Serial.println("Starting Arduino web client.");

  // connection state

  boolean notConnected = true;

  // Start GSM shield

  // pass the PIN of your SIM as a parameter of 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 you get a connection, report back via serial:

  if (client.connect(server, port))

  {

    Serial.println("connected");

    // Make a HTTP request:

    client.print("GET ");

    client.print(path);

    client.println(" HTTP/1.0");

    client.println();

  }

  else

  {

    // if you didn't get a connection to the server:

    Serial.println("connection failed");

  }
}

void loop()
{

  // if there are incoming bytes available

  // from the server, read them and print them:

  if (client.available())

  {

    char c = client.read();

    Serial.print(c);

  }

  // if the server's disconnected, stop the client:

  if (!client.available() && !client.connected())

  {

    Serial.println();

    Serial.println("disconnecting.");

    client.stop();

    // do nothing forevermore:

    for(;;)

      ;

  }
}

Совершение голосовых вызовов

Через модем можно совершать голосовые вызовы. Новая версия Arduino GSM Shield имеет аудио/микрофонный 3-мм разъём, который можно использовать со стандартной гарнитурой мобильного телефона с микрофоном.

Аудио-разъём GSM Shield V2

Если у вас более старая версия этого шилда, вам необходимо создать небольшую схему и подключить её к пинам шилда, как описано ниже.

Отверстия для динамика и микрофона на GSM-шилде

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

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

Схема подключения микрофона и динамика к GSM-шилду Монтаж динамика для голосовых вызовов GSM-шилда Макетная плата для голосовых вызовов GSM-шилда

Следующий скетч позволяет совершить голосовой вызов. Используя монитор последовательного порта, вы можете ввести номер телефона удалённого абонента и завершить вызов. Когда вы увидите сообщение READY, введите номер телефона. Убедитесь, что монитор последовательного порта настроен на отправку только символа новой строки при нажатии Enter.

#include <GSM.h>

// PIN Number
#define PINNUMBER ""

// initialize the library instance

GSM gsmAccess; // include a 'true' parameter for debug enabled

GSMVoiceCall vcs;

String remoteNumber = "";  // the number you will call
char charbuffer[20];

void setup()
{

  // initialize serial communications

  Serial.begin(9600);

  Serial.println("Make Voice Call");

  // connection state

  boolean notConnected = true;

  // Start GSM shield

  // If your SIM has PIN, pass it as a parameter of begin() in quotes

  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()
{

  // add any incoming characters to the String:

  while (Serial.available() > 0)

  {

    char inChar = Serial.read();

    // if it's a newline, that means you should make the call:

    if (inChar == '\n')

    {

      // make sure the phone number is not too long:

      if (remoteNumber.length() < 20)

      {

        // show the number you're calling:

        Serial.print("Calling to : ");

        Serial.println(remoteNumber);

        Serial.println();

        // Call the remote number

        remoteNumber.toCharArray(charbuffer, 20);

        // Check if the receiving end has picked up the call

        if(vcs.voiceCall(charbuffer))

        {

          Serial.println("Call Established. Enter line to end");

          // Wait for some input from the line

          while(Serial.read()!='\n' && (vcs.getvoiceCallStatus()==TALKING));

          // And hang up

          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

    {

      // add the latest character to the message to send:

      if(inChar!='\r')

        remoteNumber += inChar;

    }

  }
}

Следующие шаги

Теперь, когда вы протестировали основные функции платы, смотрите справочные страницы библиотеки GSM для получения информации об API библиотеки и дополнительных примерах.