制作一个Tello无人机的WiFi无线遥控器(ESP8266+Shield).源码分析上

2020-12-17 10:40:38 浏览数 (1)

代码语言:javascript复制
https://www.jianshu.com/p/f8e2e8ceaa47


https://github.com/PaulStoffregen/SoftwareSerial


https://github.com/bportaluri/WiFiEsp


https://github.com/sudar/JoystickShield
代码语言:javascript复制
https://hardwarefun.com/projects/joystick-shield

这里是我们主要要加载的三个库,分别是软串口的库,wifi对于esp8266的支持库,还有游戏手柄的硬件支持库,GitHub上面下载就好了

这个是我解压过后的样子

全展开的样子,还有一些缺的库。稍等去下载

这个是原有项目里面,使用的硬件,这个地方放一下作为参考

用作无线的芯片,ESP8266

重点看这里的串口参数

功耗问题

硬件模组的电路连接情况

这个地方是我们本次要用的SDK命令,不多

主要是启动

起飞,降落

以及飞行的一些具体的距离,我其实觉得这个不好.我还是喜欢RC命令

用6个方向的角度值来控制飞机的运动

我们的文件库里面还缺一个IPAddress.h的头文件

我们去找一下,原来是Arduino的库

下载下来。我们研究用~

代码语言:javascript复制
https://github.com/esp8266/Arduino

不算很大的一个库

这边可以看见已经是加载完成了

Arduino-mastercoresesp8266IPAddress.cpp,这个是相对路径

注意一下,如果你在编辑器打开的情况下。直接复制相关的文件夹进去,code的数据库引擎是不会工作的,就是相关的跳转头文件,函数的功能是不可用的。建议关闭一次编辑器重新建立一次相关的文件的索引。

可以看见全部都是可以被索引到了,但是还有一个报错

看一下是什么错,是缺东西?

这边是它的建议

我直接搜索,没有个锤子库

把头文件报错直接关闭,巴适嗷

此时我想加一个Arduino的头文件,可以看到自带的自动补全真好用

加上的样子,我们说一下这些头文件的作用

  1. 一是文章里面给的硬件的库
  2. esp8266的AT指令库
  3. wifi UDP协议的库
  4. 一些Arduino自带功能的库,比如pinmode()这种函数的来历
  5. 还有一个连接esp8266串口的库
  6. 还有一个是IP地址相关的库
  7. 大体来讲就是这样,我们后面可以加更多的传感器进来,比如可以I2C的屏幕就加一个#include<Wire.h>的库,以及绘图用的库。

这些地方都是对于遥控器的一些初始化的配置,我们以下会详细的解释。

Tello SSID,这个需要根据无人机的实际值进行修改,启动Tello无人机后,用电脑扫描一下WiFi网络,以TELLO开头的热点即是。后面pass是密码,可以看到没有一点加密的东西在里面,安全性是负数。后面我们来进行相关的攻击的抓包重放,那是比较靠后的故事了,想看的等着就行。

这个就是很简单了,wifi的状态,

我们看看这个的具体应用是怎么样的

在这里是最重要的代码

打开的样子

  1. 第一次判断这个标志,如果匹配上了,就打印WiFi板子不存在
  1. 尝试连接到WPA SSID
  2. 然后打印ssid的具体信息
  3. 接着使用wifi.begin这个来连接tello飞机

接着是一个1000ms的延时,用了稳定连接情况

打印一个wifi已经连接

这个地方是调用了一个函数,来打印WiFi和状态

代码语言:javascript复制
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是单位

代码语言:javascript复制
void SendCommand(const char *command)
{
    Udp.beginPacket(telloAddr, telloPort);
    Udp.write(command, strlen(command));
    Udp.endPacket();
    delay(1000);
}

这个地方随便把发送的函数也看了

一开始初始化这个UDP协议,两个参数传进去(tello的地址,tello的端口)

8889网络编程,具体这个地方可以看我以前的文章.

接着就是UDP发包命令,后面是一个字符串计算的函数.后期看源码看看作用

然后断开连接,延时1000.这个值是一个经验的值,我不推荐这个数值.不流畅

0 人点赞