2008a/A8/課題3右
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
検索
|
最終更新
|
ヘルプ
|
ログイン
]
開始行:
*目次 [#abd898d2]
#contents
*課題 [#n7cbb7ac]
白いホイールを投げるロボットを作成し、以下の動きをするようにプログラムを作成せよ。 (重複しないように一人一つ以上のプログラムを作成すること)
~1. 全方向から懐中電灯の方向を探しだし、懐中電灯に向けてブロックを投げる。懐中電灯は動かさない。
~2.懐中電灯をゆっくり動かしたとき懐中電灯に向かって進み、懐中電灯の動きを止めればブロックを投げる。
~3.懐中電灯をゆっくり動かしたとき懐中電灯に向かって進み、懐中電灯の動きを止めれば50cmの距離まで近づいてブロックを投げる。
~ただし、モータ、光センサ、タッチセンサはそれぞれ2個まで使用可。懐中電灯の代わりに携帯のライトなどを利用してもよい。
*ロボット [#caf8cb2b]
**1.ロボットボディー [#l28bf892]
#ref(2008a/A8/課題3右/all.jpg,CENTER)
CENTER:ーロボットの全体模様ー
~
CENTER:基本的なボディーの上にコントロールキットをついた後でセンサーはその上についた。
~
CENTER:コントロールキットの上にまた発射台もついた。
~
~
~
#ref(2008a/A8/課題3右/front.jpg,CENTER)
CENTER:ーロボットの前模様ー
~
CENTER:前についている光センサー二つ
~
~
~
#ref(2008a/A8/課題3右/back.jpg,CENTER)
CENTER:ーロボットの後ろ模様ー
~
CENTER:車輪の模様。回転しやすいために一つ車輪を使った。
~
~
~
#ref(2008a/A8/課題3右/side.jpg,CENTER)
CENTER:ーロボットの横模様ー
~
CENTER:発射台の模様と車輪が見えること。
~
~
~
#ref(2008a/A8/課題3右/body.jpg,CENTER)
CENTER:ーロボットの基本的なボディーー
~
CENTER:これに基づいてロボットを作った。
~
~
~
#ref(2008a/A8/課題3右/sensor.jpg,CENTER)
CENTER:ーロボットのセンサー部分ー
~
CENTER:光の干渉を避けるためにセンサーの間の距離を遠くした。
~
~
~
**2.発射機 [#ke30291e]
#ref(2008a/A8/課題3右/shoot_front.jpg,CENTER)
CENTER:ー発射台の前模様ー
~
CENTER:ブロックが出る入り口。
~
~
~
#ref(2008a/A8/課題3右/shoot_side.jpg,CENTER)
CENTER:ー発射台の横模様ー
~
CENTER:ブロック三個を入れれる模様。
~
~
~
#ref(2008a/A8/課題3右/shoot_back.jpg,CENTER)
CENTER:ー発射台の後ろ模様ー
~
CENTER:モーターを発射機に直接ついてパワフルに発射できるようにした。
~
~
~
#ref(2008a/A8/課題3右/shootting.jpg,CENTER)
CENTER:ー発射台の作動原理ー
~
CENTER:モーターを使ってロボットの腕を曲がってブロックを打つ。
~
~
~
*プログラム [#z48bb002]
**1.懐中電灯の方向を探しだし、懐中電灯に向けてブロックを投げる [#u954ccbd]
-発射機のモターを動作させてブロックを投げる。
sub Shoot ()
{
OnRev ( OUT_C );
Wait ( 100 );
PlaySound ( SOUND_DOUBLE_BEEP );
Off ( OUT_C );
}
task main ()
{
int iDegreeOfLight = 60;
int iAverage;
SetSensor ( SENSOR_1, SENSOR_LIGHT );
SetSensor ( SENSOR_3, SENSOR_LIGHT );
// 懐中電灯が現れる前まで待っている
until ( SENSOR_1 > iDegreeOfLight || SENSOR_3 > iDegreeOfLight ) {
PlaySound ( SOUND_CLICK );
}
while ( 1 )
{
if ( SENSOR_1 > SENSOR_3 )
{
iAverage = ( SENSOR_1 + SENSOR_3 ) / 2;
while ( SENSOR_3 > iAverage + 1 || SENSOR_3 < iAverage - 1 )
{
OnFwd ( OUT_B );
}
}
else
{
// ロボットが左折だけできるから
// 懐中電灯がロボットの右側にあったら一回転して光を探す。
OnFwd ( OUT_B );
Wait ( 280 );
}
Off ( OUT_B );
Shoot ();
break;
}
}
**2.懐中電灯をゆっくり動かしたとき懐中電灯に向かって進み、懐中電灯の動きを止めればブロックを投げる。 [#p9f7e43d]
-発射機のモターを動作させてブロックを投げる。
sub Shoot ()
{
OnRev ( OUT_C );
Wait ( 100 );
PlaySound ( SOUND_DOUBLE_BEEP );
Off ( OUT_C );
}
task main ()
{
int iDegreeOfLight = 60;
int iAverage, iAverage_After = 0;
SetSensor ( SENSOR_1, SENSOR_LIGHT );
SetSensor ( SENSOR_3, SENSOR_LIGHT );
// 懐中電灯が現れる前まで待っている
until ( SENSOR_1 > iDegreeOfLight || SENSOR_3 > iDegreeOfLight ) {
PlaySound ( SOUND_CLICK );
}
while ( 1 )
{
if ( SENSOR_1 > SENSOR_3 )
{
iAverage = ( SENSOR_1 + SENSOR_3 ) / 2;
while ( SENSOR_3 > iAverage + 1 || SENSOR_3 < iAverage - 1 )
{
OnFwd ( OUT_B );
}
}
else
{
// ロボットが左折だけできるから
// 懐中電灯がロボットの右側にあったら一回転して光を探す。
OnFwd ( OUT_B );
Wait ( 280 );
}
Off ( OUT_B );
- 方向を探したら懐中電灯が動いているかどうかを判断して少しずつ進む。進みながら光の変化を計算する。もし変化がなければ進むのを止めてブロックを投げる。
iAverage_After = ( SENSOR_1 + SENSOR_3 ) / 2 - 5;
while ( iAverage != iAverage_After ) {
PlaySound ( SOUND_CLICK );
OnRev ( OUT_B );
iAverage = iAverage_After;
Wait ( 20 );
iAverage_After = ( SENSOR_1 + SENSOR_3 ) / 2;
}
Off ( OUT_B );
Shoot ();
break;
}
}
**3.懐中電灯をゆっくり動かしたとき懐中電灯に向かって進み、懐中電灯の動きを止めれば50cmの距離まで近づいてブロックを投げる。 [#kb822472]
#define DISTANCE_50 50
-発射機のモターを動作させてブロックを投げる。
sub Shoot ()
{
OnRev ( OUT_C );
Wait ( 100 );
PlaySound ( SOUND_DOUBLE_BEEP );
Off ( OUT_C );
}
task main ()
{
int iDegreeOfLight = 60;
int iAverage, iAverage_After = 0;
SetSensor ( SENSOR_1, SENSOR_LIGHT );
SetSensor ( SENSOR_3, SENSOR_LIGHT );
// 懐中電灯が現れる前まで待っている
until ( SENSOR_1 > iDegreeOfLight || SENSOR_3 > iDegreeOfLight ) {
PlaySound ( SOUND_CLICK );
}
while ( 1 )
{
if ( SENSOR_1 > SENSOR_3 )
{
iAverage = ( SENSOR_1 + SENSOR_3 ) / 2;
while ( SENSOR_3 > iAverage + 2 || SENSOR_3 < iAverage - 2 )
{
OnFwd ( OUT_B );
}
}
else
{
// ロボットが左折だけできるから
// 懐中電灯がロボットの右側にあったら一回転して光を探す。
OnFwd ( OUT_B );
Wait ( 280 );
}
Off ( OUT_B );
- 方向を探したら懐中電灯が動いているかどうかを判断して少しずつ進む。進みながら光の変化を計算する。もし変化がなければ進むのを止めてブロックを投げる。
iAverage_After = ( SENSOR_1 + SENSOR_3 ) / 2 - 5;
while ( iAverage != iAverage_After ) {
PlaySound ( SOUND_CLICK );
OnRev ( OUT_B );
iAverage = iAverage_After;
Wait ( 20 );
iAverage_After = ( SENSOR_1 + SENSOR_3 ) / 2;
}
- 懐中電灯が止まったら光センサーの数値を利用して懐中電灯からロボットまでの距離を判断する。何度計って懐中電灯からロボットまでの距離が50cmになる光センサーの数値にする。
iAverage = ( SENSOR_1 + SENSOR_3 ) / 2;
while ( iAverage > DISTANCE_50 ) {
OnRev ( OUT_B );
iAverage = ( SENSOR_1 + SENSOR_3 ) / 2;
}
Off ( OUT_B );
Shoot ();
break;
}
}
*難しかったところ&工夫したところ [#o5da425a]
-何もないところから始めたから発射機をどう作ればいいかなと考えることが一番難しかった。モターの回転運動を利用して発射機のブロックを直線に投げるようにすることとブロックを投げる前に準備して置くことなどが難しかった。
~
-また、ロボットが左折だけできるから懐中電灯が右側にある場合には一回回転して懐中電灯を正確に探すことが難しかった。でも、何回試してみてどのぐらい回転すればいいか分かった。
~
-二個の光センサーを使って懐中電灯を向かうようにプログラムを作ることと懐中電灯が動いているかどうかを判断することと懐中電灯とロボット間の距離を計ることも難しかった。解決策は二個の光センサーの数値の平均を計って二個の光センサーの中で一つの光センサーの数値がその平均と同じくなるまで回転するようにした。また、懐中電灯とロボット間の距離は何回試して光センサーの数値によって距離を求めた。
~
-まだ解決しなかったんだけど前進するとき重量中心が異なるかもしれないけど直進するときまっすぐ行けない問題がある。
*コメントをどうぞ [#m75a2fe3]
#comment
ロボットの説明、プログラムを頑張っています。~
*ただ、iAverageを使わなくても式の変形によって簡単に表せるところもあります。~
例えば、課題1ではSENSOR_3>SENSOR_1+2とすれば解りやすいです。~
*また、ディファレンシャル・ギアの両側にストッパーをつけることで、左右どちらにも曲がれます。~
*課題1では相対的に最も明るい方向を求めてください。I~
終了行:
*目次 [#abd898d2]
#contents
*課題 [#n7cbb7ac]
白いホイールを投げるロボットを作成し、以下の動きをするようにプログラムを作成せよ。 (重複しないように一人一つ以上のプログラムを作成すること)
~1. 全方向から懐中電灯の方向を探しだし、懐中電灯に向けてブロックを投げる。懐中電灯は動かさない。
~2.懐中電灯をゆっくり動かしたとき懐中電灯に向かって進み、懐中電灯の動きを止めればブロックを投げる。
~3.懐中電灯をゆっくり動かしたとき懐中電灯に向かって進み、懐中電灯の動きを止めれば50cmの距離まで近づいてブロックを投げる。
~ただし、モータ、光センサ、タッチセンサはそれぞれ2個まで使用可。懐中電灯の代わりに携帯のライトなどを利用してもよい。
*ロボット [#caf8cb2b]
**1.ロボットボディー [#l28bf892]
#ref(2008a/A8/課題3右/all.jpg,CENTER)
CENTER:ーロボットの全体模様ー
~
CENTER:基本的なボディーの上にコントロールキットをついた後でセンサーはその上についた。
~
CENTER:コントロールキットの上にまた発射台もついた。
~
~
~
#ref(2008a/A8/課題3右/front.jpg,CENTER)
CENTER:ーロボットの前模様ー
~
CENTER:前についている光センサー二つ
~
~
~
#ref(2008a/A8/課題3右/back.jpg,CENTER)
CENTER:ーロボットの後ろ模様ー
~
CENTER:車輪の模様。回転しやすいために一つ車輪を使った。
~
~
~
#ref(2008a/A8/課題3右/side.jpg,CENTER)
CENTER:ーロボットの横模様ー
~
CENTER:発射台の模様と車輪が見えること。
~
~
~
#ref(2008a/A8/課題3右/body.jpg,CENTER)
CENTER:ーロボットの基本的なボディーー
~
CENTER:これに基づいてロボットを作った。
~
~
~
#ref(2008a/A8/課題3右/sensor.jpg,CENTER)
CENTER:ーロボットのセンサー部分ー
~
CENTER:光の干渉を避けるためにセンサーの間の距離を遠くした。
~
~
~
**2.発射機 [#ke30291e]
#ref(2008a/A8/課題3右/shoot_front.jpg,CENTER)
CENTER:ー発射台の前模様ー
~
CENTER:ブロックが出る入り口。
~
~
~
#ref(2008a/A8/課題3右/shoot_side.jpg,CENTER)
CENTER:ー発射台の横模様ー
~
CENTER:ブロック三個を入れれる模様。
~
~
~
#ref(2008a/A8/課題3右/shoot_back.jpg,CENTER)
CENTER:ー発射台の後ろ模様ー
~
CENTER:モーターを発射機に直接ついてパワフルに発射できるようにした。
~
~
~
#ref(2008a/A8/課題3右/shootting.jpg,CENTER)
CENTER:ー発射台の作動原理ー
~
CENTER:モーターを使ってロボットの腕を曲がってブロックを打つ。
~
~
~
*プログラム [#z48bb002]
**1.懐中電灯の方向を探しだし、懐中電灯に向けてブロックを投げる [#u954ccbd]
-発射機のモターを動作させてブロックを投げる。
sub Shoot ()
{
OnRev ( OUT_C );
Wait ( 100 );
PlaySound ( SOUND_DOUBLE_BEEP );
Off ( OUT_C );
}
task main ()
{
int iDegreeOfLight = 60;
int iAverage;
SetSensor ( SENSOR_1, SENSOR_LIGHT );
SetSensor ( SENSOR_3, SENSOR_LIGHT );
// 懐中電灯が現れる前まで待っている
until ( SENSOR_1 > iDegreeOfLight || SENSOR_3 > iDegreeOfLight ) {
PlaySound ( SOUND_CLICK );
}
while ( 1 )
{
if ( SENSOR_1 > SENSOR_3 )
{
iAverage = ( SENSOR_1 + SENSOR_3 ) / 2;
while ( SENSOR_3 > iAverage + 1 || SENSOR_3 < iAverage - 1 )
{
OnFwd ( OUT_B );
}
}
else
{
// ロボットが左折だけできるから
// 懐中電灯がロボットの右側にあったら一回転して光を探す。
OnFwd ( OUT_B );
Wait ( 280 );
}
Off ( OUT_B );
Shoot ();
break;
}
}
**2.懐中電灯をゆっくり動かしたとき懐中電灯に向かって進み、懐中電灯の動きを止めればブロックを投げる。 [#p9f7e43d]
-発射機のモターを動作させてブロックを投げる。
sub Shoot ()
{
OnRev ( OUT_C );
Wait ( 100 );
PlaySound ( SOUND_DOUBLE_BEEP );
Off ( OUT_C );
}
task main ()
{
int iDegreeOfLight = 60;
int iAverage, iAverage_After = 0;
SetSensor ( SENSOR_1, SENSOR_LIGHT );
SetSensor ( SENSOR_3, SENSOR_LIGHT );
// 懐中電灯が現れる前まで待っている
until ( SENSOR_1 > iDegreeOfLight || SENSOR_3 > iDegreeOfLight ) {
PlaySound ( SOUND_CLICK );
}
while ( 1 )
{
if ( SENSOR_1 > SENSOR_3 )
{
iAverage = ( SENSOR_1 + SENSOR_3 ) / 2;
while ( SENSOR_3 > iAverage + 1 || SENSOR_3 < iAverage - 1 )
{
OnFwd ( OUT_B );
}
}
else
{
// ロボットが左折だけできるから
// 懐中電灯がロボットの右側にあったら一回転して光を探す。
OnFwd ( OUT_B );
Wait ( 280 );
}
Off ( OUT_B );
- 方向を探したら懐中電灯が動いているかどうかを判断して少しずつ進む。進みながら光の変化を計算する。もし変化がなければ進むのを止めてブロックを投げる。
iAverage_After = ( SENSOR_1 + SENSOR_3 ) / 2 - 5;
while ( iAverage != iAverage_After ) {
PlaySound ( SOUND_CLICK );
OnRev ( OUT_B );
iAverage = iAverage_After;
Wait ( 20 );
iAverage_After = ( SENSOR_1 + SENSOR_3 ) / 2;
}
Off ( OUT_B );
Shoot ();
break;
}
}
**3.懐中電灯をゆっくり動かしたとき懐中電灯に向かって進み、懐中電灯の動きを止めれば50cmの距離まで近づいてブロックを投げる。 [#kb822472]
#define DISTANCE_50 50
-発射機のモターを動作させてブロックを投げる。
sub Shoot ()
{
OnRev ( OUT_C );
Wait ( 100 );
PlaySound ( SOUND_DOUBLE_BEEP );
Off ( OUT_C );
}
task main ()
{
int iDegreeOfLight = 60;
int iAverage, iAverage_After = 0;
SetSensor ( SENSOR_1, SENSOR_LIGHT );
SetSensor ( SENSOR_3, SENSOR_LIGHT );
// 懐中電灯が現れる前まで待っている
until ( SENSOR_1 > iDegreeOfLight || SENSOR_3 > iDegreeOfLight ) {
PlaySound ( SOUND_CLICK );
}
while ( 1 )
{
if ( SENSOR_1 > SENSOR_3 )
{
iAverage = ( SENSOR_1 + SENSOR_3 ) / 2;
while ( SENSOR_3 > iAverage + 2 || SENSOR_3 < iAverage - 2 )
{
OnFwd ( OUT_B );
}
}
else
{
// ロボットが左折だけできるから
// 懐中電灯がロボットの右側にあったら一回転して光を探す。
OnFwd ( OUT_B );
Wait ( 280 );
}
Off ( OUT_B );
- 方向を探したら懐中電灯が動いているかどうかを判断して少しずつ進む。進みながら光の変化を計算する。もし変化がなければ進むのを止めてブロックを投げる。
iAverage_After = ( SENSOR_1 + SENSOR_3 ) / 2 - 5;
while ( iAverage != iAverage_After ) {
PlaySound ( SOUND_CLICK );
OnRev ( OUT_B );
iAverage = iAverage_After;
Wait ( 20 );
iAverage_After = ( SENSOR_1 + SENSOR_3 ) / 2;
}
- 懐中電灯が止まったら光センサーの数値を利用して懐中電灯からロボットまでの距離を判断する。何度計って懐中電灯からロボットまでの距離が50cmになる光センサーの数値にする。
iAverage = ( SENSOR_1 + SENSOR_3 ) / 2;
while ( iAverage > DISTANCE_50 ) {
OnRev ( OUT_B );
iAverage = ( SENSOR_1 + SENSOR_3 ) / 2;
}
Off ( OUT_B );
Shoot ();
break;
}
}
*難しかったところ&工夫したところ [#o5da425a]
-何もないところから始めたから発射機をどう作ればいいかなと考えることが一番難しかった。モターの回転運動を利用して発射機のブロックを直線に投げるようにすることとブロックを投げる前に準備して置くことなどが難しかった。
~
-また、ロボットが左折だけできるから懐中電灯が右側にある場合には一回回転して懐中電灯を正確に探すことが難しかった。でも、何回試してみてどのぐらい回転すればいいか分かった。
~
-二個の光センサーを使って懐中電灯を向かうようにプログラムを作ることと懐中電灯が動いているかどうかを判断することと懐中電灯とロボット間の距離を計ることも難しかった。解決策は二個の光センサーの数値の平均を計って二個の光センサーの中で一つの光センサーの数値がその平均と同じくなるまで回転するようにした。また、懐中電灯とロボット間の距離は何回試して光センサーの数値によって距離を求めた。
~
-まだ解決しなかったんだけど前進するとき重量中心が異なるかもしれないけど直進するときまっすぐ行けない問題がある。
*コメントをどうぞ [#m75a2fe3]
#comment
ロボットの説明、プログラムを頑張っています。~
*ただ、iAverageを使わなくても式の変形によって簡単に表せるところもあります。~
例えば、課題1ではSENSOR_3>SENSOR_1+2とすれば解りやすいです。~
*また、ディファレンシャル・ギアの両側にストッパーをつけることで、左右どちらにも曲がれます。~
*課題1では相対的に最も明るい方向を求めてください。I~
ページ名: