#freeze 閲覧総計:&counter(); (本日:&counter(today); 昨日:&counter(yesterday);) *ライントレースカー(コースアウト処理追加) [#p3d7b6a5] 「基本機能のみ搭載」では、カーブの際、ラインセンサ2ケ共が黒ラインから はずれ、車がラインから外れてしまいました。 この問題を解決する為、今回はラインの外れ方の履歴をold_flagに持たせ ラインセンサ2ケ共に外れた際の動作指示を定義しました。 【結果】ライントレースカーは常に正しくラインに沿って走行出来る様に なりました。 06/11/05 |&attachref(,zoom,150x150,button){新しい写真添付};|&attachref(,zoom,150x150,button){新しい写真添付};| /** * ライントレースカー(コースアウト処理追加) * * PIC 16F628A * 発信器:内臓4MHz * 電源:PIC 乾電池4本(6.0V) モータ 乾電池3本(4.5V) * ライトセンサー:RA0, RA1 * モーター:左 RB6,RB7 右 RB0,RB1 * * Device Flags: _BODEN_OFF _BOREN_OFF _CP_OFF _PWRTE_ON * _WDT_OFF _LVP_OFF _MCLRE_OFF _INTRC_OSC_NOCLKOUT * * プログラム言語:MikroC v6.0 */ void main() { //メインプログラム unsigned short int old_flag; //完全コースアウト前の状況を記録flag //マイコンの初期化 PORTA = 0b00000000; //PORTAの中身をきれいにする PORTB = 0b00000000; //PORTBの中身をきれいにする CMCON = 0b00000111; //PORTAをデジタル入出力使用に設定 TRISA = 0b00000011; //PORTAをRA0,1を1:入力に、他は0:出力に設定 TRISB = 0b00000000; //PORTBを8つ全て0:出力に設定 //マイコンの初期化終わり do{ //doとwhileの間を繰り返す if(PORTA.F1 == 1) { //左センサー黒 if(PORTA.F2 == 1) { //右センサー黒 //車がラインの上にある //左右モーター前進 PORTB.F2 = 1; //左モーター前進 PORTB.F3 = 0; PORTB.F5 = 1; //右モーター前進 PORTB.F4 = 0; old_flag = 0; //両センサコース上 } else { //右センサ白 //右にコースアウト //左モーター停止、右モーター前進で //コースにもどる PORTB.F2 = 0; //左モーター停止 PORTB.F3 = 0; PORTB.F5 = 1; //右モーター前進 PORTB.F4 = 0; old_flag = 1; //右にコースアウト } } else { //左センサー白 if(PORTA.F2 == 1) { //右センサー黒 //左にコースアウト //左モーター前進、右モーター停止で //コースにもどる PORTB.F2 = 1; //左モーター前進 PORTB.F3 = 0; PORTB.F5 = 0; //右モーター停止 PORTB.F4 = 0; old_flag = 2; //左にコースアウト } else { //右センサー白 //左右センサー共に白、完全コースアウトした場合 if(old_flag == 1) { //右にコースアウト //左モーター停止、右モーター前進で //コースにもどる PORTB.F2 = 0; //左モーター停止 PORTB.F3 = 0; PORTB.F5 = 1; //右モーター前進 PORTB.F4 = 0; old_flag = 1; //右にコースアウト } else { //左にコースアウト //左モーター前進、右モーター停止で //コースにもどる PORTB.F2 = 1; //左モーター前進 PORTB.F3 = 0; PORTB.F5 = 0; //右モーター停止 PORTB.F4 = 0; old_flag = 2; //左にコースアウト } } } } while(1); //doとwhileの間を繰り返す } //メインプログラム終わり ★この情報は役に立ちましたか? #vote(はい[5],いいえ[5]) #comment