欢迎光临散文网 会员登陆 & 注册

航模自动控制全动鸭翼的小程序(arduino)

2022-12-18 18:33 作者:暖风新叶柳  | 我要投稿

//警告:该程序用于把鸭翼变成风向标,便于静不稳定飞机或者放宽静稳定飞机的控制。飞机上必需要额外加陀螺才能保持稳定。程序经过飞行验证,但是使用者一切后果自负,包括但不限于俯仰发散、深失速、尾旋、上树、提控回家,务必在开阔无人的地方进行测试。

//传感器:维特智能JY-ME01轴编码器,精度0.1°。通信用的串口,从传感器的板子的串口TX焊线出来连arduino板子的RX即可。

//传感器输出数据是字符串,格式为 Angle:xxx.xxx °,因此数据需要处理一下,从字符串中把后面的数字提取出来,再除以1000,得到攻角的值

#include <Servo.h>;

Servo servo;

char comdata = "";//字符串函数

String aoa = "";//字符串函数

float AOA;

byte PWM_PIN = 2; //将PWM的信号线输入到3号引脚

int pwm_value;

float AOAlimitmax=30;//攻角限制器+-30

float P=1.1;//P值根据实际舵量自行设置。鸭翼偏转角需要略大于风标偏转角。


void setup() {

  servo.attach(9);

  servo.write(90);

  delay(500);

  pinMode(PWM_PIN, INPUT);//将该引脚设置为输入模式

  Serial.begin(9600);//打开串口波特率9600

}


void loop()

{

    pwm_value = pulseIn(PWM_PIN, HIGH);//检测高电平

    float AOAcmd=(pwm_value-1000)*(AOAlimitmax*2)/1000-AOAlimitmax ;//pwm1000=-AOAlimitmax,pwm1500=0,pwm2000=AOAlimitmax 

    String aoa = "";//缓存清零

    while (Serial.available() > 0)//循环串口是否有数据

    { 

      comdata=Serial.read();

      if(isDigit(comdata)) //是数字就执行

        {

          aoa += comdata;//叠加数据到aoa

        }

      delay(2);//延时等待响应

    }

  if (aoa.length()>0)//如果aoa有数据

  { 

      AOA=aoa.toFloat();

      AOA=AOA/1000-180;

  }

  delay(2);//延时等待响应

  int theta=P*(AOAcmd-AOA)+90+5;

  if (theta>140)

  {theta=140;}

  if (theta<60)

  {theta=60;}

  servo.write(theta);

  //Serial.print(pwm_value);

  //Serial.print(",");

  //Serial.print(AOAcmd);

  //Serial.print(",");

  //Serial.print(AOA);

  //Serial.print(",");

  //Serial.println(theta);

}

// https://www.bilibili.com/video/BV1og411E7xT/?spm_id_from=333.999.0.0

航模自动控制全动鸭翼的小程序(arduino)的评论 (共 条)

分享到微博请遵守国家法律