[[2016b/Member]]

目次
#contents


* 課題1 [#kb53b3cc]

A4の紙に今年の大学生活を表す漢字一文字を書くロボットを製作せよ。

7画以上の文字を選ぶこと。

文字は15cm四方に収まる大きさにすること。

ひとりにつき一つ以上のプログラムを作成すること。

ペン以外はキットに含まれる部品を使うこと。

キットに付属の高価な輪ゴムは切れやすいので切れないように細心の注意を払うこと。

改良や調整をしやすくするため、ロボット本体だけでなく、プログラムについても可能な部分についてはサブルーチンや関数、マクロなどを使って部品に分けること。
** この課題で選んだ漢字 [#n2c6a6b8]
「里」
* ロボット本体の説明 [#xdb411bb]
** 全体 [#b101ce6d]
#ref(2016b/Member/rts/Mission1/IMG_1135.JPG,50%,ロボット)
講義で最初に作った形のロボットの上部にペンをくくりつけるアームを乗せた。
** アーム部分 [#lbcf563c]
#ref(2016b/Member/rts/Mission1/IMG_1136.JPG,35%,アーム)
モーターの回転を利用してペンをくくりつけたアームが回転しペンを紙につけたり離したりできるようにした。
** ロボットの動き [#kbd76d01]
ロボット本体が移動し、上部のアームを下げてペンで書かせる。別の位置で書きたい時はアームを上げて移動してからまたアームを下ろす。この動作を繰り返す。

* プログラムの説明 [#yff87e4a]
** プログラム内容 [#ha5a036d]
 #define turnleft() OnRev(OUT_AC);Wait(64);OnFwd(OUT_C);OnRev(OUT_A);Wait(80);OnFwd(OUT_AC);Wait(60);Off(OUT_ABC);
 #define turnright() OnRev(OUT_AC);Wait(64);OnFwd(OUT_A);OnRev(OUT_C);Wait(80);OnFwd(OUT_AC);Wait(60);Off(OUT_ABC);

 #define write(f) OnRev(OUT_B);Wait(17);Off(OUT_B);OnFwd(OUT_AC);Wait(f);Off(OUT_AC);OnFwd(OUT_B);Wait(20);Off(OUT_B);
 
 #define gofwd(t) OnFwd(OUT_AC);Wait(t);Off(OUT_AC);
 #define gorev(u) OnRev(OUT_AC);Wait(u);Off(OUT_AC);

 #define turnrightf() OnRev(OUT_AC);Wait(64);OnFwd(OUT_A);OnRev(OUT_C);Wait(74);OnFwd(OUT_AC);Wait(60);Off(OUT_ABC);


 task main()
 {
 
     repeat(3){
 write(50);
 turnleft();
 }
     write(50);
     
     gorev(25);
     turnleft();
     write(100);
 
     turnleft();
     gorev(30);
     write(55);
 
     turnleft();
     gofwd(30);
 
     turnleft();
     write(55);
 
     turnright();
     gofwd(50);
     turnrightf();
     write(50);
 
 
  
 }

** プログラムの構想 [#sa7e26fb]
まず「里」の四角形の部分を書いてから縦の直線を書き、最後に横の直線3本を書く、という順で書かせるようにプログラミングを行おうとした。

** プログラムの作成過程 [#f5b818fb]
プログラミングを簡略化するためにマクロを用いて、単純に前進または後退する動作、ペン(アーム)を下げてペンを任意の時間走らせたあとにペンを上げるという動作、右または左に曲がる動作を定義した(それぞれ上記のプログラム中のgofwd(),gorev(),write(),turnright(),turnleft()に当たる)。

左右に曲がる動作に関して、ロボットの設計上旋回させた時にペンの位置が曲がる前と後でズレてしまうので、そのズレを解消するためにロボットが旋回する時にズレの分だけ縦方向と横方向で少しだけ余分に動くようにマクロに組み込んだ。 四角形の部分を書く時は簡略化するためループを用いてプログラミングした。

また、字を書く行程の後半になる程直線の角度がズレていったので、ズレを戻すために曲がる動作のマクロを新しく定義し使用した(プログラム中のturnrightf())。

* まとめ [#p763b898]
** 講義でロボットを動かした結果 [#da0e30ae]
#ref(2016b/Member/rts/Mission1/IMG_1105.JPG,25%,里)

** 反省点など [#h6545958]
一番の反省点は、ロボットの挙動がバッテリーに大きく依存することだった。バッテリー残量によって、旋回時のズレの補正に必要な動作の時間(Wait()の数値)が変わるので、一度プログラムを実行させて字が書けていてもバッテリーが消耗した時に実行させると字が崩れてしまった。結果、上の写真の様になってしまった。

これを解消するにはロボットの設計を考え直すことが一番最適と思った。他のグループが作っていたX軸とY軸の座標でペンの書く場所を指定し書かせるようなロボットの設計にすれば良かったと思う。

今回の課題で学んだことは、それぞれの課題に応じて適当な設計を行わないとプログラミングや実際に動かす時に苦労してしまうという事だった。

トップ   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS