51UWB单片机连接ESP8266实现Wifi接收串口数据

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、距离等信息提取出来之后,后面就可以进行自己的编程(定位算法、可视化等)啦

在ROS下读取UWB串口数据的步骤如下: 首先,确保已经在ROS工作空间中创建了一个功能包(catkin package),并为该功能包创建一个launch文件。 如果在ROS系统中尚未安装serial库,则需要先使用以下命令安装: ``` sudo apt-get install ros-melodic-serial ``` 然后,在launch文件中添加一个serial节点,配置串口参数。例如,可以将以下内容添加到launch文件中: ``` <node pkg="serial" type="serial_node.py" name="uwb_serial_node" output="screen"> <param name="port" value="/dev/ttyUSB0" /> <param name="baud" value="115200" /> </node> ``` 其中,`port`参数指定了UWB设备的串口路径,`baud`参数指定了串口的波特率。根据实际情况进行相应修改。 接下来,在ROS功能包的源代码中,创建一个订阅者(subscriber)来接收串口数据。使用rospy库中的Serial类可以实现这一功能。以下是一个简单的示例: ```python import rospy from std_msgs.msg import String def callback(data): rospy.loginfo("Received UWB data: %s", data.data) def uwb_data_listener(): rospy.init_node('uwb_data_listener', anonymous=True) rospy.Subscriber('/uwb_data', String, callback) rospy.spin() if __name__ == '__main__': uwb_data_listener() ``` 在上述代码中,`callback`函数用于处理接收到的UWB数据UWB数据通过一个名为`'/uwb_data'`的主题(topic)进行发布。在`rospy.Subscriber`函数中,我们将`callback`函数与该主题进行绑定。 最后,使用以下命令启动ROS节点: ``` roslaunch <pkg_name> <launch_file>.launch ``` 其中,`<pkg_name>`是你创建的ROS功能包的名称,`<launch_file>`是你创建的launch文件的名称。 当ROS节点和串口节点启动后,串口数据将通过ROS主题传递给订阅者,并在回调函数中进行处理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值