Плата расширения 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.