[[2019a/Member]] 目次 #contents *課題2 [#pde1fae2] コースをトレースし、ボールを運び、ゴールまで持っていく. **選んだコース [#t8d55a74] A地点から出発 → M → K(直進) → L(ピンポン玉をつかむ) → K(右折) → J(一時停止の後、左折) → I(直進) → H(直進) → G(左折) → F → E → D(一時停止の後、直進) → C(直進) → B(一時停止) → シュート→ A地点に入る(ゴール) *ロボット [#gf027040] **本体の構造 [#xa03e15a] 本体の構造は説明書に記載してあるものをつかった. **アームの構造 [#i36a8a55] アームは前にボールにかぶさるような形の構造にした. また,ボールを運ぶ際引きずる形で持っていくのでボールが左右に動かないように支えを付けた. &ref(IMG_1501[1].jpg); **全体図 [#e18207ad] &ref(IMG_1499[1].jpg); *プログラミング [#eb8fba79] **ライントレース [#d4ca93cb] ***定義 [#k2db0e39] 黒い線を追従するライントレースのプログラミングを作るということで,「完全に真っ白」,「白と境目の間」,「境目」,「黒と境目の間」,「完全に黒」の5つの部分に色を分けて測った。 それぞれの値は,「完全な白」=65,「白と境界」=55,「境目」=47, 「黒と境界」=42,「完全な黒」=32 それらの明るさによって曲がる方向が変わるようにする. 5段階に分けて考えると,それらは左に旋回,左に移動,直進,右に移動,右に旋回 実際にその動作を定義すると #define SPEED 20 #define turn_left OnFwd(OUT_B,SPEED);Off(OUT_C); #define turn_right Off(OUT_B);OnFwd(OUT_C,SPEED); #define light_senkai OnRev(OUT_B,SPEED);OnFwd(OUT_C,SPEED); #define left_senkai OnFwd(OUT_B,SPEED);OnRev(OUT_C,SPEED); #define go_straight OnFwd(OUT_BC,SPEED); これは左側をトレースするためのプログラムだが右側をトレースするためのプログラムも必要になる.それが下のプログラムだ. #define bturn_left OnRev(OUT_B,SPEED);Off(OUT_C); #define bturn_right Off(OUT_B);OnRev(OUT_C,SPEED); #define blight_senkai OnFwd(OUT_B,SPEED);OnRev(OUT_C,SPEED); #define bleft_senkai OnRev(OUT_B,SPEED);OnFwd(OUT_C,SPEED); #define go_back OnRev(OUT_BC,SPEED); ***サブルーチン [#r2fd24ef] 主にトレースする時に使うサブルーチンを設定する. 左トレース sub follow_lineB1() { SetSensorLight(S3); long t0=CurrentTick(); while(CurrentTick()-t0<140){ if(SENSOR_3>=65){ light_senkai; t0=CurrentTick(); }else if(SENSOR_3>=55){ turn_right; t0=CurrentTick(); }else if(SENSOR_3>=47){ OnFwd(OUT_BC,SPEED); t0=CurrentTick(); }else if(SENSOR_3>=42){ turn_left; t0=CurrentTick(); }else if(SENSOR_3>=35){ left_senkai; } } Off(OUT_BC); } 右トレース sub follow_lineB2() { SetSensorLight(S3); long t0=CurrentTick(); while(CurrentTick()-t0<140){ if(SENSOR_3>=65){ left_senkai; t0=CurrentTick(); }else if(SENSOR_3>=55){ turn_left; t0=CurrentTick(); }else if(SENSOR_3>=45){ OnFwd(OUT_BC,SPEED); t0=CurrentTick(); }else if(SENSOR_3>=42){ turn_right; t0=CurrentTick(); }else if(SENSOR_3>=35){ light_senkai; } }Off(OUT_BC); } 交差点横断 sub cross_line() { OnFwd(OUT_BC,SPEED); Wait(300); Off(OUT_BC); OnFwd(OUT_C,SPEED);OnRev(OUT_B,SPEED); Wait(400); Off(OUT_BC); } 交差点の横断は交差点で止まるとき少し本体が傾くのでそのまままっすぐ進み右に曲がるという方法で交差点を横断した. **ボール [#abd4308d] ***ボールを取るプログラム [#v2589e65] まずボールを取る前にアームを上にあげる OnRev(OUT_A,SPEED); Wait(500); Off(OUT_A); 前進しボールに近づく OnFwd(OUT_BC,SPEED); Wait(500); Off(OUT_BC); アームを下げる OnFwd(OUT_A,SPEED); Wait(800); Off(OUT_A); ***ボールをゴールに入れるためのプログラム [#w2eec986] ボールをゴールにれる方法は機械本体が前進するタイミングでアームを上げボールを押し出してゴールに入れるという方法だ. まず本体のライントレースが終わったら,バックする OnRev(OUT_BC,SPEED); Wait(800); Off(OUT_BC); 次に本体が直進すると同時にアームを上げる OnFwd(OUT_BC,SPEED);OnRev(OUT_A,SPEED); Wait(800); Off(OUT_ABC); **全体のプログラム [#s98fecb6] task main() { follow_lineB1(); OnFwd(OUT_BC,SPEED); Wait(600); Off(OUT_BC); OnRev(OUT_B,SPEED);OnFwd(OUT_C,SPEED); Wait(400); Off(OUT_BC); OnFwd(OUT_BC,SPEED); Wait(2000); Off(OUT_BC); OnRev(OUT_A,SPEED); Wait(500); Off(OUT_A); OnFwd(OUT_BC,SPEED); Wait(500); Off(OUT_BC); OnFwd(OUT_A,SPEED); Wait(800); Off(OUT_A); OnRev(OUT_BC,SPEED); Wait(3000); Off(OUT_BC); OnRev(OUT_C,SPEED);OnFwd(OUT_B,SPEED); Wait(300); Off(OUT_BC); follow_lineB1(); cross_line(); follow_lineB1(); cross_line(); follow_lineB1(); OnFwd(OUT_BC,SPEED); Wait(300); Off(OUT_BC); follow_lineB2(); OnFwd(OUT_BC,SPEED); Wait(300); Off(OUT_BC); OnFwd(OUT_B,SPEED);OnRev(OUT_C,SPEED); Wait(400); Off(OUT_BC); follow_lineB2(); OnFwd(OUT_B,SPEED);OnRev(OUT_C,SPEED); Wait(100); Off(OUT_BC); OnRev(OUT_BC,SPEED); Wait(800); Off(OUT_BC); OnFwd(OUT_BC,SPEED);OnRev(OUT_A,SPEED); Wait(800); Off(OUT_ABC); } *反省・課題 [#w34ea42a] 機械の方は時間をかけずに制作できたので良かった. また,コースを書くときにペンで書いたので場所によって濃さが違いプログラムを作成するのに時間がかかってしまった.コースをテープで作るなどの工夫をすればよかったと思った. プログラムはもっとうまくできたと思った.余計なプログラムも多いしサブルーチンをうまく使えばもっと短く簡潔になったと思う.3回目の課題ではミスをなくしより良いプログラムにしたい.