各チームでそれぞれのパートナーの似顔絵を作成せよ!!
あまり外側に付けるとプログラミングがやり辛い(走行位置とラインがずれる)→できるだけ中央に取り付けたい。
ペンが上下に動くので、ペンの位置が高すぎると線が書けない。 逆に低すぎると、車輪が浮いてしまい、うまく書けない。
これらの事に注意しペンを本体中央部に取り付けた。
ペンを中央に取り付けたため、バッテリーパックを取り付ける部分がなくなってしまった・・・ そこでバッテリーパックを本体後部に取り付けることにした。
その結果、後部に重心が偏ってしまい、後ろに倒れてしまった。
そこで急遽、フロント部分に大車輪3個を取り付け、重心を安定させた。
ペン可動部が、ペンを上下させたときに不安定だった。
そこで可動部を、ペンが動いても壊れないように補強することにした。
当初は、できるだけシンプルにしたかったが、最終的にゴツくなってしまった。
フロントに取り付けた大車輪が、やたらと目立つ・・・
<横>
<上>
<前>
<後>
上下に動くので、少し高さができてしまった。
ペンを安定させるために、四方を壁で囲みできるだけ隙間をなくした。
ペンが紙に当たったときに、ブレないよう上下左右を固定した。
<ペン>
<ペンを入れる所>
最初の課題で使っていた車輪を転用し、できるだけシンプルで簡単なものにした。
<車輪>
大庭
#define MOVE 100 //直進する時間のマクロ。 #define eye 28 //目を書く時間のマクロ。 #define TURN 50 //曲がる(小回り)のマクロ。 #define turn 80 //曲がる(大回り)のマクロ。
void right(int t) //直進するための関数。 (全て関数使用) { OnFwd(OUT_B); OnRev(OUT_C); Wait(t); Off(OUT_B+OUT_C); Wait(50); } void left(int t) //左折するための関数。 { OnRev(OUT_B); OnFwd(OUT_C); Wait(t); Off(OUT_B+OUT_C); Wait(50); } void go(int t) //右折するための関数。 { OnFwd(OUT_B+OUT_C); Wait(t); Off(OUT_B+OUT_C); Wait(50); } void back(int t) //後退するための関数。 { OnRev(OUT_B+OUT_C); Wait(t); Off(OUT_B+OUT_C); Wait(50); } sub up() //ペンを上げるためのサブルーチン。(ペンの動作は0.1秒) { OnRev(OUT_A);Wait(10); Off(OUT_A); Wait(50); } sub down() //ペンを下げるためのサブルーチン。 { OnFwd(OUT_A);Wait(10); Float(OUT_A); Wait(50); }
task main () { up(); down(); go(MOVE); //輪郭を書く。 repeat(2){ up(); //あごの部分は同じ動作を2回繰り返し。 right(TURN); down(); go(55); } up(); right(60); down(); go(MOVE); up(); right(turn); down(); go(90); //頭を書く。 up(); right(80); go(30); right(80); Wait(50); go(10); down(); go(eye); //目を書く。 up(); go(20); down(); go(eye); up(); back(60); left(40); go(20); down(); go(25); //鼻を書く。 up(); left(80); down(); go(30); up(); go(20); left(50); back(10); down(); back(40); //口を書く。 up(); go(50); }
ソリョン
#define TURN_TIME 76 //90度曲がるため必要な時間を 定数にする。 sub left() //左に曲がるためのサブルーチン。 { OnRev(OUT_B); OnFwd(OUT_C); Wait(TURN_TIME); Off(OUT_B+OUT_C); Wait(40); } sub right() //右に曲がるためのサブルーチン。 { OnFwd(OUT_B); OnRev(OUT_C); Wait(TURN_TIME); Off(OUT_B+OUT_C); Wait(40); } sub right2() //曲がり重ねって方向の誤差が大きくなったとき、方向直すためちょっとだけ曲がるためのサブルーチン。 { OnFwd(OUT_B); OnRev(OUT_C); Wait(5); Off(OUT_B+OUT_C); Wait(40); } sub up() //ペンを持ち上げるサブルーチン。線をかくずに移動するとき。 { OnRev(OUT_A); Wait(10); Off(OUT_A); Wait(20); } sub down() //ペンを下げるサブルーチン。線を引くとき。 { OnFwd(OUT_A); Wait(13); Off(OUT_A); Wait(20); } void go(int t) //前に移動するための関数。入力された時間だけに移動 { OnFwd(OUT_B+OUT_C); Wait(t); Off(OUT_B+OUT_C); Wait(50); } void back(int t) //後ろに移動するための関数。入力された時間だけ前に移動 { OnRev(OUT_B+OUT_C); Wait(t); Off(OUT_B+OUT_C); Wait(50); }
task main() { Wait(80); //ボタンを押してちょっと後から動き始め down(); //顔の輪郭を描く go(110); up(); left(); down(); go(75); up(); left(); down(); go(110); repeat(3) //髪を二本ずつ描く行動をrepeatを使って3繰り返す。6本の髪を描く { up(); left(); go(10); left(); down(); go(15); up(); right(); go(10); right(); down(); go(15); } up(); //髪が終わってから下に降りてきて目を描く back(70); right(); right2(); down(); go(15); up(); go(10); down(); go(20); up(); back(45); right(); go(10); left(); down(); go(15); up(); go(10); down(); go(20); up(); back(13); //目が描き終わったらまた下に降りてきて口を描く right(); go(20); down(); repeat(4); //90度を4回曲がって円を描く。 で終了 {right();} }
<プログラム図解>
ー(絵について)
とてもシンプルな顔・・・・
なぜか線が所々途切れてしまった。
ー(プログラムについて)
できるだけ簡潔にするよう、関数やマクロを多く使った。
直角に曲がるのは避けたかったが、いくつか使わなければならなくなってしまった。
<プログラムの図解>
*「プログラムの図解」と実際のプログラムを結びつけて説明 ー赤と緑の矢印に使ってる移動のプログラムOnFwd(OUT_B+OUT_C)通じて両車輪を動けて移動して入力された時間 (int t)だけ時間がたっだら Off(OUT_B+OUT_C)で両車輪止まる。均衡をとるために50の時間をとまる。関数backもOnRev(OUT_B+OUT_C)だけ違って後ろにいく。他はgoと同じ。 ー赤は移動する前にdown(OUT_A)を通じてWait(13)の時間ほどペンをおろす、で移動が終わったらOnRev(OUT_A)でペンをあげる。 ー青い矢印は右に回る関数left()とright()がある。left()の場合はOnRev(OUT_B)とOnFwd(OUT_C)で左の車輪OUT_Bが逆転して左に曲がるようにする。right()はの場合はOnRev(OUT_C)とOnFwd(OUT_B)で左の車輪OUT_Cが逆転して右に曲がるようにする。 ーこの三つの要素を使って絵を完成する。
<完成した顔>
ー(絵):曲がるときはいつも90度を曲がるので線がいつも水平保つべきでが摩擦のせいで少しずつ傾きはじめ 髪の部分から結構傾いています。で誤差の部分ほど曲げてなおそうと思ったけど傾いた線で描かれた顔が意外と似合ったのでそのままにしました
ー(プログラム):プログラムの理解度を高めるためにrepeat, sub, void, defineを活用しました。そのおかげで簡潔なプログラムを作ることができました。
コメントをどうぞ