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

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

Примечание

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

Arduino GSM shield позволяет плате 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 — это GSM-модем. С точки зрения мобильного оператора Arduino GSM shield выглядит как обычный мобильный телефон. С точки зрения Arduino плата GSM shield выглядит как модем.

Что такое 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 мм в ширину).

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

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

SIM-карта Movilforum включает роуминговый план. Её можно использовать в любой поддерживаемой сети GSM. Покрытие этой SIM-карты распространяется на Америку и Европу; для уточнения стран с поддерживаемыми сетями проверьте страницу доступности сервиса Movilforum.

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

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

Вы не можете использовать входящую в комплект SIM-карту для совершения или приёма голосовых вызовов.

Отправлять и получать SMS можно только с другими SIM-картами в сети Movilforum.

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

Для использования голосовых и других функций шилда вам потребуется найти другого оператора связи и SIM-карту. У операторов могут быть разные политики для своих SIM-карт; обращайтесь к ним напрямую для определения поддерживаемых типов подключений.

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

Если вы используете 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, 3 и 7 зарезервированы для связи между Arduino и модемом и не могут использоваться в ваших скетчах. Связь между модемом и Arduino осуществляется через библиотеку Software Serial на пинах 2 и 3. Пин 7 используется для сброса модема.

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

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

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

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

Библиотека GSM

Библиотека GSM обеспечивает связь между Arduino и GSM-шилдом. Большинство функций предназначены для управления данными, голосом и 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), которое служит мостом между сотовой сетью и интернетом. Иногда с точкой подключения связаны имя пользователя и пароль. Например, APN Movilforum — sm2ms.movilforum.es, но он не имеет пароля или имени для входа.

На этой странице перечислена информация о ряде операторов, но она может быть устаревшей. Вам может потребоваться получить эту информацию у вашего оператора связи.

Приведённый ниже скетч подключится к 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(;;)

      ;

  }
}

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

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

Отверстия для динамика и микрофона на 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-шилд связывается с подключённым Arduino через библиотеку Software Serial. По умолчанию для этой связи используются цифровые пины 2 и 3. На Uno это работает без модификации, но для использования Leonardo, Yun или Mega требуются некоторые изменения.

Пин GSM_TX, пин 2 на шилде, отправляет информацию на Arduino. Arduino использует прерывание на этом пине, чтобы определить, когда информация доступна для чтения. На Uno эта возможность прерывания находится на пине 2. Leonardo, Yun и Mega имеют возможности прерывания на других пинах.

Вам не нужно изменять какой-либо код для программирования шилда для использования с Leonardo, Yun или Mega, так как библиотека автоматически изменит RX-пин Arduino в зависимости от платы, выбранной в меню «Tools» IDE. Однако вам нужно перенаправить данные GSM_TX на соответствующий пин Arduino.

Arduino Leonardo и Arduino Yun

Библиотека GSM использует цифровой пин 8 для связи с Leonardo или Yun. Таким образом, вам необходимо направить сигнал с пина 2 GSM-шилда на пин 8 Arduino и одновременно предотвратить подключение этого сигнала к пину 2 Arduino. Следующие два шага позволяют этого добиться:

На GSM-шилде подключите перемычку между цифровыми пинами 2 и 8. Это направляет сигнал с пина 2 GSM-шилда на пин 8 Arduino.

Чтобы предотвратить взаимное влияние этого сигнала и пина 2 Arduino, отогните штыревой разъём, подключённый к пину 2 на GSM-шилде, в сторону, чтобы он не соединялся с Leonardo или Yun.

Подключение GSM-шилда к Arduino Leonardo

Arduino Mega

Библиотека GSM использует цифровой пин 10 для связи с Mega. Таким образом, вам необходимо направить сигнал с пина 2 GSM-шилда на пин 10 Arduino и одновременно предотвратить подключение этого сигнала к пину 2 Arduino. Следующие два шага позволяют этого добиться:

На GSM-шилде подключите перемычку между цифровыми пинами 2 и 10. Это направляет сигнал с пина 2 GSM-шилда на пин 10 Arduino.

Чтобы предотвратить взаимное влияние этого сигнала и пина 2 Arduino, отогните штыревой разъём, подключённый к пину 2 на GSM-шилде, в сторону, чтобы он не соединялся с Mega.

Подключение GSM-шилда к Arduino Mega

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

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