Arduino:Знакомство с Arduino/Знакомство с Arduino GSM Shield

Материал из Онлайн справочника
Версия от 12:30, 8 июля 2023; EducationBot (обсуждение | вклад)
(разн.) ← Предыдущая версия | Текущая версия (разн.) | Следующая версия → (разн.)
Перейти к навигацииПерейти к поиску

Перевод: Максим Кузьмин
Проверка/Оформление/Редактирование: Мякишев Е.А.


Знакомство с Arduino GSM Shield[1]

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

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

Библиотека GSM идет в комплекте с IDE Arduino версией 1.0.4 и выше.

Что такое GSM

GSM – это международный стандарт для мобильной связи. Аббревиатура расшифровывается как Global System for Mobile Communications, что можно перевести как «глобальная система для мобильных коммуникаций». Кроме того, стандарт GSM иногда называют 2G, т.к. это, по сути, сотовая связь второго поколения.

Чтобы Arduino могла получить GPRS-доступ к интернету, а также делать запросы к веб-страницам и обслуживать их, вам нужно узнать у своего мобильного оператора APN (от Access Point Name, т.е. «имя точки доступа»), а также имя пользователя и пароль. Более подробно об этом читайте ниже, в разделе «Подключение к интернету».

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

То есть GSM-модуль Arduino – это, по сути, GSM-модем. С точки зрения мобильного оператора это обычный мобильный телефон. С точки зрения Arduino это просто модем.

Что такое GPRS

GPRS (от General Packet Radio Service, что можно перевести как «пакетная радиосвязь общего пользования») – это технология обмена пакетами. Он может обеспечивать скорость передачи данных в пределах 56-114 кбит/сек (в идеале).

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

Требования мобильного оператора

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

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

SIM-карты

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

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

Кроме того, у вас есть возможность сбросить забытый или потерянный PIN-код, и это делается с помощью PUK-кода (от Pin Unlock Code, что значит «код для разблокировки PIN-кода). Этот PUK-код тоже указан в документации, идущей в комплекте с SIM-картой.

О том, как управлять PIN-кодом при помощи GSM-модуля и библиотеки GSM, читайте в этой статье. «Симки» бывают разных размеров, но GSM-модуль поддерживает лишь формат mini-SIM (25 мм в длину, 15 мм в ширину).

SIM-карта Telefonica/Movilforum

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

Карта от Movilforum включает в себя роуминговый тарифный план, и его можно использовать в любой поддерживаемой GSM-сети. Эта «симка» обеспечивает покрытие в американских и европейских странах, а в каких именно – читайте на этой странице официального сайта Movilforum.

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

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

Для приема и отправки голосовых звонков эту «симку» использовать нельзя.

Принимать и отправлять SMS-сообщения можно только от SIM-карт из сети Movilforum.

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

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

Подключение GSM-модуля

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

Чтобы использовать GSM-модуль, к нему нужно подключить SIM-карту, и для этого у него есть соответствующий коннектор. Сдвиньте металлический ползунок этого коннектора от края GSM-модуля, а затем поднимите лоток для «симки».

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

Всуньте «симку» внутрь лотка на всю длину.

Опустите лоток с картой к поверхности модуля, а затем сдвиньте металлический ползунок к краю модуля – тем самым вы зафиксируете его на месте.

Когда SIM-карта будет подключена, присоедините GSM-модуль к Arduino.

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

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

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

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

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

Библиотека GSM

Библиотека GSM обрабатывает коммуникацию между Arduino и GSM-модулем. Большая часть функций этой библиотеки – для управления обмена данными, а также SMS- и голосовой коммуникации. Кроме того, в ней имеются классы для управления информацией о модеме и PIN-коде «симки». Более подробную информацию и несколько скетчей-примеров можно найти тут.

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

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

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

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

// инициализируем экземпляр библиотеки:
GSM gsmAccess(true);     // задаем параметр «true» – для отладки
GSMScanner scannerNetworks;
GSMModem modemTest;

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

// Статусное сообщение, которое будет передаваться через монитор порта:
String errortext = "ERROR";  //  "ОШИБКА"

void setup()
{
  // инициализируем последовательную коммуникацию:
  Serial.begin(9600);
  Serial.println("GSM networks scanner");  //  "Сканер GSM-сетей"
  scannerNetworks.begin();

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

  // Запускаем GSM-модуль.
  // Если у вашей «симки» есть 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-номер модема: "
  IMEI = modemTest.getIMEI();
  IMEI.replace("\n","");
  if(IMEI != NULL)
    Serial.println(IMEI);

  // Оператор, подключенный в данный момент:
  Serial.print("Current carrier: ");  //  "Текущий оператор: "
  Serial.println(scannerNetworks.getCurrentCarrier());

  // Возвращаем данные о мощности сигнала и BER.
  // Мощность сигнала – в диапазоне 0-31. 31 значит свыше 51 дБм.
  // BER (от Bit Error Rate) – это коэффициент битовых ошибок.
  // Диапазон значений - 0-7. 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 значит свыше 51 дБм.
  // BER (от Bit Error Rate) – это коэффициент битовых ошибок.
  // Диапазон - 0-7. 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.
// Меняем «12125551212» на номер, который нужен:
char remoteNumber[20]= "12125551212";  

// Символьный массив для сообщения:
char txtMsg[200]="Test";

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

  Serial.println("SMS Messages Sender");  //  "Отправщик SMS-сообщений"

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

  // Запускаем GSM-модуль.
  // Если у «симки» есть PIN, впишите его в кавычках в begin():
  while(notConnected)
  {
    if(gsmAccess.begin(PINNUMBER)==GSM_READY)
      notConnected = false;
    else
    {
      Serial.println("Not connected");  //  "Нет соединения"
      delay(1000);
    }
  }
  Serial.println("GSM initialized");  //  "GSM-связь инициализирована"
  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");    //  "\nГОТОВО!\n"
}

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

Чтобы подключиться к интернету, вам понадобится, помимо SIM-карты и тарифного плана, еще и информация об APN – это то, что есть у каждого оператора связи. Это имя точки доступа, которая служит мостом между сотовой сетью и интернетом. Иногда для доступа к этой точке нужны имя пользователя и пароль. К примеру, Movilforum’овский APN – это sm2ms.movilforum.es, но ни имени пользователя, ни пароля у него нет.

Скетч ниже подключается к «arduino.cc/latest.txt» и выводит содержимое на монитор порта.

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

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

// PIN-код (если нужно):
#define PINNUMBER ""

// Информация об APN от вашего оператора связи:
#define GPRS_APN       "GPRS_APN" // замените "GPRS_APN" на свой APN
#define GPRS_LOGIN     "login"    // замените "login" на свой логин
#define GPRS_PASSWORD  "password" // замените "password" на свой пароль

// инициализируем необходимые объекты из библиотеки GSM:
GSMClient client;
GPRS gprs;
GSM gsmAccess;

// Этот скетч-пример загружает содержимое URL’а "http://arduino.cc/latest.txt"

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

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

  // Запускаем GSM-модуль.
  // Указываем PIN-код «симки» как параметр в функции 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(;;)
      ;
  }
}

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

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

На нижней стороне GSM-модуля есть отверстия с надписями M1P и M1N. Это контакты для входящего звукового потока со знаками «плюс» и «минус» – они предназначены для микрофона. Так же есть отверстия S1P и S1N, и это контакты для исходящего звукового потока со знаками «плюс» и «минус» – для динамика.

Здесь, в документации к модему, на 43 странице показан пример цепи, подключенной к наушникам:

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

#include <GSM.h>

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

// инициализируем объекты библиотеки GSM, используемые в этом скетче:
GSM gsmAccess;  // задаем параметр «true» – для отладки
GSMVoiceCall vcs;

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

void setup()
{

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

  Serial.println("Make Voice Call");  //  "Делаем голосовой звонок"

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

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

  Serial.println("GSM initialized.");  //  "GSM-связь инициализирована"
  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");  //  "Есть связь. Введите Enter, чтобы завершить звонок"
          // Ждем, не нажмет ли пользователь Enter:
          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 библиотеки GSM и попробовать другие примеры.

См.также

Внешние ссылки