5iMX宗旨:分享遥控模型兴趣爱好

5iMX.com 我爱模型 玩家论坛 ——专业遥控模型和无人机玩家论坛(玩模型就上我爱模型,创始于2003年)
查看: 1056|回复: 10
打印 上一主题 下一主题

手把手教学diy固定翼飞控esp8266陀螺仪飞控

[复制链接]
跳转到指定楼层
楼主
发表于 2023-2-25 09:05 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 tgjohn 于 2023-2-27 11:04 编辑

esp8266芯片功能包罗万象,加上mpu6050陀螺仪模块就变身飞控,除了固定翼,车船,无人机都能用。
diy电子零件不超过10个,非常方便。

准备工作:零件:esp8266模块  mpu6050模块  usb刷机线  100uf电容2个 100nf电容2个 10k电阻3个 LDO1117 3v3 1个
                 软件:arduino + 8266库
                 电路板:嘉立创免费制作


完成体积2厘米X3厘米
后续更新固件下载
diy  q群209845016  供学习源码,非商业


欢迎继续阅读楼主其他信息

沙发
发表于 2023-2-25 09:40 | 只看该作者
感谢分享
3
发表于 2023-2-25 21:59 | 只看该作者
司令威武!!!
4
 楼主| 发表于 2023-2-27 08:02 | 只看该作者
8266航模遥控方式

来自安卓客户端来自安卓客户端
5
 楼主| 发表于 2023-2-27 11:03 | 只看该作者
第一讲esp8266ppm解码

#include <Servo.h>

#define RECEIVE_PIN 2  //IO2引脚
#define CHANNEL_AMOUNT 8 //8个PWM通道到
#define DETECTION_SPACE 2500
#define METHOD RISING

int ch[CHANNEL_AMOUNT + 1];

//舵机云台组件
Servo aservo; //副翼
Servo bservo; //升降
Servo xservo; //方向
Servo yservo; //油门
int servoA = 12; //副翼
int servoB = 13; //升降
int servoX = 14; //方向
int servoY = 16; //油门
int anew=90;//副翼数据
int bnew=90;//升降数据
int xnew=90;//方向数据
int ynew=90;//油门数据

void setup(){
  Serial.begin(115200);
  pinMode(RECEIVE_PIN, INPUT_PULLUP);

  pinMode(servoA, OUTPUT);//定义端口为OUTPUT输出模式
  pinMode(servoB, OUTPUT);//定义端口为OUTPUT输出模式
  aservo.write(90);
  aservo.attach(servoA);
  bservo.write(90);
  bservo.attach(servoB);

  attachInterrupt(digitalPinToInterrupt(RECEIVE_PIN), ppm_interrupt, METHOD);
}

void loop(){
  //循环打印通道值,取1-8的值
  for (byte i = 0; i < CHANNEL_AMOUNT + 1; i++){
    Serial.print(ch[i]);
    Serial.print("\t");
;
}
  Serial.println("");
bnew=(90+(1500-ch[1])/5);//500:90的系数
anew=(90+(1500-ch[2])/5);

  bservo.write(bnew);
  aservo.write(anew);

}

ICACHE_RAM_ATTR void ppm_interrupt(){
  static byte i;
  static unsigned long int t_old;
  unsigned long int t = micros();   //储存时间值t当引脚值下降/上升时
  unsigned long int dt = t - t_old; //计算两个峰之间的时间
  t_old = t;
if ((dt > DETECTION_SPACE) || (i > CHANNEL_AMOUNT)){
  i = 0;
}
  ch[i++] = dt;
}

6
 楼主| 发表于 2023-2-28 08:26 | 只看该作者
8266开源项目 第二讲esp8266陀螺仪自稳

//ail副翼,ele升降舵,thr油门,rud方向舵
//ch1    ail 副翼(左右侧飞/横滚)   对应  roll   左右侧飞
//ch2  ele 升降舵前后(机头向下/上  升降舵)  对应  pitch 前后
//ch3  thr 油门  直升机叫  螺距  四轴  thr油门
//ch4  rud 方向舵(方向左右)  对应于yaw 方向

#include <Servo.h>
  #include <Wire.h>
  #include "I2Cdev.h"
  #include "MPU6050.h"

#define RECEIVE_PIN 2  //IO2引脚
#define CHANNEL_AMOUNT 8 //8个PWM通道到
#define DETECTION_SPACE 2500
#define METHOD RISING
int ch[CHANNEL_AMOUNT + 1];
  MPU6050 mpu;
  int16_t ax, ay, az, gx, gy, gz; //加速度计陀螺仪原始数据

//舵机云台组件
Servo aservo; //副翼
Servo eservo; //升降
Servo rservo; //方向
Servo tservo; //油门
int servoA = 12; //副翼io
int servoE = 13; //升降io
int servoR = 14; //方向io
int servoT = 16; //油门io
int anew=90;//副翼数据
int enew=90;//升降数据
int rnew=90;//方向数据
int tnew=90;//油门数据

void setup(){
  Serial.begin(115200);
  pinMode(RECEIVE_PIN, INPUT_PULLUP);

    Wire.begin();
    Serial.println("Initializing I2C devices...");
    mpu.initialize();
    Serial.println("Testing device connections...");
    Serial.println(mpu.testConnection() ? "MPU6050 connection successful" : "MPU6050 connection failed");

  pinMode(servoA, OUTPUT);//定义端口为OUTPUT输出模式
  pinMode(servoE, OUTPUT);//定义端口为OUTPUT输出模式
  aservo.write(90);
  aservo.attach(servoA);
  eservo.write(90);
  eservo.attach(servoE);

  attachInterrupt(digitalPinToInterrupt(RECEIVE_PIN), ppm_interrupt, METHOD);
}

void loop(){

    mpu.getMotion6(&ax, &ay, &az, &gx, &gy, &gz); //读取六轴原始数值
    ax = map (ax, -17000, 17000, 5, 180) ;
    ay = map (ay, -17000, 17000, 0, 120) ;
    az = map (az, -17000, 17000, 5, 180) ;   
  //循环打印通道值,取1-8的值
  for (byte i = 0; i < CHANNEL_AMOUNT + 1; i++){
//    Serial.print(ch[i]);
//    Serial.print("\t");
//;
}
  Serial.println("");
anew=(90+(1500-ch[1])/5);
enew=(90+(1500-ch[2])/5);//500:90的系数

//  eservo.write(enew);
//  aservo.write(anew);
    Serial.print(ax);
  eservo.write(ay);
  aservo.write(ax);
}

ICACHE_RAM_ATTR void ppm_interrupt(){
  static byte i;
  static unsigned long int t_old;
  unsigned long int t = micros();   //储存时间值t当引脚值下降/上升时
  unsigned long int dt = t - t_old; //计算两个峰之间的时间
  t_old = t;
if ((dt > DETECTION_SPACE) || (i > CHANNEL_AMOUNT)){
  i = 0;
}
  ch[i++] = dt;
}
7
发表于 2023-2-28 21:02 | 只看该作者
太厉害了,学习了。看不懂。
8
发表于 2023-3-1 09:58 | 只看该作者
ESP8266本身就是一个单片机吗?
9
 楼主| 发表于 2023-3-2 06:26 | 只看该作者
hunternudt 发表于 2023-3-1 09:58
ESP8266本身就是一个单片机吗?

属于单片机,也是多功能物联网芯片

来自安卓客户端来自安卓客户端
10
 楼主| 发表于 2023-3-2 08:53 | 只看该作者
今日更新无线调参功能
来自安卓客户端来自安卓客户端
11
 楼主| 发表于 2023-3-2 08:54 | 只看该作者


来自安卓客户端来自安卓客户端
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

关闭

【站内推荐】上一条 /1 下一条

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