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

Arduino中文社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 9260|回复: 7

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

[复制链接]
发表于 2018-5-7 20:38 | 显示全部楼层 |阅读模式
本帖最后由 hxl8686886 于 2018-5-8 21:58 编辑

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

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

ESP6266控制tello程序 01.png
 楼主| 发表于 2018-5-9 22:26 | 显示全部楼层
看来没人理睬编程菜鸟啊,好难过
发表于 2018-5-10 09:43 | 显示全部楼层
hxl8686886 发表于 2018-5-9 22:26
看来没人理睬编程菜鸟啊,好难过

因为你给的是个图片,让别人怎么注释,先敲一遍么
 楼主| 发表于 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[255];

const char movelist[][15] = {"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[idx++]);
}

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[len] = 0;
    }
    Serial.printf("UDP packet contents: %s\n", incomingPacket);
  }
  unsigned long thistick = millis();
  if(thistick - (lasttick + 2000)< 0xff000000){
    doNextMove();
    lasttick = thistick;
  }
}

ESP6266控制tello程序 01.rar

965 Bytes, 下载次数: 26

发表于 2018-10-26 15:05 | 显示全部楼层
巧了 我也有这样的想法
发表于 2018-10-26 15:17 | 显示全部楼层
赚钱的机会来了
发表于 2019-6-7 12:58 来自手机 | 显示全部楼层
请问有注释了嘛?我也需要。。
发表于 2020-2-21 00:14 | 显示全部楼层
本帖最后由 huarui2219 于 2020-2-22 23:27 编辑

没玩过,arduino,打算试着琢磨下



以下是我查官网api 搞定的注释版本

[pre]//导入头文件
#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[255];
//定义一组指令字符串,2维数组,但只初始化了一维,第二维为15个空
// 不太懂这个 无人机指令,试着猜一下, takeoff: 起飞, up 50 :上升50公分?,down 50: 下降 50CM,flip b :翻转 啥是b呀,land : 着陆
const char movelist[][15] = {"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[idx++]);
}

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[len] = 0;
        }
        //向串口输出日志
        Serial.printf("UDP packet contents: %s\n", incomingPacket);
    }
    //此函数用于返回的Arduino板开始运行当前程序时的毫秒数
    unsigned long thistick = millis();
    //当前时间-(上一次执行时间+2秒)小于 4278190080 毫秒
    if (thistick - (lasttick + 2000) < 0xff000000)
    {
        //执行下一个指令
        doNextMove();
        //更新上次执行时间为本次执行时间
        lasttick = thistick;
    }
}[/pre]
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|Archiver|手机版|Arduino中文社区

GMT+8, 2024-11-28 06:50 , Processed in 0.111996 second(s), 19 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表