Начало работы с 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-карта вставлена, установите шилд поверх платы Arduino.
Для загрузки скетчей на плату подключите её к компьютеру с помощью USB-кабеля и загрузите скетч через Arduino IDE. После загрузки скетча вы можете отключить плату от компьютера и питать её от внешнего источника питания.
Цифровые пины 2, 3 и 7 зарезервированы для связи между Arduino и модемом и не могут использоваться в ваших скетчах. Связь между модемом и Arduino осуществляется через библиотеку Software Serial на пинах 2 и 3. Пин 7 используется для сброса модема.
Когда жёлтый светодиод status загорается, это означает, что модем запитан, и вы можете попробовать подключиться к сети.
Для ранних версий GSM-шилда требовалось нажать кнопку Power на шилде на несколько мгновений, чтобы включить модем. Если у вас ранняя версия шилда и он не включается автоматически, вы можете припаять перемычку к контактной площадке CTRL/D7 на обратной стороне платы, и он будет включаться при подаче питания на подключённый Arduino.
Шилд должен работать в любой зоне с покрытием 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-мм разъём, который можно использовать со стандартной гарнитурой мобильного телефона с микрофоном.
Если у вас более старая версия этого шилда, вам необходимо создать небольшую схему и подключить её к пинам шилда, как описано ниже.
На нижней стороне шилда расположены отверстия с маркировкой M1P и M1N. Это положительный и отрицательный контакты голосового входа для микрофона. Отверстия с маркировкой S1P и S1N — это положительный и отрицательный контакты голосового выхода, к которым необходимо подключить динамик.
На странице 43 документации модема приведён пример схемы голоса и звука для подключения наушника:
Следующий скетч позволяет совершить голосовой вызов. Используя монитор последовательного порта, вы можете ввести номер телефона удалённого абонента и завершить вызов. Когда вы увидите сообщение 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 библиотеки и дополнительных примерах.