
① 给控制板刷一套空的程序。

② 将Esp8266模块连接到Bigfish扩展板上,并将扩展板插到控制板上。

③ 在arduino的Seiral Monitor中,输入AT指令集,观察模块的相应应答。

3. 常用指令
① 基础AT指令。

② WiFi功能AT指令。

③ TCP/IP 工具箱 AT 命令。


Rssi三点定位算法。

① 使用文末资料中的“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
-
- #include
-
- #include
-
- #include
-
- 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
-
- {
-
- 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的空间内),如下图所示,观察实验效果。


程序源代码、ESP8266调试工具、ESP8266相关学习资料详见 如何用WiFi实现无线定位