目次
前
次
試走
試走前のチェックで、ある程度までの挙動を確認できたので
実コースに近い環境で試走させてみます。
長大コースを自宅には用意できないので、ブロックごとに
コースを作り、タスクごとにテストしていきます。
NORMAL、CRANK、LANEの3種に分類して、短いコースで
チェックします。次の3コースで、ブロックでの走行
をテストすることを考えました。
NORMAL
CRANK
LANE
スタートゲートが開いてから、走行を始めることを最初に
確認しておきます。スタートゲートは、以下を利用。
サーボモータにAT90S8515を接続し、開閉の2スイッチで開閉を実現。
頻繁に使うことはないので、バッテリー駆動に。
この程度のメカでも、あるとなしでは、試走に必要となる
時間がまったく異なります。
ゲートが開いてからの時間を計測するために
4桁のタイマーを使うことに。
0.1秒単位にすると、最大999.9秒まで計測できます。
試走は、次の項目に分類して実行。
- スタートゲートが開いてから走行開始
- 走行開始から60秒後に移動停止
- クランク、レーンチェンジではないコース走行
- クランクマーク検出での減速
- クランク位置での回転
- レーンチェンジマーク検出での減速
- レーンチェンジ位置での車線変更
- 車線変更からの復帰
最初の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にて表示できます。
目次
前
次