Статья для тех, кто хочет заставить Arduino отправлять СМС через данный GSM модуль . Модуль NEOWAY M590 на базе чипа SIM900 подойдет для создания самодельной сигнализации, умного дома. Существует также альтернативный GSM модуль подключаемый напрямую к Arduino через 5 Вольт: Sim800L EVB v2.0
Постановка задачи
- Используя только Arduino и GSM модуль управлять светодиодом посредством звонка с телефона.
- Отправлять СМС (пока через команду поступающую через монитор порта в Arduino IDE)
Подключение к Arduino
Соединяем GSM модуль с Arduino.
5В модуля -> 5V Arduino
GND модуля -> GND Arduino
ТХ модуля -> digital pin2 Arduino
RX модуля -> digital pin3 Arduino
Распиновку можно посмотреть на фото. Порядок контактов такой: 1 - +5В, 2 - GND, 7 - TX, 8 - RX.
Запитать модуль можно от 4В до 5В, я использовал 5 вольтовый выход.
Модуль требует отдельного питания, потому что потребляет в пике до 2А. Конденсатор скорей всего не спасет. Поэтому при запитке от Ардуино может не работать или глючить.
Землю Ардуино и модуля GSM при раздельном питании надо соединить, но сначала нужно мультиметром замерить напряжение между этими "землями". Некоторые компьютерные блоки питания имеют перепад потенциала на корпусе и земле USB до 100В. Ток там мизерный и убить не может, но уничтожить Ардуино или модуль GSM или то и другое вместе - запросто.
Скетч
#include < SoftwareSerial . h > SoftwareSerial mySerial (2 , 3 ) ; // RX, TX int ch = 0 ; int led = 13 ; String val = "" ; void setup () {delay(2000); //время на инициализацию модуля pinMode (led , OUTPUT ) ; digitalWrite (led , LOW ) ; Serial . begin (9600 ) ; //скорость порта Serial . println ("GSM tester v1.0" ) ; mySerial . begin (9600 ) ; mySerial . println ("AT+CLIP=1" ) ; //включаем АОН delay (100 ) ; mySerial . println ("AT+CMGF=1" ) ; //режим кодировки СМС - обычный (для англ.) delay (100 ) ; mySerial . println ("AT+CSCS=\"GSM\"" ) ; //режим кодировки текста delay (100 ) ; } void loop () { if (mySerial . available () ) { //если GSM модуль что-то послал нам, то while (mySerial . available () ) { //сохраняем входную строку в переменную val ch = mySerial . read () ; val += char (ch ) ; delay (10 ) ; } if (val . indexOf ("RING" ) > - 1 ) { //если звонок обнаружен, то проверяем номер if (val . indexOf ("71234567890" ) > - 1 ) { //если номер звонящего наш. Укажите свой номер без "+" Serial . println ("--- MASTER RING DETECTED ---" ) ; mySerial . println ("ATH0" ) ; //разрываем связь digitalWrite (led , HIGH ) ; //включаем светодиод на 3 сек delay (3000 ) ; digitalWrite (led , LOW ) ; //выключаем реле } } else Serial . println (val ) ; //печатаем в монитор порта пришедшую строку val = "" ; } if (Serial . available () ) { //если в мониторе порта ввели что-то while (Serial . available () ) { //сохраняем строку в переменную val ch = Serial . read () ; val += char (ch ) ; delay (10 ) ; } //mySerial.println(val); //передача всех команд, набранных в мониторе порта в GSM модуль if (val . indexOf ("sendsms" ) > - 1 ) { //если увидели команду отправки СМС sms (String ("hello world" ) , String ("+71234567890" ) ) ; //отправляем СМС на номер +71234567890 } val = "" ; //очищаем } } void sms (String text , String phone ) //процедура отправки СМС { Serial . println ("SMS send started" ) ; mySerial . println ("AT+CMGS=\"" + phone + "\"" ) ; delay (500 ) ; mySerial . print (text ) ; delay (500 ) ; mySerial . print ((char ) 26 ) ; delay (500 ) ; Serial . println ("SMS send complete" ) ; delay (2000 ) ; }
Проверка
GPRS
В рассматриваемой версии модуля 1.30 поддержка GPRS урезанная. Мне не удалось подключиться к серверу по его DNS имени (например mysite.ru), получилось только по IP-адресу. В другом модуле SIM800L таких проблем не было.
Перечень некоторых AT команд:
AT+CMGF=1 | Вкл. текстового режима (смс только латиницей) | |||
AT+CSCS= "GSM" | Вкл. режима | |||
AT+CLIP=1 | включение определения номера входящего звонка Если отправить команду с 0, то определение номера отключится и модуль вместо номера вызывающего будет слать только сообщение "RING". |
|||
AT+CMGS="+79123456789" | Отправка СМС | |||
ATI | Получить информацию об устройстве | |||
AT+IPR=19200 | настройка скорости порта | |||
AT+GSN | вернет IMEI модуля | |||
AT+CCLK? | считываем время с модуля | |||
AT+CCLK=«yy/mm/dd,hh:mm:ss+zz» | где по порядку идут «год/месяц/дата,час:минуты:секунды+часовой пояс» Данные обязательно отправляются с ведущими нулями, то есть, к примеру, если месяц у нас "4", то отправить должны "04". Получить обратно текущие время и дату можно отправив ту же команду, только со знаком "?": |
|||
AT+CMEE=0 | уровень информации об ошибке. Может быть от 0 до 2. 0 - отключено. Будет просто писать ERROR. 1 - код ошибки. Будет возвращать цифровой код ошибки. 2 - описание ошибки. Напишет что именно ему не нравится в команде. Для работы с модулем через терминал удобней режимы ATV1, ATE1 AT+CMEE=2, для общения с микроконтроллером лучше использовать ATV0, ATE0 и AT+CMEE=0 - так проще будет обрабатывать полученные ответы. Данные настройки не сохраняются после перезагрузки модуля, поэтому необходимо включать эти команды в код программы. |
|||
AT+CSQ | информация о качестве сигнала. Модуль вернет два числа +CSQ: 17,0 17 - уровень сигнала. Может быть в диапазоне 0..31 или 99. Чем больше тем лучше, но 99 значит его отсутствие. 0 - коэффициент ошибок связи (т.н. RXQUAL). Может быть от 0 до 7, чем число меньше тем качество связи лучше. |
|||
AT+COPS? | информация об операторе, в сети которого зарегистрирован модуль | |||
ATD+79121234567; | набор номера. (";" обязательно) Модуль позвонит по указанному номеру и вернет один из вариантов BUSY - номер занят NO DIALTONE - нет сигнала на линии NO CARRIER - нет сети или другая проблема (например, нет денег на счету) NA ANSWER - нет ответа CONNECT - есть контакт! |
|||
AT+CMGR=3,0 |
Очень качественный модуль KEYES SIM900 GSM GPRS | Модуль SIM800C для ардуино от проверенного поставщика |
Шилд для разработки, совместимый с Ардуино, на базе модуля SIM900 GPRS/GSM | Недорогой модуль mini A6 GPRS GSM |
Подключение GSM GPRS шилда к Arduino
В этом разделе мы рассмотрим вопросы подключения GSM – модулей к плате адуино. За основу почти во всех примерах берется Arduino Uno, но в большинстве своем примеры пойдут и для плат Mega, Nano и т.д.
Подключение модуля SIM800
Для подключения нужны плата Ардуино, модуль SIM800L, понижающий преобразователь напряжения, провода для соединения и батарея на 12В. Модуль SIM800L требует нестандартное для ардуино напряжение в 3,7В, для этого нужен понижающий преобразователь напряжения.
Распиновка модуля SIM800 приведена на рисунке.
Плату Ардуино нужно подключить к компьютеру через USB кабель. Батарею на 12 В подключить через преобразователь: -12В на землю Ардуино, от земли в преобразователь в минус, +12В в преобразователь в плюс. Выходы с модуля TX и RX нужно подключить к пинам 2 и 3 на Ардуино. Несколько модулей можно подключать к любым цифровым пинам.
Подключение модуля A6
Модуль A6 стоит дешевле, чем SIM900, и его очень просто подключать к Ардуино. Модуль питается напряжением 5В, поэтому для соединения не нужны дополнительно понижающие напряжение элементы.
Для подключения потребуются плата Ардуино (в данном случае рассмотрена Arduino UNO), GSM модуль А6, соединительные провода. Схема подключения приведена на рисунке.
Вывод RX с модуля GSM нужно подключить к TX на плате Ардуино, вывод TX подключить к пину RX на Ардуино. Земля с модуля соединяется с землей на микроконтроллере. Вывод Vcc на GSM модуле нужно соединить с PWR_KEY.
Подключение с помощью GSM-GPRS шилда
Перед подключением важно обратить внимание на напряжение питания шилда. Ток в момент звонка или отправки данных может достигать значений в 15-2 А, поэтому не стоит запитывать шилд напрямую от Ардуино.
Перед подключением к Ардуино нужно установить сим-карту на GSM-GPRS шилд. Также нужно установить джамперы TX и RX, как показано на рисунке.
Подключение производится следующим образом – первый контакт (на рисунке желтый провод) с шилда нужно соединить с TX на Ардуино. Второй контакт (зеленый провод) подключается к RX на Ардуино. Земля с шилда соединяется с землей с аруино. Питание на микроконтроллер поступает через USB кабель.
Макет соединения шилда и платы Ардуино изображен на рисунке.
Для работы потребуется установить библиотеку GPRS_Shield_Arduino.
Для проверки правильности собранной схемы нужно сделать следующее: соединить на Ардуино RESET и GND (это приведет к тому, что данные будут передаваться напрямую от шилда к компьютеру), вставить сим-карту в шилд и включить питание шилда. Плату Ардуино нужно подключить к компьютеру и нажать кнопку включения. Если все соединено правильно, загорится красный светодиод и будет мигать зеленый.
Краткое описание взаимодействия через AT-команды
AT-команды – это набор специальных команд для модема, состоящий из коротких текстовых строк. Чтобы модем распознал поданную ему команду, строки должны начинаться с букв at. Строка будет восприниматься, когда модем находится в командном режиме. AT-команды можно отправлять как при помощи коммуникационного программного обеспечения, так и вручную с клавиатуры. Практические все команды можно разделить на 3 режима – тестовый, в котором модуль отвечает, поддерживает ли команду; чтение – выдача текущих параметров команды; запись – произойдет записывание новых значений.
Список наиболее используемых AT-команд:
- AT – для проверки правильности подключения модуля. Если все исправно, возвращается OK.
- A/ – повтор предыдущей команды.
- AT+IPR? – получение информации о скорости порта. Ответом будет +IPR: 0 OK (0 в данном случае – автоматически).
- AT+ICF? – настройка передачи. В ответ придет +ICF: бит, четность.
- AT+IFC? – контроль передачи. Ответом будет +IFC: терминал от модуля, модуль от терминала (0 – отсутствует контроль, 1 – программный контроль, 2 – аппаратный).
- AT+GCAP – показывает возможности модуля. Пример ответа – +GCAP:+FCLASS,+CGSM.
- AT+GSN – получение IMEI модуля. Пример ответа 01322600XXXXXXX.
- AT+COPS? – показывает доступные операторы.
- AT+CPAS – состояние модуля. Ответ +CPAS: 0. 0 – готовность к работе, 3 – входящий звонок, 4 – голосовое соединение, 2 – неизвестно.
- AT+CCLK? – информация о текущем времени и дате.
- AT+CLIP=1 – включение/выключение АОН. 1 – включен, 0 – выключен.
- AT+CSCB=0 – прием специальных смс-сообщений. 0 – разрешено, 1 – запрещено.
- AT+CSCS= “GSM” – кодирование смс-сообщения. Можно выбрать одну из следующих кодировок: IRA, GSM, UCS2, HEX, PCCP, PCDN, 8859-1.
- AT+CMEE=0 – получение информации об ошибке.
- AT+CPIN=XXXX – ввод пин-кода сим-карты.
- AT&F – сброс до заводских настроек.
- AT+CPOWD=1 – срочное(0) или нормальное(1) выключение модуля.
- ATD+790XXXXXXXX – звонок на номер +790XXXXXXXX.
- ATA – ответ на вызов.
- AT+CMGS=”+790XXXXXXXX”>Test sms – отправка смс-сообщения на номер +790XXXXXXXX.
В данном случае рассмотрены основные команды для модуля SIM900. Для разных модулей команды могут незначительно отличаться. Данные для модуля будут подаваться через специальную программу «терминал», которую нужно установить на компьютер. Также подавать команды модулю можно через монитор порта в Arduino IDE.
Скетчи для работы с модулем GSM
Отправка СМС на примере SIM900
Перед тем, как отправить сообщение, нужно настроить модуль. В первую очередь нужно перевести в текстовый формат передаваемое сообщение. Для этого существует команда AT+CMGF=1. Нужно перевести кодировку на GSM командой AT+CSCS=»GSM». Эта кодировка наиболее удобная, так как там символы представлены в ASCII коде, который легко понимает компилятор.
Затем нужно набрать смс-сообщение. Для этого посылается команда с номером абонента AT+CMGS=»+79XXXXXXXXX» r, в ответ предлагается набрать текст смс. Нужно выполнить отправку сообщения. По окончании требуется отправить код комбинации Ctrl+Z, модуль позволит отправку текста адресату. Когда сообщение будет отправлено, вернется OK.
Взаимодействие с модулем основано на индексах, которые присваиваются каждому новому сообщению. По этому индексу можно указать, какое из сообщений удалить или прочитать.
Получение смс. Для чтения смс-сообщения используется команда AT + CNMI = 2,2,0,0,0. Когда на модуль придет текстовое сообщение, он отправит в последовательный порт +CMTI: «SM»,2 (в данном случае 2 – порядковый номер сообщения). Чтобы его прочитать, нужно отправить команду AT+CMGR=2.
Прием голосового звонка. В первую очередь для разговора нужно подключить к модулю динамик и микрофон. При получении звонка будет показан номер, с которого он совершен. Для осуществления работы нужно включить библиотеку GSM:
#include
Если сим-карта заблокирована, нужно ввести ее пин-код. Если пин-код не требуется, это поле нужно оставить пустым.
#define PINNUMBER “”
В setup() должна быть произведена инициализация передачи данных на компьютер. Следующим шагом будет создание локальной переменной, чтобы отследить статус подключения к сети. Скетч не будет запущен, пока сим-карта не подключена к сети.
boolean notConnected = true;
С помощью функции gsmAccess.begin() происходит подключение к сети. При установлении соединения вернется значение GSM_READY.
vcs.hangCall(); – функция, показывающая, что модем готов принимать звонки.
getvoiceCallStatus() – определяет статус скетча. Если кто-то звонит, она возвращает значение RECEIVINGCALL. Для записи номера нужно воспользоваться функцией retrieveCallingNumber(). Когда будет совершен ответ на звонок, вернется TALKING. Затем скетч будет ждать символа новой строки, чтобы прервать разговор.
Установить GPRS-соединение и отправить данные на удаленный сервер
Сначала нужно установить библиотеку SoftwareSerial, которая позволяет обеспечивать последовательную передачу информации и связать GSM-модуль и микроконтроллер Ардуино.
Для отправки данных на сервер нужно отправить следующие команды:
AT+SAPBR=1,1 – открытие Carrier.
Следующие три команды связаны с установкой настроек подключения к сети.
AT+SAPBR=3,1,\”APN\”,\”internet.mts.ru\” – выбор оператора mts, имя точки доступа.
AT+SAPBR=3,1,\”USER\”,\” mts \” – выбор пользователя mts.
AT+SAPBR=3,1,\”PWD\”,\” mts \”
AT+SAPBR=1,1 – установка соединения.
AT+HTTPINIT – инициализация http.
AT+HTTPPARA=”URL”, – URL адрес.
AT+HTTPREAD – ожидание ответа.
AT+HTTPTERM – остановка http.
Если все выполнено правильно, в мониторе порта будут появляться строчки с АТ командами. Если отсутствует связь с модемом, то будет показывать по одной строке. При успешной установке GPRS-соединения на модуле начнет мигать светодиод.
Хочу представить вам очень простой способ удаленного управления электропитанием.
Мы будем использовать готовые радиоуправляемые розетки, поэтому нам не потребуется ничего паять. Это очень здорово, потому что 220 В (начинающим) лучше не трогать.
Код
Если вы используете не GSMSHIELD, а какую-то другую библиотеку, то код разумеется будет отличаться, но принцип будет один и тот же. Через определенные интервалы времени мы проверяем, нет ли у нас непрочитанных SMS, парсим их, и если пришла валидная команда с авторизованного номера, то посылаем радиосигнал функциями mySwitch.switchOff или mySwitch.switchOn , передавая им адрес розетки.Прим. в моем случае для шилда от Seeedstudio нужно было залезть в GSM.cpp и поменять заданные пины на 7 и 8. /* Arduino GSM-switch example code Switch on/off radio controlled controlled outlets Author: Vladislav Ross, 2014 Contact: [email protected] You need to download: 1. rc-switch https://code.google.com/p/rc-switch/ 2. GSMSHIELD http://www.gsmlib.org/ For GSMSHIELD: * To change pins for Software Serial, use the two lines in GSM.cpp. * If you are using Mega, uncomment "#define MEGA" line in HWSerial.h * You can enable debug messages on serial port by defining DEBUG_ON */ #include "SIM900.h" #include
Проблемы?
Если розетки ни в какую не хотят переключаться, можно попробовать принять сигнал от родного пульта на приемник. В rc-switch есть пример кода.Что дальше?
Как дальше можно развить этот проект:Во-первых, у нас осталось еще куча пинов на самом Ардуино и на GSM-шилде. Можно подключить к ним какие-то датчики или устройства. Например, сделать удаленный мониторинг температуры или полив цветов.
Во-вторых, мы использовали только SMS, а модуль еще умеет передавать голос и GPRS. GPRS может передать гораздо больше данных. Кроме того, можно не бросать трубку при звонке, а, например, принимать вызов и давать слушать, что происходит на месте.
Возможно также, что вы захотите принимать управляющие SMS не с одного номера, а с нескольких. В этом случае я бы рекомендовал хранить номера в адресной книге &mash; в библиотеке есть соответствующие функции.