目次

試走

 試走前のチェックで、ある程度までの挙動を確認できたので
 実コースに近い環境で試走させてみます。

 長大コースを自宅には用意できないので、ブロックごとに
 コースを作り、タスクごとにテストしていきます。

 NORMAL、CRANK、LANEの3種に分類して、短いコースで
 チェックします。次の3コースで、ブロックでの走行
 をテストすることを考えました。

 NORMAL



 CRANK



 LANE



 スタートゲートが開いてから、走行を始めることを最初に
 確認しておきます。スタートゲートは、以下を利用。




 サーボモータにAT90S8515を接続し、開閉の2スイッチで開閉を実現。

 頻繁に使うことはないので、バッテリー駆動に。
 この程度のメカでも、あるとなしでは、試走に必要となる
 時間がまったく異なります。

 ゲートが開いてからの時間を計測するために
 4桁のタイマーを使うことに。




 0.1秒単位にすると、最大999.9秒まで計測できます。

 試走は、次の項目に分類して実行。

 最初の2項目は、実際のコースを使わないで
 整備用プラットホームにのせてテスト。



 約60秒経過は、以下の回路でブザーがなる治具を作成。



 ブザーは圧電スピーカを使い、1HzはPIC12F629で
 プログラムを作れば、すぐにできます。
 1Hz生成のファームウエアは、以下。

/* redefine data type */
typedef unsigned char UBYTE ;
typedef unsigned int  UWORD ;

#define OFF 0
#define ON  OFF+1

#define MASK0F 0x0f

#define OUT10 GPIO.B0
#define OUT1  GPIO.B1
#define OUTM  GPIO.B2
#define OUTX  GPIO.B4

#define CNTBEGIN 6
#define XCNTMAX  25
#define YCNTMAX  250

volatile UBYTE eflag ;
volatile UBYTE tmp   ;
volatile UBYTE xcnt  ;
volatile UBYTE ycnt  ;
volatile UBYTE zcnt  ;
volatile UBYTE cnt10 ;
volatile UBYTE cnt   ;

/* function prototype */
void  init_usr(void);

/* interrupt handler */
void interrupt(void)
{
  /* generate 500Hz */
  if ( INTCON.T0IF == ON ) {
    /* clear flag */
    INTCON.T0IF = OFF ;
    /* initialize (/250) */
    TMR0 = CNTBEGIN ;
    /* set flag */
    eflag = ON ;
  }
}

void main(void)
{
  /* user initialize */
  init_usr();
  /* endless loop */
  while ( ON ) {
    /* generate 10Hz and 1Hz */
    if ( eflag == ON ) {
      /* clear flag */
      eflag = OFF ;
      /* counter increment */
      xcnt++ ;
      ycnt++ ;
      zcnt++ ;
      /* generate 20Hz */
      if ( xcnt == XCNTMAX ) {
        xcnt = 0 ;
        cnt10 = cnt10 + 1 ;
      }
      /* generate 2Hz */
      if ( ycnt == YCNTMAX ) {
        ycnt = 0 ;
        cnt++ ;
      }
      /* impress */
      OUT10 = cnt10 & ON ;
      OUT1  = cnt & ON ;
      OUTX  = zcnt & ON ;
    }
    /* manual clock generator */
    {
      /* get and mask */
      tmp = GPIO & (1 << 5);
      /* shift */
      tmp >>= 5 ;
      /* impress */
      OUTM = !(tmp & ON) ;
    }
  }
}

/* define function body */
void init_usr(void)
{
  /* I/O state */
  GPIO = 0x00 ;
  /* I/O directions */
  TRISIO = 0x28 ; /* bit0,1,2,4 as output , others as input */
  /* disable compare module */
  CMCON = 0x07 ;
  /* pull-up */
  WPU = 0x20 ;
  /* initialize Timer 0 */
  {
    /*
       4MHz/4 = 1MHz -> 1MHz/8 = 125kHz prescaler = 1:8
    */
    OPTION_REG = 0x02 ;
    /* 256 - 6 = 250 */
    TMR0 = CNTBEGIN ;
    /* enable timer0 overflow interrupt */
    INTCON.T0IE = ON ;
  }
  /* enable general interrupt */
  INTCON.GIE = ON ;
  /* clear flag */
  eflag = OFF ;
  /* others */
  xcnt  = 0 ;
  ycnt  = 0 ;
  zcnt  = 0 ;
  cnt10 = 0 ;
  cnt   = 0 ;
}

 20Hz、2HzでI/Oピンに1、0を出力し10Hz、1Hzを生成。
 10Hzは、時間経過の度合いを示すモニタに利用。モニタ
 の回路は、以下。




 1Hzでは、最大127秒(2分強)までしか計測なので
 10Hzを用意して、1270秒(21分強)まで拡張。

 タイムオーバーを音で知らせるために、圧電ブザーをつけます。



 4028を利用すると、センサーユニットが出力する情報を
 1ビット単位でLEDにて表示できます。




目次

inserted by FC2 system