刚刚接触arduino,用ESP8266控制无人机-Arduino中文社区 - Powered by Discuz! Archiver

hxl8686886 发表于 2018-5-7 20:38

刚刚接触arduino,用ESP8266控制无人机

本帖最后由 hxl8686886 于 2018-5-8 21:58 编辑

1.这是从网上截到的程序图,用来控制特洛tello无人机,但是只运行takeoff, flip b, land三个指令,其它无视(也不是完全无视,无人机处于悬念状态),请大家指点(会打点的,哈哈)

2.麻烦大神,能对给出每行的中文解释吗?(哈哈,打赏至少10元,虽然与付出不成比例,也是个心意吧。)

hxl8686886 发表于 2018-5-9 22:26

看来没人理睬编程菜鸟啊,好难过:'(

跑龙套的保 发表于 2018-5-10 09:43

hxl8686886 发表于 2018-5-9 22:26
看来没人理睬编程菜鸟啊,好难过

因为你给的是个图片,让别人怎么注释,先敲一遍么

hxl8686886 发表于 2018-5-10 16:07

不好意思,现在就发文体文件。用的是复制粘贴方法,不知这样可以吗?

#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;
}
}

嗯?嗯。 发表于 2018-10-26 15:05

巧了 我也有这样的想法

单片机菜鸟 发表于 2018-10-26 15:17

赚钱的机会来了

mugles 发表于 2019-6-7 12:58

请问有注释了嘛?我也需要。。

huarui2219 发表于 2020-2-21 00:14

本帖最后由 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]
查看完整版本: 刚刚接触arduino,用ESP8266控制无人机