Чувствительное определение расстояния с использованием 2 модулей HC-05 / 2 arduino uno

Привет, я делаю проект, в котором я использую 2 модуля HC-05 и 2 arduino unos, которые управляют ими. 1 модуль Bluetooth является ведущим, а другой - ведомым. Главный модуль неподвижен, в то время как подчиненный перемещается. Если расстояние между этими 2 модулями составляет менее 1,5 метра, главное устройство включает светодиод. Если расстояние превышает 1,5 метра, светодиод не будет включен. Это основная идея, и она работает, но не так, как я хотел. Я представляю код

код главного устройства:

#include <SoftwareSerial.h>
//master device code
SoftwareSerial BTSerial(5, 6); // RX | TX
#define LED 4
unsigned long timer = 0;
unsigned long timeDifference = 0;
char data;

void setup()
{
  Serial.begin(9600);
  BTSerial.begin(9600); 
  pinMode(LED, OUTPUT);
  delay(5000);      
}

void loop()
{
  BTSerial.write('A');
  timer = millis();
  while(!BTSerial.available()){}
  data = BTSerial.read();
  if(data =='B'){
    timeDifference = millis()-timer;   
  }
  Serial.println(timeDifference);

  if(timeDifference < 280){
    digitalWrite(LED,HIGH);
  }else{
    digitalWrite(LED,LOW);  
  }
  delay(500);

}

код ведомого устройства:

#include <SoftwareSerial.h>
//slave device code
SoftwareSerial BTSerial(5, 6); // RX | TX

char data;

void setup()
{
  BTSerial.begin(9600);       
}

void loop()
{
  while(!BTSerial.available()){}
  data = BTSerial.read();
  if(data =='A'){
    BTSerial.write('B'); 
  }

}

Итак, что здесь происходит, так это то, что главное устройство отправляет символ и запускает таймер. Ведомое устройство получает символ и отправляет другой символ на ведущее устройство. Когда главное устройство получает char, оно останавливает таймер и смотрит, сколько времени прошло. Проблема в том, что когда я соединяю эти устройства Bluetooth вместе, разница во времени составляет около 280 мс. Когда я ухожу в комнату с подчиненным устройством, все остается по-прежнему. Это не чувствительно. Что я могу сделать, чтобы сделать это более чувствительным? Я жду вашего мнения

, 👍-1


3 ответа


1

Подход, который вы используете, не будет работать. Вы пытаетесь использовать измерение скорости света для измерения расстояния. С этим связано целое множество проблем. Во-первых, часы на Arduino работают недостаточно быстро (достаточно высокое разрешение). Для этого вам нужно точное, субнаносекундное разрешение по времени (смотрите это видео: https://www.youtube.com/watch?v=9eyFDBPk4Yw). Во-вторых, BLE - это пакетный протокол. Накладные расходы и изменчивость отправки пакетов полностью сведут на нет крошечную разницу во времени прохождения туда и обратно из-за задержки со скоростью света.

Обычный способ измерения расстояния с помощью BLE - это измерение уровня сигнала. Это также чревато ошибками, но вы можете, по крайней мере, получить приблизительные измерения "непосредственного", "ближнего", "среднего" и "дальнего" расстояния.

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

,

здравствуйте, как я могу измерить уровень сигнала. Каков способ сделать это?, @EEstudent

Взгляните на [это question](https://electronics.stackexchange.com/questions/98160/how-to-get-rssi-of-bluetooth-specfically-hc-05). RSSI описывает уровень сигнала и, таким образом, может дать вам представление о расстоянии., @chrisl

Смотрите комментарий Крисла, который включает в себя ссылку. Обратите внимание, что оценка расстояния на основе уровня сигнала является довольно грубой и зависит от таких факторов, как отражающие стены и препятствия., @Duncan C


0

В дополнение к вышеперечисленным проблемам, ваш код не будет работать так, как вы хотите. Вы инициализируете таймер в каждом цикле, поэтому разница во времени всегда будет равна 0. Вместо этого вы должны записывать A с главного устройства только тогда, когда оно получает ответ B, и только после этого сбрасывать таймер.

void loop()
{
  while(!BTSerial.available()){}
  data = BTSerial.read();
  if(data =='B'){
    timeDifference = millis()-timer;
    timer = millis();
    BTSerial.write('A');
  }
  Serial.println(timeDifference);

  if(timeDifference < 280){
    digitalWrite(LED,HIGH);
  }else{
    digitalWrite(LED,LOW);  
  }
  delay(500);
}
,

0

Ваш подход никогда не сработает, как бы вы ни старались; это все равно, что пытаться использовать молоток для выпечки хлеба! Если вам нужны точные измерения расстояния во время полета, используйте датчик, предназначенный для этого, например, ИК-лидарный модуль времени полета ST Micro VL53L0X.

,