我有一個帶有wifi屏蔽的arduino uno,我希望它能夠去信號源。使用rssi跟蹤WiFi信號的來源
我得到的rssi通常是-40 dBm以上-80 dBm我假設機器人已經找到了源。
因此,機器人會直行並每隔2秒檢查一次rssi,如果新信號比它向前旋轉90度並向前直行並持續這樣做,直到它找到源爲止。
無效循環()是機器人的邏輯。
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;
}
}
}
的問題是信號變化很大,這將有時會導致機器人的權利,即使把當它是非常接近的來源和總是正確的是沒有得到到路由器它的最有效的方法是相當隨機的。有沒有更簡單的方法或更有效的方法來查找並獲取源代碼?
-40對於這樣的假設似乎有點低。我希望信號比路由器附近的信號強得多。 –
@MartinJames我使用手機熱點,所以它基本上只是爲了測試而接觸它。我現在主要關心的是爲機器人獲取最準確/高效的算法,以便在不進行大量猜測的情況下獲得源代碼。 – Higeath