刚刚接触arduino,用ESP8266控制无人机
本帖最后由 hxl8686886 于 2018-5-8 21:58 编辑1.这是从网上截到的程序图,用来控制特洛tello无人机,但是只运行takeoff, flip b, land三个指令,其它无视(也不是完全无视,无人机处于悬念状态),请大家指点(会打点的,哈哈)
2.麻烦大神,能对给出每行的中文解释吗?(哈哈,打赏至少10元,虽然与付出不成比例,也是个心意吧。)
看来没人理睬编程菜鸟啊,好难过:'( hxl8686886 发表于 2018-5-9 22:26
看来没人理睬编程菜鸟啊,好难过
因为你给的是个图片,让别人怎么注释,先敲一遍么 不好意思,现在就发文体文件。用的是复制粘贴方法,不知这样可以吗?
#include <ESP8266WiFi.h>
#include <WiFiUDP.h>
WiFiUDP Udp;
IPAddress maddr;
const char* serverip = "192.168.10.1";
const int serverport = 8889;
const int localport = 1518;
const char* ssid = "TELLO-A99CC2";
const char* password = "";
char incomingPacket;
const char movelist[] = {"takeoff","up 50","down 50",/*"cw 360","ccw 360","left 50","right 100","left 50","forward 50","back 100","forward 50",*/"flip b","land"};
void udpWriteCmd(const char* cmd){
Udp.beginPacket(maddr, serverport);
Udp.write(cmd, strlen(cmd));
Udp.endPacket();
}
void doNextMove(){
static unsigned int idx = 0;
if(idx < sizeof(movelist)/sizeof(*movelist))
udpWriteCmd(movelist);
}
void setup() {
Serial.begin(115200);
Serial.println(F("Init"));
// put your setup code here, to run once:
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED)
{
delay(500);
Serial.print(F("."));
}
Serial.println(F(" connected"));
Udp.begin(localport);
maddr.fromString(serverip);
udpWriteCmd("command");
delay(100);
doNextMove();
}
unsigned long lasttick = 0;
void loop() {
// put your main code here, to run repeatedly:
int packetSize = Udp.parsePacket();
if (packetSize){
Serial.printf("Received %d bytes from %s, port %d\n", packetSize, Udp.remoteIP().toString().c_str(), Udp.remotePort());
int len = Udp.read(incomingPacket, 255);
if (len > 0){
incomingPacket = 0;
}
Serial.printf("UDP packet contents: %s\n", incomingPacket);
}
unsigned long thistick = millis();
if(thistick - (lasttick + 2000)< 0xff000000){
doNextMove();
lasttick = thistick;
}
}
巧了 我也有这样的想法 赚钱的机会来了 请问有注释了嘛?我也需要。。 本帖最后由 huarui2219 于 2020-2-22 23:27 编辑
没玩过,arduino,打算试着琢磨下
以下是我查官网api 搞定的注释版本
//导入头文件
#include <ESP8266WiFi.h>
#include <WiFiUDP.h>
//创建可以发送和接收UDP消息的WiFi UDP类的命名实例。在基于AVR的板上,当前外发UDP数据包的大小限制为72个字节。对于非AVR板,限制为1446字节。
WiFiUDP Udp;
//定义一个IP地址对象
IPAddress maddr;
const char *serverip = "192.168.10.1";
//定义服务端端口
const int serverport = 8889;
//本地端口
const int localport = 1518;
//WIFI 用户名密码
const char *ssid = "TELLO-A99CC2";
const char *password = "";
char incomingPacket;
//定义一组指令字符串,2维数组,但只初始化了一维,第二维为15个空
// 不太懂这个 无人机指令,试着猜一下, takeoff: 起飞, up 50 :上升50公分?,down 50: 下降 50CM,flip b :翻转 啥是b呀,land : 着陆
const char movelist[] = {"takeoff", "up 50", "down 50", /*"cw 360","ccw 360","left 50","right 100","left 50","forward 50","back 100","forward 50",*/ "flip b", "land"};
//定义功能函数远程写入无人机指令,这里看起来是一个遥控器的代码
void udpWriteCmd(const char *cmd)
{
//启动连接以将UDP数据写入远程连接,这里是准备阶段
Udp.beginPacket(maddr, serverport);
//这一行才是写入命令
Udp.write(cmd, strlen(cmd));
//关闭连接
Udp.endPacket();
}
// 执行下一个动作
void doNextMove()
{
//定义静态变量,只会初始化一次,建议将此变量放到函数外部
static unsigned int idx = 0;
//判断指令集合是否为空
if (idx < sizeof(movelist) / sizeof(*movelist))
//根据顺序执行当前指令,并增加指令数组的索引号,下次进来将会执行下一个指令,注意一共定义了15个指令
udpWriteCmd(movelist);
}
void setup()
{
//设定波特率
Serial.begin(115200);
//打印日志
Serial.println(F("Init"));
// put your setup code here, to run once:
//设定wifi模式,客户端
WiFi.mode(WIFI_STA);
//连接WIFI
WiFi.begin(ssid, password);
//循环检测连接状态,每500毫秒
while (WiFi.status() != WL_CONNECTED)
{
delay(500);
Serial.print(F("."));
}
//输出连接成功
Serial.println(F(" connected"));
//在本地端口启动UDP广播
Udp.begin(localport);
//从字符串转换一个IP,并初始化 maddr 变量
maddr.fromString(serverip);
//写入指令 command
udpWriteCmd("command");
//等待100毫秒
delay(100);
//此时应 发送指令 takeoff
doNextMove();
}
//全局变量,用于保存上一次执行时间
unsigned long lasttick = 0;
//该方法循环执行
void loop()
{
// put your main code here, to run repeatedly:
//它开始处理下一个可用的传入数据包,检查UDP数据包的存在,并报告大小。在使用UDP.read()读取缓冲区之前,必须调用parsePacket()。
int packetSize = Udp.parsePacket();
//数据包的大小(以字节为单位)
// 如果没有数据包可用 : 0
if (packetSize)
{
//串口输出,用于PC端接收调试信息调试或是其他设备
Serial.printf("Received %d bytes from %s, port %d\n", packetSize, Udp.remoteIP().toString().c_str(), Udp.remotePort());
//UDP 接收数据,最多255字符
int len = Udp.read(incomingPacket, 255);
//判断是否收到
if (len > 0)
{
//如果收到,则将第一个位置写入0,C++ 字符串以0开头
incomingPacket = 0;
}
//向串口输出日志
Serial.printf("UDP packet contents: %s\n", incomingPacket);
}
//此函数用于返回的Arduino板开始运行当前程序时的毫秒数
unsigned long thistick = millis();
//当前时间-(上一次执行时间+2秒)小于 4278190080 毫秒
if (thistick - (lasttick + 2000) < 0xff000000)
{
//执行下一个指令
doNextMove();
//更新上次执行时间为本次执行时间
lasttick = thistick;
}
}
页:
[1]