• 如何用WiFi实现无线定位


    一、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
    12. #include
    13. #include
    14. #include
    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
    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的空间内),如下图所示,观察实验效果。

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

  • 相关阅读:
    数说故事×IDEA荣获语言与智能技术竞赛「视频语义理解赛题」季军
    Doris 数据分布—Partition
    java实际项目反射、自定义注解的运用实现itext生成PDF的详细应用教程
    Python进行DevOps实践
    LeetCode 260. 只出现一次的数字 III:异或
    软件设计师2010上午题基础知识(易错整理)
    木舟0基础学习Java的第十六天(异常,分类,自定义异常,注意事项)
    Redis的特性以及使用场景
    java 企业工程管理系统软件源码 自主研发 工程行业适用
    Android逆向学习之Frida逆向与抓包实战学习笔记(持续更新中)
  • 原文地址:https://blog.csdn.net/Robotway/article/details/133251058