ArduCanard V2.0 航模自动控制鸭翼小程序第二版
//ArduCanard是用arduino控制鸭翼的一个小程序,纯属个人瞎写,但是恰好可以运行。
//V2.0版优化内容:1.增加攻角限制器,在攻角大于35°后鸭翼不再响应拉杆量,变成纯正风向标。 2.舵机直接用pwm输出来控制,不用servo.h了,似乎可以避免串口和servo.h共用timer造成的卡顿问题。卡顿似乎有改善。
// 飞行效果:https://www.bilibili.com/video/BV16v4y1s7VB/?spm_id_from=333.999.0.0 //
//警告:该程序用于把鸭翼变成风向标,便于静不稳定飞机或者放宽静稳定飞机的控制。飞机上必需要额外加陀螺才能保持稳定。程序经过飞行验证,但是使用者一切后果自负,包括但不限于俯仰发散、深失速、尾旋、上树、提控回家,务必在开阔无人的地方进行测试。
//传感器:维特智能JY-ME01轴编码器,精度0.1°。通信用的串口,从传感器的板子的串口TX焊线出来连arduino板子的RX即可。
//传感器输出数据是字符串,格式为 Angle:xxx.xxx °,因此数据需要处理一下,从字符串中把后面的数字提取出来,再除以1000,得到攻角的值(此处因为用了delay函数,导致程序运行有延时,后续会改进)
char comdata = "";//字符串函数
String aoa = "";//字符串函数
float AOA;
byte PWM_PIN = 2; //将PWM的信号线输入到3号引脚
int pwm_value;
float AOAlimitmax=30;//攻角限制+-30
int theta;
void servopulse(int angle)//定义一个脉冲函数
{
int pulsewidth=(angle*11)+500; //将角度转化为500-2480的脉宽值
digitalWrite(9,HIGH); //将舵机接口电平至高
delayMicroseconds(pulsewidth); //延时脉宽值的微秒数
digitalWrite(9,LOW); //将舵机接口电平至低
delayMicroseconds(20000-pulsewidth);
}
void setup() {
pinMode(9,OUTPUT);//设定舵机接口为输出接口
servopulse(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);//延时等待响应
if (AOA>35&&AOAcmd>0)
{theta=-1.1*AOA+90+5;}
else
{theta=-1.1*(AOA-AOAcmd)+90+5;}
if (theta>140)
{theta=140;}
if (theta<60)
{theta=60;}
servopulse(theta);
//Serial.print(pwm_value);
//Serial.print(",");
//Serial.print(AOAcmd);
//Serial.print(",");
//Serial.print(AOA);
//Serial.print(",");
//Serial.println(theta);
}