
#<함수형>***********************************************************
void _Servo_동조기동_(struct SERVO_동조기동  *p설정목록,
                    unsigned char         p목록수,
                    unsigned short        p기준속도,
                    unsigned char         p속도종류,
                    unsigned char         p가감속상수,
                    unsigned char         p완료보고비율,
                    unsigned char         p즉시_임시);

#<인수>
'p설정목록'
동조기동할 서보 목록.
<struct SERVO_동조기동  [p목록수]> 로 선언된 것을 사용.
<struct SERVO_동조기동> 구조체는 "_Servo_동조기동_.h" 에 선언돼 있음.
'p목록수'
동조기동할 서보 목록 수.
'p기준속도'
동조기동할 서보의 기준속도.
이 속도값으로 각도 변화량에 따라 각 서보의 속도가 내부적으로 자동 계산 적용됨.
'p속도종류'
동작속도 종류값.
0 : 무속(속도 없이 즉시 해당 PWM 출력).
1 : 등속.
2 : 가감속.
3 : 가속.
4 : 감속.
'p가감속상수'
가감속 동조기동을 위한 기준 가감속 구간 분할 상수.
'p완료보고비율'
완료보고위치 비율값(1 - 100(%) 사이값).
기본값은 100 이며 1 이상의 값을 사용해야 한다(50% 이상의 값을 사용하는 것이 좋음).
'p즉시_임시'
설정값을 즉시 반영하거나 임시 설정만 한다.
1 : 즉시 설정을 반영함.
0 : 내부적으로 임시 설정만 함.

#<반환값>

#*******************************************************************

#<적용구분>

"맷돌 전용"

#<선언문서>

"_Servo_동조기동_.h"

#<설명>

서보 [설정 목록] 을 전달 받아서 해당 서보들을 시간의 동시성을 가지도록 동기 제어합니다.
즉, 모든 서보가 동시에 움직이고 동시에 멈추도록 동작 시킵니다.

["개선"]{-------------------------------------------------------------
[가속/등속/감속/가감속] 등 어떠한 속도 종류에도 완벽한 시간적 동기화를 구현해 줍니다.
즉, [가속/감속] 구간에서는 모든 서보가 같은 시간 동안 [가속/감속] 기동을 하게 되며 
[등속] 구간 역시 모든 서보가 같은 시간 동안 [등속] 기동을 하므로 전체적으로 완벽하게 
시간적으로 동기화 됩니다.
}--------------------------------------------------------------------

API 내부적으로 [각도 변화량] 에 맞게 [속도] 를 자동 계산하여 적용하므로 모든 서보는 동기화 됩니다.

로봇팔이나 다관절 로봇등의 동작시 이 API 를 사용하면 서보들이 따로 놀지 않고 아주 부드럽게 움직이게 됩니다. 
단, 먼저 [영점] 이 정확하게 설정돼 있어야 합니다.

즉시 반영하는 경우는 동작중인 서보에 바로 적용되며, 임시 설정하는 경우는 일단 내부 환경변수에 적용되고
<API:_Servo_설정반영_> 을 사용시에 반영됩니다.

각도를 1도 단위로 정밀하게 제어하기 위해서는 반드시 <API:_Servo_영점_> 으로 [영점] 이 설정돼야 하며
이 API 를 사용하기 위해서는 반드시 해당 서보가 생성돼 있어야 합니다.

#<예제>
    
 #define  true     1
 #define  false    0
 
 
 #define  무속      0 //속도 적용 없이 즉시 해당 PWM 출력.
 #define  등속      1 
 #define  가감속     2 
 #define  가속      3  
 #define  감속      4
 
 //이 구조체는 "_Servo_동조기동_.h" 안에 선언돼 있으므로 다시 선언할 필요는 없음..
 struct SERVO_동조기동 //9바이트.
 {
   //[!]{------------------------------------------
   //반드시 순서대로 기술하고 크기를 변경하면 안됨(수정 불가).
   //<맷돌-C> 에서만 유효함.
   //}---------------------------------------------
  
   unsigned char  *생성자;
   unsigned char   각도;

 };

 // ...
  
 //[참고!!!]{------------------------------------------------------
 //굳이 12개를 동시 기동할 필요는 없으나 여기서는 12개 서보를 생성했다고 가정하고 
 //12개 서보를 동조기동하는 것으로 설명한다.
 //}--------------------------------------------------------------
  
 //[전역변수]
 //{
     //[서보 생성자들]
     //{
         //서보 생성자 선언. 
         //맷돌은 최대 12 개의 서보를 동시 제어 가능하다.
         //배열이 아니라 개별적으로 선언해도 상관없음.
         //12 개의 서보-------v
         unsigned char  서보[12][30];
         
     //}
      
     // ...
      
  //}   
  
  // ...
   
  //[VAR]
  //{
      //동조기동을 위한 구조체 목록을 12개 선언한다.
      //각 항목은  서보 1 개의 설정정보를 관리한다.
      struct SERVO_동조기동  동조기동목록[12];
      
      int    i;
  
  //}
  
  // ...
  
  //[동조기동목록:서보목록 만들기]
  //{
      //[!]{---------------------------------------
      //서보 목록은 한번만 설정하면 되므로 여기서 먼저 만든다.
      //}------------------------------------------
  
      //12개 서보의 생성자 목록을 만든다.
      for(i = 0; i < 12; i++)
      {
        //생성자를 등록한다.
        동조기동목록[i].생성자 = 서보[i];
        
      }
      
  //}
  
  //[서보 설정]
  //{
      //선언한 12개의 서보 각각을 여기서 설정.
      
      // ...
  
  //}
  
  // ...

  //[동조기동]
  //{ 
      반복:
  
      //[각도목록 만들기]
      //{
          //각도 목록은 기동에 필요한 서보의 각도만 설정해도 상관없음.
          동조기동목록[0].각도  = 45;
          동조기동목록[1].각도  = 10;
          동조기동목록[2].각도  = 45;
          동조기동목록[3].각도  = 60;
          동조기동목록[4].각도  = 10;
          동조기동목록[5].각도  = 5;
          동조기동목록[6].각도  = 135;
          동조기동목록[7].각도  = 180;
          동조기동목록[8].각도  = 90;
          동조기동목록[9].각도  = 70;
          동조기동목록[10].각도 = 120;
          동조기동목록[11].각도 = 25;
      
      //}
      
      //즉시기동----------------------------------------v
      //완료보고비율--------------------------------v
      //가감속상수-------------------------------v
      //속도종류--------------------------v
      //기준속도----------------------v
      //적용서보개수---------------v
      _Servo_동조기동_(동조기동목록, 12, 10, 가감속, 3, 100, true);
      
      while(!_Servo_전체완료확인_());
      
      //[각도목록 만들기]
      //{
          //각도 목록은 기동에 필요한 서보의 각도만 설정해도 상관없음.
          동조기동목록[0].각도  = 5;
          동조기동목록[1].각도  = 180;
          동조기동목록[2].각도  = 90;
          동조기동목록[3].각도  = 10;
          동조기동목록[4].각도  = 170;
          동조기동목록[5].각도  = 135;
          동조기동목록[6].각도  = 45;
          동조기동목록[7].각도  = 90;
          동조기동목록[8].각도  = 125;
          동조기동목록[9].각도  = 170;
          동조기동목록[10].각도 = 20;
          동조기동목록[11].각도 = 130;
      
      //}
      
      //즉시기동---------------------------------------v
      //완료보고비율-------------------------------v
      //가감속상수-----------------------------v
      //속도종류--------------------------v
      //기준속도----------------------v
      //적용서보개수---------------v
      _Servo_동조기동_(동조기동목록, 12, 30, 등속, 3, 100, true);
      
      while(!_Servo_전체완료확인_());
      
      goto 반복;
  
  //}


