制作一个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旋钮的输出消息进行打印,这里可以可视化出来
就是一些对字符串里面字节处理 的代码.很简单,自己看
接下来就是对其它库的解读了,我们以后再见啦~
联系客服