Определение отключения передатчика NRF24L01 или отсутствия данных с передатчика.

waw555
Offline
Зарегистрирован: 27.12.2019

Здравствуйте!

Передатчик и приемник собраны на NRF24L01 + Arduino.

Есть следующий код

void loop() {

  byte pipeNo;
  if ( radio.available(&pipeNo)) { 
      radio.read( &recieved_data, sizeof(recieved_data));
      motorR.setSpeed(recieved_data[0]);
      motorL.setSpeed(recieved_data[1]);
      Serial.println(F("Данные есть"));  
  } else {
      Serial.println(F("Данных нет"));
      motorR.setMode(STOP);
      motorL.setMode(STOP);
  }

}

Мне необходимо остановить двигатели когда или если передатчик отключен, в коде выше двигатели всегда остановлены, если сделать так:

void loop() {

  byte pipeNo;
  if ( radio.available(&pipeNo)) { 
      radio.read( &recieved_data, sizeof(recieved_data));
      motorR.setSpeed(recieved_data[0]);
      motorL.setSpeed(recieved_data[1]);
      Serial.println(F("Данные есть"));  
  } else {
      Serial.println(F("Данных нет"));
  }

}

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

Подскажите пожалуйста, как определить, что передатчик отключен, или как сделать остановку двигателя если передатчик отключился или с него нет данных?

Заранее спасибо!

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

waw555 пишет:

если сделать так:

void loop() {

  byte pipeNo;
  if ( radio.available(&pipeNo)) { 
      radio.read( &recieved_data, sizeof(recieved_data));
      motorR.setSpeed(recieved_data[0]);
      motorL.setSpeed(recieved_data[1]);
      Serial.println(F("Данные есть"));  
  } else {
      Serial.println(F("Данных нет"));
  }

}

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

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

Цитата:

Подскажите пожалуйста, как определить, что передатчик отключен,

Ситуации "передатчик отключен" и "передатчик включен, но ничего не передает" различить никак невозможно.

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

Цитата:

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

Заранее спасибо!

Остановка двигателя делается командой двигателю и никак не связана с работой передатчика.

waw555
Offline
Зарегистрирован: 27.12.2019

Приветствую, andriano!

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

Дело в том, что 

if ( radio.available(&pipeNo))

верно 1 из 4, то есть в порт прилетает 1 раз Данные есть и 3 раза Данных нет. Соответственно двигатели постоянно отключены.

Если сделать так то все начинает работать и при отключении передатчика двигатели останавливаются, но думаю, что это не верно

void loop() {


  
  byte pipeNo;
  if ( radio.available(&pipeNo)) { 
      radio.read( &recieved_data, sizeof(recieved_data));
      motorR.setSpeed(recieved_data[0]);
      motorL.setSpeed(recieved_data[1]);
      Serial.println(F("Данные есть"));
      count = 0;  
      
  } else {
    if (count > 10000 ){
      Serial.println(F("Данных нет"));
      motorR.setSpeed(0);
      motorL.setSpeed(0);

    }
    count++;
  }

}

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

 

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

Да - время.

Для измерения времени специально существуют функции millis() и micros().

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

andriano пишет:

Да - время.

Для измерения времени специально существуют функции millis() и micros().

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

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

Рекомендовать одно значение времени для любых задач, все равно, что рекомендовать один размер обуви для всех людей.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

andriano пишет:

Рекомендовать одно значение времени для любых задач, все равно, что рекомендовать один размер обуви для всех людей.

как в китае было  )))

waw555
Offline
Зарегистрирован: 27.12.2019

Правильно ли я понимаю, что должно быть примерно так?

void loop() {
  byte pipeNo;
  if ( radio.available(&pipeNo)) { 
      radio.read( &recieved_data, sizeof(recieved_data));
      motorR.setSpeed(recieved_data[0]);
      motorL.setSpeed(recieved_data[1]);
      timeroffline = millis(); 
      
  } else {
    if (millis() - timeroffline > 500){
      Serial.println(F("Данных нет"));
      motorR.setSpeed(0);
      motorL.setSpeed(0);
    }
  }
}

 

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

Важно поменять работу не только приемника, но и передатчика. Чтобы ваш код работал, передатчик должен отправлять новый пакет каждые 100-200 мс, даже если оператор не дает никаких команд.

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

waw555 пишет:

Правильно ли я понимаю, что должно быть примерно так?

void loop() {
  byte pipeNo;
  if ( radio.available(&pipeNo)) { 
      radio.read( &recieved_data, sizeof(recieved_data));
      motorR.setSpeed(recieved_data[0]);
      motorL.setSpeed(recieved_data[1]);
      timeroffline = millis(); 
      
  } else {
    if (millis() - timeroffline > 500){
      Serial.println(F("Данных нет"));
      motorR.setSpeed(0);
      motorL.setSpeed(0);
    }
  }
}

 

Нет.

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

Пока в этой теме нет самого главного, алгоритма работы передатчика, т. е. телега стоит впереди лошади.

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

ВН пишет:

Пока в этой теме нет самого главного, алгоритма работы передатчика, т. е. телега стоит впереди лошади.

Не совсем так.

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