/* <AT-WALKERに超音波センサーPINGを取り付ける> (c)2005.AsakusaGiken ある一定の距離に近づくプログラム */ #include /* IO関連 */ #include /* 割り込み関連 */ #include /* 割り込みベクタ関連 */ #include /* USART通信関連 */ char txb[10],rxb[10]; /* -----グローバル変数----- */ char phase = 0; /* フェーズを表す変数(PORTC操作用にも使うのでバイトサイズ) */ char ServoPos[4] = {94, 94, 94, 94}; /* サーボの位置を示す変数 */ char HomePos[4] = {92, 96, 96, 94}; /* ホームポジション */ int StepNo = 0; /* 歩行状態 */ /*-----mS間ウェイトする関数-----*/ void wait_ms(int msec) { int count; /* 繰り返し用カウンタ変数(for文で使用) */ TCCR2 |= (1< 7) { phase = 0; /* フェーズが7を超えたらフェーズ0に戻る */ } } /*-----歩行関係-----*/ void step0(void) { /* step0 */ ServoPos[0] = HomePos[0] + 0; ServoPos[1] = HomePos[1] + 20; ServoPos[2] = HomePos[2] + 0; ServoPos[3] = HomePos[3] + 20; } void step1(void) { /* step1 */ ServoPos[0] = HomePos[0] + 30; ServoPos[1] = HomePos[1] + 20; ServoPos[2] = HomePos[2] + 15; ServoPos[3] = HomePos[3] + 20; } void step2(void) { /* step2 */ ServoPos[0] = HomePos[0] + 15; ServoPos[1] = HomePos[1] - 20; ServoPos[2] = HomePos[2] + 15; ServoPos[3] = HomePos[3] - 20; } void step3(void) { /* step3 */ ServoPos[0] = HomePos[0] + 0; ServoPos[1] = HomePos[1] - 20; ServoPos[2] = HomePos[2] + 0; ServoPos[3] = HomePos[3] - 20; } void step4(void) { /* step4 */ ServoPos[0] = HomePos[0] - 15; ServoPos[1] = HomePos[1] - 20; ServoPos[2] = HomePos[2] - 30; ServoPos[3] = HomePos[3] - 20; } void step5(void) { /* step5 */ ServoPos[0] = HomePos[0] - 15; ServoPos[1] = HomePos[1] + 20; ServoPos[2] = HomePos[2] - 15; ServoPos[3] = HomePos[3] + 20; } void homeP(void) { ServoPos[0] = HomePos[0]; ServoPos[1] = HomePos[1]; ServoPos[2] = HomePos[2]; ServoPos[3] = HomePos[3]; ServoPos[4] = HomePos[4]; ServoPos[5] = HomePos[5]; ServoPos[6] = HomePos[6]; ServoPos[7] = HomePos[7]; } /*-----移動-----*/ void Go_Fw(void) // 前進 { switch(StepNo) { case 0: step1(); StepNo++; break; case 1: step2(); StepNo++; break; case 2: step3(); StepNo++; break; case 3: step4(); StepNo++; break; case 4: step5(); StepNo++; break; case 5: step0(); StepNo=0; break; } } void Go_Bw(void) // バック歩行 { switch(StepNo) { case 0: step5(); StepNo=5; break; case 1: step0(); StepNo--; break; case 2: step1(); StepNo--; break; case 3: step2(); StepNo--; break; case 4: step3(); StepNo--; break; case 5: step4(); StepNo--; break; } } int i; /*-----PB6に接続した超音波センサから距離を読み取る関数-----*/ unsigned char ping(void) { DDRB |= (1< 40){ /* 遠かったら */ /* 前進 */ step0(); Go_Fw(); wait_ms(200); }else if (Dist < 30){ /* 近かったら */ /* 後進 */ Go_Bw(); wait_ms(200); } else{ wait_ms(200); } /* ちょうどよい距離だったら */ } }