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 и не отсоединять. Включение модуля будет происходить при подачи питания.



Если такой штуки нет, то можно превратить ардуину в USB-UART мост залив в неё вот такой скетч…

void setup() 
 { 
   pinMode(0, INPUT); 
   pinMode(1, INPUT); 
 } 
 void loop() 
 {} 


… и соединив следующим образом:

Ардуина <> NEOWAY

+5 <> +5
GND <> GND
RX <> RX
TX <> TX

Контакт BOOT соедините с GND.



О питании


Модуль может потреблять большой ток, до 2-х ампер в пике, поэтому для надёжной работы необходимо организовать дополнительный БП. В принципе заработает то он и от ардуины, но в момент регистрации в сети или приёма звонка, модуль может перегружаться.

Так же будет не лишним поставить электролитический конденсатор (~1000 микрофарад, 16 вольт) поближе к модулю.


После подачи питания, на плате должен начать мигать светодиод (примерно раз в секунду) — это говорит о том, что он готов к работе.




Теперь подключаем Вашу конструкцию к компьютеру, в IDE Arduino открываем «Монитор последовательного порта» (в дальнейшем «терминал»), выбираем (внизу-справа) NL & CR, устанавливаем скорость 9600 и отправляем команду проверки связи — AT


Если ответ — ОК, то значит модуль работает и скорость 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.
0 для нулевого профиля, 1 для первого профиля.

AT+CPAS — проверка статуса модема, ответ — +CPAS: 0.
Статусы: 0 — готов к работе, 2 — неизвестно, 3 — входящий звонок, 4 — в режиме соединения.

AT+CPWROFF — отключение модуля.

AT+CLIP=1 — включить АОН.

AT+CLIP=0 — отключить АОН.

ATD+79634759175; — позвонить.
В терминал будут выводиться сообщения: CONNECT — соединение установлено, BUSY — занят, NO ANSWER — нет ответа, NO CARRIER — вызов сброшен.

ATH — сбросить все соединения.

ATH1 — сбросить текущие соединение.

AT+CMGF=1 — настроить на текстовый формат SMS.

AT+CMGF=0 — настроить SMS на PDU формат.

AT+CSCS=«GSM» — кодировка текста sms — ASCII. Переправьте на нормальные кавычки.
Возможны другие кодировки: HEX – шестнадцатеричными значениями, IRA – международный справочный алфавит, PCCP437 – кодировка CP437(IBM PC), 8859-1 – кодовые страницы семейства ISO 8859, UCS2 – кодировка unicode.

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
  • 133147
Поддержать автора


Telegram-чат istarik

Задать вопрос по статье
Telegram-канал istarik

Известит Вас о новых публикациях






Комментарии (54)

0
вопрос — «скетч будет посылать SMS в ответ на наш звонок:»
реализовал его, но странно работает — при звонке на модуль идет сброс, далее приходит смс, но спустя немного времени еще идет смс и так до бесконечности как я понимаю.
код весь пересмотрел, ничего кроме номера телефона не правил
Подскажите?
0
попробовал «скетч будет посылать SMS в ответ на наш звонок:»
такая же ерундистика.
Звонок на модуль один, а led13 уже 3и раза отработал
0
извиняюсь во втором своем посте ошибся — скетч конечно же, который первый в статье, где по звонку горит led13
0
при звонке на модуль идет сброс
Это похоже на плохое питание. От чего модуль запитан?
0
запитан от БП компьютера +5В
но я boot проводом притянул к земле, а не сопротивлением — может в этом дело?
и уровни не согласовывал модуля и ардуины
0
У Вас какой модуль?

Кстати, я добавил кнопку на Телеграм-чат (в начале комментов), можно там пооющаться.
0
модуль ровно такой как в статье
телеграмм не работает же, по крайней мере так просто
а по модулю — он у меня работает от БП компа, но вот при звонке на недо и скетче из первого примера, вместо того, чтобы отработать на led13 один раз, он делает это несколько… порой 2, порой 4
0
В терминале смотрели, что происходит во время звонка?
0
да все ок в момент звонка
потом в порт ничего не валится
0
Ардуина какая? Подключена как описано в статье?
0
arduino duemilanove
подключено
Ардуина <> NEOWAY

+5 <> +5
GND <> GND
D2 <> TX
D3 <> RX

Контакт BOOT соедините с GND.
0
вернее у меня модуль запитан от БП ПК, а ардуино от USB
0
т.е.
Ардуина <> NEOWAY
D2 <> TX
D3 <> RX
NEOWAY <> БП ПК
+5 <> +5
GND <> GND
0
провожу эксперименты дальше
предположил, что возможно проблемы с библиотекой SoftwareSerial
скачал и установил свежую — github.com/PaulStoffregen/SoftwareSerial
и после этого еще интересней стало — в порту видно, что звонок пришел, led13 загорается
0
То есть работает?
0
модуль работает, но как я выше писал отчего-то после вызова с сотового делает с перерывами несколько включений led13
пока по моим наблюдениям 4 раза повторят
0
предположение одно, что-то не так с ардуино, тем более я от ардуино не отключил всякие разные питы, которые использовал для другого проекта
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.