【U018】如何用WiFi实现无线定位
作者:机器谱
ESP8266 |
一、WiFi主从模块设置
1. 实验器材
2. 实验步骤
① 给控制板刷一套空的程序。
ESP8266
② 将Esp8266模块连接到Bigfish扩展板上,并将扩展板插到控制板上。
③ 在arduino的Seiral Monitor中,输入AT指令集,观察模块的相应应答。
3. 常用指令
① 基础AT指令。
② WiFi功能AT指令。
③ TCP/IP 工具箱 AT 命令。
二、WiFi定位
1. 实验器材
2. 定位算法
Rssi三点定位算法。
3. 实验操作
① 使用文末资料中的“ESP8266调试工具”将三个模块设置为AP模式,并记录其NAME,用于存储在程序中,按照下面方法连接ESP8266模块和Basra主控板。
② 使用“ESP8266调试工具”将与主控板连接的WiFi模块设置为Statino模式,按照下面方法连接ESP8266模块和BigFish主控板,OLED显示屏使用四芯输入排线与BigFish进行连接。
③ 将实验例程(ESP8266RSSIPosition.ino)下载到主控板中。
/*------------------------------------------------------------------------------------ 版权说明:Copyright 2023 Robottime(Beijing) Technology Co., Ltd. All Rights Reserved. Distributed under MIT license.See file LICENSE for detail or copy at https://opensource.org/licenses/MIT by 机器谱 2023-09-12 https://www.robotway.com/ ------------------------------*/ /*将与主控板相连接的wifi模块使用“esp8266调试工具软件”设置为Station模式 将其余三个模块设置为AP模式,并记录其NAME,存储在程序中*/ //#define DEBUG #define ESP_AP_NUMBER 3 #include <SoftwareSerial.h> #include <RssiPositionComputer.h> #include <Wire.h> #include <MultiLCD.h> SoftwareSerial myESP(2,3); RssiPositionComputer myPositionComputer; Point2D master_point; LCD_SSD1306 lcd; char esp_ap_name[ESP_AP_NUMBER][10] = {"ESP826601","ESP826602","ESP826603"}; int rssi[ESP_AP_NUMBER]; float distance[ESP_AP_NUMBER];
void setup() { delay(1000); Serial.begin(115200); myESP.begin(9600); #ifdef DEBUG Serial.println("begin"); #endif while(myESP.available()&&myESP.read()); while(!myESP.available()) { myESP.println("AT"); delay(1000); } while(myESP.available()&&myESP.read()); #ifdef DEBUG Serial.println("Resonse ok"); #endif lcd.begin(); lcd.clear(); lcd.setCursor(30,4); lcd.print("Hello, world!"); }
void loop() { int n = searchESPAP(esp_ap_name,rssi); for(int i=0;i<ESP_AP_NUMBER;i++) { distance[i] = rssiToDistance(rssi[i]); Serial.print(distance[i]); Serial.print('\t'); } Serial.print(n); Serial.print('\t'); if(myPositionComputer.distanceToPoint(distance[0],distance[1],distance[2],&master_point)==true) { Serial.print(master_point.x); Serial.print('\t'); Serial.print(master_point.y); Serial.print('\t'); Serial.println("position okok"); lcd.clear(); lcd.setCursor(30,2); lcd.printLong(master_point.x*100,FONT_SIZE_LARGE); //按厘米输出 lcd.setCursor(30,5); lcd.printLong(master_point.y*100,FONT_SIZE_LARGE); } else { lcd.clear(); lcd.setCursor(30,4); lcd.print("position ERROR!"); Serial.println("position ERROR"); } }
int nameToNumber(char in[],char name[][10]) { for(int i=0;i<3;i++) { for(int j=0;j<9;j++) { if(in[j] != name[i][j]) break; if(j==8) return(i); } } return(-1); }
byte searchESPAP(char name[][10], int rs[]) { byte search_result_number = 0; int state = 0; int n; int ap_n; char name_string[10]; char rssi_string[4]; while(myESP.available()&&myESP.read()); myESP.println("AT+CWLAP"); delay(100); while(myESP.available()&&myESP.read()); unsigned long t = millis(); while(!myESP.available()) { if(millis()-t<3000) delay(5); else return(0); } #ifdef DEBUG Serial.println("received........"); #endif t = millis(); while(myESP.available()||(millis()-t<3000)) { if(!myESP.available()) continue; char in_char = myESP.read(); #ifdef DEBUG Serial.print(in_char); #endif if( (state == 0)&&(in_char=='(') ) { state = 1; n = -4; } else if(state == 1) { n++; if(n>=0) name_string[n] = in_char; if(n == 8) { n = -3; ap_n = nameToNumber(name_string,name); if(ap_n != -1) { state = 2; #ifdef DEBUG Serial.print('\n'); Serial.print("ap_n:");Serial.println(ap_n); #endif } else { state = 0; } } } else if(state==2) { n++; if(n>=0) rssi_string[n] = in_char; if(n == 2) { rs[ap_n] = atof(rssi_string); state = 0; search_result_number++; #ifdef DEBUG Serial.print('\n'); Serial.print("rssi["+String(ap_n)+"]:");Serial.println(rs[ap_n]); #endif } } } return(search_result_number); }
float rssiToDistance(int rssi) { float dis = 0; dis = pow(10.0,((abs(rssi)-47)/10.0/2.212)); return dis; } |
④ 将不同模块按照三点定位摆放开(在1m×1m的空间内),如下图所示,观察实验效果。
4. 资料清单
序号 | 内容 |
1 | 程序源代码 |
2 | ESP8266调试工具 |
3 | ESP8266相关学习资料 |
【整体打包】-【U018】如何用WiFi实现无线定位-ESP8266-资料附件.rar | 48.59MB | 下载33次 | 下载 |
|