GSM модуль NEOWAY M590 связь с Ардуино
Здравствуйте. Однажды я уже описывал работу с GSM/GPRS-шилдом SIM900, сейчас речь пойдёт о дешёвом (порядка 150 рублей) модуле GSM NEOWAY M590.
Модуль продаётся «врассыпную»
В комплекте поставляется
•Две маленькие, чёрные штучки — это резисторы, полярность не имеет значения.
•Квадратная
•Чёрный цилиндр — это диод (в данной конструкции отвечает за понижение напряжения), обязательно соблюдение полярности, так что делаем как на иллюстрации.
•Маленькая прозрачная штучка — это светодиод, опять же, важна полярность, на плате минус расположен ближе к букве Boot.
Остальные детали, думаю, не вызывают вопросов.
Схема обвязки
Будем считать, что Вы всё правильно спаяли и у Вас получилось вот такое устройство:
Подключение и эксплуатация
NEOWAY общается с ардуиной (или иным устройством) через UART (RX, TX) с помощью AT-команд. Для того чтоб посылать команды, надо выяснить скорость UARTа.
Для выяснения скорости, нужно подключить собраный модуль к компьютеру с помощью USB-UART моста, выглядит эта
В этом случае соединяем:
USB-UART <> NEOWAY
+5 <> +5
GND <> GND
TX <> RX
RX <> TX
Контакт BOOT используется для включения/отключения модуля кратковременным (~1сек) соединением с GND, однако удобнее просто соединить его с GND и не отсоединять. Включение модуля будет происходить при подачи питания.
Если такой
void setup()
{
pinMode(0, INPUT);
pinMode(1, INPUT);
}
void loop()
{}
… и соединив следующим образом:
Ардуина <> NEOWAY
+5 <> +5
GND <> GND
RX <> RX
TX <> TX
Контакт BOOT соедините с GND.
О питании
Модуль может потреблять большой ток, до 2-х ампер в пике, поэтому для надёжной работы необходимо организовать дополнительный БП. В принципе заработает то он и от ардуины, но в момент регистрации в сети или приёма звонка, модуль может перегружаться.
Так же будет не лишним поставить электролитический конденсатор (~1000 микрофарад, 16 вольт) поближе к модулю.
После подачи питания, на плате должен начать
Теперь подключаем Вашу конструкцию к компьютеру, в
Если ответ — ОК, то значит модуль работает и скорость UARTа установлена 9600. Если ответа нет, то проверьте правильность соединения UARTа и дальше действуйте методом «тыка» подставляя разные скорости, пока не увидите заветное ОК.
После старта модем скажет — MODEM:STARTUP, а о готовности к работе сообщит — +PBREADY
Если модему не будет хватать питания (
Ещё я столкнулся с тем, что модем работает не со всеми сим-картами.
Если всё в порядке, тогда переходим к изучению АТ-команд для общения с NEOWAY и его настройки.
АТ-команды
АТ — запрос состояния, ответ — ОК.
ATE0 — отключить «эхо».
ATE1 — включить «эхо».
ATI — название и версия модуля.
AT+getvers — версия прошивки.
AT+IPR=9600 — установка скорости UARTа (9600), возможные варианты — 1200, 2400, 4800, 9600, 19200, 38400, 57600, 115200.
AT&W0 — сохранение конфигурации настроек в EEPROM.
AT&W1 — сохранение конфигурации настроек в EEPROM.
AT+CPAS — проверка статуса модема, ответ — +CPAS: 0.
AT+CPWROFF — отключение модуля.
AT+CLIP=1 — включить АОН.
AT+CLIP=0 — отключить АОН.
ATD+79634759175; — позвонить.
ATH — сбросить все соединения.
ATH1 — сбросить текущие соединение.
AT+CMGF=1 — настроить на текстовый формат SMS.
AT+CMGF=0 — настроить SMS на PDU формат.
AT+CSCS=«GSM» — кодировка текста sms — ASCII. Переправьте на нормальные кавычки.
AT+CMGR=1 — чтение sms, где цифра — порядковый номер сообщения. То есть в данном случае читается первое сообщение, так — AT+CMGR=2 второе и т.д.
AT+CMGD=1 — удаление sms, где цифра — порядковый номер сообщения.
AT+CMGD=1,1 — удалить все прочитанные sms.
AT+CMGD=1,2 — удалить все прочитанные и отправленные sms.
AT+CMGD=1,3 — удалить все прочитанные, отправленные и неотправленные sms.
AT+CMGD=1,4 — удалить все sms.
AT+CNMI=1,2,2,1,0 — вывод принятого sms в терминал.
Здесь можно найти исчерпывающую информацию по ат-командам.
Отправка SMS будет осуществляться ардуиной.
Далее будем управлять модулем с помощью ардуины
Если на вашем модуле установлена скорость UARTа отличная от 9600, тогда дайте команду:
AT+IPR=9600
При взаимодействии с ардуиной будет использоваться SoftwareSerial, а он плохо работает на скоростях выше 9600.
Отключите девайс от питания и переключите RX и TX
Ардуина <> NEOWAY
+5 <> +5
GND <> GND
D2 <> TX
D3 <> RX
Контакт BOOT соедините с GND.
Вначале загружаем в ардуину простой скетч (предварительно вписав номер, с которого будете звонить на модуль).
#include <SoftwareSerial.h>
SoftwareSerial mySerial(2, 3);
byte led = 13;
void setup() {
delay(2000);
pinMode(led, OUTPUT);
digitalWrite(led, LOW);
Serial.begin(9600);
mySerial.begin(9600);
Serial.println("GSM NEOWAY promote site istarik.ru");
Serial.println();
Serial.println("Turn on AOH:");
mySerial.println("AT+CLIP=1"); //включить АОН
delay(100);
// ПРИ СТАРТЕ, НА КАЖДУЮ КОМАНДУ ДОЛЖНО БЫТЬ ПОДТВЕРЖДЕНИЕ - ОК
}
void loop()
{
if(mySerial.available()) //если модуль что-то послал
{
char ch = ' ';
String val = "";
while(mySerial.available())
{
ch = mySerial.read();
val += char(ch); //собираем принятые символы в строку
delay(3);
}
Serial.print("Neo send> ");
Serial.println(val);
if(val.indexOf("RING") > -1) //если есть входящий вызов, то проверяем номер
{
if(val.indexOf("79891196709") > -1) // ВПИШИТЕ НОМЕР, с которого Вы будете звонить на модуль
{
Serial.println("Call my phone");
mySerial.println("ATH"); //разрываем связь
Serial.println("Disconnection");
Serial.println("On D13");
digitalWrite(led, HIGH); //включаем светодиод на 5 сек
Serial.println("5 sec pause");
delay(5000);
digitalWrite(led, LOW); //выключаем
Serial.println("Off D13");
}
}
}
}
При звонке со вписанного номера, будет на 5 секунд зажигаться D13, а связь обрываться. Если это будет другой номер, то ничего не произойдёт. Все действия отображаются в терминале.
Следующий скетч будет посылать SMS в ответ на наш звонок:
#include <SoftwareSerial.h>
SoftwareSerial mySerial(2, 3);
byte led = 13;
void setup()
{
delay(2000);
pinMode(led, OUTPUT);
digitalWrite(led, LOW);
Serial.begin(9600);
mySerial.begin(9600);
Serial.println("GSM NEOWAY promote site istarik.ru");
Serial.println();
Serial.println("Turn on AOH:");
mySerial.println("AT+CLIP=1"); // включить АОН
delay(100);
Serial.println("Text format sms:");
mySerial.println("AT+CMGF=1"); // текстовый формат SMS
delay(100);
Serial.println("Mode GSM:");
mySerial.println("AT+CSCS=\"GSM\""); // кодировка текста - GSM
delay(100);
// ПРИ СТАРТЕ, НА КАЖДУЮ КОМАНДУ ДОЛЖНО БЫТЬ ПОДТВЕРЖДЕНИЕ - ОК
}
void loop()
{
if(mySerial.available()) //если модуль что-то послал
{
char ch = ' ';
String val = "";
while(mySerial.available())
{
ch = mySerial.read();
val += char(ch); //собираем принятые символы в строку
delay(5);
}
Serial.print("Neo send> ");
Serial.println(val);
if(val.indexOf("RING") > -1) //если есть входящий вызов, то проверяем номер
{
if(val.indexOf("79919790861") > -1) // ВПИШИТЕ НОМЕР, с которого Вы будете звонить на модуль
{
Serial.println("Call my phone");
mySerial.println("ATH"); //разрываем связь
Serial.println("Disconnection");
delay(3000);
sms(String("Hello from istarik.ru"), String("+79919790861")); // ВПИШИТЕ НОМЕР, с которого Вы будете звонить на модуль
}
}
}
}
void sms(String text, String phone) // отправка СМС
{
Serial.println("Start SMS send");
mySerial.println("AT+CMGS=\"" + phone + "\"");
delay(500);
mySerial.print(text);
delay(500);
mySerial.print((char)26);
delay(500);
Serial.println("SMS send OK");
delay(2000);
}
Вместо строки «Hello from istarik.ru» можно вписать какую-либо переменную, например температуру с датчика, а звонок заменить каким-либо событием, например, нажатием на кнопку (дописав обработчик нажатия кнопки).
С помощью этого скетча можно отправлять в модуль через терминал какие-то свои команды или АТ-команды. Ответ будет выводится в терминал.
#include <SoftwareSerial.h>
SoftwareSerial mySerial(2, 3);
byte led = 13;
void setup()
{
delay(2000);
pinMode(led, OUTPUT);
digitalWrite(led, LOW);
Serial.begin(9600);
mySerial.begin(9600);
Serial.println("GSM NEOWAY promote site istarik.ru");
Serial.println();
}
void loop()
{
if(Serial.available()) //если в мониторе порта ввели что-то
{
char ch = ' ';
String val = "";
while (Serial.available())
{
ch = Serial.read();
val += char(ch); //собираем принятые символы в строку
delay(5);
}
if(val.indexOf("callmy") > -1) // своя команда
{
mySerial.println("ATD+79196989701;"); // ВПИШИТЕ номер, на который нужно позвонить
}
else mySerial.println(val); // передача всего, что набрано в терминале в GSM модуль
}
while(mySerial.available())
{
Serial.print((char)mySerial.read());
delay(3);
}
}
Если ввести в терминале ат-команду — AT+CLIP=1, то включится АОН, а если ввести свою команду — callmy, тогда модуль перезвонит на вписанный в скетче телефон.
Скетч для отправки SMS-команд:
#include <SoftwareSerial.h>
SoftwareSerial mySerial(2, 3);
byte led = 13;
void setup() {
delay(2000);
pinMode(led, OUTPUT);
digitalWrite(led, LOW);
Serial.begin(9600);
mySerial.begin(9600);
Serial.println("GSM NEOWAY promote site istarik.ru");
Serial.println();
Serial.println("Turn on AOH:");
mySerial.println("AT+CLIP=1"); //включить АОН
delay(300);
Serial.println("Text format sms:");
mySerial.println("AT+CMGF=1"); // текстовый формат SMS
delay(300);
Serial.println("Mode GSM:");
mySerial.println("AT+CSCS=\"GSM\""); // кодировка текста - GSM
delay(300);
Serial.println("SMS to terminal:");
mySerial.println("AT+CNMI=2,2,0,0,0"); // вывод смс в консоль
delay(300);
}
void loop()
{
if(mySerial.available()) //если модуль что-то послал
{
char ch = ' ';
String val = "";
while(mySerial.available())
{
ch = mySerial.read();
val += char(ch); //собираем принятые символы в строку
delay(3);
}
Serial.print("Neo send> ");
Serial.println(val);
if(val.indexOf("+CMT") > -1) //если есть входящее sms
{
if(val.indexOf("led13on") > -1) // смотрим, что за команда
{
Serial.println("On D13");
digitalWrite(led, HIGH); //включаем светодиод
}
if(val.indexOf("led13off") > -1) // смотрим, что за команда
{
digitalWrite(led, LOW); //выключаем
Serial.println("Off D13");
}
}
}
}
Если отправить модулю смску с текстом — led13on, то светодиод зажжётся, а если отправить текст — led13off, то погаснет.
И последний скетч, который позволяет отправив в модуль смс со специальным словом, получить в ответ смс с балансом денег на симке, которая стоит в NEOWAY
#include <SoftwareSerial.h>
SoftwareSerial mySerial(2, 3);
byte led = 13;
void setup() {
delay(2000);
pinMode(led, OUTPUT);
digitalWrite(led, LOW);
Serial.begin(9600);
mySerial.begin(9600);
Serial.println("GSM NEOWAY promote site istarik.ru");
Serial.println();
Serial.println("Turn on AOH:");
mySerial.println("AT+CLIP=1"); //включить АОН
delay(300);
Serial.println("Text format sms:");
mySerial.println("AT+CMGF=1"); // текстовый формат SMS
delay(300);
Serial.println("Mode GSM:");
mySerial.println("AT+CSCS=\"GSM\""); // кодировка текста - GSM
delay(300);
Serial.println("SMS to terminal:");
mySerial.println("AT+CNMI=2,2,0,0,0"); // вывод смс в консоль
delay(300);
}
void loop()
{
if(mySerial.available()) //если модуль что-то послал
{
char ch = ' ';
String val = "";
while(mySerial.available())
{
ch = mySerial.read();
val += char(ch); //собираем принятые символы в строку
delay(3);
}
Serial.print("Neo send> ");
Serial.println(val);
if(val.indexOf("+CMT") > -1) //если есть входящее sms
{
if(val.indexOf("money") > -1) // смотрим, что за команда
{
delay(3000);
mySerial.println("ATD#100#;");
}
}
if(val.indexOf("+CUSD") > -1) //если есть входящее sms
{
if(val.indexOf("Balance") > -1) // смотрим, что за команда
{
delay(3000);
val = val.substring(val.indexOf("Balance"),val.indexOf("r"));
sms(String(val), String("+79967081199")); // ВПИШИТЕ ВАШ НОМЕР
}
}
}
}
void sms(String text, String phone) //отправка СМС с балансом модема
{
Serial.println("Start SMS send");
mySerial.println("AT+CMGS=\"" + phone + "\"");
delay(500);
mySerial.print(text);
delay(500);
mySerial.print((char)26);
delay(500);
Serial.println("SMS send OK");
delay(2000);
}
Отправьте модулю смску с текстом — money и через несколько секунд придёт ответная смс с количеством денег на балансе симки NEOWAY.
Все эксперименты проводились с оператором
Теперь можно из этих скетчей собирать то, что Вам нужно.
У NEOWAY нет микрофона, поэтому голосовую связь осуществить не получится, но само соединение устанавливается, и если принять звонок от модуля, то в динамике будет просто тишина.
При поступлении входящего вызова на контакте RING появляются импульсы с низким логическим уровнем длительностью 30 мс, в такт звуку гудка. При получении SMS сообщения, появляется однократный импульс длительностью 25-35 мс.
На этом пожалуй всё…
Вступайте в Telegram-группу Arduino
- +458
- stD
142739
Поддержать автора
Комментарии (54)
реализовал его, но странно работает — при звонке на модуль идет сброс, далее приходит смс, но спустя немного времени еще идет смс и так до бесконечности как я понимаю.
код весь пересмотрел, ничего кроме номера телефона не правил
Подскажите?
такая же ерундистика.
Звонок на модуль один, а led13 уже 3и раза отработал
но я boot проводом притянул к земле, а не сопротивлением — может в этом дело?
и уровни не согласовывал модуля и ардуины
Кстати, я добавил кнопку на Телеграм-чат (в начале комментов), можно там пооющаться.
телеграмм не работает же, по крайней мере так просто
а по модулю — он у меня работает от БП компа, но вот при звонке на недо и скетче из первого примера, вместо того, чтобы отработать на led13 один раз, он делает это несколько… порой 2, порой 4
потом в порт ничего не валится
подключено
Ардуина <> NEOWAY
+5 <> +5
GND <> GND
D2 <> TX
D3 <> RX
Контакт BOOT соедините с GND.
Ардуина <> NEOWAY
D2 <> TX
D3 <> RX
NEOWAY <> БП ПК
+5 <> +5
GND <> GND
предположил, что возможно проблемы с библиотекой SoftwareSerial
скачал и установил свежую — github.com/PaulStoffregen/SoftwareSerial
и после этого еще интересней стало — в порту видно, что звонок пришел, led13 загорается
пока по моим наблюдениям 4 раза повторят