P-ROBO(ピーロボ)
メイン関数
ライントレースを行うにあたって作成したメイン関数を紹介します。
1.メイン関数
メイン処理の関数です。起動して電源がOFFされるまで動作する為に、内部の処理は無限ループとなっています。
- 初期化処理
- 割り込み許可
- ロータリスイッチ読み込み
- 赤外LEDセンサフラグオン
- 赤外LEDセンサオン
- 赤外LEDセンサ読み込み
- モータ動作選択
- モータ動作設定
- センサ状態のバックアップを行う
・メイン関数 流れ図
・メイン関数 プログラム
void main(void)
{
init(); // 初期化処理
IntrEnable(); // 割り込みスタート
UserLedCtrl(LED_OFF); // ユーザLED:OFF
/*** debug start ***/ // デバッグ用(目視にて動作確認を行う為に)
UserLedCtrl(LED_ON); // ユーザーLEDをONにする
Wait(0, 100); // 1秒待ち
UserLedCtrl(LED_OFF); // ユーザーLEDをOFFにする
/*** debug end ***/
while(1){ // 電源が切られるまで動作(無限ループ)
ReadSensor(); // 赤外LEDセンサデータ取得
iSensorData &= 0x07;
Wait(0, 1); // 時間待ち(10ms)
switch(iSensorData){ // センサー状態により判断
case 0: // センサー取得なし
switch(iSensorBack){ // 前回の状態を参照して動作を決定する
case 0:
case 2:
case 5:
case 7:
iMoveR = 0x03;
iMoveL = 0x03;
iSpeedR = 0;
iSpeedL = 0;
break;
case 1:
iMoveR = 0x01;
iMoveL = 0x02;
iSpeedR = 20;
iSpeedL = 20;
break;
case 3:
iMoveR = 0x02;
iMoveL = 0x02;
iSpeedR = 0;
iSpeedL = 20;
break;
case 4:
iMoveR = 0x02;
iMoveL = 0x01;
iSpeedR = 20;
iSpeedL = 20;
break;
case 6:
iMoveR = 0x02;
iMoveL = 0x02;
iSpeedR = 20;
iSpeedL = 0;
break;
default:
break;
}
break;
case 1:
iMoveR = 0x02;
iMoveL = 0x02;
iSpeedR = 10;
iSpeedL = 25;
break;
case 2:
iMoveR = 0x02;
iMoveL = 0x02;
iSpeedR = 20;
iSpeedL = 20;
break;
case 3:
iMoveR = 0x02;
iMoveL = 0x02;
iSpeedR = 15;
iSpeedL = 20;
break;
case 4:
iMoveR = 0x02;
iMoveL = 0x02;
iSpeedR = 25;
iSpeedL = 10;
break;
case 5:
iMoveR = 0x02;
iMoveL = 0x02;
iSpeedR = 15;
iSpeedL = 15;
break;
case 6:
iMoveR = 0x02;
iMoveL = 0x02;
iSpeedR = 20;
iSpeedL = 15;
break;
case 7:
iMoveR = 0x02;
iMoveL = 0x02;
iSpeedR = 25;
iSpeedL = 25;
break;
default:
break;
}
MoveMotorR(iMoveR ,iSpeedR); // 右モータの制御を行う
MoveMotorL(iMoveL ,iSpeedL); // 左モータの制御を行う
if(iSensorData != 0x00){ // 赤外LEDセンサデータチェック
iSensorBack = iSensorData; // 赤外LEDセンサデータをバックアップする
}
}
}