機器人武術擂臺---無差別組(五)推棋子演算法

sumjess發表於2018-10-10

機器人武術擂臺---無差別組(五)推棋子演算法

做一份筆記,大佬勿噴。

作者:sumjess

注意:本部落格是以《2018年華北五省(市、自治區)大學生機器人大賽競賽規則》為基礎而寫的

@@@@@@@@@一共寫2個版本的推棋子演算法-----STM32、K60@@@@@@@@

特別提醒:K60是基於山外庫書寫!

 

一、總述:

推棋子有一個筆者想嘗試的辦法,就是使用陀螺儀,這樣可以讓車在場地內做到定位功能,可以讓車走遍及整場。但是由於時間問題,暫時還是使用最普遍的16個光電開關的方案。

無論是推棋子還是互推,前提都是不掉下擂臺,所以在所有的光電開關中,起到防掉落功能的光電開關的優先順序應該為最高,所以,可能會有人想用中斷來防掉落,小編認為此舉是沒有必要的,因為在主函式中,虛擬碼就是:光電開關檢測-->電機執行,所以小編認為用不用中斷都一樣,其他的光電開關就是檢測棋子的作用啦

所以整體演算法部分程式碼就是:

     (if)         如果檢測到有掉落危險,那麼執行指令脫離危險。

     (else if) 否則檢測哪個方向有棋子,哪側有棋子向哪個方向開去。

      (else)   否則慢速直行

 

所以不難發現,演算法都是巢狀,用的都是if,當然在這裡也可以用狀態機。所以小編STM32的程式用的是if巢狀,K60用的是狀態機。

二、演算法部分:

@@@@@@@@@STM32的推棋子演算法@@@@@@@@

 

#define delays 380
void algor_SUM_UP(void)
{

	
	
      if(up_for_lift==0&&up_for_right==0&&up_back_left==0&&up_back_right==0)//沒有掉落危險
      {
				/////////////////////////////////////後側檢測
        if(back_1==0||back_2==0)//後側
          {
              delay_us(200);//去抖
              if(back_1==0||back_2==0)//確定後側
              {
                  drive_Back_H();//高速倒車

              }
          }
         else
              {
                  ;
              }
					/////////////////////////////////////前面檢測
        if(for_1==0||for_2==0||for_3==0)//前面
         {
						delay_us(200);
						if(for_1==0||for_2==0||for_3==0)//確定前面
						{
							drive_For_H();//高速直行
						}
					}
				else
					{
							;
					}
					/////////////////////////////////////後側檢測--如果沒有,那麼直行
				if(back_1==0||back_2==0)//後側
				{
					delay_us(200);
					if(back_1==0||back_2==0)//確定後側
					{
						drive_Back_H();//高速後退
					}
				
				}
				else
						{
							drive_For_L();//低速直行
						}
					/////////////////////////////////////前面檢測--如果確實有,那麼高速直行;如果沒有,看最下面的else2;如果一瞬間有,看下看面的else1;
				if(for_1==0||for_2==0||for_3==0)//前面
				{
					delay_us(200);
					if(for_1==0||for_2==0||for_3==0)//確定前面
					{
						drive_For_H();//高速直行
					}
					else//else1,檢測左邊,如果有左轉;如果一瞬間有,看下面的else3;
					{
              if(left_1==0||left_2==0||for_lift==0||back_lift==0)//左側
              {
                delay_us(200);
                if(left_1==0||left_2==0||for_lift==0||back_lift==0)//確定左側
                  {
                    drive_Left_S();//超級左轉
                    delay_ms(delays);
										
										
                   }
							}
              else//else3,如果有右轉;如果一瞬間有低速直行;
                  {
                        if(right_1==0||right_2==0||for_right==0||back_right==0)//右側
                        {
                            delay_us(200);
                            if(right_1==0||right_2==0||for_right==0||back_right==0)//確定右側
                              {
                                    drive_Right_S();//超級右轉
                                    delay_ms(delays);
                              }
                             else
                             {
                               drive_For_L();//低速直行
                             }
                         }
                  }
              
       }


  }
				
  else//檢測左側,如果有左轉;如果一瞬間有,檢測右側;如果右側確實有,右轉;如果右側一瞬間有,那麼低速直行;
  {
             if(left_1==0||left_2==0||for_lift==0||back_lift==0)//左側
              {
                delay_us(200);
                if(left_1==0||left_2==0||for_lift==0||back_lift==0)//確定左側
                  {
                        drive_Left_S();//左轉
                        delay_ms(delays);
                   }
							}
              else
                  {
                        if(right_1==0||right_2==0||for_right==0||back_right==0)//右側
                        {
                            delay_us(200);
                            if(right_1==0||right_2==0||for_right==0||back_right==0)//確定右側
                                  {
                                    drive_Right_S();//右轉
                                    delay_ms(delays);
                                   }
                             else
                             {
                               drive_For_L();//低速直行
                             }
                         }
                  }
             
  }
}
			      else
      {
        if(up_for_lift==1||up_for_right==1)//前方有掉落危險
        {
          delay_us(200);
          if(up_for_lift==1||up_for_right==1)//確定有掉落危險
          {

            drive_Stop();//停下驅動
            drive_Back_H();//高速倒車
            delay_ms(700);//300ms
            drive_Right();//右轉(可以設定向左向右演算法)
            delay_ms(500);//250ms
          }
        }
        if(up_back_left==1||up_back_right==1)//後方有掉落危險
        {
          delay_us(200);
          if(up_back_left==1||up_back_right==1)//確定有掉落危險
          {
						drive_Stop();//停下驅動J
            drive_For_M();//快速直行
            delay_ms(700);//300msJ
            drive_Right();//右轉(可以設定向左向右演算法)J
            delay_ms(500);//250msJ
          }
        }
			}
		}

 

 

@@@@@@@@@K60的推棋子演算法@@@@@@@@@@

1、掃描函式:

    uint8 opt_qua_Scan(void)//排位模式掃描程式
  {
    int sensorState;
          if( left_forward_edge  == 1 )    { sensorState =   1; }//左前邊緣
    else if ( right_forward_edge  == 1 )   { sensorState =  2;  }//右前邊緣
    else if ( left_back_edge  == 1 )       { sensorState =  3;  }//左後邊緣
    else if ( right_back_edge  == 1 )      { sensorState =  4;  }//右後邊緣
    else if ( left_forward  == 0 )         { sensorState =  5;  }//左後
    else if ( forward_middle_left  == 0 )  { sensorState =  6;  }//前中左
    else if ( forward_middle_right == 0 )  { sensorState =  7;  }//前中右
    else if ( right_forward == 0 )         { sensorState =  8;  }//右前
    else if ( left_1  == 0 )               { sensorState =  9;  }//左一
    else if ( right_1  == 0 )              { sensorState =  10; }//右一
    else if ( left_2  == 0 )               { sensorState =  11; }//左二
    else if ( right_2 == 0 )               { sensorState =  12; }//右二
    else if ( left_back == 0 )             { sensorState =  13; }//左後
    else if ( back_middle_left == 0 )      { sensorState =  14; }//後中左
    else if ( back_middle_right == 0 )     { sensorState =  15; }//後中右
    else if ( right_back == 0 )            { sensorState =  16; }//右後
    else    {                                 sensorState = 17; }//巡邏模式
    return sensorState;
  }

2、執行函式:

t=opt_qua_Scan();	//得到鍵值
			switch(t)
		        {				 
			case 1:
			{	
              //右後          
			  sumjess_back_right_fastest();   
                         break;       
                        }
			case 2:
			{	
              //左後            
			  sumjess_back_left_fastest(); 
                         break;       
                        }
			case 3:				
			{	
              //右前            
			  sumjess_forward_right_fastest(); 
                         break;       
                        }
			case 4:
			{	
              //右前            
			  sumjess_forward_right_fastest();
                         break;       
                        }
			case 5:
			{	
              //左後            
			  sumjess_back_left_faster(); 
                         break;       
                        }
			case 6:				
			{	
              //前左            
			  sumjess_forward_left_fast();
                         break;       
                        }
			case 7:
			{	
              //前右           
			  sumjess_forward_right_faster();
                         break;       
                        }
			case 8:
			{	
              //前右            
			  sumjess_forward_right_fastest(); 
                         break;       
                        }
			case 9:				
			{	
              //前左            
			  sumjess_back_left_fastest(); 
                         break;       
                        }
			case 10:
			{	
               //右後            
			   sumjess_back_right_fastest();
                         break;       
                        }
			case 11:
			{	
              //前左            
			  sumjess_back_left_fastest();
                         break;       
                        }
			case 12:				
			{	
              //前右            
			  sumjess_forward_right_fastest();
                         break;       
                        }
			case 13:
			{	
              //左後            
			  sumjess_back_left_faster(); 
                         break;       
                        }
			case 14:
			{	
              //左後            
			  sumjess_back_left_faster(); 
                         break;       
                        }
			case 15:				
			{	
               //右後            
			   sumjess_back_right_fastest();
                         break;       
                        }
			case 16:
			{	
               //右後          
			   sumjess_back_right_faster();
                         break;       
                        }
			case 17:
			{	
             //中速前進             
			 sumjess_forward_faster();  
                         break;       
                        }
                              
			default:
			         break;//跳出
			}

 

 

 

 

注:以上所有配置不一定通用,請各位讀者按照自己板子的型號和原理圖進行調整。

 

 

 

 

相關文章