使用rssi

时间:2016-05-16 18:42:58

标签: arduino

我有一个带有wifi屏蔽的arduino uno,我希望它能够找到信号源。

我得到的rssi通常是-80 dBm -40 dBm以上我假设机器人找到了源。

因此机器人会直接检查rssi,如果新信号比它向前旋转90度之前更差,并且直线检查,直到它找到信号源,就会检查rssi。

Void loop()是机器人的逻辑。

int angle = 90;
char ssid[]="AndroidAP";
bool sourceFound = false;
long rssi = -100;
long prevRssi = 0;

void setup() {
  Serial.begin(9600); 
  updateRSSI();
  servoLeft.attach(8);
  servoRight.attach(9);
  goStraight();
}

void loop() {
  if(!sourceFound){
    updateRSSI();
    if(prevRssi>rssi){
      turnRight();
      goStraight();
      delay(2500);
    }
    if(rssi>-41){
      stayStill();
      detachServos();
      sourceFound = true;
      Serial.print("Source found.");
      Serial.println();
    }
  }
}

/*MOVEMENT CONTROLS*/
void turnLeft(){
  servoLeft.writeMicroseconds(1300);
  servoRight.writeMicroseconds(1300);
  delay(angle*10.6);
}
void turnRight(){
  servoLeft.writeMicroseconds(1700);
  servoRight.writeMicroseconds(1700);
  delay(angle*10.6);
}
void turnAround(){
  if((double)rand() / (double)RAND_MAX==0){
    turnLeft(); 
    turnLeft();
  }else{
    turnRight();
    turnRight();
  }
}
void stayStill(){
  servoLeft.writeMicroseconds(1500);
  servoRight.writeMicroseconds(1500);
}
void goStraight(){
  servoLeft.writeMicroseconds(1600);
  servoRight.writeMicroseconds(1444 );
}
void detachServos(){
  servoLeft.detach();
  servoRight.detach(); 
}
/*MOVEMENT CONTROLS*/
/*WIFI SHIELD CONTROLS*/
void updateRSSI(){
  prevRssi = rssi;
  uint8_t available_networks = WiFi.scanNetworks();
  for (uint8_t net = 0; net < available_networks; ++net)
  {
    if (strcmp(WiFi.SSID(net), ssid) == 0)
    {
     // ssidFound = true;
      rssi = WiFi.RSSI(net);

      if(rssi-prevRssi<-10){ //disregard the measurement and try again
        rssi = prevRssi;
        updateRSSI();
      }

      Serial.print("Old: ");
      Serial.print(prevRssi);
      Serial.print(" dBm ");
      Serial.print("New: ");
      Serial.print(rssi);
      Serial.print(" dBm");
      Serial.println();
      break;
   }
  }
}

问题是信号变化很大,这会导致机器人有时甚至在它非常靠近光源时向右转,并且总是向右走并不是最有效的到达路由器的方式,这是非常随机的。有没有更简单的方法或更有效的方法来查找和获取源?

1 个答案:

答案 0 :(得分:0)

基本上你的机器人正在做一个名为&#34; wardriving&#34;的常见任务的本地化部分。 (听起来很违法,但事实并非如此)。我最近正在进行一些研究,几乎就是你正在做的事情,尽管有些论文发现,基本上WiFi站的信号强度很弱并且使用不一致。

Dartmouth study(第14页)这项研究发现,使用典型的战争驾驶方法,他们只能检测到所有WiFi节点的40%到60%,并且平均来自实际发射机的误差大约为30-40m 。

Another study(第4页)这里有一个3个基站的图,用于在恒定距离处对信号强度进行采样。您会注意到一条钟形曲线,其标准偏差至少为5(遗憾的是没有数据表)。然而,这确实清楚地显示了您应该期望的信号噪声。

我并不是说你的目标是不可能我说的是你需要做很多过滤并且移动得非常慢(我的项目不能做的事情)。与本能相反,WiFi信号强度令人难以置信的嘈杂,使得在没有极大数据集的情况下难以准确驾驭。希望这些论文至少有助于改变你的期望。