Расстояние между 2 Arduino, используя RF ссылки

В настоящее время у меня есть установка, в которой я посылаю символ с использованием Tx 434 МГц и Uno на Mega с Rx. Мега подсчитывает, сколько раз он получает символ, а затем, если он падает ниже определенного числа, он вызывает тревогу. Это жизнеспособный способ измерения расстояния между двумя микроконтроллерами в помещении или есть лучший способ.

Передатчик (мега)

#include <SoftwareSerial.h>

int rxPin=2; //Goes to the Receiver Pin
int txPin=5; //Make sure it is set to pin 5 going to input of receiver

SoftwareSerial txSerial = SoftwareSerial(rxPin, txPin);
SoftwareSerial rxSerial = SoftwareSerial(txPin, rxPin);
char sendChar ='H';

void setup() {
  pinMode(rxPin, INPUT);
  pinMode(txPin,OUTPUT);
  txSerial.begin(2400);
  rxSerial.begin(2400);
}

void loop() {
  txSerial.println(sendChar);
  Serial.print(sendChar);
}

Получатель

#include <SoftwareSerial.h>

//Make sure it is set to pin 5 going to the data input of the transmitter
int rxPin=5; 
int txPin=3; //Don't need to make connections
int LED=13;
int BUZZ=9;
int t=0;

char incomingChar = 0;
int counter = 0;

SoftwareSerial rxSerial = SoftwareSerial(rxPin, txPin);

void setup() {
  pinMode(rxPin, INPUT); //initilize rxpin as input
  pinMode(BUZZ, OUTPUT); //initilize buzz for output
  pinMode(LED, OUTPUT); //initilize led for output
  rxSerial.begin(2400); //set baud rate for transmission
  Serial.begin(2400); //see above
}

void loop() {
  for(int i=0; i<200; i++) {
    incomingChar = rxSerial.read(); //read incoming msg from tx

    if (incomingChar =='H') {
      counter++; //if we get bit "h" count it  
    }
    delay(5); //delay of 10 secs
  }
  Serial.println(incomingChar);
  Serial.println(counter); //prints the the bits we recieved

  if(counter<55) {
    //if we receive less than 100 bits than print out of range triggers alarm
    Serial.println("out of range"); 
    tone(BUZZ,5000,500);digitalWrite(LED,HIGH);
  }
  else {
    noTone(BUZZ);digitalWrite(LED, LOW);
    //if we get more than 100 bits than we are within range turn off alarm
    Serial.println("in range"); 
  }

  counter = 0;
  incomingChar=0;
}

3 ответа

Теоретически, вы можете достичь измерения расстояния, заставив uno отправить сообщение, которое мега отзовет обратно. Это дало бы uno время прохождения туда и обратно для распространения сообщений между arduinos. Вы должны были бы приблизить задержки обработки. После этого это базовая физика. Это в основном так же, как работает радар. Фактическая задержка будет что-то вроде

tтуда и обратно = tuno отправка + 2*tраспространение + tмега получение + tмега передача + tuno получение

Я предполагаю, что расстояние, которое вы пытаетесь достичь, составляет порядка нескольких метров. Требуемое разрешение будет проблемой, потому что s = vt => t = s/v, где s это расстояние между вашими Arduinos и v = c в случае радиоволн. Поскольку задержки при передаче должны оставаться постоянными, вы должны иметь возможность измерять различия в порядке 1/c вторые интервалы, в основном. Я не очень знаком с ардуино, поэтому я не знаю, способны ли они на такого рода измерения.

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

Я бы посоветовал вам использовать ультразвуковой дальномер, такой как Maxbotix HRLV-EZ4, продаваемый Sparkfun. Он находится в пределах вашего ценового диапазона и должен иметь возможность измерять расстояния до 5 м /195 дюймов с разрешением 1 мм.

Другие вопросы по тегам