制作一个Tello无人机的WiFi无线遥控器(ESP8266+Shield).源码分析上
https://www.jianshu.com/p/f8e2e8ceaa47
https://github.com/PaulStoffregen/SoftwareSerial
https://github.com/bportaluri/WiFiEsp
https://github.com/sudar/JoystickShield
https://hardwarefun.com/projects/joystick-shield
这里是我们主要要加载的三个库,分别是软串口的库,wifi对于esp8266的支持库,还有游戏手柄的硬件支持库,GitHub上面下载就好了
这个是我解压过后的样子
全展开的样子,还有一些缺的库。稍等去下载
这个是原有项目里面,使用的硬件,这个地方放一下作为参考
用作无线的芯片,ESP8266
重点看这里的串口参数
功耗问题
硬件模组的电路连接情况
这个地方是我们本次要用的SDK命令,不多
主要是启动
起飞,降落
以及飞行的一些具体的距离,我其实觉得这个不好.我还是喜欢RC命令
用6个方向的角度值来控制飞机的运动
我们的文件库里面还缺一个IPAddress.h的头文件
我们去找一下,原来是Arduino的库
下载下来。我们研究用~
https://github.com/esp8266/Arduino
不算很大的一个库
这边可以看见已经是加载完成了
Arduino-master\cores\esp8266\IPAddress.cpp,这个是相对路径
注意一下,如果你在编辑器打开的情况下。直接复制相关的文件夹进去,code的数据库引擎是不会工作的,就是相关的跳转头文件,函数的功能是不可用的。建议关闭一次编辑器重新建立一次相关的文件的索引。
可以看见全部都是可以被索引到了,但是还有一个报错
看一下是什么错,是缺东西?
这边是它的建议
我直接搜索,没有个锤子库
把头文件报错直接关闭,巴适嗷
此时我想加一个Arduino的头文件,可以看到自带的自动补全真好用
加上的样子,我们说一下这些头文件的作用
一是文章里面给的硬件的库
esp8266的AT指令库
wifi UDP协议的库
一些Arduino自带功能的库,比如pinmode()这种函数的来历
还有一个连接esp8266串口的库
还有一个是IP地址相关的库
大体来讲就是这样,我们后面可以加更多的传感器进来,比如可以I2C的屏幕就加一个#include<Wire.h>的库,以及绘图用的库。
这些地方都是对于遥控器的一些初始化的配置,我们以下会详细的解释。
Tello SSID,这个需要根据无人机的实际值进行修改,启动Tello无人机后,用电脑扫描一下WiFi网络,以TELLO开头的热点即是。后面pass是密码,可以看到没有一点加密的东西在里面,安全性是负数。后面我们来进行相关的攻击的抓包重放,那是比较靠后的故事了,想看的等着就行。
这个就是很简单了,wifi的状态,
我们看看这个的具体应用是怎么样的
在这里是最重要的代码
打开的样子
第一次判断这个标志,如果匹配上了,就打印WiFi板子不存在
尝试连接到WPA SSID
然后打印ssid的具体信息
接着使用wifi.begin这个来连接tello飞机
接着是一个1000ms的延时,用了稳定连接情况
打印一个wifi已经连接
这个地方是调用了一个函数,来打印WiFi和状态
void PrintWifiStatus()
{
// print the SSID of the network you're attached to:
Serial.print("SSID: ");
Serial.println(WiFi.SSID());
// print your WiFi shield's IP address:
IPAddress ip = WiFi.localIP();
Serial.print("IP Address: ");
Serial.println(ip);
// print the received signal strength:
long rssi = WiFi.RSSI();
Serial.print("signal strength (RSSI):");
Serial.print(rssi);
Serial.println(" dBm");
}
这个是函数的具体实现,可以看带其实啥也没有,就是一些打印店额语句
打印SSID接入点的名字
打印IP地址,这边还打印了一个WIFI的强度值,dBm是单位
void SendCommand(const char *command)
{
Udp.beginPacket(telloAddr, telloPort);
Udp.write(command, strlen(command));
Udp.endPacket();
delay(1000);
}
这个地方随便把发送的函数也看了
一开始初始化这个UDP协议,两个参数传进去(tello的地址,tello的端口)
8889网络编程,具体这个地方可以看我以前的文章.
接着就是UDP发包命令,后面是一个字符串计算的函数.后期看源码看看作用
然后断开连接,延时1000.这个值是一个经验的值,我不推荐这个数值.不流畅