UWB定位需要电脑读取UWB基站的串口数据来读取距离信息,用wifi连接可以实现远程接收串口数据方便连接。这里记录一下如何让51UWB单片机接入WiFi模块ESP8266。
前置条件:
单片机完成基站(RX)、标签(TX)程序的烧录(参考官方用户手册)
ESP8266模块完成AT指令集的烧录,可以通过串口用AT指令对其进行控制
开始!
ESP8266接入串口(这边用的是ESP8266-NodeMCU,可以直接通过安卓线连入电脑的USB口),在设备管理器中查看端口号,打开串口调试工具(用的是XCOM)连接该端口号。
按RST复位ESP8266,如果串口有输出初始化信息,说明连接成功,接下来可以用AT指令对其进行操作
模块配置为Station模式:AT+CWMODE=1
这时ESP8266可以作为TCP客户端,电脑作为TCP服务端进行通讯,之后可以进行透传,将串口数据通过WIFI传至电脑。
扫描WIFI信息:AT+CWLAP
选择要连接的网络(这里选择手机热点):AT+CWJAP="SSID","password"
设置多连接模式:AT+CIPMUX=1
打开cmd,输入ipconfig查看此时电脑接入WiFi的ip地址:
设置上电自动透传:
AT+SAVETRANSLINK=1,"192.168.221.179",8080,"TCP"
需关闭防火墙与虚拟机,不然连接可能会出现ERRORCLOSED。可参考:
https://blog.csdn.net/rong81590509/article/details/76133002
https://blog.csdn.net/yottian/article/details/122916280
出现OK则配置完成,断开端口,拔出串口线/USB线。
将ESP8266接入UWB基站串口(接入1号基站即可)
引脚如下:
ESP8266 | UWB基站 |
RX | TX |
TX | RX |
G | GND |
3V | 3.3V |
给基站上电(插入充电宝即可),并打开其余基站与标签,这里开了三个基站与一个标签作单标签定位测试。
开启之后基站的串口即可不断接收到标签到三个基站的距离数据,下面要做的就是将这些串口的数据传到电脑。
打开网络调试助手测试连接情况(这里用XNET),设置协议为TCP Server,本机IP为192.168.221.179,端口8080,点击连接。
如果能接收到数据(一堆乱码),说明ESP8266与电脑的TCP通信没问题,剩下就是把这些数据解析出来了。
如果没收到数据再检查ESP8266的配置情况。
断开XNET的连接,利用python脚本开启TCP服务端并解析数据。
import socket
import threading # 多线程
# TCP IP与端口号
LOCAL_IP = "192.168.221.179"
PORT = 8080
def dispose_client_request(tcp_client_1, tcp_client_address):
# 循环接收和发送消息
while True:
recv_data = tcp_client_1.recv(16)
# 有消息就回复数据,如果消息长度为0表示客户端下线了
if recv_data:
recv_data = bytes(recv_data)
decode(data=recv_data)
else:
print("%s 客户端下线了..." % tcp_client_address[1])
tcp_client_1.close()
break
def decode(data):
# 根据UWB传输协议进行解码
if len(data) != 16:
print('error len data')
return
#print(data[4])
tag_id = data[3]
dis0 = (data[6] + data[7]*256)/100
dis1 = (data[8] + data[9]*256)/100
dis2 = (data[10] + data[11]*256)/100
if __name__ == '__main__':
fig = plt.figure()
# 创建服务端套接字对象
tcp_server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 端口复用
tcp_server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True)
# 绑定端口
tcp_server.bind((LOCAL_IP, PORT))
# 设置监听
tcp_server.listen(128)
# 建立TCP连接
tcp_client, tcp_client_address = tcp_server.accept()
print ('connected from:', tcp_client_address)
socks = tcp_client
thd = threading.Thread(target=dispose_client_request, args=(tcp_client, tcp_client_address))
thd.setDaemon(True)
thd.start()
decode函数将target_ID、距离等信息提取出来之后,后面就可以进行自己的编程(定位算法、可视化等)啦