似顔絵を描く。
コンパクトにする。
初めは次のようなロボットを製作しました。三輪、前輪で駆動&旋回。
しかし前輪と後輪が離れているために小回りが利かず円は書くことはできたものの細かい動きはできませんでした。 またペンの位置も不安定でした。 上記の問題点を解決するために前輪と後輪の距離はできるだけ近くにし、ペンの位置は頭の中心に取り付けることによってプログラミングをするときにペンの位置を観察しやすいようにしました。 試行錯誤を重ねて作り上げた二代目
アームは少し斜めに取り付けることによってペンを下しているときにしっかりと紙につくようになりました。
ロボット内部中央(ブロック縦2マス、横4マス、高さ2マスの小さな隙間)にペンの上げ下げをする棒を取り付けることによってどの班のロボットよりも小さくて軽い左右対称ロボットを実現することができました。 このアームこそ一番苦労した部分です。
はじめは固定された後輪だったために回転したときに後輪を引きずるような感じになり回転後の位置がいつも一定になりませんでした。そこで後輪を回るようにして回転後の位置が正確になるようにしました。
#define tt 49 //90°(基準値) #define ct 51 //ターンの位置調整時間
sub pon() //ペン接地 { OnFwd(OUT_B);Wait(100); Off(OUT_B); } sub poff() //ペン上げ { OnRev(OUT_B);Wait(150); Off(OUT_B); } void left(int t) { OnRev(OUT_A); OnFwd(OUT_C); Wait(t); Off(OUT_A+OUT_C); } void right(int t) { OnFwd(OUT_A); OnRev(OUT_C); Wait(t); Off(OUT_A+OUT_C); } void go(int t) { OnFwd(OUT_A+OUT_C); Wait(t); Off(OUT_A+OUT_C); } void back(int t) { OnRev(OUT_A+OUT_C);Wait(t); Off(OUT_A+OUT_C); } void adj() //位置調整 { poff(); go(ct); } void goon(int t) //描画前進 { back(ct); pon(); go(t); } sub jigzag() //ジグザグ走行 { OnFwd(OUT_A);Wait(30);Off(OUT_A); OnFwd(OUT_C);Wait(30);Off(OUT_C); } task main() { //輪郭 goon(100); adj(); left(tt); goon(80); adj(); left(tt); goon(100); //目 poff(); go(30); left(tt); back(ct); go(20); pon(); go(20); poff(); go(20); pon(); go(20); poff(); go(20); //眉毛 adj(); right(tt/3*5+10);//150°+10 goon(28); adj(); right(tt/3*2);//60° goon(28); adj(); left(tt/3*2);//60° goon(28); adj(); right(tt/3*2);//60° goon(28); adj(); right(tt/3*2);//60° //口 right(10); go(50); right(tt); go(20); goon(40); adj(); go(20); right(tt+10); go(40+ct); right(tt); back(ct); //髪 pon(); repeat(3) { jigzag(); } //終わり poff(); //back(150); }
ロボットの位置修正のためにそのば凌ぎプログラムが増えてしまい、とても長くなりました。
余計な線が多め。挫折のようなものを感じました。現実は厳しい。
#define TURN_TIME 51 //関数を使い繰り返しをうまくまとめる。
void turn_left() //左に90度回転
{
OnRev(OUT_A); OnFwd(OUT_C); Wait(TURN_TIME); Off(OUT_A+OUT_C);
}
void turn_right() //右に90度回転
{
OnFwd(OUT_A); OnRev(OUT_C); Wait(TURN_TIME); Off(OUT_A+OUT_C);
}
void go_straight(int t) //直進
{
OnFwd(OUT_A+OUT_C); Wait(t); // t/100 秒直進する Off(OUT_A+OUT_C);
}
void go_back(int t) //後ろに進む
{
OnRev(OUT_A+OUT_C); Wait(t); Off(OUT_A+OUT_C);
}
void pen_on(int t) //ペンを下す。
{
OnFwd(OUT_B); Wait(t); Off(OUT_B);
}
void pen_off(int t) //ペンをあげる。
{
OnRev(OUT_B); Wait(t); Off(OUT_B);
}
task main()
{
go_straight(120); //顔の輪郭一画目 pen_off(150); go_straight(51); turn_left(); go_back(51); pen_on(110); go_straight(100); //顔の輪郭二画目 pen_off(150); go_straight(51); turn_left(); go_back(51); pen_on(110); go_straight(120); //顔の輪郭三画目 pen_off(150); go_straight(51); turn_left(); go_back(40); pen_on(110); go_straight(28); //目 pen_off(150); go_straight(15); pen_on(110); go_straight(28); //目 pen_off(150); go_straight(13); turn_left(); go_back(15); pen_on(110); go_straight(20); //鼻 pen_off(100); go_straight(20); pen_on(120); turn_left(); //にっこりした口
}
後輪をよく動くようにした。機動力が上がった。
コンパクトさで重心が前になりすぎて、旋回時や停止時に余計な線を書いてしまった。
棒を押し出してアームをあげる仕組みにしたら、上げ幅がとても小さくなった。
思いのほか大変でした。ロボットが握りが弱い寿司のように崩れる場面があって、 メンテナンスの事も考えて作る必要があると感じました。うまくいくときいかないときがあるので確実性も必要だと思いました。(Ando)
綺麗な顔が書けるようにとにかく小回りのきくロボットを作るようにしました。とくに筆を持たせるアーム部分は苦労の連続で安定した動きをさせるようにするにはかなり時間がかかりましたが、二人で何回も話し合って納得のいくロボットを作り上げることができました。(YU)