Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: mbed MPU6050_2 SDFileSystem3 HCSR04_2
Diff: main.cpp
- Revision:
- 46:ebbe73af073d
- Parent:
- 45:eebdf6fa7b15
--- a/main.cpp Wed Sep 26 23:43:14 2018 +0000
+++ b/main.cpp Sat Dec 22 06:27:25 2018 +0000
@@ -159,1579 +159,14 @@
BombingMode bombing_mode = Takeoff;
static int16_t autopwm[8] = {1455,1450,1176,1628,1417,1452};
-/*
-//1号機
-static int16_t trimpwm[6] = {1580,1600,1176,1404,1440,1448};
-int16_t maxpwm[6] = {1796,1936,1848,1740,1820,1856};
-int16_t minpwm[6] = {1182,1265,1176,1068,1180,1176};
-const int16_t reverce[4] = {Reverce_falfalla[0],Reverce_falfalla[1],Reverce_falfalla[2],Reverce_falfalla[3]};
-*/
-//2号機
-
-static int16_t trimpwm[6] = {1455,1450,1176,1628,1417,1452};
-int16_t maxpwm[6] = {1672,1786,1848,1964,1712,1860};
-int16_t minpwm[6] = {1057,1115,1176,1292,1180,1180};
-const int16_t reverce[4] = {Reverce_falfalla[0],Reverce_falfalla[1],Reverce_falfalla[2],Reverce_falfalla[3]};
-
-
-int16_t oldTHR = 1000;
-
-int16_t g_AIL_L_Ratio_rightloop = 0.5;
-
-
-static float nowAngle[3] = {0,0,0};
-const float trimAngle[3] = {0.0, 0.0, 0.0};
-const float maxAngle[2] = {90, 90};
-const float minAngle[2] = {-90, -90};
-
-float FirstROLL = 0.0, FirstPITCH = 0.0 ,FirstYAW = 0.0;
-
-unsigned int g_distance;
-Ticker USsensor;
-static char g_buf[16];
-char g_landingcommand='Z';
-float g_SerialTargetYAW;
-
-Timer t;
-Timer t2;
-Timeout RerurnChickenServo1;
-Timeout RerurnChickenServo2;
-
-/*-----関数のプロトタイプ宣言-----*/
-void setup();
-void loop();
-
-void Init_PWM();
-void Init_servo(); //サーボ初期化
-void Init_sbus(); //SBUS初期化
-void Init_sensors();
-void DisplayClock(); //クロック状態確認
-
-//センサの値取得
-void SensingMPU();
-void UpdateDist();
-
-//void offsetRollPitch(float FirstROLL, float FirstPITCH);
-//void TransYaw(float FirstYAW);
-float TranslateNewYaw(float beforeYaw, float newzeroYaw);
-void UpdateTargetAngle(float targetAngle[3]);
-void CalculateControlValue(float targetAngle[3], float controlValue[3]);
-void UpdateAutoPWM(float controlValue[3]);
-void ConvertPWMintoRAD(float targetAngle[3]);
-inline float CalcRatio(float value, float trim, float limit);
-bool CheckSW_Up(Channel ch);
-int16_t ThresholdMaxMin(int16_t value, int16_t max, int16_t min);
-inline int16_t SetTHRinRatio(float ratio);
-
-//sbus割り込み
-void Update_PWM(); //マニュアル・自動モードのpwmデータを整形しpwm変数に入力
-void Output_PWM(int16_t pwm[6]); //pwmをサーボへ出力
-
-//シリアル割り込み
-void getSF_Serial();
-float ConvertByteintoFloat(char high, char low);
-
-
-//SD設定
-int GetParameter(FILE *fp, const char *paramName,char parameter[]);
-int SetOptions(float *g_kpELE, float *g_kiELE, float *g_kdELE,
- float *g_kpRUD, float *g_kiRUD, float *g_kdRUD,
- float *g_rightloopROLL, float *g_rightloopPITCH,
- float *g_leftloopROLL, float *g_leftloopPITCH,
- float *g_gostraightROLL, float *g_gostraightPITCH,
- float *g_takeoffTHR, float *g_loopTHR,
- float *g_rightloopROLLshort, float *g_rightloopPITCHshort,
- float *g_leftloopROLLshort, float *g_leftloopPITCHshort,
- float *g_glideloopROLL, float *g_glideloopPITCH,
- float *g_kpAIL, float *g_kiAIL, float *g_kdAIL,
- int *g_rightloopRUD, int *g_rightloopshortRUD,
- int *g_leftloopRUD, int *g_leftloopshortRUD,
- int *g_glideRUD,
- float *g_rightloopROLL_approach,float *g_leftloopROLL_approach,
- int *g_rightloopRUD_approach,int *g_leftloopRUD_approach,
- float *g_rightloopPITCH_approach,float *g_leftloopPITCH_approach
- );
-//switch2割り込み
-void ResetTrim();
-
-//自動操縦
-void UpdateTargetAngle_GoStraight(float targetAngle[3]);
-void UpdateTargetAngle_GoStraight_zero(float targetAngle[3]); //着陸時にスロットルが0の時の直進
-void UpdateTargetAngle_Rightloop(float targetAngle[3]);
-void UpdateTargetAngle_Rightloop_short(float targetAngle[3]);
-void UpdateTargetAngle_Rightloop_zero(float targetAngle[3]); //着陸時にスロットルが0の時の右旋回
-void UpdateTargetAngle_Leftloop(float targetAngle[3]);
-void UpdateTargetAngle_Leftloop_short(float targetAngle[3]);
-void UpdateTargetAngle_Leftloop_zero(float targetAngle[3]); //着陸時にスロットルが0の時の左旋回
-void UpdateTargetAngle_Moebius(float targetAngle[3]);
-void UpdateTargetAngle_Glide(float targetAngle[3]);
-void UpdateTargetAngle_Takeoff(float targetAngle[3]);
-void UpdateTargetAngle_Approach(float targetAngle[3]);
-void Take_off_and_landing(float targetAngle[3]);
-
-int Rotate(float targetAngle[3], float TargetYAW);
-
-//投下
-void Chicken_Drop();
-void ReturnChickenServo1();
-void ReturnChickenServo2();
-
-//超音波による高度補正
-void checkHeight(float targetAngle[3]);
-void UpdateTargetAngle_NoseUP(float targetAngle[3]);
-void UpdateTargetAngle_NoseDOWN(float targetAngle[3]);
-
-//デバッグ用
-void Sbusprintf();
-void DebugPrint();
-
-/*---関数のプロトタイプ宣言終わり---*/
-
-int main()
-{
- setup();
-
-
+int main(void){
while(1){
-
- loop();
-
-
- NVIC_DisableIRQ(USART1_IRQn);
- if(!CheckSW_Up(Ch7)){
- led3=0;
- }else{
- led3=1;
- }
- NVIC_EnableIRQ(USART1_IRQn);
- }
-
-}
-
-void setup(){
- //buzzer = 0;
- led1 = 1;
- led2 = 1;
- led3 = 1;
- led4 = 1;
-
- SetOptions(&g_kpELE, &g_kiELE, &g_kdELE,
- &g_kpRUD, &g_kiRUD, &g_kdRUD,
- &g_rightloopROLL, &g_rightloopPITCH,
- &g_leftloopROLL, &g_leftloopPITCH,
- &g_gostraightROLL, &g_gostraightPITCH,
- &g_takeoffTHR, &g_loopTHR,
- &g_rightloopROLLshort, &g_rightloopPITCHshort,
- &g_leftloopROLLshort, &g_leftloopPITCHshort,
- &g_glideloopROLL, &g_glideloopPITCH,
- &g_kpAIL, &g_kiAIL,&g_kdAIL,
- &g_rightloopRUD, &g_rightloopshortRUD,
- &g_leftloopRUD, &g_leftloopshortRUD,
- &g_glideloopRUD,
- &g_rightloopROLL_approach,&g_leftloopROLL_approach,
- &g_rightloopRUD_approach,&g_leftloopRUD_approach,
- &g_rightloopPITCH_approach,&g_leftloopPITCH_approach
- );
-
-
- Init_PWM();
- Init_servo();
- Init_sbus();
- Init_sensors();
- //switch2.rise(ResetTrim);
-
- USsensor.attach(&UpdateDist, 0.05);
-
- NVIC_SetPriority(USART1_IRQn,0);
- NVIC_SetPriority(EXTI0_IRQn,1);
- NVIC_SetPriority(TIM5_IRQn,2);
- NVIC_SetPriority(EXTI9_5_IRQn,3);
- DisplayClock();
- t.start();
-
-
- pc.printf("MPU calibration start\r\n");
-
- float offsetstart = t.read();
- while(t.read() - offsetstart < 26){
- SensingMPU();
- for(uint8_t i=0; i<3; i++) pc.printf("%3.2f\t",nowAngle[i]);
- pc.printf("\r\n");
- led1 = !led1;
- led2 = !led2;
- led3 = !led3;
- led4 = !led4;
- }
-
- pc.attach(getSF_Serial, Serial::RxIrq);
- NVIC_SetPriority(USART2_IRQn,4);
-
- FirstROLL = nowAngle[ROLL];
- FirstPITCH = nowAngle[PITCH];
- nowAngle[ROLL] -=FirstROLL;
- nowAngle[PITCH] -=FirstPITCH;
-
- led1 = 0;
- led2 = 0;
- led3 = 0;
- led4 = 0;
- wait(0.2);
-
-
- pc.printf("All initialized\r\n");
-}
-
-void loop(){
- static float targetAngle[3] = {0.0, 0.0, 0.0}, controlValue[2] = {0.0, 0.0};
- SensingMPU();
- UpdateTargetAngle(targetAngle);
- CalculateControlValue(targetAngle, controlValue);
- UpdateAutoPWM(controlValue);
-
-
- //NVIC_SetPriority(TIM5_IRQn,4);
- //NVIC_SetPriority(USART2_IRQn,2);
-
- wait_ms(23);
-
- //NVIC_SetPriority(TIM5_IRQn,2);
- //NVIC_SetPriority(USART2_IRQn,4);
-
-
- // pc.printf("6\r\n");
- //NVIC_DisableIRQ(USART2_IRQn);
- //pc.printf("%c",g_landingcommand);
- //NVIC_EnableIRQ(USART2_IRQn);
-#if DEBUG_PRINT_INLOOP
- //Sbusprintf();
- DebugPrint();
-#endif
-}
-
-//サーボ初期化関数
-void Init_servo(){
-
- servo1.period_ms(14);
- servo1.pulsewidth_us(trimpwm[AIL_R]);
-
- servo2.period_ms(14);
- servo2.pulsewidth_us(trimpwm[ELE]);
-
- servo3.period_ms(14);
- servo3.pulsewidth_us(trimpwm[THR]);
-
- servo4.period_ms(14);
- servo4.pulsewidth_us(trimpwm[RUD]);
-
- servo5.period_ms(14);
- servo5.pulsewidth_us(trimpwm[DROP]);
-
- servo6.period_ms(14);
- servo6.pulsewidth_us(trimpwm[AIL_L]);
-
- pc.printf("servo initialized\r\n");
-}
-
-//Sbus初期化
-void Init_sbus(){
- sbus.initialize();
- sbus.setLastfuncPoint(Update_PWM);
- sbus.startInterrupt();
-}
-
-void Init_sensors(){
- if(mpu6050.setup() == -1){
- pc.printf("failed initialize\r\n");
- while(1){
- led1 = 1; led2 = 0; led3 = 1; led4 = 0;
- wait(1);
- led1 = 0; led2 = 1; led3 = 0; led4 = 1;
- wait(1);
- }
- }
-}
-
-void Init_PWM(){
- pc.printf("PWM initialized\r\n");
-}
-
-void DisplayClock(){
- pc.printf("System Clock = %d[MHz]\r\n", HAL_RCC_GetSysClockFreq()/1000000);
- pc.printf("HCLK Clock = %d[MHz]\r\n", HAL_RCC_GetHCLKFreq()/1000000);
- pc.printf("PCLK1 Clock = %d[MHz]\r\n", HAL_RCC_GetPCLK1Freq()/1000000);
- pc.printf("PCLK2 Clock = %d[MHz]\r\n", HAL_RCC_GetPCLK2Freq()/1000000);
- pc.printf("\r\n");
-}
-
-void UpdateTargetAngle(float targetAngle[3]){
-
-
- static int16_t count_op = 0;
-#if DEBUG_SEMIAUTO
- switch(operation_mode){
- case StartUp:
- if(!CheckSW_Up(Ch7) && CheckSW_Up(Ch8)){
- count_op++;
- if(count_op > changeModeCount){
- operation_mode = SemiAuto;
- pc.printf("Goto SemiAuto mode\r\n");
- count_op = 0;
- }
- }else count_op = 0;
- break;
-
- case SemiAuto:
- /* 大会用では以下のif文を入れてoperation_modeを変える
- if(CheckSW_Up(Ch6)){
- count_op++;
- if(count_op>changeModeCount){
- output_status = XXX;
- led2 = 0;
- pc.printf("Goto XXX mode\r\n");
- count_op = 0;
- }else count_op = 0;
- ConvertPWMintoRAD(targetAngle);
- }
- */
- ConvertPWMintoRAD(targetAngle);
- break;
-
- default:
- operation_mode = SemiAuto;
- break;
- }
-
-#else
-
- switch(operation_mode){
- case StartUp:
- if(!CheckSW_Up(Ch7) && !CheckSW_Up(Ch8)){ //ch7;自動・手動切り替え ch8;自動操縦モード切替
- count_op++;
- if(count_op > changeModeCount){
- operation_mode = RightLoop;
- pc.printf("Goto RightLoop mode\r\n");
- count_op = 0;
- }
- }else count_op = 0;
- break;
-
- case RightLoop:
- if(!CheckSW_Up(Ch7) && CheckSW_Up(Ch8)){
- count_op++;
- if(count_op > changeModeCount){
- operation_mode = LeftLoop;
- pc.printf("Goto LeftLoop mode\r\n");
- count_op = 0;
- }
- }else count_op = 0;
- UpdateTargetAngle_Rightloop(targetAngle);
-
- break;
-
- case LeftLoop:
- if(!CheckSW_Up(Ch7) && !CheckSW_Up(Ch8)){
- count_op++;
- if(count_op > changeModeCount){
- operation_mode = GoStraight;
- pc.printf("Goto GoStraight mode\r\n");
- count_op = 0;
- }
- }else count_op = 0;
- UpdateTargetAngle_Leftloop(targetAngle);
- break;
-
- case GoStraight:
- if(!CheckSW_Up(Ch7) && CheckSW_Up(Ch8)){
- count_op++;
- if(count_op > changeModeCount){
- operation_mode = Moebius;
- pc.printf("Goto Moebius mode\r\n");
- count_op = 0;
- }
- }else count_op = 0;
- UpdateTargetAngle_GoStraight(targetAngle);
- break;
-
- case Moebius:
- if(!CheckSW_Up(Ch7) && !CheckSW_Up(Ch8)){
- count_op++;
- if(count_op > changeModeCount){
- operation_mode = Glide;
- pc.printf("Goto Glide mode\r\n");
- count_op = 0;
- }
- }else count_op = 0;
- UpdateTargetAngle_Moebius(targetAngle);
- break;
-
- case Glide:
- if(!CheckSW_Up(Ch7) && CheckSW_Up(Ch8)){
- count_op++;
- if(count_op > changeModeCount){
- operation_mode = BombwithPC;
- pc.printf("Goto Bombing mode\r\n");
- pc.attach(getSF_Serial, Serial::RxIrq);
- count_op = 0;
- }
- }else count_op = 0;
- UpdateTargetAngle_Glide(targetAngle);
- break;
-
- case BombwithPC:
- if(!CheckSW_Up(Ch7) && !CheckSW_Up(Ch8)){
- count_op++;
- if(count_op > changeModeCount){
- operation_mode = RightLoop;
- pc.printf("Goto RightLoop mode\r\n");
- pc.attach(NULL, Serial::RxIrq);
- count_op = 0;
- }
- }else count_op = 0;
- Take_off_and_landing(targetAngle);
- break;
-
- default:
- operation_mode = StartUp;
- break;
- }
-#endif
-
- if(CheckSW_Up(Ch7)){
- output_status = Auto;
- led1 = 1;
- }else{
- output_status = Manual;
- led1 = 0;
- }
-
-
-}
-
-int GetParameter(FILE *fp, const char *paramName,char parameter[]){
- int i=0, j=0;
- int strmax = 200;
- char str[strmax];
-
- rewind(fp); //ファイル位置を先頭に
- while(1){
- if (fgets(str, strmax, fp) == NULL) {
- return 0;
- }
- if (!strncmp(str, paramName, strlen(paramName))) {
- while (str[i++] != '=') {}
- while (str[i] != '\n') {
- parameter[j++] = str[i++];
- }
- parameter[j] = '\0';
- return 1;
- }
- }
-}
-
-
-//sdによる設定
-int SetOptions(float *g_kpELE, float *g_kiELE, float *g_kdELE,
- float *g_kpRUD, float *g_kiRUD, float *g_kdRUD,
- float *g_rightloopROLL, float *g_rightloopPITCH,
- float *g_leftloopROLL, float *g_leftloopPITCH,
- float *g_gostraightROLL, float *g_gostraightPITCH,
- float *g_takeoffTHR, float *g_loopTHR,
- float *g_rightloopROLLshort, float *g_rightloopPITCHshort,
- float *g_leftloopROLLshort, float *g_leftloopPITCHshort,
- float *g_glideloopROLL, float *g_glideloopPITCH,
- float *g_kpAIL, float *g_kiAIL, float *g_kdAIL,
- int *g_rightloopRUD, int *g_rightloopshortRUD,
- int *g_leftloopRUD, int *g_leftloopshortRUD,
- int *g_glideloopRUD,
- float *g_rightloopROLL_approach,float *g_leftloopROLL_approach,
- int *g_rightloopRUD_approach,int *g_leftloopRUD_approach,
- float *g_rightloopPITCH_approach,float *g_leftloopPITCH_approach
- ){
-
- pc.printf("SDsetup start.\r\n");
-
- FILE *fp;
- char parameter[40]; //文字列渡す用の配列
- int SDerrorcount = 0; //取得できなかった数を返す
- const char *paramNames[] = {
- "KP_ELEVATOR",
- "KI_ELEVATOR",
- "KD_ELEVATOR",
- "KP_RUDDER",
- "KI_RUDDER",
- "KD_RUDDER",
- "RIGHTLOOP_ROLL",
- "RIGHTLOOP_PITCH",
- "LEFTLOOP_ROLL",
- "LEFTLOOP_PITCH",
- "GOSTRAIGHT_ROLL",
- "GOSTRAIGHT_PITCH",
- "TAKEOFF_THR_RATE",
- "LOOP_THR_RATE",
- "RIGHTLOOP_ROLL_SHORT",
- "RIGHTLOOP_PITCH_SHORT",
- "LEFTLOOP_ROLL_SHORT",
- "LEFTLOOP_PITCH_SHORT",
- "AUTOGLIDE_ROLL",
- "AUTOGLIDE PITCH",
- "KP_AILERON",
- "KI_AILERON",
- "KD_AILERON",
- "RIGHTLOOP_RUDDER",
- "RIGHTLOOPSHORT_RUDDER",
- "LEFTLOOP_RUDDER",
- "LEFTLOOPSHORT_RUDDER",
- "GLIDELOOP_RUDDER",
- "RIGHTLOOP_ROLL_APPROACH",
- "LEFTLOOP_ROLL_APPROACH",
- "RIGHTLOOP_RUDDER_APPROACH",
- "LEFTLOOP_RUDDER_APPROACH",
- "RIGHTLOOP_PITCH_APPROACH",
- "LEFTLOOP_PITCH_APPROACH",
- };
-
- fp = fopen("/sd/option.txt","r");
-
- if(fp != NULL){ //開けたら
- pc.printf("File was openned.\r\n");
- if(GetParameter(fp,paramNames[0],parameter)) *g_kpELE = atof(parameter);
- else{ *g_kpELE = KP_ELE;
- SDerrorcount++;
- }
- if(GetParameter(fp,paramNames[1],parameter)) *g_kiELE = atof(parameter);
- else{ *g_kiELE = KI_ELE;
- SDerrorcount++;
- }
- if(GetParameter(fp,paramNames[2],parameter)) *g_kdELE = atof(parameter);
- else{ *g_kdELE = KD_ELE;
- SDerrorcount++;
- }
- if(GetParameter(fp,paramNames[3],parameter)) *g_kpRUD = atof(parameter);
- else{ *g_kpRUD = KP_RUD;
- SDerrorcount++;
- }
- if(GetParameter(fp,paramNames[4],parameter)) *g_kiRUD = atof(parameter);
- else{ *g_kiRUD = KI_RUD;
- SDerrorcount++;
- }
- if(GetParameter(fp,paramNames[5],parameter)) *g_kdRUD = atof(parameter);
- else{ *g_kdRUD = KD_RUD;
- SDerrorcount++;
- }
- if(GetParameter(fp,paramNames[6],parameter)) *g_rightloopROLL = atof(parameter);
- else{ *g_rightloopROLL = RIGHT_ROLL;
- SDerrorcount++;
- }
- if(GetParameter(fp,paramNames[7],parameter)) *g_rightloopPITCH = atof(parameter);
- else{ *g_rightloopPITCH = RIGHT_PITCH;
- SDerrorcount++;
- }
- if(GetParameter(fp,paramNames[8],parameter)) *g_leftloopROLL = atof(parameter);
- else{ *g_leftloopROLL = LEFT_ROLL;
- SDerrorcount++;
- }
- if(GetParameter(fp,paramNames[9],parameter)) *g_leftloopPITCH = atof(parameter);
- else{ *g_leftloopPITCH = LEFT_PITCH;
- SDerrorcount++;
- }
- if(GetParameter(fp,paramNames[10],parameter)) *g_gostraightROLL = atof(parameter);
- else{ *g_gostraightROLL = STRAIGHT_ROLL;
- SDerrorcount++;
- }
- if(GetParameter(fp,paramNames[11],parameter)) *g_gostraightPITCH = atof(parameter);
- else{ *g_gostraightPITCH = STRAIGHT_PITCH;
- SDerrorcount++;
- }
- if(GetParameter(fp,paramNames[12],parameter)) *g_takeoffTHR = atof(parameter);
- else{ *g_takeoffTHR = TAKEOFF_THR;
- SDerrorcount++;
- }
- if(GetParameter(fp,paramNames[13],parameter)) *g_loopTHR = atof(parameter);
- else{ *g_loopTHR = LOOP_THR;
- SDerrorcount++;
- }
- if(GetParameter(fp,paramNames[14],parameter)) *g_rightloopROLLshort = atof(parameter);
- else{ *g_rightloopROLLshort = RIGHT_ROLL_SHORT;
- SDerrorcount++;
- }
- if(GetParameter(fp,paramNames[15],parameter)) *g_rightloopPITCHshort = atof(parameter);
- else{ *g_rightloopPITCHshort = RIGHT_PITCH_SHORT;
- SDerrorcount++;
- }
- if(GetParameter(fp,paramNames[16],parameter)) *g_leftloopROLLshort = atof(parameter);
- else{ *g_leftloopROLLshort = LEFT_ROLL_SHORT;
- SDerrorcount++;
- }
- if(GetParameter(fp,paramNames[17],parameter)) *g_leftloopPITCHshort = atof(parameter);
- else{ *g_leftloopPITCHshort = LEFT_PITCH_SHORT;
- SDerrorcount++;
- }
- if(GetParameter(fp,paramNames[18],parameter)) *g_glideloopROLL = atof(parameter);
- else{ *g_glideloopROLL = GLIDE_ROLL;
- SDerrorcount++;
- }
- if(GetParameter(fp,paramNames[19],parameter)) *g_glideloopPITCH = atof(parameter);
- else{ *g_glideloopPITCH = GLIDE_PITCH;
- SDerrorcount++;
- }
- if(GetParameter(fp,paramNames[20],parameter)) *g_kpAIL = atof(parameter);
- else{ *g_kpAIL = KP_AIL;
- SDerrorcount++;
- }
- if(GetParameter(fp,paramNames[21],parameter)) *g_kiAIL = atof(parameter);
- else{ *g_kiAIL = KI_AIL;
- SDerrorcount++;
- }
- if(GetParameter(fp,paramNames[22],parameter)) *g_kdAIL = atof(parameter);
- else{ *g_kdAIL = KP_AIL;
- SDerrorcount++;
- }
- if(GetParameter(fp,paramNames[23],parameter)) *g_rightloopRUD = atof(parameter);
- else{ *g_rightloopRUD = RIGHTLOOP_RUD;
- SDerrorcount++;
- }
- if(GetParameter(fp,paramNames[24],parameter)) *g_rightloopshortRUD = atof(parameter);
- else{ *g_rightloopshortRUD = RIGHTLOOPSHORT_RUD;
- SDerrorcount++;
- }
- if(GetParameter(fp,paramNames[25],parameter)) *g_leftloopRUD = atof(parameter);
- else{ *g_leftloopshortRUD = LEFTLOOP_RUD;
- SDerrorcount++;
- }
- if(GetParameter(fp,paramNames[26],parameter)) *g_leftloopshortRUD = atof(parameter);
- else{ *g_leftloopshortRUD = LEFTLOOPSHORT_RUD;
- SDerrorcount++;
- }
- if(GetParameter(fp,paramNames[27],parameter)) *g_glideloopRUD = atof(parameter);
- else{ *g_glideloopRUD = GLIDELOOP_RUD;
- SDerrorcount++;
- }
- if(GetParameter(fp,paramNames[28],parameter)) *g_rightloopROLL_approach = atof(parameter);
- else{ *g_rightloopROLL_approach = RIGHTLOOPROLL_APPROACH;
- SDerrorcount++;
- }
- if(GetParameter(fp,paramNames[29],parameter)) *g_leftloopROLL_approach= atof(parameter);
- else{ *g_leftloopROLL_approach = LEFTLOOPROLL_APPROACH;
- SDerrorcount++;
- }
- if(GetParameter(fp,paramNames[30],parameter)) *g_rightloopRUD_approach = atof(parameter);
- else{ *g_rightloopRUD_approach = RIGHTLOOPRUD_APPROACH;
- SDerrorcount++;
- }
- if(GetParameter(fp,paramNames[31],parameter)) *g_leftloopRUD= atof(parameter);
- else{ *g_leftloopRUD= LEFTLOOPRUD_APPROACH;
- SDerrorcount++;
- }
- if(GetParameter(fp,paramNames[32],parameter)) *g_rightloopPITCH_approach = atof(parameter);
- else{ *g_rightloopPITCH_approach = RIGHTLOOPPITCH_APPROACH;
- SDerrorcount++;
- }
- if(GetParameter(fp,paramNames[33],parameter)) *g_leftloopPITCH_approach = atof(parameter);
- else{ *g_leftloopPITCH_approach = LEFTLOOPPITCH_APPROACH;
- SDerrorcount++;
+ printf("Hello World\r\n");
+ //servo1.period_ms(14);
+ servo1.pulsewidth_us(1300);
+ wait(1);
+ //servo1.period_ms(14);
+ servo1.pulsewidth_us(1200);
}
-
- fclose(fp);
-
- }else{ //ファイルがなかったら
- pc.printf("fp was null.\r\n");
- *g_kpELE = KP_ELE;
- *g_kiELE = KI_ELE;
- *g_kdELE = KD_ELE;
- *g_kpRUD = KP_RUD;
- *g_kiRUD = KI_RUD;
- *g_kdRUD = KD_RUD;
- *g_rightloopROLL = RIGHT_ROLL;
- *g_rightloopPITCH = RIGHT_PITCH;
- *g_leftloopROLL = LEFT_ROLL;
- *g_leftloopPITCH = LEFT_PITCH;
- *g_gostraightROLL = STRAIGHT_ROLL;
- *g_gostraightPITCH = STRAIGHT_PITCH;
- *g_takeoffTHR = TAKEOFF_THR;
- *g_loopTHR = LOOP_THR;
- *g_kpAIL = KP_AIL; //パラメータ変えるのお忘れなく!!
- *g_kiAIL = KI_AIL;
- *g_kdAIL = KD_AIL;
- *g_rightloopRUD = RIGHTLOOP_RUD;
- *g_rightloopshortRUD = RIGHTLOOPSHORT_RUD;
- *g_leftloopRUD = LEFTLOOP_RUD;
- *g_leftloopshortRUD = LEFTLOOPSHORT_RUD;
- *g_glideloopRUD = GLIDELOOP_RUD;
- *g_rightloopROLL_approach = RIGHTLOOPROLL_APPROACH;
- *g_leftloopROLL_approach = LEFTLOOPROLL_APPROACH;
- *g_rightloopRUD_approach = RIGHTLOOPRUD_APPROACH;
- *g_leftloopRUD_approach = LEFTLOOPRUD_APPROACH;
- *g_rightloopPITCH_approach = RIGHTLOOPPITCH_APPROACH;
- *g_leftloopPITCH_approach = LEFTLOOPPITCH_APPROACH;
-
- SDerrorcount = -1;
- }
- pc.printf("SDsetup finished.\r\n");
- if(SDerrorcount == 0) pc.printf("setting option is success\r\n");
- else if(SDerrorcount == -1) pc.printf("ERROR 1. cannot open option\r\n");
- else if(SDerrorcount > 0) pc.printf("ERROR 2. reading parameter is failed[%d]\r\n",SDerrorcount);
-
- pc.printf("kpELE = %f, kiELE = %f, kdELE = %f\r\n", *g_kpRUD, *g_kiRUD, *g_kdRUD);
- pc.printf("kpRUD = %f, kiRUD = %f, kdRUD = %f\r\n", *g_kpELE, *g_kiELE, *g_kdELE);
- pc.printf("rightloopROLL = %f, rightloopPITCH = %f\r\n", *g_rightloopROLL, *g_rightloopPITCH);
- pc.printf("leftloopROLL = %f, g_leftloopPITCH = %f\r\n", *g_leftloopROLL, *g_leftloopPITCH);
- pc.printf("gostraightROLL = %f, g_gostraightPITCH = %f\r\n", *g_gostraightROLL, *g_gostraightPITCH);
- pc.printf("g_takeoffTHR = %f, g_loopTHR = %f\r\n", *g_takeoffTHR, *g_loopTHR);
- pc.printf("rightloopROLLshort = %f, rightloopPITCHshort = %f\r\n", *g_rightloopROLLshort, *g_rightloopPITCHshort);
- pc.printf("leftloopROLLshort = %f, g_leftloopPITCHshort = %f\r\n", *g_leftloopROLLshort, *g_leftloopPITCHshort);
- pc.printf("glideROLL = %f, glidePITCH = %f\r\n", *g_glideloopROLL, *g_glideloopPITCH);
- pc.printf("kpAIL = %f,kiAIL = %f,kdAIL = %f\r\n ",*g_kpAIL,*g_kiAIL,*g_kdAIL);
- pc.printf("RIGHTLOOPRUD = %d,RIGHTLOOPSHORTRUD = %d\r\n",*g_rightloopRUD,*g_rightloopshortRUD);
- pc.printf("LEFTTLOOPRUD = %d,LEFTLOOPSHORTRUD = %d\r\n",*g_leftloopRUD,*g_leftloopshortRUD);
- pc.printf("GLIDELOOPRUD = %d\r\n",*g_glideloopRUD);
- pc.printf("RIGHTLOOP_ROLL_APPROACH = %f, LEFTLOOP_ROLL_APPROACH= %f\r\n",*g_rightloopROLL_approach,*g_leftloopROLL_approach);
- pc.printf("RIGHTLOOP_RUD_APPROACH = %d, LEFTLOOP_RUD_APPROACH = %d\r\n",*g_rightloopRUD_approach,*g_leftloopRUD_approach);
- pc.printf("RIGHTLOOP_PITCH_APPROACH = %f, LEFTLOOP_PITCH_APPROACH = %f\r\n",*g_rightloopPITCH_approach,*g_leftloopPITCH_approach);
-
- return SDerrorcount;
-}
-
-void CalculateControlValue(float targetAngle[3], float controlValue[3]){
-
- static int t_last;
- int t_now;
- float dt;
-
- t_now = t.read_us();
- dt = (float)((t_now - t_last)/1000000.0f) ;
- t_last = t_now;
-
-
- //controlValue[ROLL] = pid_RUD.calcPID(nowAngle[ROLL], targetAngle[ROLL], dt);
- controlValue[ROLL] = pid_AIL.calcPID(nowAngle[ROLL], targetAngle[ROLL], dt); //エルロンでロール制御
- controlValue[PITCH] = pid_ELE.calcPID(nowAngle[PITCH], targetAngle[PITCH], dt);
-
-}
-
-void UpdateAutoPWM(float controlValue[3]){
- NVIC_DisableIRQ(USART1_IRQn);
- int16_t addpwm[2]; //-500~500
- addpwm[PITCH] = (float)GAIN_CONTROLVALUE_TO_PWM * controlValue[PITCH]; //センサ:機首下げ正 レバー:機首上げ正
- addpwm[ROLL] = (float)GAIN_CONTROLVALUE_TO_PWM * controlValue[ROLL]; //センサ:右回転正(8月13日時点;左回転が正!) レバー:右回転正
-
- autopwm[ELE] = trimpwm[ELE] + reverce[ELE] * addpwm[PITCH]; //rewrite
- autopwm[AIL_R] = trimpwm[AIL_R] - reverce[AIL_R] * addpwm[ROLL];
- //autopwm[THR] = oldTHR;
-
- autopwm[ELE] = ThresholdMaxMin(autopwm[ELE], maxpwm[ELE], minpwm[ELE]);
- autopwm[AIL_R] = ThresholdMaxMin(autopwm[AIL_R], maxpwm[AIL_R], minpwm[AIL_R]);
-
- NVIC_EnableIRQ(USART1_IRQn);
-}
-
-inline float CalcRatio(float value, float trim, float limit){
- return (value - trim) / (limit - trim);
-}
-
-bool CheckSW_Up(Channel ch){
-
- if(SWITCH_CHECK < sbus.manualpwm[ch]){
- return true;
- }else{
- return false;
- }
-
-}
-
-int16_t ThresholdMaxMin(int16_t value, int16_t max, int16_t min){
- if(value > max) return max;
- if(value < min) return min;
- return value;
-}
-
-inline int16_t SetTHRinRatio(float ratio){
- return minpwm[THR] + (int16_t)(2 * lengthdivpwm * ratio);
-}
-
-
-
-/*---SBUS割り込み処理---*/
-
-//udate_Inputで抽出したpwmデータを整形して各変数に代入する。(マニュアルモード)
-//各stabiGylo関数で算出したpwmを各変数に代入する(自動モード)
-void Update_PWM()
-{
- NVIC_DisableIRQ(USART1_IRQn);
- static int16_t pwm[6];
- static int16_t temppwm[6]={trimpwm[0],trimpwm[1],trimpwm[2],trimpwm[3],trimpwm[4],trimpwm[5]};
- static int16_t FailsafeCounter=0;
- static int16_t ResetCounter=0;
- static int16_t OKCounter=0;
-
- if(sbus.flg_ch_update == true){
-
- switch(output_status){ //マニュアルモード,自動モード,自動着陸もモードを切替
- case Manual:
- if(OKCounter!=0) break;
- for(uint8_t i=0;i<6;i++){
- pwm[i] = sbus.manualpwm[i];
- }
- oldTHR = sbus.manualpwm[THR];
- //pc.printf("update_manual\r\n");
- NVIC_EnableIRQ(USART1_IRQn);
- break;
-
- case Auto:
- if(OKCounter!=0) break;
- pwm[AIL_R] = autopwm[AIL_R]; //sbus.manualpwm[AIL];
- pwm[ELE] = autopwm[ELE];
- pwm[THR] = autopwm[THR];
- pwm[RUD] = autopwm[RUD];
- pwm[DROP] = autopwm[DROP];
- pwm[AIL_L] = autopwm[AIL_L];
-
- NVIC_EnableIRQ(USART1_IRQn);
- break;
-
- default:
- if(OKCounter!=0) break;
- for(uint8_t i=0;i<6;i++){
- pwm[i] = sbus.manualpwm[i];
- } //pc.printf("update_manual\r\n");
- NVIC_EnableIRQ(USART1_IRQn);
- break;
- }
-
- for(uint8_t i=0;i<6;i++){
- if(pwm[i]<1000 || pwm[i]>2000) pwm[i]=temppwm[i];
- temppwm[i]=pwm[i];
- }
-
- }
- //else(sbus.flg_ch_update == false) pc.printf("0\r\n");
- /* if(sbus.failsafe_status==SBUS_SIGNAL_OK){
- pc.printf("OK\r\n");
- }
- */
- //pc.printf("%d\r\n",sbus.failsafe_status);
-
- if(sbus.failsafe_status==SBUS_SIGNAL_LOST||sbus.failsafe_status==SBUS_SIGNAL_FAILSAFE) FailsafeCounter++;
- else ResetCounter++;
-
- if(ResetCounter>7){
- ResetCounter=0;
- FailsafeCounter=0;
- }
-
- if(FailsafeCounter>10){
- ResetCounter=0;
- for(uint8_t i=0;i<6;i++) pwm[i] = trimpwm[i];
-
- if(sbus.failsafe_status==SBUS_SIGNAL_OK&&sbus.flg_ch_update == true) OKCounter++;
- else OKCounter=0;
-
- if(OKCounter>10){
- OKCounter=0;
- FailsafeCounter=0;
- }
- //pc.printf("OKCounter=%d, FailsafeCounter=%d, sbus.failsafe_status=%d\r\n",OKCounter,FailsafeCounter,sbus.failsafe_status);
- }
- //if(sbus.failsafe_status==SBUS_SIGNAL_OK){FailsafeCounter=0;}
-
-
- sbus.flg_ch_update = false;
- Output_PWM(pwm);
-}
-
-
-
-
-//pwmをサーボに出力。
-void Output_PWM(int16_t pwm[5])
-{
- NVIC_DisableIRQ(USART1_IRQn);
- servo1.pulsewidth_us(pwm[0]);
- servo2.pulsewidth_us(pwm[1]);
- servo3.pulsewidth_us(pwm[2]);
- servo4.pulsewidth_us(pwm[3]);
- servo5.pulsewidth_us(pwm[4]);
- servo6.pulsewidth_us(pwm[5]);
- NVIC_EnableIRQ(USART1_IRQn);
-
-}
-
-void ResetTrim(){
- for(uint8_t i=0; i<6; i++){ //i=4から書き換え_投下サーボは入ってない模様
- trimpwm[i] = sbus.manualpwm[i];
- }
- pc.printf("reset PWM trim\r\n");
-}
-
-
-void SensingMPU(){
- //static int16_t deltaT = 0, t_start = 0;
- //t_start = t.read_us();
-
- float rpy[3] = {0}, oldrpy[3] = {0};
- static uint16_t count_changeRPY = 0;
- static bool flg_checkoutlier = false;
- NVIC_DisableIRQ(USART1_IRQn);
- NVIC_DisableIRQ(USART2_IRQn);
- NVIC_DisableIRQ(TIM5_IRQn);
- NVIC_DisableIRQ(EXTI0_IRQn);//MPU割り込み禁止
- NVIC_DisableIRQ(EXTI9_5_IRQn);//超音波割り込み禁止
-
- mpu6050.getRollPitchYaw_Skipper(rpy);
-
- NVIC_EnableIRQ(USART1_IRQn);
- NVIC_EnableIRQ(USART2_IRQn);
- NVIC_EnableIRQ(TIM5_IRQn);
- NVIC_EnableIRQ(EXTI0_IRQn);
- NVIC_EnableIRQ(EXTI9_5_IRQn);
-
-
- //外れ値対策
- for(uint8_t i=0; i<3; i++) rpy[i] *= 180.0f/PI;
- rpy[ROLL] -= FirstROLL;
- rpy[PITCH] -= FirstPITCH;
- rpy[YAW] -= FirstYAW;
-
- for(uint8_t i=0; i<3; i++) {if(rpy[i] < nowAngle[i]-10 || rpy[i] > nowAngle[i]+10) {flg_checkoutlier = true;}}
- if(!flg_checkoutlier || count_changeRPY >= 2){
- for(uint8_t i=0; i<3; i++){
- nowAngle[i] = (rpy[i] + nowAngle[i])/2.0f; //2つの移動平均
- }
- count_changeRPY = 0;
- }else count_changeRPY++;
- flg_checkoutlier = false;
-
-}
-
-float TranslateNewYaw(float beforeYaw, float newzeroYaw){
- float newYaw = beforeYaw - newzeroYaw;
-
- if(newYaw<-180.0f) newYaw += 360.0f;
- else if(newYaw>180.0f) newYaw -= 360.0f;
- return newYaw;
-}
-
-
-void getSF_Serial(){
- //NVIC_DisableIRQ(USART1_IRQn);
- //NVIC_DisableIRQ(EXTI0_IRQn);
- //NVIC_DisableIRQ(TIM5_IRQn);
-
-
- static char SFbuf[16]={'Q','Q','Q','Q','Q','Q','Q','Q','Q','Q','Q','Q','Q','Q','Q','Q'};
-
- static int bufcounter=0;
-
-
-
- if(pc.readable()) { // 受信確認
-
- SFbuf[bufcounter] = pc.getc(); // 1文字取り出し
- if(SFbuf[0]!='S'){
- //pc.printf("x");
- return;
- }
-
-
-
- //pc.printf("%c",SFbuf[bufcounter]);
-
- if(SFbuf[0]=='S'&&bufcounter<5)bufcounter++;
-
- if(bufcounter==5 && SFbuf[4]=='F'){
-
- g_landingcommand = SFbuf[1];
- //wait_ms(20);
- //if(g_landingcommand=='Y')g_SerialTargetYAW = ConvertByteintoFloat(SFbuf[2], SFbuf[3]);
- if(g_landingcommand=='Y')g_SerialTargetYAW =0.0f;
- bufcounter = 0;
- memset(SFbuf, 0, sizeof(SFbuf));
- NVIC_ClearPendingIRQ(USART2_IRQn);
- //pc.printf("command = %c, commandYAW = %f\r\n", g_landingcommand, g_SerialTargetYAW);
- }
-
- else if(bufcounter>=5){
- //pc.printf("Communication Falsed.\r\n");
- memset(SFbuf, 0, sizeof(SFbuf));
- bufcounter = 0;
- NVIC_ClearPendingIRQ(USART2_IRQn);
- }
- }
-
- //NVIC_EnableIRQ(TIM5_IRQn);
- //NVIC_EnableIRQ(EXTI0_IRQn);
- //NVIC_EnableIRQ(USART1_IRQn);
- }
-
-float ConvertByteintoFloat(char high, char low){
-
- //int16_t intvalue = (int16_t)high*256 + (int16_t)low;
- int16_t intvalue = (int16_t)(((int16_t)high << 8) | low); // Turn the MSB and LSB into a signed 16-bit value
- float floatvalue = (float)intvalue;
- return floatvalue;
-}
-
-
-//超音波割り込み
-void UpdateDist(){
- g_distance = usensor.get_dist_cm();
- usensor.start();
-}
-
-//8の字旋回
-void UpdateTargetAngle_Moebius(float targetAngle[3]){
- static uint8_t RotateCounter=0;
- static bool flg_setInStartAuto = false;
- static float FirstYAW_Moebius = 0.0;
- float newYaw_Moebius;
-
- if(!flg_setInStartAuto && CheckSW_Up(Ch7)){
- FirstYAW_Moebius = nowAngle[YAW];
- RotateCounter = 0;
- flg_setInStartAuto = true;
- }else if(!CheckSW_Up(Ch7)){
- flg_setInStartAuto = false;
- led4 = 0;
- }
- autopwm[THR]=oldTHR;
-
- newYaw_Moebius = TranslateNewYaw(nowAngle[YAW], FirstYAW_Moebius);
-
- if(RotateCounter == 0 && newYaw_Moebius >90.0 && newYaw_Moebius < 180.0) {RotateCounter++; led4 = 1; pc.printf("Rotate 90\r\n");}
- if(RotateCounter == 1 && newYaw_Moebius >-180.0 && newYaw_Moebius < -90.0) {RotateCounter++; led4 = 0; pc.printf("Rotate 180\r\n");}
- if(RotateCounter == 2 && newYaw_Moebius >-90.0 && newYaw_Moebius <-10.0) {RotateCounter++; led4 = 1; pc.printf("Rotate 270\r\n");}
- if(RotateCounter == 3 && newYaw_Moebius >0.0 && newYaw_Moebius < 90.0) {RotateCounter++; led4 = 0; pc.printf("Change Rotate direction\r\n");}
-
-
- if(RotateCounter <= 3) UpdateTargetAngle_Rightloop_short(targetAngle);
- else UpdateTargetAngle_Leftloop_short(targetAngle); //左旋回
-
-}
-
-//自動滑空
-void UpdateTargetAngle_Glide(float targetAngle[3]){
- static int THRcount = 0;
- static int t_start = 0;
- static bool flg_tstart = false;
- static bool flg_ground = false;
- int t_diff = 0;
- static int groundcount = 0;
-
- targetAngle[ROLL] = g_glideloopROLL;
-
- autopwm[RUD]=g_glideloopRUD;
- // autopwm[THR]=oldTHR;
-
-
-
- //時間計測開始設定
- if(!flg_tstart && CheckSW_Up(Ch7)){
- t_start = t.read();
- flg_tstart = true;
- pc.printf("timer start\r\n");
- }else if(!CheckSW_Up(Ch7)){
- t_start = 0;
- flg_tstart = false;
- }
-
-
- //フラグが偽であれば計測は行わない
- if(flg_tstart){
- t_diff = t.read() - t_start;
- //一定高度or15秒でled点灯
- NVIC_DisableIRQ(EXTI9_5_IRQn);
- if((groundcount>5 && g_distance>0) || t_diff > 15){
- led4 = 1;
- //pc.printf("Call [Stop!] calling!\r\n");
- }
-
- if(g_distance<250 && g_distance > 0) {
- groundcount++;
- }
- NVIC_EnableIRQ(EXTI9_5_IRQn);
- }else{
- t_diff = 0;
- groundcount = 0;
- led4 = 0;
- }
-
- NVIC_DisableIRQ(EXTI9_5_IRQn);
- if(t_diff > 17) autopwm[THR] = SetTHRinRatio(0.5);
-
- else if(g_distance<150 && g_distance>0 ){
- NVIC_DisableIRQ(EXTI9_5_IRQn);
- THRcount++;
- if(THRcount>5) flg_ground = true;
- }
- else THRcount = 0;
- NVIC_EnableIRQ(EXTI9_5_IRQn);
-
- if(flg_ground == true) {
- autopwm[THR] = SetTHRinRatio(0.6);
- targetAngle[PITCH] = g_gostraightPITCH;
- }
- else {
- autopwm[THR] = minpwm[THR];
- targetAngle[PITCH] = g_glideloopPITCH;
- }
-
- NVIC_DisableIRQ(USART1_IRQn);
- if(!CheckSW_Up(Ch7)){
- flg_ground = false;
- }
- NVIC_EnableIRQ(USART1_IRQn);
-}
-
-//離陸-投下-着陸一連
-void Take_off_and_landing(float targetAngle[3]){
-
- if(!CheckSW_Up(Ch7)) bombing_mode = Takeoff;
-
- switch(bombing_mode){
- case Takeoff:
- static bool flg_setFirstYaw = false;
- static int TakeoffCount = 0;
-
- if(!flg_setFirstYaw && CheckSW_Up(Ch7)){
- FirstYAW = nowAngle[YAW];
- flg_setFirstYaw = true;
- }else if(flg_setFirstYaw && !CheckSW_Up(Ch7)){
- flg_setFirstYaw = false;
- }
-
- UpdateTargetAngle_Takeoff(targetAngle);
- NVIC_DisableIRQ(EXTI9_5_IRQn);
- if(g_distance>150) TakeoffCount++;
- else TakeoffCount = 0;
- NVIC_EnableIRQ(EXTI9_5_IRQn);
- if(TakeoffCount>5){
- autopwm[THR] = 1180+320*2*0.5;
- targetAngle[PITCH]=g_gostraightPITCH;
- autopwm[RUD]=trimpwm[RUD];
- //pc.printf("Now go to Approach mode!!");
- bombing_mode = Approach;
- }
- break;
-
- //case Chicken:
- //break;
- /*
- case Transition:
- static int ApproachCount = 0;
- targetAngle[YAW]=180.0;
- int Judge = Rotate(targetAngle, g_SerialTargetYAW);
-
- if(Judge==0) ApproachCount++;
- if(ApproachCount>5) bombing_mode = Approach;
- break;
- */
- case Approach:
-
- autopwm[THR] = SetTHRinRatio(g_loopTHR); //0.7;スロットルの割合
- UpdateTargetAngle_Approach(targetAngle);
-
- break;
-
- default:
- bombing_mode = Takeoff;
- break;
- }
-
-}
-
-//離陸モード
-void UpdateTargetAngle_Takeoff(float targetAngle[3]){
- //pc.printf("%d \r\n",g_distance);
- static int tELE_start = 0;
- static bool flg_ELEup = false;
- int t_def = 0;
-
- autopwm[RUD] = trimpwm[RUD];
-
-
- if(!flg_ELEup && CheckSW_Up(Ch7)){
- tELE_start = t.read_ms();
- flg_ELEup = true;
- pc.printf("timer start\r\n");
- }else if(!CheckSW_Up(Ch7)){
- tELE_start = 0;
- flg_ELEup = false;
- }
- if(flg_ELEup){
- t_def = t.read_ms() - tELE_start;
-
- //1.5秒経過すればELE上げ舵へ
- if(t_def>500) targetAngle[PITCH]=-35.0;
- else{
- t_def = 0;
- targetAngle[PITCH]=g_gostraightPITCH;
- }
- }
- targetAngle[ROLL] = g_gostraightROLL;
- //targetAngle[PITCH] = g_loopTHR;
- autopwm[THR] = SetTHRinRatio(g_takeoffTHR); //0.7;スロットルの割合
-}
-
-
-//ヨーを目標値にして許容角度になるまで水平旋回
-int Rotate(float targetAngle[3], float TargetYAW){
- float diffYaw = TranslateNewYaw(TargetYAW, nowAngle[YAW]);
-
- if(diffYaw > LIMIT_STRAIGHT_YAW){
- /*
- if(diffYaw > THRESHOLD_TURNINGRADIUS_YAW) UpdateTargetAngle_Rightloop_short(targetAngle);
- else UpdateTargetAngle_Rightloop(targetAngle);
- */
- UpdateTargetAngle_Rightloop_short(targetAngle);
- return 1;
- }else if(diffYaw < -LIMIT_STRAIGHT_YAW){
- UpdateTargetAngle_Leftloop_short(targetAngle);
- /*
- if(diffYaw < -THRESHOLD_TURNINGRADIUS_YAW) UpdateTargetAngle_Leftloop_short(targetAngle);
- else UpdateTargetAngle_Leftloop(targetAngle);
- */
- return 1;
- }else{
- UpdateTargetAngle_GoStraight(targetAngle);
- return 0;
- }
-}
-
-//チキラー投下
-void Chicken_Drop(){
- if(CheckSW_Up(Ch7)){
- autopwm[DROP] = 1712;
- pc.printf("Bombed!\r\n");
- //RerurnChickenServo1.attach(&ReturnChickenServo1, 3);
- //operation_mode = Approach;
- //buzzer = 0;
- pc.printf("Goto LeftLoop mode\r\n");
- }
-}
-
-void ReturnChickenServo1(){
- autopwm[DROP] = 1344;
- pc.printf("first reverse\r\n");
- RerurnChickenServo2.attach(&ReturnChickenServo2, 1);
-}
-
-void ReturnChickenServo2(){
- autopwm[DROP] = 1392;
- pc.printf("second reverse\r\n");
- }
-
- //着陸モード(PCからの指令に従う)
-void UpdateTargetAngle_Approach(float targetAngle[3]){
-
- static bool zeroTHR=true;//着陸時のスロットル動作確認用
-
- if(CheckSW_Up(Ch7)){
- output_status = Auto;
- led1 = 1;
- }else{
- output_status = Manual;
- led1 = 0;
- zeroTHR=true;
- }
-
-
- NVIC_DisableIRQ(USART2_IRQn);
- switch(g_landingcommand){
- case 'R': //右旋回セヨ
- if(zeroTHR==false){
- UpdateTargetAngle_Rightloop_zero(targetAngle);
- }
- else{
- targetAngle[ROLL] = g_rightloopROLL_approach;
- targetAngle[PITCH] = g_rightloopPITCH_approach ;
- autopwm[RUD]=g_rightloopRUD_approach; //RUD固定
- if(autopwm[AIL_R]<trimpwm[AIL_R]){ //エルロン上がりやすさ調節
- autopwm[AIL_L]=trimpwm[AIL_L]+AIL_L_correctionrightloop+(autopwm[AIL_R]-trimpwm[AIL_R])*AIL_L_RatioRising;
- }
- else {autopwm[AIL_L]=trimpwm[AIL_L]+AIL_L_correctionrightloop+(autopwm[AIL_R]-trimpwm[AIL_R])*AIL_L_RatioDescent;
- autopwm[AIL_R]=autopwm[AIL_R]+AIL_R_correctionrightloop;
- }
- }
- NVIC_EnableIRQ(USART2_IRQn);
- break;
-
- case 'L': //左旋回セヨ
- if(zeroTHR==false){
- UpdateTargetAngle_Leftloop_zero(targetAngle);
- }
- else{
- targetAngle[ROLL] = g_leftloopROLL_approach;
- targetAngle[PITCH] = g_leftloopPITCH_approach;
- autopwm[RUD]=g_leftloopRUD_approach;
- if(autopwm[AIL_R]<trimpwm[AIL_R]){
- autopwm[AIL_L]=trimpwm[AIL_L]+AIL_L_correctionleftloop+(autopwm[AIL_R]-trimpwm[AIL_R])*AIL_L_RatioRising;
- }
- else autopwm[AIL_L]=trimpwm[AIL_L]+AIL_L_correctionleftloop+(autopwm[AIL_R]-trimpwm[AIL_R])*AIL_L_RatioDescent;
- }
- NVIC_EnableIRQ(USART2_IRQn);
- break;
-
- case 'G': //直進セヨ
- if(zeroTHR==false){
- UpdateTargetAngle_GoStraight_zero(targetAngle);
- }
- else{
- targetAngle[ROLL] = g_gostraightROLL;
- targetAngle[PITCH] = g_gostraightPITCH;
- }
- NVIC_EnableIRQ(USART2_IRQn);
- break;
-
- case 'Y': //指定ノヨー方向ニ移動セヨ
- Rotate(targetAngle, g_SerialTargetYAW);
- NVIC_EnableIRQ(USART2_IRQn);
- break;
-
- case 'U': //機首ヲ上ゲヨ
- static int UpCounter=0;
- UpCounter++;
- if(UpCounter==3){
- while(1){
- targetAngle[ROLL] = g_gostraightROLL;
- autopwm[THR] = minpwm[THR];
- autopwm[ELE] = minpwm[ELE];
- if(CheckSW_Up(Ch7)){
- output_status = Auto;
- led1 = 1;
- }else{
- output_status = Manual;
- led1 = 0;
- zeroTHR=true;
- }
- }
-
- }
- NVIC_EnableIRQ(USART2_IRQn);
-
- break;
-
- /*case 'B': //ブザーヲ鳴ラセ
- //buzzer = 1;
- NVIC_EnableIRQ(USART2_IRQn);
- break;*/
-
- case 'B': //物資ヲ落トセ
- Chicken_Drop();
- NVIC_EnableIRQ(USART2_IRQn);
- break;
-
- case 'C': //停止セヨ
- targetAngle[ROLL] = 0.0;
- targetAngle[PITCH] = -3.0;
- autopwm[THR] = minpwm[THR];
- zeroTHR=false;
- NVIC_EnableIRQ(USART2_IRQn);
- break;
-
- default :
- NVIC_EnableIRQ(USART2_IRQn);
- break;
-
-
- }
-
-}
-
-void checkHeight(float targetAngle[3]){
-
- static int targetHeight = 200;
-
- NVIC_DisableIRQ(EXTI9_5_IRQn);
- if(g_distance < targetHeight + ALLOWHEIGHT){
- UpdateTargetAngle_NoseUP(targetAngle);
- if(CheckSW_Up(Ch7)) led2 = 1;
- }
- else if(g_distance > targetHeight - ALLOWHEIGHT){
- UpdateTargetAngle_NoseDOWN(targetAngle);
- if(CheckSW_Up(Ch7)) led2 = 1;
- }
- else led2=0;
- NVIC_EnableIRQ(EXTI9_5_IRQn);
- }
-
- void UpdateTargetAngle_NoseUP(float targetAngle[3]){
-
- //targetAngle[PITCH] += 2.0f;
- //if(nowAngle[PITCH]<targetAngle[PITCH]) autopwm[THR] = SetTHRinRatio(0.6);
- autopwm[THR] = SetTHRinRatio(g_loopTHR+0.05);
- //pc.printf("nose UP");
-}
-
-void UpdateTargetAngle_NoseDOWN(float targetAngle[3]){
-
- //targetAngle[PITCH] -= 2.0f;
- autopwm[THR] = SetTHRinRatio(g_loopTHR-0.05);
- //pc.printf("nose DOWN");
-}
-
-//直進
-void UpdateTargetAngle_GoStraight(float targetAngle[3]){
-
- autopwm[RUD] = trimpwm[RUD];
- targetAngle[ROLL] = g_gostraightROLL;
- targetAngle[PITCH] = g_gostraightPITCH;
- autopwm[THR] = SetTHRinRatio(g_loopTHR);
-
- //pc.printf("Roll = %f, PITCH = %f, THR = %d \r\n", targetAngle[ROLL], targetAngle[PITCH], autopwm[THR]);
-}
-
-//直進(着陸時スロットル0のとき)
-void UpdateTargetAngle_GoStraight_zero(float targetAngle[3]){
-
- autopwm[RUD] = trimpwm[RUD];
- targetAngle[ROLL] = g_gostraightROLL;
- targetAngle[PITCH] = g_gostraightPITCH;
- autopwm[THR] = minpwm[THR];
-
- //pc.printf("Roll = %f, PITCH = %f, THR = %d \r\n", targetAngle[ROLL], targetAngle[PITCH], autopwm[THR]);
-}
-
-//右旋回
-void UpdateTargetAngle_Rightloop(float targetAngle[3]){ //右旋回
-
- targetAngle[PITCH] = g_rightloopPITCH ;
- autopwm[RUD]=g_rightloopRUD; //RUD固定
- autopwm[THR] = SetTHRinRatio(0.45); //手動スロットル記憶
-
- /*
- if (nowAngle[ROLL]>20.0||nowAngle[ROLL]<-20.0){
- t2.start();
- pc.printf("Timer start.");
- }
- if(0.0<t2.read()<5.0){
- //pc.printf("tagetAngle is changed.");
- targetAngle[ROLL] = rightloopROLL2;
- }
- else {
- t2.stop();
- t2.reset();
- pc.printf("Timer stopped.");
- targetAngle[ROLL] = g_rightloopROLL;
- }
-*/
- if(autopwm[AIL_R]<trimpwm[AIL_R]){ //エルロン上がりやすさ調節
- autopwm[AIL_L]=trimpwm[AIL_L]+AIL_L_correctionrightloop+(autopwm[AIL_R]-trimpwm[AIL_R])*AIL_L_RatioRising;
- }
- else autopwm[AIL_L]=trimpwm[AIL_L]+AIL_L_correctionrightloop+(autopwm[AIL_R]-trimpwm[AIL_R])*AIL_L_RatioDescent;
- autopwm[AIL_R]=autopwm[AIL_R]+AIL_R_correctionrightloop;
-
-
- //checkHeight(targetAngle);
- //pc.printf("Roll = %f, PITCH = %f, THR = %d \r\n", targetAngle[ROLL], targetAngle[PITCH], autopwm[THR]);
-}
-
-//右旋回(着陸時スロットル0の時)
-void UpdateTargetAngle_Rightloop_zero(float targetAngle[3]){ //右旋回
- autopwm[THR]=minpwm[THR];
- targetAngle[ROLL] = g_rightloopROLL_approach;
- targetAngle[PITCH] = g_rightloopPITCH_approach ;
- autopwm[RUD]=g_rightloopRUD_approach; //RUD固定
- if(autopwm[AIL_R]<trimpwm[AIL_R]){ //エルロン上がりやすさ調節
- autopwm[AIL_L]=trimpwm[AIL_L]+AIL_L_correctionrightloop+(autopwm[AIL_R]-trimpwm[AIL_R])*AIL_L_RatioRising;
- }
- else autopwm[AIL_L]=trimpwm[AIL_L]+AIL_L_correctionrightloop+(autopwm[AIL_R]-trimpwm[AIL_R])*AIL_L_RatioDescent;
- autopwm[AIL_R]=autopwm[AIL_R]+AIL_R_correctionrightloop;
-
- //checkHeight(targetAngle);
- //pc.printf("Roll = %f, PITCH = %f, THR = %d \r\n", targetAngle[ROLL], targetAngle[PITCH], autopwm[THR]);
-}
-
-void UpdateTargetAngle_Rightloop_short(float targetAngle[3]){ //右旋回
-
- targetAngle[ROLL] = g_rightloopROLLshort;
- targetAngle[PITCH] = g_rightloopPITCHshort;
- autopwm[RUD]=g_rightloopshortRUD;
- autopwm[THR] = SetTHRinRatio(0.45);
- if(autopwm[AIL_R]<trimpwm[AIL_R]){
- autopwm[AIL_L]=trimpwm[AIL_L]+AIL_L_correctionrightloopshort+(autopwm[AIL_R]-trimpwm[AIL_R])*AIL_L_RatioRising;
- }
- else autopwm[AIL_L]=trimpwm[AIL_L]+AIL_L_correctionrightloopshort+(autopwm[AIL_R]-trimpwm[AIL_R])*AIL_L_RatioDescent;
-
- //pc.printf("Roll = %f, PITCH = %f, THR = %d \r\n", targetAngle[ROLL], targetAngle[PITCH], autopwm[THR]);
-}
-
-//左旋回
-void UpdateTargetAngle_Leftloop(float targetAngle[3]){
-
- targetAngle[ROLL] = g_leftloopROLL;
- targetAngle[PITCH] = g_leftloopPITCH;
- autopwm[RUD]=g_leftloopRUD;
- autopwm[THR] = SetTHRinRatio(0.45);
- if(autopwm[AIL_R]<trimpwm[AIL_R]){
- autopwm[AIL_L]=trimpwm[AIL_L]+g_AIL_L_correctionleftloop+(autopwm[AIL_R]-trimpwm[AIL_R])*AIL_L_RatioRising;
- }
- else autopwm[AIL_L]=trimpwm[AIL_L]+g_AIL_L_correctionleftloop+(autopwm[AIL_R]-trimpwm[AIL_R])*AIL_L_RatioDescent;
- //checkHeight(targetAngle);
-
- //printf("Roll = %f, PITCH = %f, THR = %d \r\n", targetAngle[], targetAngle[PITCH], autopwm[THR]);
-}
-
-//左旋回(着陸時スロットル0のとき)
-void UpdateTargetAngle_Leftloop_zero(float targetAngle[3]){
-
- targetAngle[ROLL] = g_leftloopROLL_approach;
- targetAngle[PITCH] = g_leftloopPITCH_approach;
- autopwm[RUD]=g_leftloopRUD_approach;
- autopwm[THR] = minpwm[THR];
- if(autopwm[AIL_R]<trimpwm[AIL_R]){
- autopwm[AIL_L]=trimpwm[AIL_L]+AIL_L_correctionleftloop+(autopwm[AIL_R]-trimpwm[AIL_R])*AIL_L_RatioRising;
- }
- else autopwm[AIL_L]=trimpwm[AIL_L]+AIL_L_correctionleftloop+(autopwm[AIL_R]-trimpwm[AIL_R])*AIL_L_RatioDescent;
- //autopwm[AIL_L]=trimpwm[AIL_L]+AIL_L_correctionleftloopshort+(autopwm[AIL_R]-trimpwm[AIL_R])*AIL_L_Ratio_leftloop;
- //checkHeight(targetAngle);
-
- //printf("Roll = %f, PITCH = %f, THR = %d \r\n", targetAngle[], targetAngle[PITCH], autopwm[THR]);
-}
-
-void UpdateTargetAngle_Leftloop_short(float targetAngle[3]){
-
- targetAngle[ROLL] = g_leftloopROLLshort;
- targetAngle[PITCH] = g_leftloopPITCHshort;
- autopwm[RUD]=g_leftloopRUD;
- autopwm[THR] = SetTHRinRatio(0.45);
- if(autopwm[AIL_R]<trimpwm[AIL_R]){
- autopwm[AIL_L]=trimpwm[AIL_L]+AIL_L_correctionleftloopshort+(autopwm[AIL_R]-trimpwm[AIL_R])*AIL_L_RatioRising;
- }
- else autopwm[AIL_L]=trimpwm[AIL_L]+AIL_L_correctionleftloopshort+(autopwm[AIL_R]-trimpwm[AIL_R])*AIL_L_RatioDescent;
-
- //pc.printf("Roll = %f, PITCH = %f, THR = %d \r\n", targetAngle[ROLL], targetAngle[PITCH], autopwm[THR]);
-}
-
-void Sbusprintf(){
-
- for(uint8_t i=0; i<8; i++) pc.printf("ch.%d = %d ",i+1,sbus.manualpwm[i]);
- pc.printf("\r\n");
-
- }
-
-
-
-//デバッグ用
-void DebugPrint(){
- /*
- static int16_t deltaT = 0, t_start = 0;
- deltaT = t.read_u2s() - t_start;
- pc.printf("t:%d us, ",deltaT);
- pc.printf("\r\n");
- t_start = t.read_us();
- */
- //for(uint8_t i=0; i<8; i++) pc.printf("%d ",sbus.manualpwm[i]);
- //for(uint8_t i=1; i<4; i++) pc.printf("%d ",sbus.manualpwm[i]);
- //pc.printf("\r\n");
- //for(uint8_t i=0; i<3; i++) pc.printf("%3.2f\t",nowAngle[i]);
- //for(uint8_t i=0; i<2; i++) pc.printf("%3.2f\t",nowAngle[i]); //ロール、ピッチのみ 小数点以下2ケタ
- //pc.printf("%d\t",autopwm[AIL_L]);
- //pc.printf("%d\t",autopwm[RUD]);
- //pc.printf("%d",g_distance);
- //NVIC_DisableIRQ(EXTI9_5_IRQn);
- //pc.printf("g_distance = %d",g_distance);
- //NVIC_EnableIRQ(EXTI9_5_IRQn);
- //pc.printf("Mode: %c: ",g_buf[0]);
- //if(g_buf[0] == 'Y') pc.printf(" %3.1f",g_SerialTargetYAW);
- //pc.printf("\r\n");
-}
\ No newline at end of file
+ }
\ No newline at end of file