PX4使用WIFI模块

PX4支持WIFI模块作为数传工具,官网上也提供了教程,但是不注意细节也很容易失败。以下是我的经验以及教训。

配置环境

飞控:pixhawk v2,烧录PX4 v1.8.2的固件

地面站:QGC 3.5.2

wifi模块:市面上最常见的8针ESP8266模块

操作系统:Win 10

参考资料

[1] https://docs.px4.io/master/en/telemetry/esp8266_wifi_module.html

[2] http://ardupilot.org/copter/docs/common-esp8266-telemetry.html

[3] 工具下载

wifi模块固件烧录

如官网所示,可以使用python烧录固件也可以使用第三方工具烧录固件,PX4的v 1.8.2使用的是mavlink2,因此烧录firmware-1.2.2固件。烧录之前需要把GPIO0接地。我是这样烧录的,使用网上最常见的转串口的座,下面把杜邦线公母头分别焊接在GND和GPIO0的排针上,上电前需要短接,正常工作不短接。稍后我会把全部资料和工具上传。

烧录界面如下图所示,选择正确的串口,正确的固件,配置合适的波特率,之后点击flash。

官方固件和安可信固件的区别:

1、官方的固件在烧录之后会自动配置串口为透传模式,如果需要修改wifi的工作方式或者是波特率,首先电脑连接PixRacer热点,密码为pixracer,浏览器中输入192.168.4.1,点击setup即可配置,如下图所示

2、对于安可信的固件则是需要用户通过AT指令配置wifi模块的工作方式,再设置串口成为透传模式

 

硬件连接

要想成功首先保证硬件连接,在PX4固件中,wifi模块接入在telem2端口,telem2端口的闲分别为vcc, tx(接wifi模块的rx), rx(接wifi模块的tx), -, -, gnd。如下图所示,注意截图的文档来源于APM,烧录的是APM固件,它接入的是telem1。烧录PX4固件的需要接入telem2,同时配置SYS_COMPANION为ESP模式,最后重启飞控

结果测试

连接好之后,飞控的usb不要连接到电脑上,不然地面站会默认链接usb串口。电脑连接PixRacer的wifi,打开地面站即可,QGC会自动使用UDP连接飞控,界面上会出现wifi桥接的界面,如下图所示。

经验教训

之前一直不成功的主要问题还是在于硬件,我使用了这个模块,它有多个串口,USB接了一个串口,排针也引出来了几个串口。现在还没有搞清楚USB的那个串口是对应的串口几,烧录官方的固件之后是需要把数传2的串口接到USB的那个串口上的。

问题排除方法:上电后收到对应的wifi热点,可以访问192.168.4.1,;飞控板的确连接了telem2,参数也配置正确;硬件连接也是对的,那么大概率的问题就出在wifi模式了,于是换了最常见的8针wifi模块就解决了。而这个大模块不行的原因我猜是usb串口的另外一边接了232转换芯片,直接接TX和RX管脚,电平可能会被232芯片拉底??

 

其他尝试

把ESP8266配置成AP模式的缺点是地面站只可以连接一架飞机,如果地面站需要连接多架飞机,需要把ESP设置成STA模式,并开启电脑的热点,电脑热点的开启网上有很多资料,下面是热点开启后,ESP8266的设置,注意把SSID,passwd以及局域网的网段改成自己的(192.168后面的称为网段),重启之后ESP会自动切换成STA模式。如果1分钟之内无法连接到热点,它会自动掉会AP模式。

下面是多个飞机连接的示意图,它可以同时显示多架飞机的状态信息

同样的原理,ESP8266还可以接入路由器的热点,同时地面站所在的电脑也连接到同一个热点,也可以实现多个飞行器的接入。通过抓包发现,ESP8266连接到热点信号之后,它发送的所有数据包都是广播包,如下图所示。即目的节点是192.168.1.255的数据包(我电脑的网段是10.42.0网段,所以是10.42.0.255的目的地址),这种发送方式在一定程度上会占用网络的贷款,增加网络的拥塞程度,因为路由器接收到这个包之后会在全网广播,其他飞行器会受到没用的数据包,占用网络带宽.后面可以考虑下把目的节点的IP地址修改成地面站所在电脑的IP的地址,当然最好通过路由器给电脑设置一个静态的IP,以防IP节点不断变化

 

以下是一个控制 ESP8266 灯亮度的 HTML 网页示例: ```html <!DOCTYPE html> <html> <head> <title>ESP8266 LED</title> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script> <style> body { font-family: Arial, sans-serif; } h1 { margin-top: 50px; text-align: center; } #slider-container { margin-top: 50px; width: 50%; margin-left: auto; margin-right: auto; } #slider-value { font-size: 24px; text-align: center; } </style> </head> <body> <h1>ESP8266 LED</h1> <div id="slider-container"> <input type="range" min="0" max="255" value="0" class="slider" id="brightness-slider"> <p id="slider-value">0</p> </div> <script> $(document).ready(function() { // 当滑条值改变时,发送AJAX请求 $("#brightness-slider").change(function() { var brightness = $(this).val(); $.get("/set-brightness?brightness=" + brightness, function(data, status) { // 更新亮度值 $("#slider-value").text(brightness); }); }); }); </script> </body> </html> ``` 这个网页包含一个滑条,可以控制 LED 的亮度。当滑条值改变时,会通过 AJAX 请求将亮度值发送给 ESP8266 服务端。 以下是对应的 ESP8266 服务端代码示例: ```c++ #include <ESP8266WiFi.h> const char* ssid = "your_wifi_ssid"; const char* password = "your_wifi_password"; WiFiServer server(80); void setup() { Serial.begin(9600); delay(10); // 连接 WiFi Serial.println(); Serial.print("Connecting to "); Serial.println(ssid); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(1000); Serial.print("."); } Serial.println(""); Serial.println("WiFi connected"); // 启动服务 server.begin(); Serial.println("Server started"); } void loop() { // 等待客户端连接 WiFiClient client = server.available(); if (client) { Serial.println("New client"); String request = ""; // 读取 HTTP 请求 while (client.connected()) { if (client.available()) { char c = client.read(); request += c; if (c == '\n') { break; } } } // 提取亮度值 int brightness = 0; int pos = request.indexOf("brightness="); if (pos != -1) { String valueStr = request.substring(pos + 11); brightness = valueStr.toInt(); } // 发送 HTTP 响应 String response = "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n\r\n"; response += "<!DOCTYPE HTML>\r\n<html>\r\n"; response += "Brightness set to " + String(brightness) + "\r\n"; response += "</html>\n"; client.print(response); // 控制 LED 亮度 analogWrite(D1, brightness); } } ``` 这里同样使用ESP8266 的 `WiFiServer` 类来创建一个 HTTP 服务器,监听端口号为 80。当客户端向服务器发送 HTTP 请求时,可以从请求中提取亮度值,并将其传递给 `analogWrite()` 函数来控制 LED 的亮度。 需要注意的是,这里使用ESP8266 的 D1 引脚来控制 LED,您需要根据实际情况修改引脚号。另外,为了使代码更加健壮,建议添加一些错误处理逻辑,例如在客户端断开连接时关闭连接等。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值