Странные помехи при выключенном Bluetooth модуле

zzzzza
Offline
Зарегистрирован: 18.11.2016

Всем привет!

У меня есть модуль "HC-05" и Arduino Leonardo.

Когда делал включение и выключение модуля с помощью транзистора, случайно заметил, что в выключенном состояние, если к модулю поднести руку, то он что-то посылает (а точнее посылает пустой символ или пробел). Если руку убрать подальше от модуля, то это прекратится. В включенном состояние все нормально, ничего не посылается.

Пробовал убирать транзистор и вместо этого отключать провод от ножки питания Bluetooth модуля, но проблема осталась. Думал может пока экспериментировал с вкл/выкл сжег порт Arduino, попробовал подключить к другим портам - проблема не пропала.

Имеется вот такой код, чтобы через COM-порт общаться с модулем.

void setup()
 {
  Serial.begin(9600);
  Serial1.begin(38400);
 }

void loop()
 {
  if (Serial1.available())
   {
    Serial.write(Serial1.read());
   } 

  if (Serial.available())
   {
    Serial1.write(Serial.read()); 
   }
 }

Подскажите, пожалуйста, в чем может быть проблема?

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

А Вы уверены что модуль действительно выключен? У него на RX нет логической единицы?

zzzzza
Offline
Зарегистрирован: 18.11.2016

zzzzza пишет:

Когда делал включение и выключение модуля с помощью транзистора, случайно заметил, что в выключенном состояние, если к модулю поднести руку, то он что-то посылает (а точнее посылает пустой символ или пробел). 

Я имел ввиду, что если открыть "Монитор порта" и поднести руку к модулю, то в мониторе порта будет постоянно увеличивающаяся пустая строка.

zzzzza
Offline
Зарегистрирован: 18.11.2016

andriano пишет:

А Вы уверены что модуль действительно выключен? У него на RX нет логической единицы?

Ну лампочки на нем не горят, да и провод питания отсоединен. А он может питаться от TX и RX контактов?

zzzzza
Offline
Зарегистрирован: 18.11.2016

andriano пишет:

А Вы уверены что модуль действительно выключен? У него на RX нет логической единицы?

Вывел значение 0-ого пина:

Serial.println(digitalRead(0));

Если руку не подносить, то значение постоянно равняется 0-лю. А вот когда подносишь руку к модулю, то значение начинает меняться то на 1, то на 0.

zzzzza
Offline
Зарегистрирован: 18.11.2016

В чем может быть проблема?

zzzzza
Offline
Зарегистрирован: 18.11.2016

Разобрался: надо было использовать подтягивающий резистор у 0-ого пина (RX).

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

zzzzza пишет:

Разобрался: надо было использовать подтягивающий резистор у 0-ого пина (RX).

Вы бы схему вместе с вопросом размещали.

zzzzza
Offline
Зарегистрирован: 18.11.2016

Буду знать.

На самом деле у меня возник еще один вопрос, с которым я никак не могу разобраться: я хочу посылать AT команды через код, а не монитор порта, но почему-то ничего не работает. Тут дело скорее всего не в подключение, так как обмен данными с телефоном и монитором порта происходит без проблем. В чем может быть проблема?

void setup()
 {
  Serial.begin(9600);
  Serial1.begin(38400);
 }
 
void loop()
 {
  Serial1.write("AT+NAME?");

  if (Serial1.available())
   {
    Serial.write(Serial1.read());
   }
 }

Модуль находится в режиме AT команд. В мониторе порта пусто, то есть ничего не приходит(

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

отвечает Nick Gammon:

On the Leonardo you have to wait for Serial to become active:
 

 
Serial.begin(57600);
while (!Serial) { }
zzzzza
Offline
Зарегистрирован: 18.11.2016

b707 пишет:

отвечает Nick Gammon:

On the Leonardo you have to wait for Serial to become active:
 

 
Serial.begin(57600);
while (!Serial) { }

Добавил, но все равно вмониторе порта пусто. Также пробовал "While (!Serial) {}" в "Setup" запихнуть, тоже ничего.

void setup()
 {
  Serial.begin(9600);
  Serial1.begin(38400);
 }
  
void loop()
 {
  Serial1.write("AT+NAME?");
 
  if (Serial1.available())
   {
    while (!Serial) {Serial.write(Serial1.read());}
   }
 }

 

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

zzzzza пишет:

 Также пробовал "While (!Serial) {}" в "Setup" запихнуть, тоже ничего.

именно в Сетап и надо, в луп незачем

zzzzza
Offline
Зарегистрирован: 18.11.2016

b707 пишет:

zzzzza пишет:

 Также пробовал "While (!Serial) {}" в "Setup" запихнуть, тоже ничего.

именно в Сетап и надо, в луп незачем

Вообщем вся проблема была в том, что отправлять AT команду надо было со специальными символами "\r\n". Можно даже "while (!Serial) {}" убрать. Но это очень странно, потому что я до этого пробовал этот вариант, но ничего не работало.

Спасибо за помощь. 

zzzzza
Offline
Зарегистрирован: 18.11.2016

Раз тут уже несколько проблем, связанных с Bluetooth, описаны, хотелось бы рассказать еще об одной, с которой я столкнулся и в процессе решил ее. (Вдруг кому-нибудь эта информация понадобится)

Проблема:

Если программно перевести модуль в режим AT команд (то есть выключить->подать на ногу "K" питание->включить) и сразу же отправить AT команду, то ответ не придет.

Решение:

Перед тем как отправлять AT команду, надо сделать небольшую паузу (например, так "delay(1000)"). Причем пробовал ставить 500 и при такой задержки ответ все равно не приходил.

Код, чтобы понимать о чем идет речь (Вкл и Выкл модуля организовано с помощью транзистора):

digitalWrite(BLUETOOTH_ON_OFF_PIN, 0); //Выключаем Bluetooth.
digitalWrite(BLUETOOTH_K_PIN, 1); //Подаем сигнал на ногу "K".
digitalWrite(BLUETOOTH_ON_OFF_PIN, 1); //Включаем Bluetooth.
delay(1000);
Serial1.write("AT\r\n"); //Посылаем AT команду.