Подключение модуля gsm/gprs a6 (расширенная версия) к Arduino UNO R3

Homo Faber
Offline
Зарегистрирован: 25.05.2019

Подключаю модуль GSM/GPRS A6 (расширенная версия) к Arduino UNO R3.

Вот так он выглядит. Порылся в Тырнете в поисках подключения к Arduino UNO R3.
Нашёл достаточно простое подключение:

GSM/GPRS A6  Arduino UNO R3

   VCC_IN --------> 5V
     U-TXD --------> RX (0 pin)
     U-RXD --------> TX (1 pin)
        GND --------> GND

Скетч отказывался заливаться, выскакивала ошибка синхронизации, выделывался UNO, помучался, решил подключить к А6 внешнее питание. Не помогло. При этом, при полностью отключенном А6 заливка проходит без проблем.
Обратил внимание на то, что при подключении  U-RXD --------> TX (1 pin) начинает подсвечивать светодиод ON на плате Arduino. Похоже, что по U-RXD идет какой-то сигнал (наводка).
Подскажите, пожалуйста, чайнику, что делаю не так?
Может всё-таки подключаю не так?
Заранее спасибо всем откликнувшимся.

 

Ворота
Ворота аватар
Offline
Зарегистрирован: 10.01.2016

Homo Faber пишет:

Скетч отказывался заливаться, выскакивала ошибка синхронизации, выделывался UNO, помучался, решил подключить к А6 внешнее питание. Не помогло. При этом, при полностью отключенном А6 заливка проходит без проблем.

Не подлючай модуль при заливке скетча, подключайте потом или, как Вы говорите, отключайте его полностью.

Он начинает воспринимать заливку скетча как свои команды, отвечает на них, сходит с ума и сводит с ума Уну.

b707
Offline
Зарегистрирован: 26.05.2017

Homo Faber пишет:

Скетч отказывался заливаться, выскакивала ошибка синхронизации, выделывался UNO, помучался, решил подключить к А6 внешнее питание. Не помогло. При этом, при полностью отключенном А6 заливка проходит без проблем.

ну так все естесственно. Интерфейс USB, через который происходит заливка подключен на контроллере к пинам 0 и 1. Поэтому, если к пинам 0 и 1 что-то подключено - заливка скетча будет глючить.

 

Решение два - либо подключайте модем к другим пинам, либо каждый раз при заливке отключайте модем от ардуины

Homo Faber
Offline
Зарегистрирован: 25.05.2019

b707 пишет:

ну так все естесственно. Интерфейс USB, через который происходит заливка подключен на контроллере к пинам 0 и 1. Поэтому, если к пинам 0 и 1 что-то подключено - заливка скетча будет глючить.

Решение два - либо подключайте модем к другим пинам, либо каждый раз при заливке отключайте модем от ардуины

Тогда посоветуйте, пожалуйста, к каким пинам подключать девайс, и как получать и передавать информацию.
И, если можно, так же посоветуйте, какую библиотеку в таком случае использовать? Стандартную "GSM.H" или какую-то другую?
Помогите чайнику закипеть, пожалуйста...

Homo Faber
Offline
Зарегистрирован: 25.05.2019

Да,ещё заметил, что на выходах висит постоянное напряжение порядка 3,5В. Так должно быть или это глюк модуля?

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

На всех выходах висит? На некоторых - нормально.

kostyamat
Offline
Зарегистрирован: 16.11.2017

Homo Faber пишет:

b707 пишет:

ну так все естесственно. Интерфейс USB, через который происходит заливка подключен на контроллере к пинам 0 и 1. Поэтому, если к пинам 0 и 1 что-то подключено - заливка скетча будет глючить.

Решение два - либо подключайте модем к другим пинам, либо каждый раз при заливке отключайте модем от ардуины

Тогда посоветуйте, пожалуйста, к каким пинам подключать девайс, и как получать и передавать информацию.
И, если можно, так же посоветуйте, какую библиотеку в таком случае использовать? Стандартную "GSM.H" или какую-то другую?
Помогите чайнику закипеть, пожалуйста...


Откройте для себя библиотеку SoftwareSerial. Она позволит вам подключить модем к почти любым пинам Ардуино.
Если хотите чему нибудь научится при работе с модемом, старайтесь не использовать библиотек, а обрабатывать ответы модема самому. Этот способ менее затратен для ресурсов микроконтроллера.
Очень рекомендую к прочтению этот цикл статей http://codius.ru/articles/GSM_%D0%BC%D0%BE%D0%B4%D1%83%D0%BB%D1%8C_SIM80...

Homo Faber
Offline
Зарегистрирован: 25.05.2019

andycat пишет:
На всех выходах висит? На некоторых - нормально.

Уточняю напряжения относительно GND (вольт):
Uпит         5,15
H_TXD      3,39
H_TXD      3,37
R232_RX  -5,85 
R232_TX   0
U_RXD      3,9
U_TXD      3,39 

Оч-чень странное напряжение на R232_RX с минусом... Так и должно быть?

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

Homo Faber пишет:

 

Оч-чень странное напряжение на R232_RX с минусом... Так и должно быть?

Если ко мне вопрос, то не знаю, я этими выводами не пользуюсь, и модуль A6 у меня другой.

Выше же уже утветили - используйте на МК SoftWare Serial библиотеку и соотвественно пины, отличные от 0 и 1.

sadman41
Offline
Зарегистрирован: 19.10.2016

Минус для RS232 - нормально. Загляните в википедию.

Homo Faber
Offline
Зарегистрирован: 25.05.2019

Попробовал - реакция нулевая, может другие входы-выходы надо использовать?
Задал вопрос на codius.ru, пока без ответа.
Да и модуль там другой используется...

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

да не..... должно все работать, он простой как валенок.

Еще подключите PWR на +5 V, RST на GND

  digitalWrite(reset_A6_pin, LOW);
  digitalWrite(power_A6_pin, HIGH);

 

если есть переходник USB-TTL - напрямую к компу подключить и пообщаяться с модемом, по умолчанию скорость 115200 у него, если нужно меньше - в течении 3 секунд слать AT команду ему на нужной скорости.

 

void initModem() {
  digitalWrite(reset_A6_pin, LOW);
  digitalWrite(power_A6_pin, HIGH);
  while ((millis() - current_millis) <= 3200UL) {
    Serial.print("AT\r\n"); delay(100);
  }

 

Homo Faber
Offline
Зарегистрирован: 25.05.2019

Ур-р-ря!!!!
Удалось соединится!
Но в ответ пришли кракозяблы...
Вот Скетч с codius.ru, немного переделанный.

#include <SoftwareSerial.h>
SoftwareSerial GSM_A6(8, 9);        // 8 - RX Arduino (TX GSM_A6), 9 - TX Arduino (RX GSM_A6)
void setup() {
  Serial.begin(9600);               // Скорость обмена данными с компьютером
  Serial.println("Start!");
  GSM_A6.begin(9600);               // Скорость обмена данными с модемом
  GSM_A6.println("AT");
}

void loop() {
  if (GSM_A6.available())           // Ожидаем прихода данных (ответа) от модема...
    Serial.write(GSM_A6.read());    // ...и выводим их в Serial
  if (Serial.available())           // Ожидаем команды по Serial...
    GSM_A6.write(Serial.read());    // ...и отправляем полученную команду модему
}

А вот кракозяблы:

Кракозяблы не копировались, пришлосьчерез Print Screen.

Соединился - уже счастье, но похоже что-то с кодировкой не то...

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

А вы 3 секунды ему команду АТ давали чтоб он настроился под скорость? Выше же написано....

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

Или в своём скетче поставьте 115200 скорость и в мониторе порта соответственно аналогично

Homo Faber
Offline
Зарегистрирован: 25.05.2019

andycat пишет:
А вы 3 секунды ему команду АТ давали чтоб он настроился под скорость? Выше же написано....

Написано-то оно написано, но чайник не втыкает в смысл этих 2-х строк:

  digitalWrite(reset_A6_pin, LOW);
  digitalWrite(power_A6_pin, HIGH);

В частности "reset_A6_pin", куда она пишется?
На модуле нет RESETа...
Пока заглушу эти строчки, посмотрю, что получится...

Homo Faber
Offline
Зарегистрирован: 25.05.2019

Попробовал.
Что характерно, вывалил кучу команд "АТ" без ответа. Похоже, что "Serial.print("AT\r\n");" должно выглядеть как "GSM_A6.println("AT\r\n");"? Или я опять что-то не понял? Ведь команда АТ должна посыляться на модуль, а не в монитор порта?
Пробую изменить.

Вот на что обратил внимание: кракозяблы в мониторепорта появляются только при включении питания модуля, при этом энергично мигает синий светодиод на порте U_TXD.

Докладываю результаты испытания: НУЛЬ!
Вот новый скетч.

#include <SoftwareSerial.h>

int current_millis=millis();

SoftwareSerial GSM_A6(8, 9);        // 8 - RX Arduino (TX GSM_A6), 9 - TX Arduino (RX GSM_A6)

void setup() {
  Serial.begin(9600);               // Скорость обмена данными с компьютером
  Serial.println("Start!");
  GSM_A6.begin(9600);               // Скорость обмена данными с модемом
  initModem();
}

void loop() {
  if (GSM_A6.available())           // Ожидаем прихода данных (ответа) от модема...
     {
      Serial.write(GSM_A6.read());    // ...и выводим их в Serial
     }
}

void initModem()
{
//  digitalWrite(reset_A6_pin, LOW);    // Временно закоментировано, в связи с неясностью подключения
//  digitalWrite(power_A6_pin, HIGH);   // Временно закоментировано, в связи с неясностью подключения
  while ((millis() - current_millis) <= 3200UL)
        {
         GSM_A6.print("AT\r\n");
         Serial.println(millis() - current_millis);
         delay(100);
        }
}

В мониторе порта пишет "Start!" после чего разность миллисекунд раз десять и ФСЁ...

Ещё хочу спросить уважаемого andycat, что означают "UL" после 3200 (3200UL)? 

Приношу всем извинения за непонятки со стилями в комментариях, сам не понял как получилось...

BOOM
BOOM аватар
Онлайн
Зарегистрирован: 14.11.2018

Homo Faber пишет:

, что означают "UL" после 3200 (3200UL)? 

Это говорит компилятору константу рассматривать не как int, а как беззнаковое long (внутренне представление числа).

( вот тут информация есть )

Homo Faber
Offline
Зарегистрирован: 25.05.2019

С беззнаковым длинным понятно. Спасибо за разъяснение.

А вот с остальным - "тёмный лес и волки воют"...

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

Homo Faber пишет:

 

Вот новый скетч.

#include <SoftwareSerial.h>

int current_millis=millis();

SoftwareSerial GSM_A6(8, 9);        // 8 - RX Arduino (TX GSM_A6), 9 - TX Arduino (RX GSM_A6)

void setup() {
  Serial.begin(9600);               // Скорость обмена данными с компьютером
  Serial.println("Start!");
  GSM_A6.begin(9600);               // Скорость обмена данными с модемом
  initModem();
}

void loop() {
  if (GSM_A6.available())           // Ожидаем прихода данных (ответа) от модема...
     {
      Serial.write(GSM_A6.read());    // ...и выводим их в Serial
     }
}

void initModem()
{
//  digitalWrite(reset_A6_pin, LOW);    // Временно закоментировано, в связи с неясностью подключения
//  digitalWrite(power_A6_pin, HIGH);   // Временно закоментировано, в связи с неясностью подключения
  while ((millis() - current_millis) <= 3200UL)
        {
         GSM_A6.print("AT\r\n");
         Serial.println(millis() - current_millis);
         delay(100);
        }
}

В мониторе порта пишет "Start!" после чего разность миллисекунд раз десять и ФСЁ...

 

ну так...если вы используете именно этот скетч - ничего и не будет в мониторе порта.

в loop добавьте обратную операцию - т е из монитора порта в модем, и попробуйте ручками ввести в модем какую нибудь команду например ATE0- должен появиться ответ.

С такой модификацией модема не работал, но че то сомневаюсь что на нем RST и PWR нет - можете крупно фотку или описание точное выложить посмотреть?

я для A6 ввожу вот такие команды при включении устройства, если добьетесь ответа, рекомендую эти строчки в setup прописать:

ATE0
AT+CLIP=1
ATS0=5
ATV1
AT+CMGF=1
AT+CMGD=1,4

 

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

и в вашем скетче 3 строка тип current_millis не правильный - должен быть unsigned long

Homo Faber
Offline
Зарегистрирован: 25.05.2019

andycat пишет:

и в вашем скетче 3 строка тип current_millis не правильный - должен быть unsigned long

Вроде не ругается, а цифры выдаёт правильные.

b707
Offline
Зарегистрирован: 26.05.2017

Homo Faber пишет:

не ругается, а цифры выдаёт правильные.

тем не менее, попробуйте подумать. Какой тип значения возвращает millis() ?

Homo Faber
Offline
Зарегистрирован: 25.05.2019

andycat пишет:

в loop добавьте обратную операцию - т е из монитора порта в модем, и попробуйте ручками ввести в модем какую нибудь команду например ATE0- должен появиться ответ.

Простите, мне ещё не совсем понятен метод передачи из монитора порта в модем, если можно примерчик в студию

andycat пишет:

С такой модификацией модема не работал, но че то сомневаюсь что на нем RST и PWR нет - можете крупно фотку или описание точное выложить посмотреть?

Описания нет, а фото - пожалуйста. RST - точно нет, а про PWR - речи не было, я считал, что это, возможно, альтернативное питание.

Лицевая сторона приведена в начале статьи, там профессиональное фото.

Homo Faber
Offline
Зарегистрирован: 25.05.2019

b707 пишет:

тем не менее, попробуйте подумать. Какой тип значения возвращает millis() ?

Исправил, хотя, если честно, в данном случае, не вижу принципиальной разницы. Возможно в более сложных проектах это может сыграть негативную роль.
Но, тем не менее, спасибо за совет.

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

Homo Faber пишет:

 не вижу принципиальной разницы. 

С таким отношением и без изучения предмета, скетч ваш далеко не уедет.

Вижу PWR есть, рядом EN - думаю тоже важную роль играет - читайте описание к своему модему.

Пример loop  в вашем же 12ом сообщении.

ЗЫ. Учиться учиться и еще раз учиться....

Homo Faber
Offline
Зарегистрирован: 25.05.2019

К сожалению описания найти пока не удалось, даже на вражеском. Возможно плохо искал.

Homo Faber
Offline
Зарегистрирован: 25.05.2019

andycat пишет:

Пример loop  в вашем же 12ом сообщении.

Имеется в виду 

  if (Serial.available())           // Ожидаем команды по Serial...
     GSM_A6.write(Serial.read());    // ...и отправляем полученную команду модему

Я таки правильно Вас понял?

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

Homo Faber пишет:

 

Имеется в виду 

  if (Serial.available())           // Ожидаем команды по Serial...
     GSM_A6.write(Serial.read());    // ...и отправляем полученную команду модему

Я таки правильно Вас понял?

да, соотвественно потом когда инициализация и несколько ответов от AT команды пройдут - можно в монитор порта слать что либо и эксперименитировать

Homo Faber
Offline
Зарегистрирован: 25.05.2019

На сегодня уже всё, а завтра, надеюсь удастся поэкспериментировать...

Всем спасибо за намёки и подсказки...

Homo Faber
Offline
Зарегистрирован: 25.05.2019

Итак эксперименты продолжаются.
Пока не забыл! Поповоду PWR и EN: на этих пинах сидит постоянное напряжение.
На PWR - 3,43в, на EN - 5,07в.

Подозреваю, что ни один из этих выводов не является аналогом RST.

Вот последний вариант скетча, залитого в Arduino/

#include <SoftwareSerial.h>

int current_millis=millis();

SoftwareSerial GSM_A6(8, 9);        // 8 - RX Arduino (TX GSM_A6), 9 - TX Arduino (RX GSM_A6)

void setup() {
  Serial.begin(9600);               // Скорость обмена данными с компьютером
  Serial.println("Start!");
  GSM_A6.begin(9600);               // Скорость обмена данными с модемом
//  initModem();
  GSM_A6.println("AT");
  GSM_A6.println("AT+GMM");
}

void loop() {
  if (GSM_A6.available())           // Ожидаем прихода данных (ответа) от модема...
     {
      Serial.write(GSM_A6.read());    // ...и выводим их в Serial
     }
  if (Serial.available())           // Ожидаем команды по Serial...
     {
      GSM_A6.write(Serial.read());    // ...и отправляем полученную команду модему
     }
}

void initModem()
{
//  digitalWrite(reset_A6_pin, LOW);
//  digitalWrite(power_A6_pin, HIGH);
  while ((millis() - current_millis) <= 3200UL)
        {
         GSM_A6.print("AT\r\n");
         delay(100);
        }
}

initModem временно заблокирован. Ответа на команду АТ нет, при подаче питания на модуль по-прежнему пишет кракозяблы.

Новых идей по установлению связи с модулем пока не возникло. Описание - отсутствует.

Может у кого возникли какие либо мысли по поводу модуля?

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

1. дохлый модем (не верю).

2. где то нет контакта или кривое подключение.

3. третья строка int так и не исправлена.

4. читаем и не ленимся зачем пины PWR и EN и не на них меряем напряжение, а подаем на них то что нужно.

основная мысль: что то не так делаете, информации в интернетах вагон....

Update: самый надежный споспоб проверить модем - подключить напрямую к компьютеру через USB TTL переходник.

Homo Faber
Offline
Зарегистрирован: 25.05.2019

Сегодня решил изменить скорость обмена на 115200, и вот что получил после включения питания.

Копирование через буфер так и не получилось.

Ответ более-менее осмысленный, но всё равно, как чайник, я ничего не понял. И команды через монитор порта тожене проходят...

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Это Вы по софтсериал пытаетесь передавать на 115200?

Homo Faber
Offline
Зарегистрирован: 25.05.2019

Воспользовался сторонним теминалом PuTTY, 3 раза включал модем, получил 3 похожих, но разных ответа.

 
^CIOIT: 1, 0, 0
^CINIT= 2, 32, 418NLC▒
^STN= 38
 
^CINL▒: 4, 8192, 38
^CINIT: 8, 2048, 1
 
^CINIT: 13, 0, 1638450
 
^CR*▒▒'▒▒b▒b▒j
 
+CRECz 0
 
+CTZV:1N        ▒z▒▒b▒▒Ҋ▒҂▒b▒▒j
 
+CIEV= service,  0
                  +CIEV: ro`▒, 0
 
+CRB▒: 1
 
------------------------------------------
 
^CINIT: 1, 0, 0
 
^CINR▒'▒b▒▒b▒▒▒ʊj
 
^STN: 38
 
^CINIR: 4, 8192, 1x
 
^CINIT: 8. 2048, 1
 
^CH▒IT: 16, 0, 1638450
 
^CINIT: 1b, 0, 0
+CREG: 0
 
------------------------------------------
 
^CIOIT: 1, 0, 0C▒
^CINIT: 2, 32, 41890
 
^STN: 38
^CINIT: 2, 8192, 38
^A▒NIT: 8, 2028, 1
 
^CINIT: 0f, 0, 163842`
 
^CIOIT: 32, 0, 0
 
+CRE▒'▒j
 
Для удобства разделил ответы строками с "-".
Уважаемые гуру, может мне хоть что-то кто-нибудь сказать?
Может этот модуль просто на свалку выкинуть как неисправный? Или он на что-то ещё сгодится ;)

 

Homo Faber
Offline
Зарегистрирован: 25.05.2019

Да, задал скорость 115200 для порта и только на этой скорости получил что-то более-менее осмысленное...

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Софтсериал на 115200 не тянет.

Либо подключайте к аппаратному, либо переводите модем на более низкую скорость.

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

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

Поищите команду и тупо его сбросьте на дефолтные и перезагрузить.

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

Команды через тот же putty отправляйте.

ЗЫ. Поэтому для начинающих я всегда рекомендую модем sim800, он сложнее в подключении и питании, но более предсказуем в поведении.

Homo Faber
Offline
Зарегистрирован: 25.05.2019

Весь фокус-то в том, что он команды не воспринимает...

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

Чудо прям...

b707
Offline
Зарегистрирован: 26.05.2017

Homo Faber пишет:

Весь фокус-то в том, что он команды не воспринимает...

никакого фокуса. Если Софтсериал на скорости 115200 иногда может работать на прием, то на передачу он больше 38400 не тянет.

Настаивайте модем на более низкую скорость, как это делать - andycat Вам выше писал

sadman41
Offline
Зарегистрирован: 19.10.2016

b707 пишет:

никакого фокуса. Если Софтсериал на скорости 115200 иногда может работать на прием, то на передачу он больше 38400 не тянет.

У меня противоположная информация. Передавать проще. У меня сейчас софтсериал на дебаге стоял вместо хардварного - на вывод прёт только так на 115200. На приём - 57600, если есть "параллельные" задачи.

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

Ну ТС если подключил к компу, то оттуда то наверняка 115200 работает ок.
Тут где то на форуме было описано год назад как я мучился с ответами ussd баланс посмотреть, в итоге довёл модем до неадекватного поведения и сбрасывал именно командами до дефолтных настроек. Завтра тему поищу....

Homo Faber
Offline
Зарегистрирован: 25.05.2019
OK
AT
 
OK
AT+IPR?
 
+IPR: 9600
 
OK
 

Homo Faber
Offline
Зарегистрирован: 25.05.2019

Странно, накатал целое произведение (не очень художественное) но почему-то получилосьто, что получилось.

Итак, получен нормальный ответ от модема.

Start!
-1
-1
-1
-1
-1
-1
-1
65
84
13
10
 
OK
AT
 
OK
AT
 
OK
AT+IPR?
 
+IPR: 9600
 
OK
 
Вот скетч, с помощью которого удалось соединится.
 
#include <SoftwareSerial.h>

//unsigned long current_millis=millis();

SoftwareSerial GSM_A6(8, 9);        // 8 - RX Arduino (TX GSM_A6), 9 - TX Arduino (RX GSM_A6)

unsigned long current_millis=millis();

void setup() {
  Serial.begin(9600);               // Скорость обмена данными с компьютером
  Serial.println("Start!");
  GSM_A6.println("AT+IPR=9600");
  GSM_A6.begin(9600);                 // Скорость обмена данными с модемом 9600
  initModem();
}

void loop() {
  if (GSM_A6.available())           // Ожидаем прихода данных (ответа) от модема...
     {
      Serial.write(GSM_A6.read());    // ...и выводим их в Serial
     }
  if (Serial.available())           // Ожидаем команды по Serial...
     {
      GSM_A6.write(Serial.read());    // ...и отправляем полученную команду модему
     }
}

void initModem()
{
  while ((millis() - current_millis) <= 10000UL)
        {
         GSM_A6.println("AT");              // Посылаем команду АТ
         delay(1000);
         Serial.println(GSM_A6.read());     // Результат выводим в Serial
        }
  GSM_A6.println("AT+IPR?");                // Посылаем запрос о скорости соединения
  Serial.println(GSM_A6.read());            // Результат выводим в Serial
}

Спасибо всем, принявшим участие в дискуссии по эксперименту ;)

Но, это ещё не всё, теперь буду пытаться отправлять и получать SMS. Наверняка будут возникать вопросы, и обратится мне кромевас, уважаемые форумчане, больше не к кому.

Так что до встречи...

PS. Пришлось задать не менее 10 циклов обращения с интервалом в секунду, только после этого пошли адекватные ответы...

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

В документации написано в течении 3х секунд слать AT для того чтоб модем стал работать на нужной скорости, так что поэкспериментируйте - уменьшите задержку между отправкой AT и период цикла соответственно уменьшить.

Homo Faber
Offline
Зарегистрирован: 25.05.2019

Поэкспериментировал - это единственный вариант. Потерпеть можно, ведь это только при включении питания необходимо, насколько я понимаю. В процессе работы нет необходимости повторять процедуру.

b707
Offline
Зарегистрирован: 26.05.2017

Homo Faber пишет:

 В процессе работы нет необходимости повторять процедуру.

бывает приходится и повторять. Модем при длительном простое возвращается к дефолтной скорости

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

или если модем не отвечает на команды нормально - придеться его сбросить и заново инициализировать

Homo Faber
Offline
Зарегистрирован: 25.05.2019

И вновь продолжаю экспериментировать с А6. До SMS дело ещё не дошло, пока пытаюсь зажечь светодиод при ответе "ОК" от модема.
Почему-то загорается сразу, ещё до ответа модема. Сейчас эта ветка закомментирована. Вот код.

#include <SoftwareSerial.h>

SoftwareSerial GSM_A6(8, 9);        // 8 - RX Arduino (TX GSM_A6), 9 - TX Arduino (RX GSM_A6)

unsigned long current_millis=millis();
int ch = 0;
int led = 4;
String val = "";

void setup() {
  pinMode(led, OUTPUT);
  digitalWrite(led, LOW);           // Светодиод ВЫКЛ
  Serial.begin(9600);               // Скорость обмена данными с компьютером
  Serial.println("Start!");
  GSM_A6.begin(115200);                 // Скорость обмена данными с модемом 115200
  GSM_A6.println("AT+IPR=9600");
  GSM_A6.begin(9600);                 // Скорость обмена данными с модемом 9600
  initModem();
}

void loop() {
  if (GSM_A6.available())           // Ожидаем прихода данных (ответа) от модема...
     {
      Serial.write(GSM_A6.read());    // ...и выводим их в Serial
     }
  if (Serial.available())           // Ожидаем команды по Serial...
     {
      GSM_A6.println(Serial.read());    // ...и отправляем полученную команду модему
     }
}

void initModem()
{
  while ((millis() - current_millis) <= 5000UL)
        {
         GSM_A6.println("AT");              // Посылаем команду АТ
         delay(1000);
/*         val="";
         while (GSM_A6.available())
               {
                ch = GSM_A6.read();
                val += char(ch);      // Сохраняем входную строку в переменную val
                delay(10);
                if (val.indexOf("OK"))
                   {
                    digitalWrite(led, HIGH);           // Светодиод ВКЛ
                    break;
                   }
               }*/
        }
  GSM_A6.println("AT+IPR?");                // Посылаем запрос о скорости соединения
  Serial.write(GSM_A6.read());              // Результат выводим в Serial
  delay(2000);
  GSM_A6.println("ATI");                    // Посылаем запрос о версии модуля
  Serial.write(GSM_A6.read());              // Результат выводим в Serial
}

Как видно из кода, сделал попытку сократить количество посылок "АТ" путём команды "break", но количество посылок не изменилось...

Start!

:
Q5
AT
 
+CME ERROR:58
AT
 
OK
AT
 
OK
AT
 
OK
AT+IPR?
ATI
 
Ai Thinker Co.LTD
A6 
V03.03.20161229019H03
 
OK
97
116
10
 
+CME ERROR:58
 

И ещё какая странность проявилась: перестал отвечать на команду "AT+IPR?", а на команду "АТ" стал отвечать в числовом виде (после последнего "ОК" ответ на "АТ", выделено жирным).
Может знатоки подскажут, где я опять накосячил?