打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

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

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

这个图没有截图的很完美,串口定义半个

然后是一个无符号的int数来放一个本地端口

还有一个不变的int变量来保护UDP的的超时时间

还有一个char类型的值来放包的缓存的数组长度

char是C/C++整型数据中比较古怪的一个,其它的如int/long/short等不指定signed/unsigned时都默认是signed,但char在标准中是unsigned,编译器可以实现为带符号的,也可以实现为不带符号的,有些编译器如pSOS的编译器,还可以通过编译开关来指定它是有符号数还是无符号数。

一个有一点点CPP的味道的代码,常见了一个串口对象

将一个esp8266抽象成了一个串口

这两个函数看昨天文章的最后

这个地方是开启了两个串口,一个是arduino的串口

一个是esp的串口,设置了波特率.稍微找一下这个函数

搜搜一看,这么多都是ino文件

可以看到这边的更新的记录.

看了三个ino文件,都发现同一个头文件

/** * Initialize the ESP module. * * param espSerial: the serial interface (HW or SW) used to communicate with the ESP module */ static void init(Stream* espSerial);

这里看见了函数原型

头和实现在一起


void WiFiEspClass::init(Stream* espSerial){ LOGINFO(F("Initializing ESP module")); EspDrv::wifiDriverInit(espSerial);}

这个地方是具体的实现

等WiFi连接稳定以后开始进行发送命令

打印当前连接的WiFi的状态

可以监听UDP的端口,本地的ESP听无人机的8889

接着设置了一下开启UDP的端口

打印开启的本地端口号

接着发送命令,让飞行器进入SDK控制模式

延时稳定一下.

void JoystickShield::calibrateJoystick(){ byte i;
// calibrate x int xCenter = 0; for (i = 0; i < 10; i++) xCenter += analogRead(pin_analog_x); xCenter /= i;
// calibrate y int yCenter = 0; for (i = 0; i < 10; i++) yCenter += analogRead(pin_analog_y); yCenter /= i;
// save Stroke of Joystick joystickStroke = max(pin_analog_x, pin_analog_y) * 1.01;
// set Center with tolerance setThreshold(xCenter - CENTERTOLERANCE, xCenter + CENTERTOLERANCE, yCenter - CENTERTOLERANCE, yCenter + CENTERTOLERANCE);}

关于这个手柄的函数,后面再聊

在我们的shied里面有

void JoystickShield::processEvents(){ int x_direction = 0; int y_direction = 0;
// read from Joystick pins x_position = analogRead(pin_analog_x); y_position = analogRead(pin_analog_y);
// determine Joystick direction if (x_position > x_threshold_high) { x_direction = 1; x_position = map(x_position, x_threshold_high, x_threshold_high + x_threshold_low, 0, 100); x_position = constrain(x_position, 0, 100); } else if (x_position < x_threshold_low) { x_direction = -1; x_position = map(x_position, 0, x_threshold_low, -100, 0); } else x_position = 0;
if (y_position > y_threshold_high) { y_direction = 1; y_position = map(y_position, y_threshold_high, y_threshold_high + y_threshold_low, 0, 100); y_position = constrain(y_position, 0, 100); } else if (y_position < y_threshold_low) { y_direction = -1; y_position = map(y_position, 0, y_threshold_low, -100, 0); } else y_position = 0;
if (x_direction == -1) { if (y_direction == -1) { currentStatus = LEFT_DOWN; } else if (y_direction == 0) { currentStatus = LEFT; } else { currentStatus = LEFT_UP; } } else if (x_direction == 0) { if (y_direction == -1) { currentStatus = DOWN; } else if (y_direction == 0) { currentStatus = CENTER; } else { currentStatus = UP; } } else { if (y_direction == -1) { currentStatus = RIGHT_DOWN; } else if (y_direction == 0) { currentStatus = RIGHT; } else { currentStatus = RIGHT_UP; } }
// Determine which buttons were pressed, set button states array values to true/false accordingly buttonStates[0] = digitalRead(pin_up_button) != pin_up_button_unpressed; buttonStates[1] = digitalRead(pin_right_button) != pin_right_button_unpressed; buttonStates[2] = digitalRead(pin_down_button) != pin_down_button_unpressed; buttonStates[3] = digitalRead(pin_left_button) != pin_left_button_unpressed; buttonStates[4] = digitalRead(pin_E_button) != pin_E_button_unpressed; buttonStates[5] = digitalRead(pin_F_button) != pin_F_button_unpressed; buttonStates[6] = digitalRead(pin_joystick_button) != pin_joystick_button_unpressed;}

这个函数是处理按键事件的

我们这里看一个向上飞的片段

打印2个语句,向上飞50里面

forward是指令,50 是参数

这个是对按下这个动作的响应用bool函数响应

这个也是一个具体的处理逻辑

全部都是这样的逻辑,对照SDK写

里面有按钮没有用,可以自己自定义命令发送

对3D旋钮的输出消息进行打印,这里可以可视化出来

就是一些对字符串里面字节处理 的代码.很简单,自己看


接下来就是对其它库的解读了,我们以后再见啦~

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
旋转编码器Arduino教程
基于ESP32-S2实现的网络/FM两用收音机
【精彩原创】ESP-mp-01开发板I2C驱动OLED显示
Arduino关于旋转编码器程序的介绍
小车测速码盘读数请教(主要是想让小车走直线)?
【RISC-V MCU应用开发】详解EC11编码器高效驱动方法
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服