5iMX.com 我爱模型 玩家论坛 ——专业遥控模型和无人机玩家论坛(玩模型就上我爱模型,创始于2003年)

标题: 手把手教学diy固定翼飞控esp8266陀螺仪飞控 [打印本页]

作者: tgjohn    时间: 2023-2-25 09:05
标题: 手把手教学diy固定翼飞控esp8266陀螺仪飞控
本帖最后由 tgjohn 于 2023-2-27 11:04 编辑

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

准备工作:零件:esp8266模块  mpu6050模块  usb刷机线  100uf电容2个 100nf电容2个 10k电阻3个 LDO1117 3v3 1个
                 软件:arduino + 8266库
                 电路板:嘉立创免费制作
(, 下载次数: 25) (, 下载次数: 23) (, 下载次数: 33) (, 下载次数: 24) (, 下载次数: 26)

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



作者: 红三军团    时间: 2023-2-25 09:40
感谢分享
作者: zssssha    时间: 2023-2-25 21:59
司令威武!!!
作者: tgjohn    时间: 2023-2-27 08:02
8266航模遥控方式
(, 下载次数: 11)

作者: tgjohn    时间: 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;
}


作者: tgjohn    时间: 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;
}

作者: hbxfzw    时间: 2023-2-28 21:02
太厉害了,学习了。看不懂。
作者: hunternudt    时间: 2023-3-1 09:58
ESP8266本身就是一个单片机吗?
作者: tgjohn    时间: 2023-3-2 06:26
hunternudt 发表于 2023-3-1 09:58
ESP8266本身就是一个单片机吗?

属于单片机,也是多功能物联网芯片
(, 下载次数: 24)

作者: tgjohn    时间: 2023-3-2 08:53
今日更新无线调参功能

作者: tgjohn    时间: 2023-3-2 08:54

(, 下载次数: 24)





欢迎光临 5iMX.com 我爱模型 玩家论坛 ——专业遥控模型和无人机玩家论坛(玩模型就上我爱模型,创始于2003年) (http://5imx.com./) Powered by Discuz! X3.3