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