如何用WiFi实现无线定位

news2024/12/29 10:04:33

一、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)下载到主控板中。

/*------------------------------------------------------------------------------------

  版权说明: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的空间内),如下图所示,观察实验效果。

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1049942.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

使用不同尺寸的传感器拍照时,怎么保证拍出同样视场范围的照片?

1、问题背景 使用竞品机做图像效果对比时&#xff0c;我们通常都会要求拍摄的照片要视场范围一致&#xff0c;这样才具有可比性。之前我会考虑用同样焦距、同样分辨率的设备去拍照对比就可以了&#xff0c;觉得相机的视场范围只由镜头焦距来决定。 但如果对于不同尺寸的传感器…

5、Docker安装mysql主从复制与redis集群

安装mysql主从复制 主从搭建步骤 1.1 新建主服务器容器实例3307 docker run -p 3307:3306 --name mysql-master #3307映射到3306&#xff0c;容器名为mysql-master -v /app/mysql/mydata/mysql-master/log:/var/log/mysql #容器数据卷 -v /app/mysql/mydata/mysql-master/dat…

insightface实战:画出嘴巴和眼睛的mask

今天的目标是将人脸的嘴巴和眼睛区域抠出来&#xff0c;使用insightface简单实现出来&#xff0c;为了方便批量使用多进程跑数据&#xff0c;使用多进程的方式&#xff0c;下面是代码&#xff1a; import os import cv2 from multiprocessing import Pool import numpy as n…

五、接口测试工具:Postman

Postman是一款接口调试工具&#xff0c;是一款免费的可视化软件&#xff0c;同时支持各种操作系统平台&#xff0c;是测试接口的首选工具。 官网下载&#xff1a; https://www.postman.com/downloads/ 工作面板 简易的get请求 简易的post请求 案例&#xff1a;请求百度地图…

跨类型文本文件,反序列化与类型转换的思考

文章目录 应用场景序列化 - 对象替换原内容&#xff0c;方便使用编写程序取得结果数组 序列化 - JSON 应用场景 在编写热更新的时候&#xff0c;我发现了一个古早的 ini 文件&#xff0c;记录了许多有用的数据 由于使用的语言年份较新&#xff0c;没有办法较好地对 ini 文件的…

聊聊KISS(Keep It Simple, Stupid)原则

文章目录 1. 前言2. KISS原则的几项描述3. KISS原则和奥卡姆剃刀原则区别 1. 前言 KISS原则&#xff0c;是Keep It Simple, Stupid的缩写&#xff0c;翻译成中文就是“保持简单&#xff0c;愚蠢的人也能懂”。这是一种鼓励简单设计的设计原则。 KISS原则的主要思想是&#x…

Unity实现设计模式——中介者模式

Unity实现设计模式——中介者模式 用一个中介者对象来封装一系列的对象交互&#xff0c;中介者使各对象不需要显示地相互引用&#xff0c;从而使其松散耦合&#xff0c;而且可以独立地改变它们之间的交互。 这里使用一个生活中的例子来介绍中介者模式&#xff0c;比如当我们在…

【CTFHUB】SSRF原理之简单运用(一)

一、漏洞原理 SSRF 服务端请求伪造 原理&#xff1a;在某些网站中提供了从其他服务器获取数据的功能&#xff0c;攻击者能通过构造恶意的URL参数&#xff0c;恶意利用后可作为代理攻击远程或本地的服务器。 二、SSRF的利用 1.对目标外网、内网进行端口扫描。 2.攻击内网或本…

【开发篇】十二、缓存框架JetCache

文章目录 0、介绍1、JetCache远程缓存2、JetCache本地缓存3、标准配置文件4、JetCache方法缓存注解--Cached5、Cached4、CacheUpdate5、CacheInvalidate6、CacheRefresh7、缓存统计报告 上篇完成了Spring Cache底层技术的各种切换&#xff0c;但各个技术有各自的优缺点&#xf…

QT窗口的设置、按钮的创建和对象树的概念

目录 设置窗口属性 按钮的创建 对象树 对象树的概念 构建和析构的顺序问题 设置窗口属性 在Qt官方手册中查找QWidget相关信息 或者在QT软件帮助一栏直接搜索QWidget 即可找到一些要寻找的设置属性的函数 将代码写在构造函数中 widget.cpp #include "widget.h"…

QT pyside2 线程嵌套子线程 实现开始运行和停止运行

文章目录 前言为什么要使用多线程 一、单个线程实现按钮方法的执行二、线程嵌套多个子线程实现按钮方法的执行三、QT GUI常用代码3.1 多线程取出队列任务循环执行&#xff0c;无停止3.2 将某个方法放在线程中执行3.3 QT pyside2 tableWidget 清除日志3.4 退出整个GUI程序(杀死进…

从入门到精通:详解SVN版本控制系统的使用方法

从入门到精通&#xff1a;详解SVN版本控制系统的使用方法 一、引言1.1、版本控制的概念和重要性1.2、流行的版本控制系统SVN 二、SVN基础知识2.1、SVN的基本概念和术语解释2.2、SVN的工作原理和架构 三、创建SVN仓库3.1、创建本地仓库3.2、配置访问权限 四、使用SVN进行版本控制…

基于AI图像识别的智能缺陷检测系统,在钢铁行业的应用-技术方案

目录 概述 废钢智能检判方案简介 废钢智能检判系统优势及价值 废钢人工检判过程 废钢等级检判标准 废钢检判结果 智能检判方案-废钢智能检判算法 算法一&#xff1a;废钢等级识别算法 算法二&#xff1a;不合格料的位置识别算法 算法三&#xff1a;不合格料的类型识别…

docker-compose 网络配置- IP 主机名 hosts配置

docker-compose 配置IP、hostname、hosts配置 配置IP version: "3" networks:bd-network: # 声明网络external: true services:kafka: # 服务名称networks:bd-network: # 连接的网络名称ipv4_address: 172.2.0.102 # 配置IP配置 主机名 version: "3&quo…

DevExpress WinForms图表组件 - 直观的数据信息呈现方式!(二)

在上文中&#xff08;点击这里回顾>>&#xff09;&#xff0c;我们为大家介绍了DevExpress WinForms图表控件的互动图表、图标设计器及可定制功能等&#xff0c;本文将继续介绍DevExpress WinForms图表控件的数据分析、大数据功能等&#xff0c;欢迎持续关注我们哦~ Dev…

数据结构与算法——17.二叉搜索树

这篇文章我们来看一下数据结构中的二叉搜索树。 目录 1.概述 2.二叉搜索树的实现 3.总结 1.概述 我们前面学到的数据结构&#xff0c;比如&#xff1a;动态数组、链表、队列、栈、堆&#xff0c;这些数据结构存储完数据后&#xff0c;我们要去查找某个数据&#xff0c;它的…

FPGA 多路视频处理:图像缩放+视频拼接显示,HDMI采集,提供2套工程源码和技术支持

目录 1、前言版本更新说明免责声明 2、相关方案推荐FPGA图像缩放方案推荐FPGA视频拼接方案推荐 3、设计思路框架视频源选择IT6802解码芯片配置及采集动态彩条缓冲FIFO图像缩放模块详解设计框图代码框图2种插值算法的整合与选择 视频拼接算法图像缓存视频输出 4、vivado工程1&am…

PIE:1979-2018年中国气温数据产品(空间分辨率为0.1º)

简介 中国气温数据产品包含1979-2018年期间中国的近地表气温数据&#xff08;单位为摄氏度&#xff09;&#xff0c;时间分辨率为每日&#xff0c;空间分辨率为0.1。本产品集成了再分析数据&#xff08;ERA5、CMFD&#xff09;、遥感数据&#xff08;MODIS&#xff09;、原位数…

RISC-V架构的函数调用规范和栈布局

1、函数调用中寄存器规范 2、函数调用规范 &#xff08;1&#xff09;函数的前8个参数使用a0-a7寄存器传递&#xff0c;如果传参多于8个&#xff0c;则除前8个参数使用寄存器来传递之外&#xff0c;后面的参数使用栈传递&#xff1b; &#xff08;2&#xff09;如果传递的参数小…

《学术小白学习之路10》论文常见方法:Doc2vec-句向量模型实现

1. 数据 用于文献的摘要的相似度的计算 ## 导包 import pandas as pd import jieba import gensim from gensim.models import Doc2Vec from gensim.models.doc2vec import TaggedDocument再定义停用词典,用于分词,还可以自己定义一个分词词典 ## 读入数据 papers = pd.&l…