- 追加された行はこの色です。
- 削除された行はこの色です。
[[2011a]]
#contents
目次
*課題内容 [#wf02aa61]
**ランタンに向かってテニスボールを転がす(または運ぶ)ロボットの作成 [#f8eb0f78]
1転がす(ライントレース)~
2最短距離で運ぶ(自由走行)~
ロボットを作成せよ。ただし、1の場合はテニスボールの置いてある場所から直接転がし、 2の場合はその場所から最短距離で運ぶこと。ボールを探す際にはラインに沿っても沿わなくてもよい。
*メンバー [#kaa1df5d]
-中島
-すがはら
*今回のロボット [#o6433c71]
**タッチセンサー [#peff3869]
#ref(touch_sennsor2.JPG)
**アーム [#hefc2ca6]
#br
-モーターの回転でアームにつながる軸が回転することでアームが上下し、ボールをつかませた。
#br
#ref(arm.JPG)
-左右の歯車の数を変えることで左右のアームがそれぞれ異なる回転をするようにした。
#ref(gia_zoom.JPG)
-上から見た歯車部分。
#br
-左右の歯車の数を変えることで左右のアームがそれぞれ異なる回転をさせ、両方のアームが上下同じ向きに動くようにした。
#br
#ref(gia_zoom1.jpg)
#br
-上から見た歯車部分
#br
#ref(gia_highview.JPG)
#br
**全体図 [#oa9dd39e]
#br
-タッチセンサー→アーム、歯車部分→ランタンを探す光センサーと重ね、取り付けた。~
バランスをとるため黄色の本体はやや後ろにした。
#br
#ref(robotto.JPG)
#br
-↓ライントレースのセンサーが前に付かなかったため後ろにつけた。
#br
#ref(rign_sennsor.JPG)
#br
*プログラム [#b9f2eb27]
**すがはらのやつ [#q90c65a8]
#define THRETHOLD 40 //ライントレースの閾値 40
#define SPIN 500 //一回転する時間
今回の課題のライントレースはセンサー1個で行うため、ライン上の時はライン外の白の部分を探させ、ラインから外れたらラインを探させた。そのためマシンはジグザグに進んでライントレースするようになった。
#define THRETHOLD 40 //ライントレースの閾値 40
#define SPIN 500 //一回転する時間
task main()
{
SetSensor(SENSOR_1,SENSOR_TOUCH); //センサー1をタッチセンサーに
SetSensor(SENSOR_2,SENSOR_LIGHT); //センサー2を光センサーに(ランタンを探す)
SetSensor(SENSOR_3,SENSOR_LIGHT); //センサー3を光センサーに(ライントレース)
int l_max=0; //l_maxを定義(初期値0)
int t_max=0; //t_maxを定義(初期値0)
int l_max=0; //l_maxを定義(初期値0)
int t_max=0; //t_maxを定義(初期値0)
while(true){
start follow_line; //follow_lineのタスク(ライントレース)を開始
until (SENSOR_1==1); //ボールがセンサーに当たったら
stop follow_line; //follow_lineのタスクを一旦停止
start follow_line; //follow_lineのタスク(ライントレース)を開始
until (SENSOR_1==1); //ボールがセンサーに当たったら
stop follow_line; //follow_lineのタスクを一旦停止
OnFwd(OUT_B); //アームを閉じてボールを固定
OnFwd(OUT_B); //アームを閉じてボールを固定
Wait(10);
ClearTimer(0);
while(FastTimer(0)<=SPIN)
{
OnFwd(OUT_A);
OnRev(OUT_C); //回転開始
if(SENSOR_2>l_max) //ランタンの位置(光の最大値)を探す
{l_max=SENSOR_2; //最大値をl_maxと定義
t_max=FastTimer(0);} //ランタンを見つけた時間をt_maxと定義
OnRev(OUT_C); //回転開始
if(SENSOR_2>l_max) //ランタンの位置(光の最大値)を探す
{l_max=SENSOR_2; //最大値をl_maxと定義
t_max=FastTimer(0);} //ランタンを見つけた時間(FastTimer(0)<=SPINの経過時間)をt_maxと定義
}
OnFwd(OUT_C);
OnRev(OUT_A);
Wait(SPIN-t_max); //ランタンの向きへ方向転換
Wait(SPIN-t_max); //ランタンの向きへ方向転換
Off(OUT_A+OUT_C);
Wait(50);
OnRev(OUT_B);
Wait(20); //アームを開き、ボールを蹴り出す準備
Wait(20); //アームを開き、ボールを蹴り出す準備
Off(OUT_B);
Wait(50);
OnFwd(OUT_A+OUT_C);
Wait(50); //キック!!
Wait(50); //キック!!
Off(OUT_A+OUT_C);
OnRev(OUT_A+OUT_C);
Wait(50); //元の位置に戻る
Wait(50); //元の位置に戻る
OnFwd(OUT_A);
OnRev(OUT_C);
Wait(SPIN-t_max); //元の向きに戻る
} //while文の先頭に戻って再びライントレースを開始
Wait(SPIN-t_max); //元の向きに戻る
} //while文の先頭に戻って再びライントレースを開始
}
task follow_line() //follow_lineのタスク(ライントレース)
task follow_line() //follow_lineのタスク(ライントレース)
{
while(true){
if(SENSOR_3<THRETHOLD) //センサーがライン上(黒)のとき
{OnFwd(OUT_A); Off(OUT_C);} //右に曲がる
if(SENSOR_3>THRETHOLD) //センサーがライン外(白)のとき
{OnFwd(OUT_C); Off(OUT_A);} //左に曲がる
if(SENSOR_3<THRETHOLD) //センサーがライン上(黒)のとき
{OnFwd(OUT_A); Off(OUT_C);} //右に曲がる
if(SENSOR_3>THRETHOLD) //センサーがライン外(白)のとき
{OnFwd(OUT_C); Off(OUT_A);} //左に曲がる
}
}
**中島のやつ [#ucba0017]
*反省・感想 [#a2189b7b]
-アームの動かし方、取り付けにとても苦労した。横に開閉するアームを取り付けたかったが、うまく取りつかなく断念してしまった。
-ランタンを探すセンサーの周りを囲ったりして精度を上げる工夫ができず、うまくランタンを探してくれなかった。でも部屋を暗くしたときはほぼ成功したのでよかったと思う。
-ロボットはいろいろ苦労したが、アーム部分など工夫したいいものが作れたと思う。
-複数のタスクを使ってプログラムしたが、途中でフォロータスクを止めたりできて便利だった。またメインタスクもすっきりして見やすい気がしたので、ロボコンでも使っていきたい。
*コメント [#hdddc3c7]
#comment