- 追加された行はこの色です。
- 削除された行はこの色です。
#contents
*課題3の内容とルール [#tfe55046]
*ロボットの概要 [#xf9efff3]
後輪駆動です。
後ろのタイヤ2つと前につけた棒の3点で支えています。
#ref(./CA3C0286.JPG,100%,)
投げる装置
#ref(./CA3C0287.JPG,100%,)
***モーター1つで方向転換できる仕組み [#ca63015a]
ディファレンシャル・ギアとラチェットを用いて考えられる方法
+左右のタイヤの回転方向は同じ+ラチェットは1つ →直進可、方向転換一方向のみ可
+左右のタイヤの回転方向は逆+ラチェット2つ →直進不可、方向転換左右とも可
(2)を採用。
#ref(./CA3C0288.JPG,100%,)
**製作過程 [#of227fff]
-初めはキャスターを使っていた。しかしキャスターがうまく動かず、摩擦を大きくする原因になってしまった。
キャスターの改良もしたが、試しに棒一本を使ってみたところ上手くいったので、採用することにした。
-タイヤが空回りしてしまうという問題があった。後輪の摩擦を大きくすることで解決をはかった。
実際には、1,RCXを後ろ寄りにつける 2,前の棒を長めにする という方法をとった。
*プログラム [#z47e3adb]
***光センサ1つでライントレースする仕組み [#z6388ae2]
#define THRESHOLD 40 //しきい値
task main(){
SetSensor(SENSOR_1, SENSOR_LIGHT); //センサー1定義(ライントレース用)
while(1){
if(SENSOR_1<THRESHOLD){ //最初にライン上(黒)の場合
OnFwd(OUT_C);Wait(15); //左に逸らす
if(SENSOR_1>THRESHOLD){ //ライン外(白)の場合
OnRev(OUT_C);Wait(15); //右に逸らす
}
}
}
Off(OUT_C);
}
ディファレンシャル・ギアを使うと直進が出来ないため、ジグザクに進ませるようにしました。
**松澤(追跡あり) [#k84a262e]
#define THRESHOLD 40 //しきい値
#define RUN_TIME 500 //相手を探す時間
int s=0; //打つ回数の変数
void shoot(){ //弾を打つ関数
OnFwd(OUT_A); //一度引く
Wait(5);
OnRev(OUT_A); //打つ
Wait(5);
OnFwd(OUT_A); //引く
Wait(5);
Off(OUT_A);
s++; //sをインクリメント
}
task main(){
SetSensor(SENSOR_1, SENSOR_LIGHT); //センサー1定義(ライントレース用)
SetSensor(SENSOR_3, SENSOR_LIGHT); //センサー3定義(相手の探索用)
int l=0; //入力された光の値用の変数
int l_max=0; //光の最大値用の変数
while(s != 2){ //弾を2回打つまで繰り返す(2回打たなければ終わらない)
ClearTimer(0); //Timer(0)をリセット
while(Timer(0)<=RUN_TIME){ //相手を探すループ
if(SENSOR_1<THRESHOLD){ //最初にライン上(黒)の場合
OnFwd(OUT_C);Wait(15); //左に逸らす
repeat(2){PlaySound(SOUND_CLICK) ;}
if(SENSOR_1>THRESHOLD){ //ライン外(白)の場合
OnRev(OUT_C);Wait(15); //右に逸らす
}
}
if(SENSOR_3>60){ //蛍光灯か相手の光かを判断する(ある程度光が当たっていたら)
l=SENSOR_3; //lに観測値を代入
if(l>l_max){ //入力値が観測最大値よりも大きかったら
l_max=l; //l_maxに観測値lを代入(l_maxを更新)
}
}
}
if(SENSOR_3>=((l_max-5)||(l_max+5))){ //SENSOR_3がl=max(相手の光)を感知したら[誤差±5]
repeat(16){ //5秒間追跡する
OnFwd(OUT_C);Wait(15);
OnRev(OUT_C);Wait(15);
}
shoot(); //弾を打つ
}
PlaySound(SOUND_UP);
}
Off(OUT_C);
}
**伊藤 [#re7d4db2]
task main()
{
SetSensor(SENSOR_1,SENSOR_LIGHT);
SetSensor(SENSOR_3,SENSOR_LIGHT);
while (1)
{
if (SENSOR_3<40) //ライントレース
{OnRev(OUT_C);
Wait(25);
if (SENSOR_3>40)
{OnFwd(OUT_C);
Wait(25);
}
}
if (SENSOR_3>45) //光センサ45以上の時
{OnFwd(OUT_A); //弾を打つ
Wait(20);
Off(OUT_A);
OnRev(OUT_A);
Wait(20);
Off(OUT_A);
}
}
}
*反省 [#lb11e93d]
**松澤 [#s2d03151]
**伊藤 [#h649d1e2]
*コメント欄 [#de1d6748]