目次

今回の課題

今回与えられた課題の概要は、懐中電灯の明かりを判断し懐中電灯めがけてパーツを投げつけるロボットの制作です。

今回のプログラム課題は3つあります。それらを下記に示します。

1.全方向から懐中電灯の方向を探し出し、懐中電灯を狙ってブロックを投げる。
  方向を定めたのち、懐中電灯の30cm以内に近づかない範囲で必要な距離を移動してもよい。
  懐中電灯は動かさないが、いろいろな距離や方向にある懐中電灯に対応できるロボットにすること。
2.懐中電灯をゆっくり動かしたとき懐中電灯に向かって進む。
  懐中電灯の動きを止めれば一定の距離(懐中電灯から30cm以上離れた距離)まで近づいて懐中電灯に向かってブロックを投げる。
3.懐中電灯を動かしたとき懐中電灯に向かって進み、見失った時には再び全方向から懐中電灯を探し出す。
  7秒以上追尾できたら懐中電灯に向かってブロックを投げる。

この課題を全うするために自分の全身全霊をかけて機体を制作しプログラムを構築した。

機体制作

今回の機体制作担当は・・・やはり高橋である。
「前回、前々回との機体とは違うものが作りたい」という至極個人的な思考によりオリジナリティあひれる機体制作に取り組んだ。
ちなみに今回の機体が完成するまで3日を費やしました。

こちらが完成した機体である。

01.JPG

↑前から見た図

02.JPG

↑右から見た図

03.JPG

↑後ろから見た図

04.JPG

↑左から見た図

今回なんといっても重要なのは駆動部である。

08.JPG

↑の図の中央にあるディファレンシャル・ギアの使用という初めての試みにより駆動部の設計に大きく苦悩して機体を制作した。

全体の工夫点

今回期待制作において工夫した点です。

駆動部のギア構造ゞ酘杏瑤両暖駝明冓

今回多くの人が悩んだと思われるのが駆動部のギア構造ではないだろうか。
↓が今回モーターに直結したギア部分である。

25.JPG

↑の写真のようにモーターに最小のギアをつけギア比を1:5にすることで、スピードよりパワーを優先させることにした。

モーターからタイヤまでの長さ、すなわち機体が縦に大きくなるほど回転行動が難しくなる。
そこで今回の駆動部のギア構造はL字型、直角構造に決定した。
それが↓に示したものである。

16.JPG
30.jpg

↑の写真の構造により駆動部の面積を小さくすることに成功した。

駆動部のギア構造▲織ぅ篦招襯ア比編

今回はディファレンシャル・ギアを使用するのが条件である。
設計条件をクリアするためにはディファレンシャル・ギアからタイヤまでのギア数を左右で変えなければならない。
ギア数を変えるのは比較的簡単であるが、ギア数を変えると左右のタイヤで回転数が変わってしまう。
これでも機体として動作することは可能である。しかし、左右均等に動く機体を制作してこそ「真の機体制作者」であると思う。
そこで高橋は「真の機体制作者」になることを目指してみた。
回転数を変えずにギア数を変える・・・この問題の解決に数時間の思考を要した。
思考の末完成したのが↓である。上2つが右側(正面から見ると左側)で下2つが左側(正面から見ると右側)のタイヤ直結ギア構造である。

17.JPG
18.JPG
19.JPG
20.JPG

こうして機体は左右対称に行動することが可能になり、プログラムを組む上でも非常に楽になった。

駆動部機体重量負荷軽減構造

上記のように機体制作を続けてきたが同時に問題も発生してきた。
今回の機体仕様上、機体は上に大きくなってしまう。
そのためタイヤを支えるためのパーツに負荷が大きくかかってしまい、モーターのパワーを純粋に伝えることができなくなってしまう。
せっかくギア構造の工夫,妊僖錙爾鯑世燭里北蟻未砲覆辰討靴泙Α
そこで考えたのがタイヤに直結している棒状のパーツを2点で支えるということである。

31.jpg
32.jpg

↑の写真で示した部分に↓で示したパーツを加えた。2点固定の完成!!

33.jpg

これによりモーターからのパワーをロスすることなくタイヤに伝えることができる。

回転行動における最重要動作部「ローラー」

今回の課題の仕様上、その場でいかになめらかな回転行動を行うかが成功の鍵である。
そこで多くのグループが考えたのが3輪構造であると思う。
ディファレンシャル・ギアにより一つの動作で駆動するのはタイヤ1つとなっており、3輪にすることでより回転行動がしやすくなる。
ただ3輪にすればよいというわけではなく、機体の重量を3輪で支えた上でなめらかな回転行動をとらなければいけない。
この点を踏まえた上で完成したのが↓のローラーである。

12.JPG
15.JPG

ちなみに製造方法は↓こんな感じです。

13.JPG

こうして作られたローラーには機体の重量に負けないように↓このパーツがついています。

34.jpg

このパーツはタイヤを固定している軸自体が回転するときに軸のブレを無くし、なめらかな回転を可能にしています。

ブロック射出砲台

今回の期待制作の問題点の一つが砲台の設計である。
砲台がしっかりしていないと懐中電灯に命中させることは不可能である。
そこで射出ブロックの形状を観察してみた。
すると、ブロックには棒状のパーツで固定するのに最適な穴があり、なおかつ重心がブロックの中心であることがわかった。

そこで↓のような砲台を設計してみた。

04.JPG

しかし、この砲台をただ設置するだけでは懐中電灯に命中させることはできない。
そこでカスタムしたのが↓のストッパー(緑色の平状ブロック)である。

06.JPG

このストッパーのおかげで↓の角度での射出が可能になり、懐中電灯への安定した命中率を可能にした。

05.JPG

プログラム一覧

プログラム1

 制作者 河島

int     shine; //どこが明るいか探知するための値
#define set    SetPower(OUT_A,4);SetPower(OUT_C,7);SetSensor(SENSOR_3,SENSOR_LIGHT);shine==0;
#define r      OnFwd(OUT_A);  //機体が右方向に回転するマクロ
#define tomare Off(OUT_A);   //機体行動停止マクロ
#define fire   OnFwd(OUT_C);Wait(50);Float(OUT_C);  //発射!するマクロ
#define s3     SENSOR_3     //SENSORと入力するのが面倒で作ったマクロ
task main (){
set;                            //パワー・センサー・shineのセット
ClearTimer(0);           //タイマーをスタート
while(Timer(0) < 40){         //40は一回転するのに十分な時間
r;if(s3 > shine){shine == s3;} //右回転しながらセンサーの値がshineより大きかったら値を変更
}
PlayTone(440,50);        //上のプログラムが正常に作動したことの確認音
r;until((s3 > shine-3)&&(s3 < shine+3));//上でとったshineの値付近まで右回転したら
r;Wait(15);               //懐中電灯への微調整
tomare;                 //そこで止まる 
fire;                  //そして発射!!命中!!
}

プログラム2

 制作者 高橋

int     shine;       //明るいところを探知するための値
#define set    SetPower(OUT_A,4);SetPower(OUT_C,7);SetSensor(SENSOR_1,SENSOR_LIGHT);SetSensor(SENSOR_3,SENSOR_LIGHT);//パワーとセンサーの設定
#define r      OnFwd(OUT_A);//右回転するためのマクロ
#define l      OnRev(OUT_A);//左回転するためのマクロ
#define tomare Off(OUT_A); //停止するマクロ
#define fire   OnFwd(OUT_C);Wait(50);Float(OUT_C);//発射!!マクロ
#define s1     SENSOR_1   //SENSORの入力が面倒で作ったマクロその1
#define s3     SENSOR_3   //その2
task main (){
set;shine==0;        //セットとshineのセット
ClearTimer(0);       //タイマーをスタート
while(Timer(0) < 40){    //40は1回転するのに十分な時間
r;             //右回転しながら
if((s3 > shine)&&(s1 < s3)) //右センサーの値が左センサーの値より大きくshineの値より大きかったら
{shine=s3;}         //shineの値を変更
if((s1 > shine)&&(s1 > s3)) //左センサーの値が右センサーの値より大きくshineの値より大きかったら
{shine=s1;}         //shineの値を変更
}
r;                          //右センサーがshineの値付近まで回転したら
until((s3 >= shine-1)&&(s3 <= shine+1));
tomare;           //停止
ClearTimer(1);       //タイマーをスタート
while(Timer(1) < 30){    //☆30は懐中電灯の停止判断時間☆
if(s3 > shine)       //右センサーがshineより大きいなら
{shine==s3;ClearTimer(1);} //値を変更してタイマーをリスタート
if(s1 > shine)       //左センサーがshineより大きいなら     
{shine==s1;ClearTimer(1);} //値を変更してタイマーをリスタート
if((s3 < shine)&&(s1 < shine)&&(s1 > s3))
{l;} //shineが左右のセンサーよりも大きく左センサーが右センサーより大きいなら左回転
if((s3 < shine)&&(s1 < shine)&&(s1 < s3))
{r;} //shineが左右のセンサーよりも大きく右センサーが左センサーより大きいなら右回転
}
tomare;ClearTimer(0);    //行動停止とタイマースタート
while(Timer(0) < 5){    //微調整の0.5秒
if(s1 > s3){l;}       //左右の光センサーの値が大きい方に方向転換
if(s3 > s1){r;}
}
tomare;                     //行動停止そして
fire;            //発射!!命中!!
}

プログラム3

 制作者 丸山 

sub search_light (){//光源を探す
	OnFwd(OUT_A);
	until ((SENSOR_1>50)||(SENSOR_3>50));
	ClearTimer(0);
}
task main() {
	SetSensor(SENSOR_1,SENSOR_LIGHT);
	SetSensor(SENSOR_3,SENSOR_LIGHT);
	ClearTimer(0);
	while(Timer(0)<=70){
	if (SENSOR_1<SENSOR_3) {OnFwd(OUT_A);}else{OnRev(OUT_A);}//光源を追跡する
	if ((SENSOR_1<40)&&(SENSOR_3<40)) {search_light();}//光源を見失った場合タイマーを0にして光源を探し出す
	if ((SENSOR_1>80)||(SENSOR_3>80)) {Off(OUT_A);}//光源に近い場合は止まる
	Wait(5);
	}
	Off(OUT_A);OnFwd(OUT_C);Wait(30);Off(OUT_C);//7秒間光源を見失わなかった場合ブロックを投げる
}

今回の良かったところ

今回の課題は制作期間が1週間しか無かったため、多くのグループが発表することが出来なかった。
しかし、我がグループは授業時に先生に見せることができた。
他のグループで見せていたところはなかったのでは・・・と思います。(勘違いであったらスミマセン)
完成した機体・プログラムを見せることは出来た。
改良部はしっかりと指摘されてしまったが、「まあいいですね」とのコメント?はもらえた。

感想

メンバーの感想です。

河島

今回のプログラムを作るのもとても大変で高橋のプログラムを参考にやった。
やはり、一週間という短い期間でするというのが大変だと感じる原因だと思いました。
ロボコンでのロボットは5人でいいものを築き上げれたらいいと思います。

高橋

今回も大変な作業だったが楽しんで行うことが出来たので結果オーライという感じです。
機体制作もプログラム構築も納得のいくものが出来たので良かった。
あとは「ロボコン」に向けて一直線といきましょう。

丸山

制作時間が一週間しかなかったのでブロック投げの精度が
かなり大雑把なものになってしまい残念でした。
次のロボコンではより精確な動作ができるようにしたいです。

ページ更新履歴

8/6 指摘された懐中電灯の停止について変更しました。
課題についてもう一度考えると懐中電灯の移動は1回のみ、すなわち1回停止したならば再スタートはありえないということです。
つまり動き続けるか停止しているかのどちらかなので、懐中電灯の停止判断を厳しくしました。
これで懐中電灯の停止後3秒で照準を合わせて発射します。
二つ目のプログラムの更新点には☆をつけておきました。

8/7 高橋
こさかさんに指摘された点ですが、課題の解釈を間違っていると思います。
松本先生によると懐中電灯とロボットとの距離はロボットのみが変える事ができるそうです。
つまり懐中電灯を持っている人が近づけたり、遠ざけたりすることはありません。
ですのでこのプログラムで問題ありません。
「今回の良かったところ」にも書きましたが実際に成功しているので問題ありません。
次に、自分がrやlなどの1文字のマクロを設定していることについてです。
これは作業時に自分がわかりやすいようにするためです。
メインタスクにOnFwd(OUT_A);OnRev(OUT_C);などを書いても自分が何をしたいのかがうまく判断できないと思います。
一目で意味もわかり打ち間違いの心配もありません。
setについてはメインタスクにこれらがあると見にくいためです。

コメント一覧

コメントをよろしくお願いします。

  • ロボットの説明が詳しくてよいです。プログラムの説明で、変数やマクロなどの意味をもう一回確認してみたほうがいいかもしれません。また、二つ目のプログラムでは懐中電灯が停止することを、できればですが、もっと明確に認識できたほうがいいです、-- FI? 2009-08-05 (水) 13:32:45
  • 変更したので再評価お願いします。変更点はページ更新履歴をご覧ください。 -- 高橋? 2009-08-09 (日) 00:02:56
  • 変更したので再評価お願いします。変更点はページ更新履歴をご覧ください。 -- 高橋? 2009-08-09 (日) 00:49:25
  • ロボットの説明がとても詳しく、工夫が良くわかります。プログラムについては、まず、setマクロの内容は一回しか書かないんだからマクロにする意味がないような気がします。マクロ名にrとかl見たいな一文字を利用するのは好ましくないです(可読性が落ちるし、ミスを招きやすいので)。単語にしたほうがいいです。高橋さんのプログラムについて、停止判断が怪しいような気がします…while(Timer(1) < 30)で光が停止しているかどうかを判断できているとは思えません。例えば、3秒の間、懐中電灯が遠ざかり続けたときは、停止していなくても投げてしまうのではないでしょうか?丸山さんのプログラムでは、if(SENSOR_1<SENSOR_3)のelseで逆回転とすると、SENSOR_1=SENSOR_3のとき(光の真正面のとき)も逆回転してしまうような気がします。 -- こさか? 2009-08-09 (日) 23:55:17
  • 懐中電灯は左右にしか動かないのですね。てっきり前後にも動くもんだと思ってました。失礼しました。それから、マクロに関しては、rやlは自分では解りやすいかもしれませんが、他の人(採点する側)には意味が解りづらいという意味で、可読性が低いと言いました。例えば小文字のlは数字の1とか大文字のIと間違えやすいので、rightとかleftといった単語にしたほうが、間違いが減らせるし、読む側としてはわかりやすいということです。プログラムの本質に関わる点ではないのでさほど問題はありませんが、もし、プログラミングに関してより知識を深めたいと思ったら、「プログラミング 命名規則」などと検索してみると、詳しい情報が得られると思います。 -- こさか? 2009-08-10 (月) 21:13:40
  • あとからプログラムに挿入したコメントであっても、// などを忘れないように。 -- 松本 2009-08-10 (月) 22:28:43
  • すみません、訂正しておきました。 -- 高橋? 2009-08-10 (月) 23:13:29


添付ファイル: file34.jpg 226件 [詳細] file31.jpg 227件 [詳細] file33.jpg 242件 [詳細] file32.jpg 205件 [詳細] file30.jpg 207件 [詳細] file26.JPG 113件 [詳細] file25.JPG 228件 [詳細] file24.JPG 112件 [詳細] file23.JPG 108件 [詳細] file22.JPG 114件 [詳細] file21.JPG 114件 [詳細] file20.JPG 223件 [詳細] file19.JPG 231件 [詳細] file18.JPG 209件 [詳細] file17.JPG 214件 [詳細] file16.JPG 212件 [詳細] file15.JPG 228件 [詳細] file14.JPG 120件 [詳細] file13.JPG 209件 [詳細] file12.JPG 218件 [詳細] file11.JPG 112件 [詳細] file10.JPG 110件 [詳細] file09.JPG 97件 [詳細] file08.JPG 230件 [詳細] file07.JPG 105件 [詳細] file06.JPG 228件 [詳細] file05.JPG 213件 [詳細] file04.JPG 209件 [詳細] file03.JPG 196件 [詳細] file02.JPG 205件 [詳細] file01.JPG 213件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2009-08-10 (月) 23:13:29