目次

システムシーケンサ見直し

 これまでのシステム動作は、ひとつのシーケンサで
 すべてを取り仕切ってきましたが、上位から下位に
 向けて、より専門内容を担当するシーケンサへと
 規模を小さくした方が扱いやすいと指摘されました。

 システムシーケンサを見直して、専門内容を担当する
 シーケンサで、実現できるかを検討してみます。

 最上位のシーケンサは、以下としてみました。



 このシーケンサを、Cで記述すると次のようになります。

switch ( state ) {
  /* trigger handling */
  case 0 :
           /* now state */
           state = 0 ;
           /* get start trigger */
           sflag = get_start_trigger();
           /* judge */
           if ( sflag == ON ) {
             sflag = OFF ;
             /* next state */
             state = 1 ;
           }
           /* */
           break ;
  /* set timer */
  case 1 :
           /* get current time */
           begin_time = millis();
           /* calculate exit time */
           exit_time = begin_time + XINTERVAL ;
           /* next state */
           state = 2 ;
           /* */
           break ;
  /* enable move sequencer */
  case 2 :
           /* set flag */
           eflag = ON ;
           /* set counter */
           ecnt = 0 ;
           /* next state */
           state = 3 ;
           /* */
           break ;
  /* check timeout */
  case 3 :
           /* now state */
           state = 3 ;
           /* get current time */
           current_time = millis();
           /* compare */
           if ( current_time > exit_time ) {
             /* next state */
             state = 4 ;
           }
           /* */
           break ;
  /* disable move sequencer */
  case 4 :
           /* reset flag */
           eflag = OFF ;
           /* stop */
           motor_stop();
           /* next state */
           state = 5 ;
           /* */
           break ;
  /* return */
  case 5 :
           /* first state */
           state = 0 ;
           /* */
           break ;
  /* others */
  default :
           break ;
}

 最上位のシーケンサが担当しているのは
 スタート合図の検出と走行シーケンサの
 起動と停止、タイムアウトの3処理だけ
 となっています。

 走行シーケンサは、最上位のシーケンサからの
 指示で動作するように設計すればよく、他の
 ことを考えないでよくなります。

 センサーからの情報取得は、常にやっておけば
 よいので、走行シーケンサは、次のように単純
 処理で実現可能。



 このシーケンサは、タイマー割り込みを利用した方が
 わかりやすいので、コードにしてみると次のように
 記述できます。

if ( tflag == ON ) {
  /* clear flag */
  tflag = OFF ;
  /* move sequencer */
  if ( eflag == ON ) {
    escan( ecnt );
    ecnt++ ;
    ecnt &= 3 ;
  }
}

void escan(byte x)
{
  switch (x) {
    /* get sensor information */
    case 0 :
             /* get */
             sensor = get_sensor_info();
             /* */
             break ;
    /* judge move mode */
    case 1 :
             /* get mode */
             mode = get_mode();
             /* judge */
             if ( mode == NORMAL ) {
               if ( sensor == CENTER ) {
                 xleft  = 50 ;
                 xright = 50 ;
               }
               :
               :
             }
             if ( mode == CRANK ) {
               if ( sensor == CENTER ) {
                 xleft  = 30 ;
                 xright = 30 ;
               }
               :
               :
             }
             /* */
             break ;
    /* set duty */
    case 2 :
             /* set */
             update_motor(xleft,xright);
             /* */
             break ;
  }
}


(under construction)

目次

inserted by FC2 system