2015a/Member/Rabbit/Mission3
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
検索
|
最終更新
|
ヘルプ
|
ログイン
]
開始行:
[[2015a/Member]]
*今回の課題について [#n372d985]
半径一メートル以内にある懐中電灯を探し、懐中電灯にピンポン玉を当てる。と言う課題です。
ロボットが懐中電灯に当たらない限りどこからボールを打っても良い。
初めはタッチセンサーを利用して懐中電灯にボールをぶつけようとしましたが、ロボットが懐中電灯に当たってはいけないと言う決まりがあったので光センサーだけで懐中電灯を探しました。
今回は2つの方法で懐中電灯を探す。
*ロボット本体の説明 [#h4b55fe1]
**車体について [#of6e552c]
#ref(./IMG_0555.JPG,10%)
付属のマニュアルに書いてあるロボットを使いました。
モーターCで右のタイヤ(写真の下側)を、モーターAで左タイヤ(写真の上側)を動かすことにした。
二つのモーターを使って前進、後進、その場で旋回、片方のモーターだけを使ってゆっくり車体の向きを変えることができる。
OnFwdで後進、OnRevで前進をします。
**アームについて [#x5441150]
#ref(./IMG_0552.JPG,10%)
決まった時間がたつとアームが下がりボールを捕まえるようになっている。
モーターBを使って動かす。
#ref(./IMG_0605.JPG,10%)
OnRevでアームを持ち上げる。赤い矢印はモーターB、青い矢印はアームの動く向き。
#ref(./IMG_0606.JPG,10%)
OnFwdでアームを下げる。赤い矢印はモーターB、青い矢印はアームの動く向き。
モーターBを回転させることでアームを下げてボールを捕まえたり、シュートの直前に捕まえるときと逆にモーターを回して開いたりする。
。
**全体 [#ld0055da]
#ref(./as.JPG,20%)
#ref(./IMG_0580.JPG,20%)
この写真がロボットの完成品の全体です。
ボールをシュートする時はアームを持ち上げて一度後ろに下がってから、ボールに体当たりをする。
ただし課題2と違い光センサーが前を向くように取り付けてあります。
センサーを前に付けただけだと、正確に懐中電灯の方向を向いていなくてもしきい値が高くなってしまう。センサーの正面からの光だけ入るようにした。
*プログラムの説明 [#zfe56287]
**一周する間にしきい値の最大値を見つけるプログラム [#r6ab3789]
#define ageru OnRev(OUT_B);Wait(9);Off(OUT_B);
#define utu OnFwd(OUT_AC);Wait(50);ageru;OnRev(OUT_AC);Wait(50);Off(OUT_AC);
ボールをシュートする定義です。課題2と同じ。
ボールをシュートする時はアームを持ち上げて一度後ろに下がってから、ボールに体当たりをする。
task main()
{ SetSensor(SENSOR_2, SENSOR_LIGHT);
int runtime=400; //一周するのにかかる時間
int litemax=0; //しきい値の最大値
int timemax=0; //しきい値が最大値の時の時間
一周するのにかかる時間、しきい値の最大値と最大になった時の時間を設定します。
while(SENSOR_2 < 58){ //しきい値が58を超えるまで繰り返す。
ClearTimer(0); //時間を測り始める
OnFwd(OUT_A);OnRev(OUT_C); //左旋回
while(FastTimer(0) < runtime) //一周するまで繰り返す
{
if(SENSOR_2 > litemax) //しきい値の値がそれまでのしきい値の最大を超えた時
{
litemax=SENSOR_2; //新たな最大値を記録する
timemax=FastTimer(0);} //新たな最大値を記録した時の時間を記録する
}
左旋回で一周する間にしきい値の値がそれまでのしきい値の最大を超えた時、新たな最大値とその時の時間を記録する。そのあとも一周終わるまで旋回を続け、さらに大きいしきい値を探す。
Off(OUT_AC);Wait(100); //一時停止
OnFwd(OUT_C);OnRev(OUT_A); //右旋回
Wait(runtime-timemax); //しきい値が最大になった時の方向を向くまで
Off(OUT_AC);Wait(100); //一時停止
OnRev(OUT_AC);Wait(100); //懐中電灯のある方に向かって前進
}
一周した後右旋回でしきい値が最大になった方向を向く。(4秒−左旋回を始めてから新たな最大値を記録するまでの時間)の間右旋回
しきい値が最大になった方向に前進する。
utu;} //ボールをシュートする
しきい値が58を超えたら懐中電灯の近くとみなして、ボールをシュートする。
58を超えていなければ、もう一度左旋回をしてしきい値の高い場所を探す。
***一つ目のプログラムの問題点 [#t623c7af]
まっすぐ懐中電灯の方に向かえず、近くに行ってもしきい値が上がらない。
***解決方法 [#k12073d4]
正確に懐中電灯の方向を向いていなければ、しきい値が高くならないようにセンサーの正面からの光だけ入るようにした。
**懐中電灯を通過したことに気が付くプログラム [#l1f7af41]
左旋回中に懐中電灯を通り過ぎたときしきい値が急低下するので、その部分をさがす。そのあと急上昇するまで右旋回をして、懐中電灯のある方向にロボットを向ける。
#define ageru OnRev(OUT_B);Wait(9);Off(OUT_B); //アームを上げる
#define utu OnFwd(OUT_AC);Wait(50);ageru;OnRev(OUT_AC);Wait(150);Off(OUT_AC); //ボールをシュートする。
ボールをシュートする定義です。課題2と同じ。
ボールをシュートする時はアームを持ち上げて一度後ろに下がってから、ボールに体当たりをする。
task main()
{ SetSensor(SENSOR_2, SENSOR_LIGHT);
int runtime=400; //一周するのにかかる時間
int liteima=0; //その瞬間のしきい値
int litedown=0; //急低下後のしきい値
一周するのにかかる時間、その瞬間のしきい値と急低下後のしきい値を設定します。
ClearTimer(0);
while(FastTimer(0) < runtime) //一周するまでの間
{
liteima=SENSOR_2; //その瞬間のしきい値を記録
OnFwd(OUT_A);OnRev(OUT_C);Wait(10); //左旋回する
まずその場でのしきい値 (liteima)を記録して、そこから左に旋回する。
しきい値が急低下するまで左旋回を続ける。
if(SENSOR_2 < liteima-12) //しきい値が急低下した時に行う動作
{
PlaySound(SOUND_UP); //音を鳴らす
litedown=SENSOR_2; //急低下後のしきい値を記録
until(SENSOR_2 > litedown+12){ OnFwd(OUT_C);OnRev(OUT_A);} //しきい値がもう一度上がるまで右旋回
しきい値が一度に12以上さがった時。その場所のしきい値(litedown)を記録して、右旋回を始める。
Off(OUT_AC);Wait(400); } //一周するのにかかる時間が終わるまで止る
}
(litedown)の値から12以上上がった時その場に4秒間停止して while(FastTimer(0) < runtime)の次の動作に移れるようにする。
until(SENSOR_2 > 58){ OnRev(OUT_AC);} //懐中電灯の方向に前進
Off(OUT_AC);Wait(100); //一時停止
utu; //ボールをシュートする。
}
しきい値が58を超えるまで前進する。しきい値が58を超えたら懐中電灯の近くとみなして、ボールをシュートする。
***二つ目のプログラムの問題点 [#g7c2205e]
その一 窓から入ってきた光で動作してしまう。
その二 一気にしきい値が下がる場所が見つからない。
***解決方法 [#od627e8f]
その一について 一気にしきい値が8だけ下がったら次の動作に移るようにしていたが、窓からの光で次の動作を始めてしまう事があった。
なのでしきい値が一気に12下がらないと次の動作に移らないようにした。
その二について ゆっくり回転していたのが原因だった。そうするとしきい値が一気に下がらずうまくいかないことがあったので回転の速さを下げるのは止めた。
*まとめ [#b2310249]
本体の写真が間違っていました。修正してあります。
OnFwdで後進、OnRevで前進をします。どうしてこうなるのかよく分かりません。
以前はしきい値が63を超えたら懐中電灯の近くとみなしていた。しかし講義を受けた教室で実験した時に懐中電灯に近づいてもしきい値が上がらず懐中電灯にぶつかってしまった。なのでしきい値が58を超えたら懐中電灯の近くとみなすことにした。(実験したのはロボコンが始まる前の時間です。)
一つ目のプログラムは講義中にほとんど説明されたので特に困ることはなかった。
二つ目のプログラムはどれだけしきい値が変わったら次の動作をするか、外からの光にどうやって対策するかなど考えることがたくさんあった。
二つ目のプログラムはその場で一回転する間に懐中電灯を見つけなければならない。だから懐中電灯との距離が離れたりするとうまくいかなかった。大体1メートル30センチを超えるとしきい値が12以上下がる場所が見つからず成功しなかった。機会があればこれを解決できるようなプログラムを考えたいと思う。
終了行:
[[2015a/Member]]
*今回の課題について [#n372d985]
半径一メートル以内にある懐中電灯を探し、懐中電灯にピンポン玉を当てる。と言う課題です。
ロボットが懐中電灯に当たらない限りどこからボールを打っても良い。
初めはタッチセンサーを利用して懐中電灯にボールをぶつけようとしましたが、ロボットが懐中電灯に当たってはいけないと言う決まりがあったので光センサーだけで懐中電灯を探しました。
今回は2つの方法で懐中電灯を探す。
*ロボット本体の説明 [#h4b55fe1]
**車体について [#of6e552c]
#ref(./IMG_0555.JPG,10%)
付属のマニュアルに書いてあるロボットを使いました。
モーターCで右のタイヤ(写真の下側)を、モーターAで左タイヤ(写真の上側)を動かすことにした。
二つのモーターを使って前進、後進、その場で旋回、片方のモーターだけを使ってゆっくり車体の向きを変えることができる。
OnFwdで後進、OnRevで前進をします。
**アームについて [#x5441150]
#ref(./IMG_0552.JPG,10%)
決まった時間がたつとアームが下がりボールを捕まえるようになっている。
モーターBを使って動かす。
#ref(./IMG_0605.JPG,10%)
OnRevでアームを持ち上げる。赤い矢印はモーターB、青い矢印はアームの動く向き。
#ref(./IMG_0606.JPG,10%)
OnFwdでアームを下げる。赤い矢印はモーターB、青い矢印はアームの動く向き。
モーターBを回転させることでアームを下げてボールを捕まえたり、シュートの直前に捕まえるときと逆にモーターを回して開いたりする。
。
**全体 [#ld0055da]
#ref(./as.JPG,20%)
#ref(./IMG_0580.JPG,20%)
この写真がロボットの完成品の全体です。
ボールをシュートする時はアームを持ち上げて一度後ろに下がってから、ボールに体当たりをする。
ただし課題2と違い光センサーが前を向くように取り付けてあります。
センサーを前に付けただけだと、正確に懐中電灯の方向を向いていなくてもしきい値が高くなってしまう。センサーの正面からの光だけ入るようにした。
*プログラムの説明 [#zfe56287]
**一周する間にしきい値の最大値を見つけるプログラム [#r6ab3789]
#define ageru OnRev(OUT_B);Wait(9);Off(OUT_B);
#define utu OnFwd(OUT_AC);Wait(50);ageru;OnRev(OUT_AC);Wait(50);Off(OUT_AC);
ボールをシュートする定義です。課題2と同じ。
ボールをシュートする時はアームを持ち上げて一度後ろに下がってから、ボールに体当たりをする。
task main()
{ SetSensor(SENSOR_2, SENSOR_LIGHT);
int runtime=400; //一周するのにかかる時間
int litemax=0; //しきい値の最大値
int timemax=0; //しきい値が最大値の時の時間
一周するのにかかる時間、しきい値の最大値と最大になった時の時間を設定します。
while(SENSOR_2 < 58){ //しきい値が58を超えるまで繰り返す。
ClearTimer(0); //時間を測り始める
OnFwd(OUT_A);OnRev(OUT_C); //左旋回
while(FastTimer(0) < runtime) //一周するまで繰り返す
{
if(SENSOR_2 > litemax) //しきい値の値がそれまでのしきい値の最大を超えた時
{
litemax=SENSOR_2; //新たな最大値を記録する
timemax=FastTimer(0);} //新たな最大値を記録した時の時間を記録する
}
左旋回で一周する間にしきい値の値がそれまでのしきい値の最大を超えた時、新たな最大値とその時の時間を記録する。そのあとも一周終わるまで旋回を続け、さらに大きいしきい値を探す。
Off(OUT_AC);Wait(100); //一時停止
OnFwd(OUT_C);OnRev(OUT_A); //右旋回
Wait(runtime-timemax); //しきい値が最大になった時の方向を向くまで
Off(OUT_AC);Wait(100); //一時停止
OnRev(OUT_AC);Wait(100); //懐中電灯のある方に向かって前進
}
一周した後右旋回でしきい値が最大になった方向を向く。(4秒−左旋回を始めてから新たな最大値を記録するまでの時間)の間右旋回
しきい値が最大になった方向に前進する。
utu;} //ボールをシュートする
しきい値が58を超えたら懐中電灯の近くとみなして、ボールをシュートする。
58を超えていなければ、もう一度左旋回をしてしきい値の高い場所を探す。
***一つ目のプログラムの問題点 [#t623c7af]
まっすぐ懐中電灯の方に向かえず、近くに行ってもしきい値が上がらない。
***解決方法 [#k12073d4]
正確に懐中電灯の方向を向いていなければ、しきい値が高くならないようにセンサーの正面からの光だけ入るようにした。
**懐中電灯を通過したことに気が付くプログラム [#l1f7af41]
左旋回中に懐中電灯を通り過ぎたときしきい値が急低下するので、その部分をさがす。そのあと急上昇するまで右旋回をして、懐中電灯のある方向にロボットを向ける。
#define ageru OnRev(OUT_B);Wait(9);Off(OUT_B); //アームを上げる
#define utu OnFwd(OUT_AC);Wait(50);ageru;OnRev(OUT_AC);Wait(150);Off(OUT_AC); //ボールをシュートする。
ボールをシュートする定義です。課題2と同じ。
ボールをシュートする時はアームを持ち上げて一度後ろに下がってから、ボールに体当たりをする。
task main()
{ SetSensor(SENSOR_2, SENSOR_LIGHT);
int runtime=400; //一周するのにかかる時間
int liteima=0; //その瞬間のしきい値
int litedown=0; //急低下後のしきい値
一周するのにかかる時間、その瞬間のしきい値と急低下後のしきい値を設定します。
ClearTimer(0);
while(FastTimer(0) < runtime) //一周するまでの間
{
liteima=SENSOR_2; //その瞬間のしきい値を記録
OnFwd(OUT_A);OnRev(OUT_C);Wait(10); //左旋回する
まずその場でのしきい値 (liteima)を記録して、そこから左に旋回する。
しきい値が急低下するまで左旋回を続ける。
if(SENSOR_2 < liteima-12) //しきい値が急低下した時に行う動作
{
PlaySound(SOUND_UP); //音を鳴らす
litedown=SENSOR_2; //急低下後のしきい値を記録
until(SENSOR_2 > litedown+12){ OnFwd(OUT_C);OnRev(OUT_A);} //しきい値がもう一度上がるまで右旋回
しきい値が一度に12以上さがった時。その場所のしきい値(litedown)を記録して、右旋回を始める。
Off(OUT_AC);Wait(400); } //一周するのにかかる時間が終わるまで止る
}
(litedown)の値から12以上上がった時その場に4秒間停止して while(FastTimer(0) < runtime)の次の動作に移れるようにする。
until(SENSOR_2 > 58){ OnRev(OUT_AC);} //懐中電灯の方向に前進
Off(OUT_AC);Wait(100); //一時停止
utu; //ボールをシュートする。
}
しきい値が58を超えるまで前進する。しきい値が58を超えたら懐中電灯の近くとみなして、ボールをシュートする。
***二つ目のプログラムの問題点 [#g7c2205e]
その一 窓から入ってきた光で動作してしまう。
その二 一気にしきい値が下がる場所が見つからない。
***解決方法 [#od627e8f]
その一について 一気にしきい値が8だけ下がったら次の動作に移るようにしていたが、窓からの光で次の動作を始めてしまう事があった。
なのでしきい値が一気に12下がらないと次の動作に移らないようにした。
その二について ゆっくり回転していたのが原因だった。そうするとしきい値が一気に下がらずうまくいかないことがあったので回転の速さを下げるのは止めた。
*まとめ [#b2310249]
本体の写真が間違っていました。修正してあります。
OnFwdで後進、OnRevで前進をします。どうしてこうなるのかよく分かりません。
以前はしきい値が63を超えたら懐中電灯の近くとみなしていた。しかし講義を受けた教室で実験した時に懐中電灯に近づいてもしきい値が上がらず懐中電灯にぶつかってしまった。なのでしきい値が58を超えたら懐中電灯の近くとみなすことにした。(実験したのはロボコンが始まる前の時間です。)
一つ目のプログラムは講義中にほとんど説明されたので特に困ることはなかった。
二つ目のプログラムはどれだけしきい値が変わったら次の動作をするか、外からの光にどうやって対策するかなど考えることがたくさんあった。
二つ目のプログラムはその場で一回転する間に懐中電灯を見つけなければならない。だから懐中電灯との距離が離れたりするとうまくいかなかった。大体1メートル30センチを超えるとしきい値が12以上下がる場所が見つからず成功しなかった。機会があればこれを解決できるようなプログラムを考えたいと思う。
ページ名: