航模自動(dòng)控制全動(dòng)鴨翼的小程序(arduino)
//警告:該程序用于把鴨翼變成風(fēng)向標(biāo),便于靜不穩(wěn)定飛機(jī)或者放寬靜穩(wěn)定飛機(jī)的控制。飛機(jī)上必需要額外加陀螺才能保持穩(wěn)定。程序經(jīng)過(guò)飛行驗(yàn)證,但是使用者一切后果自負(fù),包括但不限于俯仰發(fā)散、深失速、尾旋、上樹(shù)、提控回家,務(wù)必在開(kāi)闊無(wú)人的地方進(jìn)行測(cè)試。
//傳感器:維特智能JY-ME01軸編碼器,精度0.1°。通信用的串口,從傳感器的板子的串口TX焊線出來(lái)連arduino板子的RX即可。
//傳感器輸出數(shù)據(jù)是字符串,格式為 Angle:xxx.xxx °,因此數(shù)據(jù)需要處理一下,從字符串中把后面的數(shù)字提取出來(lái),再除以1000,得到攻角的值
#include <Servo.h>;
Servo servo;
char comdata = "";//字符串函數(shù)
String aoa = "";//字符串函數(shù)
float AOA;
byte PWM_PIN = 2; //將PWM的信號(hào)線輸入到3號(hào)引腳
int pwm_value;
float AOAlimitmax=30;//攻角限制器+-30
float P=1.1;//P值根據(jù)實(shí)際舵量自行設(shè)置。鴨翼偏轉(zhuǎn)角需要略大于風(fēng)標(biāo)偏轉(zhuǎn)角。
void setup() {
? servo.attach(9);
? servo.write(90);
? delay(500);
? pinMode(PWM_PIN, INPUT);//將該引腳設(shè)置為輸入模式
? Serial.begin(9600);//打開(kāi)串口波特率9600
}
void loop()
{
? ? pwm_value = pulseIn(PWM_PIN, HIGH);//檢測(cè)高電平
? ? float AOAcmd=(pwm_value-1000)*(AOAlimitmax*2)/1000-AOAlimitmax ;//pwm1000=-AOAlimitmax,pwm1500=0,pwm2000=AOAlimitmax?
? ? String aoa = "";//緩存清零
? ? while (Serial.available() > 0)//循環(huán)串口是否有數(shù)據(jù)
? ? {?
? ? ? comdata=Serial.read();
? ? ? if(isDigit(comdata)) //是數(shù)字就執(zhí)行
? ? ? ? {
? ? ? ? ? aoa += comdata;//疊加數(shù)據(jù)到aoa
? ? ? ? }
? ? ? delay(2);//延時(shí)等待響應(yīng)
? ? }
? if (aoa.length()>0)//如果aoa有數(shù)據(jù)
? {?
? ? ? AOA=aoa.toFloat();
? ? ? AOA=AOA/1000-180;
? }
? delay(2);//延時(shí)等待響應(yīng)
? 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