极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 1785|回复: 0

如何用WiFi实现无线定位

[复制链接]
发表于 2023-10-23 13:27:25 | 显示全部楼层 |阅读模式
本帖最后由 机器谱 于 2023-10-23 13:27 编辑

一、WiFi主从模块设置
1. 实验器材

2. 实验步骤
      ① 给控制板刷一套空的程序。

② 将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)下载到主控板中。
  1. /*------------------------------------------------------------------------------------

  2.   版权说明:Copyright 2023 Robottime(Beijing) Technology Co., Ltd. All Rights Reserved.

  3.            Distributed under MIT license.See file LICENSE for detail or copy at

  4.            https://opensource.org/licenses/MIT

  5.            by 机器谱 2023-09-12 https://www.robotway.com/

  6.   ------------------------------*/

  7. /*将与主控板相连接的wifi模块使用“esp8266调试工具软件”设置为Station模式

  8.   将其余三个模块设置为AP模式,并记录其NAME,存储在程序中*/

  9. //#define DEBUG

  10. #define ESP_AP_NUMBER 3

  11. #include <SoftwareSerial.h>

  12. #include <RssiPositionComputer.h>

  13. #include <Wire.h>

  14. #include <MultiLCD.h>

  15. SoftwareSerial myESP(2,3);

  16. RssiPositionComputer myPositionComputer;

  17. Point2D master_point;

  18. LCD_SSD1306 lcd;

  19. char esp_ap_name[ESP_AP_NUMBER][10] = {"ESP826601","ESP826602","ESP826603"};

  20. int   rssi[ESP_AP_NUMBER];

  21. float distance[ESP_AP_NUMBER];

  22. void setup()

  23. {

  24. delay(1000);

  25. Serial.begin(115200);

  26. myESP.begin(9600);

  27. #ifdef DEBUG

  28. Serial.println("begin");

  29. #endif

  30. while(myESP.available()&&myESP.read());

  31. while(!myESP.available())

  32. {

  33. myESP.println("AT");

  34. delay(1000);

  35. }

  36. while(myESP.available()&&myESP.read());

  37. #ifdef DEBUG

  38. Serial.println("Resonse ok");

  39. #endif

  40. lcd.begin();

  41.     lcd.clear();

  42.     lcd.setCursor(30,4);

  43.     lcd.print("Hello, world!");

  44. }

  45. void loop()

  46. {

  47. int n = searchESPAP(esp_ap_name,rssi);

  48. for(int i=0;i<ESP_AP_NUMBER;i++)

  49. {

  50. distance[i] = rssiToDistance(rssi[i]);

  51. Serial.print(distance[i]);

  52. Serial.print('\t');

  53. }

  54. Serial.print(n);

  55. Serial.print('\t');

  56. if(myPositionComputer.distanceToPoint(distance[0],distance[1],distance[2],&master_point)==true)

  57.     {

  58.       Serial.print(master_point.x);

  59.       Serial.print('\t');

  60.       Serial.print(master_point.y);

  61.       Serial.print('\t');

  62.       Serial.println("position okok");

  63.       lcd.clear();

  64.       lcd.setCursor(30,2);

  65.       lcd.printLong(master_point.x*100,FONT_SIZE_LARGE);   //按厘米输出

  66.       lcd.setCursor(30,5);

  67.       lcd.printLong(master_point.y*100,FONT_SIZE_LARGE);

  68.     }

  69.     else

  70.     {

  71.     lcd.clear();

  72.     lcd.setCursor(30,4);

  73.     lcd.print("position ERROR!");

  74.         Serial.println("position ERROR");   

  75.     }

  76. }

  77. int nameToNumber(char in[],char name[][10])

  78. {

  79. for(int i=0;i<3;i++)

  80. {

  81. for(int j=0;j<9;j++)

  82. {

  83. if(in[j] != name[i][j])

  84. break;

  85. if(j==8)

  86. return(i);

  87. }

  88. }

  89. return(-1);

  90. }

  91. byte searchESPAP(char name[][10], int rs[])

  92. {

  93. byte search_result_number = 0;

  94. int state = 0;

  95. int n;

  96. int ap_n;

  97. char name_string[10];

  98. char rssi_string[4];

  99. while(myESP.available()&&myESP.read());

  100. myESP.println("AT+CWLAP");

  101. delay(100);

  102. while(myESP.available()&&myESP.read());

  103. unsigned long t = millis();

  104. while(!myESP.available())

  105. {

  106. if(millis()-t<3000)

  107. delay(5);

  108. else

  109. return(0);

  110. }

  111. #ifdef DEBUG

  112. Serial.println("received........");

  113. #endif

  114. t = millis();

  115. while(myESP.available()||(millis()-t<3000))

  116. {

  117. if(!myESP.available())

  118. continue;

  119. char in_char = myESP.read();

  120. #ifdef DEBUG

  121. Serial.print(in_char);

  122. #endif

  123. if( (state == 0)&&(in_char=='(') )

  124. {

  125. state = 1;

  126. n = -4;

  127. }

  128. else if(state == 1)

  129. {

  130. n++;

  131. if(n>=0)

  132. name_string[n] = in_char;

  133. if(n == 8)

  134. {

  135. n = -3;

  136. ap_n = nameToNumber(name_string,name);

  137. if(ap_n != -1)

  138. {

  139. state = 2;

  140. #ifdef DEBUG

  141. Serial.print('\n');

  142. Serial.print("ap_n:");Serial.println(ap_n);

  143. #endif

  144. }

  145. else

  146. {

  147. state = 0;

  148. }

  149. }

  150. }

  151. else if(state==2)

  152. {

  153. n++;

  154. if(n>=0)

  155. rssi_string[n] = in_char;

  156. if(n == 2)

  157. {

  158. rs[ap_n] = atof(rssi_string);

  159. state = 0;

  160. search_result_number++;

  161. #ifdef DEBUG

  162. Serial.print('\n');

  163. Serial.print("rssi["+String(ap_n)+"]:");Serial.println(rs[ap_n]);

  164. #endif

  165. }

  166. }

  167. }

  168. return(search_result_number);

  169. }

  170. float rssiToDistance(int rssi)

  171. {

  172. float dis = 0;

  173. dis = pow(10.0,((abs(rssi)-47)/10.0/2.212));

  174. return dis;

  175. }


复制代码

④ 将不同模块按照三点定位摆放开(在1m×1m的空间内),如下图所示,观察实验效果。


4. 资料下载
资料内容:

①程序源代码
②ESP8266调试工具
③ESP8266相关学习资料
资料下载地址:如何用WiFi实现无线定位 https://www.robotway.com/h-col-267.html

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 需要先绑定手机号

Archiver|联系我们|极客工坊

GMT+8, 2024-4-30 14:20 , Processed in 0.041581 second(s), 17 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表