2011a/A7/課題3左
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
検索
|
最終更新
|
ヘルプ
|
ログイン
]
開始行:
[[2011a]]
#contents
目次
*課題内容 [#wf02aa61]
**ランタンに向かってテニスボールを転がす(または運ぶ)ロボットの作成 [#f8eb0f78]
1転がす(ライントレース)~
2最短距離で運ぶ(自由走行)~
ロボットを作成せよ。ただし、1の場合はテニスボールの置いてある場所から直接転がし、 2の場合はその場所から最短距離で運ぶこと。ボールを探す際にはラインに沿っても沿わなくてもよい。
*メンバー [#kaa1df5d]
-中島
-すがはら
*今回のロボット [#o6433c71]
**タッチセンサー [#peff3869]
#ref(touch_sennsor2.JPG)
**アーム [#hefc2ca6]
#br
-モーターの回転でアームにつながる軸が回転することでアームが上下し、ボールをつかませた。
#br
#ref(arm.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
*走行するコース [#a73ec682]
-課題2で使ったコースを今回も使用した。ライントレースは左回りで行い、ランタンはロータリーの中に置いた。
#br
#ref(cose.JPG)
#br
*プログラム [#b9f2eb27]
**すがはらのやつ [#q90c65a8]
今回の課題のライントレースはセンサー1個で行うため、ライン上の時はライン外の白の部分を探させ、ラインから外れたらラインを探させた。そのためマシンはジグザグに進んでライントレースするようになった。
#define THRETHOLD 40 //ライントレースの閾値 40
#define SPIN 500 //一回転する時間
task main()
{
repeat(3){ //3回繰り返す
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)
while(true){
start follow_line; //follow_lineのタスク(ライントレース)を開始
until (SENSOR_1==1); //ボールがセンサーに当たったら
stop follow_line; //follow_lineのタスクを一旦停止
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);} //ランタンを見つけた時間(FastTimer(0)<=SPINの経過時間)をt_maxと定義
}
OnFwd(OUT_C);
OnRev(OUT_A);
Wait(SPIN-t_max); //ランタンの向きへ方向転換
Off(OUT_A+OUT_C);
Wait(50);
OnRev(OUT_B);
Wait(20); //アームを開き、ボールを蹴り出す準備
Off(OUT_B);
Wait(50);
OnFwd(OUT_A+OUT_C);
Wait(50); //キック!!
Off(OUT_A+OUT_C);
OnRev(OUT_A+OUT_C);
Wait(50); //元の位置に戻る
OnFwd(OUT_A);
OnRev(OUT_C);
Wait(SPIN-t_max); //元の向きに戻る
} //while文の先頭に戻って再びライントレースを開始
} //repeat範囲
Off(OUT_A+OUT_C); //三回繰り返したら終了
}
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);} //左に曲がる
}
}
**中島のやつ [#ucba0017]
#define arm_down OnFwd(OUT_B);Wait(20);Off(OUT_B); //アームを下ろす
#define arm_up OnRev(OUT_B);Wait(25);Off(OUT_B); //アームを上げる
#define go_straight(t) OnFwd(OUT_A+OUT_C);Wait(t);Off(OUT_A+OUT_C); //直進
#define turn_right OnFwd(OUT_A);OnRev(OUT_C);Wait(110);Off(OUT_A+OUT_C); //右曲り
#define turn_left OnFwd(OUT_C);OnRev(OUT_A);Wait(110);Off(OUT_A+OUT_C); //左曲がり
task main()
{
SetSensor(SENSOR_1,SENSOR_TOUCH); //センサー1はタッチセンサー
SetSensor(SENSOR_2,SENSOR_LIGHT); //センサー2はタッチセンサー
SetSensor(SENSOR_3,SENSOR_LIGHT); //センサー3はタッチセンサー
int l_max=0; //光の最大値を記憶させる変数を定義
int t_max=0; //ランタンを認識した時間を定義
repeat(4) //4回繰り返す
{
start ziguzagu; //ジグザグにすすむ
until(SENSOR_1 == 1); //タッチセンサーが押されるまで実行する
stop ziguzagu; //進むのをやめる
start carry_boll; //ランタンを探し、ボールを運び、最初にもどる
until(SENSOR_2 < 40); //光センサーが認識するまで実行
stop carry_boll; //運ぶのをやめる
}
}
task ziguzagu() //ジグザグにすすむプログラム
{
while(true)
{
go_straight(350);
turn_right;
go_straight(80);
turn_right;
go_straight(350);
turn_left;
go_straight(80);
turn_left;;
}
}
task carry_boll() //ボールを運ぶプログラム
{
int l_max=0; //光の最大値を記憶させる変数を定義
int t_max=0; //ランタンを認識した時間を定義
arm_down;
ClearTimer(0); //タイマー0をリセット
while(FastTimer(0)<=450) //4.5秒間繰り返し
{
OnFwd(OUT_A);
OnRev(OUT_C);
if(SENSOR_2>l_max) //センサー2が最大値を感知したとき
l_max=SENSOR_2; //l_maxを最大値とする
t_max=FastTimer(0); //t_maxを記憶
}
OnFwd(OUT_C);
OnRev(OUT_A);
Wait(450-t_max); //t_maxの時間回転
}
OnFwd(OUT_A+OUT_C);
until(SENSOR_3 < 40);
arm_up;
OnRev(OUT_A+OUT_C);
until(SENSOR_3 < 40);
OnFwd(OUT_A);
OnRev(OUT_C);
Wait(450-t_max);
}
*反省・感想 [#a2189b7b]
-アームの動かし方、取り付けにとても苦労した。横に開閉するアームを取り付けたかったが、うまく取りつかなく断念してしまった。
-ランタンを探すセンサーの周りを囲ったりして精度を上げる工夫ができず、うまくランタンを探してくれなかった。でも部屋を暗くしたときはほぼ成功したのでよかったと思う。
-ロボットはいろいろ苦労したが、アーム部分など工夫したいいものが作れたと思う。
-複数のタスクを使ってプログラムしたが、途中でフォロータスクを止めたりできて便利だった。またメインタスクもすっきりして見やすい気がしたので、ロボコンでも使っていきたい。
*コメント [#hdddc3c7]
- 細かなところですが、すがはらさんのプログラムで、SetSensor文はrepeatの外のほうがよいですね。 -- [[松本]] &new{2011-07-29 (金) 15:31:28};
#comment
終了行:
[[2011a]]
#contents
目次
*課題内容 [#wf02aa61]
**ランタンに向かってテニスボールを転がす(または運ぶ)ロボットの作成 [#f8eb0f78]
1転がす(ライントレース)~
2最短距離で運ぶ(自由走行)~
ロボットを作成せよ。ただし、1の場合はテニスボールの置いてある場所から直接転がし、 2の場合はその場所から最短距離で運ぶこと。ボールを探す際にはラインに沿っても沿わなくてもよい。
*メンバー [#kaa1df5d]
-中島
-すがはら
*今回のロボット [#o6433c71]
**タッチセンサー [#peff3869]
#ref(touch_sennsor2.JPG)
**アーム [#hefc2ca6]
#br
-モーターの回転でアームにつながる軸が回転することでアームが上下し、ボールをつかませた。
#br
#ref(arm.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
*走行するコース [#a73ec682]
-課題2で使ったコースを今回も使用した。ライントレースは左回りで行い、ランタンはロータリーの中に置いた。
#br
#ref(cose.JPG)
#br
*プログラム [#b9f2eb27]
**すがはらのやつ [#q90c65a8]
今回の課題のライントレースはセンサー1個で行うため、ライン上の時はライン外の白の部分を探させ、ラインから外れたらラインを探させた。そのためマシンはジグザグに進んでライントレースするようになった。
#define THRETHOLD 40 //ライントレースの閾値 40
#define SPIN 500 //一回転する時間
task main()
{
repeat(3){ //3回繰り返す
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)
while(true){
start follow_line; //follow_lineのタスク(ライントレース)を開始
until (SENSOR_1==1); //ボールがセンサーに当たったら
stop follow_line; //follow_lineのタスクを一旦停止
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);} //ランタンを見つけた時間(FastTimer(0)<=SPINの経過時間)をt_maxと定義
}
OnFwd(OUT_C);
OnRev(OUT_A);
Wait(SPIN-t_max); //ランタンの向きへ方向転換
Off(OUT_A+OUT_C);
Wait(50);
OnRev(OUT_B);
Wait(20); //アームを開き、ボールを蹴り出す準備
Off(OUT_B);
Wait(50);
OnFwd(OUT_A+OUT_C);
Wait(50); //キック!!
Off(OUT_A+OUT_C);
OnRev(OUT_A+OUT_C);
Wait(50); //元の位置に戻る
OnFwd(OUT_A);
OnRev(OUT_C);
Wait(SPIN-t_max); //元の向きに戻る
} //while文の先頭に戻って再びライントレースを開始
} //repeat範囲
Off(OUT_A+OUT_C); //三回繰り返したら終了
}
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);} //左に曲がる
}
}
**中島のやつ [#ucba0017]
#define arm_down OnFwd(OUT_B);Wait(20);Off(OUT_B); //アームを下ろす
#define arm_up OnRev(OUT_B);Wait(25);Off(OUT_B); //アームを上げる
#define go_straight(t) OnFwd(OUT_A+OUT_C);Wait(t);Off(OUT_A+OUT_C); //直進
#define turn_right OnFwd(OUT_A);OnRev(OUT_C);Wait(110);Off(OUT_A+OUT_C); //右曲り
#define turn_left OnFwd(OUT_C);OnRev(OUT_A);Wait(110);Off(OUT_A+OUT_C); //左曲がり
task main()
{
SetSensor(SENSOR_1,SENSOR_TOUCH); //センサー1はタッチセンサー
SetSensor(SENSOR_2,SENSOR_LIGHT); //センサー2はタッチセンサー
SetSensor(SENSOR_3,SENSOR_LIGHT); //センサー3はタッチセンサー
int l_max=0; //光の最大値を記憶させる変数を定義
int t_max=0; //ランタンを認識した時間を定義
repeat(4) //4回繰り返す
{
start ziguzagu; //ジグザグにすすむ
until(SENSOR_1 == 1); //タッチセンサーが押されるまで実行する
stop ziguzagu; //進むのをやめる
start carry_boll; //ランタンを探し、ボールを運び、最初にもどる
until(SENSOR_2 < 40); //光センサーが認識するまで実行
stop carry_boll; //運ぶのをやめる
}
}
task ziguzagu() //ジグザグにすすむプログラム
{
while(true)
{
go_straight(350);
turn_right;
go_straight(80);
turn_right;
go_straight(350);
turn_left;
go_straight(80);
turn_left;;
}
}
task carry_boll() //ボールを運ぶプログラム
{
int l_max=0; //光の最大値を記憶させる変数を定義
int t_max=0; //ランタンを認識した時間を定義
arm_down;
ClearTimer(0); //タイマー0をリセット
while(FastTimer(0)<=450) //4.5秒間繰り返し
{
OnFwd(OUT_A);
OnRev(OUT_C);
if(SENSOR_2>l_max) //センサー2が最大値を感知したとき
l_max=SENSOR_2; //l_maxを最大値とする
t_max=FastTimer(0); //t_maxを記憶
}
OnFwd(OUT_C);
OnRev(OUT_A);
Wait(450-t_max); //t_maxの時間回転
}
OnFwd(OUT_A+OUT_C);
until(SENSOR_3 < 40);
arm_up;
OnRev(OUT_A+OUT_C);
until(SENSOR_3 < 40);
OnFwd(OUT_A);
OnRev(OUT_C);
Wait(450-t_max);
}
*反省・感想 [#a2189b7b]
-アームの動かし方、取り付けにとても苦労した。横に開閉するアームを取り付けたかったが、うまく取りつかなく断念してしまった。
-ランタンを探すセンサーの周りを囲ったりして精度を上げる工夫ができず、うまくランタンを探してくれなかった。でも部屋を暗くしたときはほぼ成功したのでよかったと思う。
-ロボットはいろいろ苦労したが、アーム部分など工夫したいいものが作れたと思う。
-複数のタスクを使ってプログラムしたが、途中でフォロータスクを止めたりできて便利だった。またメインタスクもすっきりして見やすい気がしたので、ロボコンでも使っていきたい。
*コメント [#hdddc3c7]
- 細かなところですが、すがはらさんのプログラムで、SetSensor文はrepeatの外のほうがよいですね。 -- [[松本]] &new{2011-07-29 (金) 15:31:28};
#comment
ページ名: