- 追加された行はこの色です。
- 削除された行はこの色です。
*課題1 [#l12ad1b8]
**目標 [#i64331fb]
#ref(2012b/Member/maji/Mission1/フィールド,100%,フィールド)
#ref(2012b/Member/maji/Mission1/field.jpg,100%,フィールド)
ピンポン球を持って黒い線の上を走り、上部のゴールの手前まで運びシュートする。
**ロボットの概要 [#d53a15b0]
***全体像 [#t4943c43]
#ref(2012b/Member/maji/Mission1/全体像,100%,全体像)
#ref(2012b/Member/maji/Mission1/all.jpg,20%,全体像)
-カーブでポールと接触しないように横は短く、縦は長くした
-コントローラの部分を後部に縦に取り付けて、前部に機能を集約させた
-ピンポン球をどうやって持ち、シュートをするか考えた結果この形になった(下記で説明)
***ドライブベース [#e2e70d64]
#ref(2012b/Member/maji/Mission1/土台,100%,土台)
基礎土台で作っているうちに何度も変わったので、バラしてみてから初めて見た
#ref(2012b/Member/maji/Mission1/走る構造,100%,走る構造)
#ref(2012b/Member/maji/Mission1/dodai.jpg,100%,土台)
-前部のアームの部分が不安定なので、土台はがっちりと安定したのになった
-基礎土台で作っているうちに何度も変わった
#ref(2012b/Member/maji/Mission1/run.jpg,100%,走る構造)
-三輪車の逆バージョンで前輪駆動にしたのは、光センサーが近くて読み取りやすかったら
-黒くて丸い部分は支えの役割で引きずって走る
***球をつかんでシュートする構造 [#f0f1fad4]
#ref(2012b/Member/maji/Mission1/つかむ構造,100%,つかむ構造)
#ref(2012b/Member/maji/Mission1/モーター,100%,モーター)
#ref(2012b/Member/maji/Mission1/つかんでる所,100%,つかんでる所)
&ref(2012b/Member/maji/Mission1/grab.jpg,100%,つかむ構造);
&ref(2012b/Member/maji/Mission1/moter.jpg,100%,モーター);
&ref(2012b/Member/maji/Mission1/catch.jpg,100%,つかんでる所);
モーターのパワーがゴムとギアに伝わってアームを回す
このように球をアームを回すと本体に引っかかるので、そのまま運びゴール前で逆回転をして弾いてシュートする
**プログラムの説明 [#v428c126]
#define THRESHOLD 45 // しきい値
#define go_forward OnFwd(OUT_AC); // 直進
#define turn_left1 OnFwd(OUT_C);OnRev(OUT_A); // 左旋回
#define turn_left0 OnFwd(OUT_C);Off(OUT_A); // 左折
#define turn_right1 OnFwd(OUT_A);OnRev(OUT_C); // 右旋回
#define turn_right0 OnFwd(OUT_A);Off(OUT_C); // 右折
task main()
{
ClearTimer(0);
int timer = 0; //続けて黒になった回数
int kado = 0; // 走っていて左側に直角がある回数
SetSensor(SENSOR_2,SENSOR_LIGHT);
SetPower(OUT_B, 2);
OnRev(OUT_B);
Wait(30);
Off(OUT_B);
while(true){
// 黒い時
if (SENSOR_2 < THRESHOLD -4){
ClearTimer(0);
while(SENSOR_2 < THRESHOLD -4){
turn_left1;
}
timer = FastTimer(0); //タイマーリセット
// 灰色の時
} else if (SENSOR_2 < THRESHOLD +8){
go_forward;
// 白い時
} else {
turn_right1;
}
if (timer >= 30) { //0.3秒以上黒が続いたら
if (timer >= 30) { //0.3秒以上黒が続いたら直角とみなす
PlayTone(440, 30);
timer = 0;
kado++; //直角の回数をカウント
if (kado == 2) { //2つ目の直角にきたら
turn_right1;
Wait(35);
go_forward;
turn_right1; //交差点で曲がったのを正
Wait(35); //面に向き直し交差点を通過す
go_forward; //る
Wait(30);
timer = 0;
}
if (kado == 3) { //3つ目の直角にきたら
turn_right1; //ゴールに対して正面に向くよう修正
turn_right1;
Wait(60);
Off(OUT_AC);
SetPower(OUT_B, 7);
OnFwd(OUT_B);
Wait(100);
Off(OUT_B);
break;
}
}
}
Off(OUT_AC);
}
***何度も直した所 [#b8ea2dc7]
if (timer >= 30) { //0.3秒以上黒が続いたら
PlayTone(440, 30);
timer = 0;
kado++; //直角の回数をカウント
if (kado == 2) { //2つ目の直角にきたら
turn_right1;
Wait(35);
go_forward;
Wait(30);
timer = 0;
最初はif (timer >= 30)の外にif (kado == 2)を置いていたけど、if (kado == 2)が来たらタイマーを0にしてしまうので、次のif (kado == 3)までいけなかったのをif (timer >= 30)の中に入れることによって直角の回数を3まで数えた
*感想 [#j6de3015]
相方にかなりアドバイスをもらって完成しました。こんなに時間がかかると思わなかったので、次回は時間に余裕を持って完成させたい。プログラムの方は短くでき、しきい値を微調整しなくても安定してゴールまで行けたんで満足です。