Чувствительное определение расстояния с использованием 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 мс. Когда я ухожу в комнату с подчиненным устройством, все остается по-прежнему. Это не чувствительно. Что я могу сделать, чтобы сделать это более чувствительным? Я жду вашего мнения
@EEstudent, 👍-1
3 ответа
Подход, который вы используете, не будет работать. Вы пытаетесь использовать измерение скорости света для измерения расстояния. С этим связано целое множество проблем. Во-первых, часы на Arduino работают недостаточно быстро (достаточно высокое разрешение). Для этого вам нужно точное, субнаносекундное разрешение по времени (смотрите это видео: https://www.youtube.com/watch?v=9eyFDBPk4Yw). Во-вторых, BLE - это пакетный протокол. Накладные расходы и изменчивость отправки пакетов полностью сведут на нет крошечную разницу во времени прохождения туда и обратно из-за задержки со скоростью света.
Обычный способ измерения расстояния с помощью BLE - это измерение уровня сигнала. Это также чревато ошибками, но вы можете, по крайней мере, получить приблизительные измерения "непосредственного", "ближнего", "среднего" и "дальнего" расстояния.
В качестве альтернативы можно было бы использовать и ультразвуковой датчик дальности.
В дополнение к вышеперечисленным проблемам, ваш код не будет работать так, как вы хотите. Вы инициализируете таймер в каждом цикле, поэтому разница во времени всегда будет равна 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);
}
Ваш подход никогда не сработает, как бы вы ни старались; это все равно, что пытаться использовать молоток для выпечки хлеба! Если вам нужны точные измерения расстояния во время полета, используйте датчик, предназначенный для этого, например, ИК-лидарный модуль времени полета ST Micro VL53L0X.
- Проблемы с надежным подключением с использованием HC-05 в качестве ведущего устройства Bluetooth
- Bluetooth-модуль HC-05 неправильно считывает данные с моего телефона Android
- Мой модуль Bluetooth HC-05 не работает
- Проблемы с последовательной связью от Arduino к Bluetooth HC-05
- Соединение Bluetooth с HC-05 сопряжено, но не подключено (в Linux)
- Не удается вручную подключить ведущий HC-05 к подчиненному.
- Модуль HC-05 не получает команд и не спаривается
- Передача/прием данных Nodemcu(V3) + модуль Bluetooth HC-05
здравствуйте, как я могу измерить уровень сигнала. Каков способ сделать это?, @EEstudent
Взгляните на [это question](https://electronics.stackexchange.com/questions/98160/how-to-get-rssi-of-bluetooth-specfically-hc-05). RSSI описывает уровень сигнала и, таким образом, может дать вам представление о расстоянии., @chrisl
Смотрите комментарий Крисла, который включает в себя ссылку. Обратите внимание, что оценка расстояния на основе уровня сигнала является довольно грубой и зависит от таких факторов, как отражающие стены и препятствия., @Duncan C