Gsm модуль a7 подключение к ардуино. Бюджетная GSM сигнализация с мозгами из Arduino

GSM модуль представляет собой беспроводное устройство (модем) для приема/передачи данных в сетях мобильной связи.

Neoway M590E - двухдиапазонный GSM-модуль без поддержки голосовой связи.

Технические характеристики:

Частотный диапазон
900/1800 МГц

Температурный диапазон
рабочий: -40...+85 °

Энергопотребление
напряжение питания: 3,3...4,8 В (номинальное 3,9 В)

Протоколы передачи данных
GPRS class 10
GPRS: максимальная скорость 48 кбит/с
SMS: прием/передача, точка-точка MO/MT, широковещательный режим
встроенный стек протоколов TCP/UDP/FTP/DNS: клиент TCP/UDP-сервера или M2M

Набор AT-команд
GSM 07.05, 07.07
Пришел мне недавно такой модуль, покупал у другого продавца, но он поднял цену. Это довольно старый и простой модуль. Сам модем какой то бывший в употреблении, это видно по фото, все остальное новое.




Все приходит россыпухой, остается все это спаять


Питание GSM-модуля

В мануале сказано, что при наличии в цепи питания конденсатора емкостью 1000 мкФ требование к источнику питания по току – 0,6А (при напряжении 3,9 В)


Не забудьте вывод BOOT надо замкнуть на GND через резистор на 10 кОм, тогда при подаче питания, модуль включится.
Модуль управляется по UART с помощью AT-команд
Сам модуль можно использовать в домашней автоматике и системе умный дом, собрать на нем сигнализацию, можно подключить его к Arduino, принимать и отправлять СМС и управлять удаленно устройствами. Вобщем найти кучу применения, выходящей за рамки данного сайта. Модуль очень дешевый, к покупке рекомендую. Кто желает получить дополнительную информацию, ниже привожу ссылки.

Скачать
Описание и команды управления

Neoway M590 Hardware Design Manual V1.1

Neoway M590 AT Command Sets V3.0

Планирую купить +125 Добавить в избранное Обзор понравился +53 +89

Рассмотрим как связать Адруино с GSM модулем SIM800L. Существуют GSM шилды специально для Ардуино, но по цене они достаточно дороги, потому решил приобрести бюджетный вариант. Статья может быть полезна так же для подключения модуля SIM900, NEOWAY M590, и некоторых сотовых телефонов. Неудобный нюанс в том, что этот модуль требует нестандартное для Ардуино питание 3.7В, поэтому запитывать пришлось отдельно через понижающий преобразователь напряжения.

Подключение

Для подключения я использовал следующие компоненты:

  1. Контроллер Arduino UNO R3 + USB кабель
  2. GSM модуль SIM800L (питание от 3.7В до 4.2В)
  3. Преобразователь напряжения понижающий (DC-DC step-down converter)
  4. Батарея 12В (или любой источник питания от 6В до 20В)
  5. Соединительные провода

Соединяем Ардуино с компьютером через USB кабель.

Даем питание к GSM модулю от батареи 12В через преобразователь:

  • от 12В "минус" идет на ардуино в "GND", от "GND" в преобразователь напряжения во "входящий минус".
  • от 12В "плюс" идет в преобразователь напряжения во "входящий плюс".

Возникает вопрос: можно ли подать питание от самой Ардуино от 5В? Напрямую не рисковал бы. Но можно подобрать диод или стабилизатор напряжения.

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

TX и RX контакты на GSM модуле соединяем с 2 и 3 цифровыми контактами на Ардуино. Если необходимо подключить несколько GSM модулей к Arduino, то используйте другие пины и прописывайте в скетче через SoftwareSerial.

Скетч

#include <SoftwareSerial .h> SoftwareSerial mySerial(2, 3); // RX, TX void setup () { Serial .begin (19200); //Скорость порта для связи Arduino с компьютером Serial .println ("Goodnight moon!" ); mySerial.begin (19200); //Скорость порта для связи Arduino с GSM модулем mySerial.println ("AT" ); } void loop () { if (mySerial.available ()) Serial .write (mySerial.read ()); if (Serial .available ()) mySerial.write (Serial .read ()); }

Процедура для отправки СМС

void sms (String text , String phone ) { Serial . println ("SMS send started" ) ; mySerial . println ("AT+CMGS=\"" + phone + "\"" ) ; delay (1000 ) ; mySerial . print (text ) ; delay (300 ) ; mySerial . print ((char ) 26 ) ; delay (300 ) ; Serial . println ("SMS send finish" ) ; delay (3000 ) ; }

Процедуру добавлять в конец скетча и вызывать её из основного цикла так: sms(String("текст СМС на англ."),String("+791212345678"));

Проверка

Включаем питание затем через монитор порта, выставив скорость 19200 и обязательно опцию "новая строка".

Вводите команду "ATI" и нажмите ENTER. Должна появиться информация от модели модуля.

Пробовал отправить на модуль СМСку через бесплатный сервис от Теле2, приходят непонятные строки. Пробовал в модуле сменить кодировки. Вопрос пока не решен.

Видео

К ряду побывавших в моих руках GSM модемах недавно добавился небезызвестный SIM900.

В статье речь пойдёт об отладочной плате для него.

Почему SIM900? Т.к. много слышал о нём и много, где его видел, давно захотелось ознакомиться с ним и его функционалом. Особенно заинтересовал он после статьи из журнала «Беспроводные технологии» «Все в одном или что нового в GSM-модуле SIM900». И один проект.

Основные характеристики:

  • Четыре диапазона GSM 850/ 900/ 1800/ 1900 МГц;
  • Класс передачи данных GPRS 10/8;
  • Класс мощности 4 (2Вт в диапазонах 850.900 МГц);
  • Класс мощности 1 (1Вт в диапазонах 1800/1900 МГц);
  • Управление AT-командами (GSM 07.07, 07.05 + AT команды от SIMCom);
  • Аудиокодеки HR, FR, EFR, AMR, подавление эха;
  • CSD до 14,4кбит/сек;
  • PPP-стек;
  • Встроенный стек TCP/IP, UPD/IP;
  • MUX (07.10);
  • Протоколы HTTP и FTP;
  • Напряжение питания 3,2-4,8В;
  • Температурный рабочий режим -30 +80 °С;
  • SIM карты поддерживает с напряжением 1,8 и 3,3В;
  • Размеры: 24* 24 * 3 мм
  • Вес 4 гр.

Характеристики взяты из той статьи и даташита к модулю.

Перейдём к получившемуся отладочному или демонстрационному модулю. За основу разработки взял свои наработки от . Вот что вышло:

В схеме были применены следующие упрощения от рекомендаций из даташита:


Эти упрощения не критичны, но при использование модуля в более жестких условиях или в железе, где на него будет возложена большая ответственность, о них забывать не стоит.

Теперь о том, что реализовано:

  1. Питание от 5В (что удобно при работе от USB или в 5В микроконтроллером) до 7-8В, стало возможно благодаря LM1086CT с низким падение напряжения;
  2. UART – для отладки или подключения к МК;
  3. + выведен I2C (не забываем про согласование уровней, если подключать к 5В логике, в отладке их не заложил);
  4. Кнопка и спец. вывод (5 пин на UART интерфейсе, включение высоким уровнем), как для ручного запуска модуля, т.к. и для его включения с микроконтроллера;
  5. Аудио вход и выход, для экспериментов, где может понадобиться голосовая связь.
  6. 2 статус диода, для отображения режимов работы модуля;
  7. Джампер JUMP1, который замыкает стабилизатор и позволяет питать модуль от 3,3-4,7В, что в свою очередь позволяет его напрямую запитать, например от литий-ионной батареи. Во время сборки и проверки не оказалось под рукой стабилизатора, питал от одной 18650 банки ;
  8. Разведены дополнительные земли для удобного подключения периферии;
  9. Разведена SMD площадка линии NRESET, для возможности добавлении цепи перезагрузки модуля.

Печатка выглядит следующим образом:

Плата выполнена на одностороннем стеклотекстолите размером 61х49мм. Основа – GSM модуль SIM900 (B09). Стабилизатор VR1 LM1086CT-ADJ в корпусе ТО-220. Держатель симкарт Sim card SCV-W2523X-08 или Sim card SCV-W2523X-06. Светодиоды любые в корпусах 0603 или 0805 с малым током потребления. Единственный транзистор VT1 – BC847 или подобный. Резисторы R1 и R2, токоограничители статус светодиодов, по 510Ом 0805. R3 4,7кОм, R4 47кОм, R5-R6 1кОм все типоразмера 0805. R7 0805 68Ом, R8 1206 10Ом. R8-R10 по 22Ома в корпусах типоразмера 0805. R12 1кОм, R13 10кОм, оба 0805. Конденсаторы C2-C3, C7-C8 по 33пФ, С4 22пФ, C5 1мкФ, С6 10пФ, С9,С10, С12 0,1мкФ, все они типоразмера 0805. Конденсатор C1 10мкФ чип-тантал типоразмера A. С10 100мкФ не менее 16В, C13 470-680мкФ не менее 10В, плату разводил под EPCOS: 100мкФ бочонок размера 8х11,5мм и 470-680мкФ той же серии размера 10х12,5-20мм. Кнопка S1 – DTSM13-5.0N (в пормэлектроннике), возможно её настоящее название – DTSM13-4.3N. Антенна любая на GSM диапазон с разьемом SMA-M, на плате SMA-F гнездо. Штыри PLS5 и 3х PLS2 + для перемычки JUMP1 нужны PLS3 и сам джампер с шагом 2,54. Аудио разъемы Jack 3,5 — CK3-101B, ставил, что было в наличии, не удачный вариант, лучше поставить какие-нибудь моно гнёзда .

Обзор платы GSM/GPRS SIM900 Shield

Плата Arduino GPRS/GSM Shield (рисунок 1) предоставляет нам возможность использовать для удаленного приема и передачи данных мобильной GSM-связи. Осуществить это можно тремя способами:

    используя отправку/прием коротких текстовых сообщений (SMS);

    отправкой голосовых (аудио) команд на основе технологий CSD (стандартная технология передачи данных в сети GSM) и/или DTMF (двухтональный многочастотный аналоговый сигнал, используемый для набора телефонного номера);

    используя пакетную передачу данных на основе технологии GPRS.

    Плата построена на базе модуля SIMCom SIM900.

Также на ней расположены:

    слот для SIM-карты;

    джек 3,5 мм для аудио-входа и выхода;

    разъём для внешней антенны.

Общение с платой производится через serial-соединение с помощью набора AT-команд. С помощью перемычек на плате возможно установить используемые для коммуникации контакты: аппаратные 0- 1-й или 2-3 (на некоторых платах) 7- 8-й для работы через SoftwareSerial.

Рисунок 1. GPS GPRS shield.

Плату GSM GPRS SIM900 Shield можно включить двумя способами:

    аппаратным (нажатие кнопки PWRKEY);

    программным.

Подключение к плате Arduino

Плата GSM GPRS SIM900 Shield сделана в формате шилда для плат Ардуино. Контакты шилда (гребенки) легко вставляются в разъемы платы, образуя при этом "бутерброд" (рисунок 2).


Рисунок 2. Установка GPS GPRS shield на плату Arduino.

Управление модулем GSM GPRS SIM900 с помощью AT-команд

Рассмотрим управление модулем GSM GPRS shield с помощью AT-команд. Для этого установим модуль на и подключим её к компьютеру. Arduino-скетч отправки и получения данных между компьютером и модулем GSM GPRS shield через плату показан в листинге 1.


Листинг 1

#include

// создание объекта

SoftwareSerial grs(7, 8); // RX, TX

// скорость обмена

#define GSMbaud 9600

Serial.begin(9600);

gsm.begin(GSMbaud);

Serial.println("Start");

if (Serial.available()) {

str1 = Serial.readStringUntil("\n");

str1.toCharArray(buffer, hh.length() + 1);

gsm.write(buffer);

gsm.board.write("\n");

if (gsm.available()) {

Serial.write(gprs.read());

Загружаем скетч на плату ардуино, открываем монитор последовательного порта и набираем команды установки режима:

Команда проверки подключения модуля к GPRS-сети, которую при ответе COMMAND NO RESPONSE необходимо постоянно повторять

Подключаемся к точке доступа оператора связи. Для Билайн:

AT + CGDCONT = 1, "IP", "internet.beeline.ru"

AT + CSTT = "internet.beeline.ru","", ""

Установка интернет-соединения:

AT + CGACT = 1,1

Обращение к интернет-ресурсу

Весь процесс подключения представлен на рисунке 3.


Рисунок 3. Процесс работы с модулем GSM GPRS SIM800 в мониторе последовательного порта.

Пример отправки sms-сообщений с платы Arduino

Рассмотрим пример использования отправки sms-сообщений при уменьшении температуры воздуха в помещении ниже определенного значения. Нам потребуются следующие детали:

    модуль GSM GPRS Shield – 1 шт;

    sim-карта сотового оператора с положительным балансом;

    блок питания 12В – 1 шт;

Схема подключения показана на рисунке 4.


Рисунок 4. Схема подключения для отправки sms-сообщений при низких значениях температуры воздуха.

Приступим к написанию скетча. Каждые 30 секунд получаем данные влажности и температуры с датчика DHT11. Используем библиотеку DHT. При значении температуры ниже критического отправляем sms на номер указанный в константе PHONE. И делаем паузу на 10 минут.

Содержимое скетча показано в листинге 2.


Листинг 2

// подключение библиотек

#include

#include "DHT.h"

// телефон для отправки sms

#define PHONE_NUMBER "+7928222222"

// создание объектов

SoftwareSerial gsm(7, 8);

DHT sensorDHT(2, DHT22);

// пороговое значение температуры

#define TEMPP 18

unsigned long millissend;

// запуск последовательного порта

Serial.begin(9600);

// запуск датчика DHT

sensorDHT.begin();

// запуск SoftwareSerial

gsm.begin(9600);

if (millis()-millissend>30*1000) { // показания каждые 30 секунд?

// получение данных с датчика DHT

int h = sensorDHT.readHumidity();

int t = sensorDHT.readTemperature();

if(t

// отправить sms

// ждем 10 минут

delay(10*60*1000);

millissend=millis();

// отправка sms

void SendSMS(int t) {

// установка text mode

gsm.print("AT+CMGF=1\r");

// телефон

gsm.println(PHONE_NUMBER);

gsm.println("\"");

// отправить данные t

// окончание передачи

gsm.println((char)26);

Загружаем скетч, проверяем событие прихода sms-сообщения на выбранный номер телефона при критическом значении температуры.


Рисунок 5. Схема в сборе.

Создадим прошивку получения данных при отправке sms-сообщения на sim-карту, находящийся в модуле GSM GPRS shield. Содержимое скетча показано в листинге 3.


Листинг 3

// подключение библиотек

#include

#include "DHT.h"

// создание объектов

SoftwareSerial gsm(7, 8);

DHT sensorDHT(2, DHT22);

// переменные

String phone = ""

String str1 = ""; //

boolean isSMS = false;

// подключение последовательного порта

Serial.begin(9600);

// запуск датчика DHT

// запуск SoftwareSerial

gsm.begin(9600);

// Настройка приёма сообщений

gsm.print("AT+CMGF=1\r");

gsm.print("AT+IFC=1, 1\r");

gsm.print("AT+CPBS=\"SM\"\r");

gsm.print("AT+CNMI=1,2,2,1,0\r");

if (gsm.available()) {

char c = gsm.read();

if ("\r" == c) {

if (isSMS) { // текущая строка - sms-сообщение,

if (!str1.compareTo("tmp")) { // текст sms - tmp

// отправить sms на приходящий номер

// получение данных

int t = dht.readTemperature();

// AT-команда установки text mode

gsm.print("AT+CMGF=1\r");

// номер телефона получателя

gsm.println("AT + CMGS = \"");

gsm.println(phone);

gsm.println("\"");

// сообщение – данные температуры

// окончание передачи

gsm.println((char)26);

Serial.println(currStr);

if (str1.startsWith("+CMT")) {

Serial.println(str1);

// выделить из сообщения номер телефона

phone=str1.substring(7,19);

Serial.println(phone);

// если текущая строка начинается с "+CMT",

// то следующая строка является сообщением

else if ("\n" != c) {

str1 += String(c);

Загружаем скетч на плату, отправляем sms-сообщение с текстом tmp на sim-карту и получаем в ответ sms-сообщение с данными температуры.

Часто задаваемые вопросы FAQ

1. Нет связи с Arduino по последовательному порту.

    Проверьте питание платы.

    Проверьте правильность установки перемычек.

2. Не отправляются sms-сообщения

    Проверьте наличие внешнего питание GSM GPRS shield.

    Проверьте баланс sim-карты.


По просьбе трудящихся продолжаю тему GSM девайсов, а именно подключение модуля SIM900D к ATmega. Какая модель это не важно. В этой статье я буду использовать ATmega8515. Этот контроллер я использовал исключительно по фен-шую))) Вся нужная информация будет выводится на ЖК дисплей 20х4 фирмы МЭЛТ. Его тоже выбирал по фен-шую))) И также потому что он понимает кодировку Windows-1251 что сильно упрощает вывод русских буковок.

А теперь собственно поставим задачу.

  • 1. Требуется включать и выключать 8 светодиодов(реле, вентиляторов и т.д.)
  • 2. Включат и выключать по переданному коду по средством SMS.
  • 3. Выводить на дисплей уровень приема GSM сигнала.
  • 4. Вывод на экран последнюю команду переданную по средством SMS.
Задача поставлена. GSM-модуль общается с МК по UART. Схема включения GSM-модуля можно посмотреть . МК будет работать на частоте 3,6864 МГц. Это нужно для снижения ошибок в UART. Скорость обмена 19200. За все время тестирования ошибок с передачей не было. Правда помер один МК, что дало головомойки на пару дней, но потом с заменой на новый МК все пошло как по маслу. ЖК дисплей подключен к порту А. Порт С отдан на включение и выключение светодиодов. Ах да. тут есть один нюанс. GSM-модуль может получать данные на ногу RxD только 3 вольта и не более!!! Это важно!!! Отсюда было принято решение подавать данные через резисторный делитель. Расчет плечей оставляю за вами так как МК может работать в разных диапазонах от 2,8 до 5 вольт. Лично я питаю GSM-модуль 4 вольтами, а МК 5. Так, с железом вроде разобрались. Теперь поехали по коду. Первое что необходимо это способ принятия данных от GSM-модуля. Модуль пуляет ответы на запросы такого вида:
Запрос:
AT+CSQ\r\r\n
Ответ:
\r\n+CSQ: 17,0\r\n\r\nOK\r\n
Отсюда видно что запросы и ответы перемешаны кучей \r и \n ерундой. Ну для запроса это не проблема, так как мы сами его пишем, а вот ответ... Разгребать весь этот зоопарк каждым пришедшим байтом в UDR не комельфо, поэтому будем использовать кольцевой буфер. Кто не знает что это, идем сюда . При использовании кольцевого буфера добавим в обработчик прерывания по приходу данных в UDR проверку для игнорирования \r и \n. ISR(USART_RX_vect) { char temp = UDR; if(!(temp == 0x0A || temp == 0x0D)) InBuffer(temp); } То есть мы записываем в буфер все кроме \r и \n. Как только мы получили данные начинаем их обрабатывать. Первое что нужно посмотреть, SMS это или ответ на команду. Так как GSM-модуль всегда возвращает фиксированный ответ, а меняет только данные, то отследить можно по названию ответа. Например запрос на уровень приема GSM.
if(time == 30) { time = 0; USART_STR("AT+CSQ"); USART_END(); _delay_ms(200); } if(GetData()) { _delay_ms(70); num = IndexNumber(); OutBufferStr(temp,num); } Теперь в массиве temp лежит ответ от GSM-модуля. Теперь давайте его распознаем.
if((temp == "C") & (temp == "S") & (temp == "Q")) { } Если в массиве лежит ответ на запрос уровня GSM, то условие выполнится и его можно обрабатывать по своему усмотрению. А если условие не выполнилось? То скорее всего пришло SMS. Как его вычислить? Как только приходит SMS сообщение, модуль возвращает строку вида.
+CMTI: "SM",1 Все что здесь меняется, так это последний символ, а точнее цифра. Это номер SMS. А вот буквы SM не меняются никогда. Значит нам требуется проверить есть ли в сообщении эти буквы.
if((temp == "S") & (temp == "M")) { } Конечно еще бы было не плохо проверить название самой команды для более точного убеждения, но я этим пренебрег так как это пока просто объяснения работы МК с GSM-модулем. Поле того как распознали принятие SMS не плохо бы было его прочитать. Кидаем GSM-модулю запрос вида.
USART_STR("AT+CMGR="); USART_TXD(temp); USART_STR(",0"); USART_END(); _delay_ms(200); В ячейке массива temp лежит номер SMS. Данная команда будет адекватна при SMS сообщениях меньше 9. Ну это понятно почему. А вообще чтобы не забивать память SIM карты SMSками я после прочтения SMS сразу удаляю ее, поэтому больше 1 SMS в памяти не бывает. Но все же я использовал не жестко число 1, а именно выдрал его из массива. Я не знаю почему, но иногда SMS не всегда приходят сразу, а с неким опозданием. Если такое произошло, то возможен такой косяк, SMSка еще не пришла, мы думаем что не прошла и шлем за ней еще одну. Тут проходит время и они приходят две подряд одна за одной. Первую мы читаем как 1, а вторая пришла как 2. Вот от таких косяков и защищает ячейка массива. Теперь запросив текст SMS GSM-модуль вернет нам ответ вида.
+CMGR: "REC UNREAD","+71234567890","","14/07/06,13:04:38+16" сообщение OK После этого можно читать сообщение. Так как ответы всегда фиксированы, то можно смело начинать читать с temp... и может возникнуть косяк))) Я на него нарвался. Пока я разбирался с GSM-модулем мне тихим сапом Beeline прислал SMSку. Все бы ничего да подстава засела в месте где прописывается номер отправляющего SMS абонента. Вместо "+71234567890" мне пришло "My Beeline". Ну понятно чем это пахнет. Короче МК ни фига не понял и вошел в ступор. Поэтому я решил все таки проверять номер. Да и для безопасности это не помешает. А то вдруг зависливый сосед прознает про управление котлом по SMS и пошлет команду зимой выключит котел))).
for(uint8_t i=0; i Смысл прост. В цикле сравниваем ячейки массива буфера отвечающие за номер с массивом в который заранее положили требуемый номер. Пока цифры совпадают флаг равен 1, но как только цифра не совпадет, обнуляем флаг и выходим из цикла. Если флаг в нуле, то не читаем SMSку, а если в единице, то SMSка наша. Если все проверки прошли, то читаем команду. Команды я сделал такие. Заглавния буква V значит включить, O значит отключить. Для того чтобы узнать какой светодиод включить или выключить, после буквы пишем его номер от 1 до 8. Пример, нужно включить 4-й светодиод. Шлем SMS с текстом V4 , а для отключения O4 .
if(flag) { if(temp == "V") { lcd_xy(0,2); lcd_putsf("LED-"); lcd_putchar(temp); lcd_putsf(" Bключен "); switch (temp) { case 0x31: PORTC |= (1 Собственно вот весь код. Сначала проверяем буковку и по ней выполняем ту или иную команду и параллельно выводим сообщение на ЖК. А после того как закончили работу с SMS скидываем флаг и удаляем все SMS.
USART_STR("AT+CMGD=1,4"); USART_END(); _delay_ms(100); flag=0;
Вот и все. Ниже видео всего этого безобразия и архив с проектом.
Проект