目次 #contents *今回の課題について [#x6d93ae7] -マクロや関数、サブルーチンなどを使い、main関数がなるべく単純になるようにプログラムを作ること。 -定数名やマクロなどは分かりやすい名前を用いること -余裕をもってA4の紙の中に収まる大きさにすること。いくら小さくてもよい。 -ペン以外はキットの部品を使うこと -輪ゴムは切れやすく高価なので慎重に扱い、張力がかかりすぎないようにすること。 ([[課題1:http://yakushi.shinshu-u.ac.jp/robotics/?2016a%2FMission1]]より) *ロボット本体について [#mb53aecd] &ref(全体.jpg); &ref(本体.jpg); &br;コードが長いものを使うしかなかったので、タイヤに巻き込まれないようにまとめた。ペンがずれないように支えもつけた。 &br;モーターが動くとタイヤも連動して動くようにした。しかしこの装置は少し挟む力が弱く、長い時間タイヤを動かすとペンをつかまなくなってしまうので調整が難しかった。輪ゴムは一本だと弱い上に負荷をかけすぎると切れそうだったので二本使用した。また、写真には取り忘れたが分解・組み立てもしやすいように作られている。 *プログラムについて [#kb7c8c9e] 今回は下図のような絵を書くようにプログラミングした。(始点は左上の点) &br;&ref(DSC_0040 [4104].JPG); **プログラムの定義 [#o4782149] 定義それぞれについて解説する。 #define tyokkaku 111 ロボット本体を直角に旋回させるために定義した数値だが、床の滑り具合や電池の残量によって変化したので毎回数値を変える必要があった。 #define kaiten1(t) OnFwd(OUT_A);OnRev(OUT_C);Wait(t);Off(OUT_AC); ロボット本体を時計回りに直角に回転させる。 #define kaiten2(t) OnFwd(OUT_C);OnRev(OUT_A);Wait(t);Off(OUT_AC); ロボット本体を反時計回りに直角に回転させる。 #define zensin(t) OnFwd(OUT_AC);Wait(t);Off(OUT_AC); ロボット本体をt秒間前進させる。 #define pen_up OnRev(OUT_B);Wait(20);Off(OUT_B); ペンを上げる。 #define pen_down OnFwd(OUT_B);Wait(20);Off(OUT_B); ペンを下げる。 #define soroeru(t) OnRev(OUT_AC);Wait(t);Off(OUT_AC); ロボット本体を旋回させた後ペン先の始点と終点を揃えるために定義した。 #define write(t) pen_down;zensin(t);pen_up; t秒間線を書く動作を定義した。 #define magarisusumu1(t) kaiten1(tyokkaku);soroeru(58);write(t); ロボット本体を直角に旋回させてt秒間線を書く動作を定義した。 **プログラム [#qf5a20da] プログラムについて解説する。 task main() { write(81);//頭のてっぺん zensin(52); kaiten1(75); soroeru(59); write(42);//髪の毛右斜め上 zensin(62); kaiten1(40); soroeru(60); write(132);//髪の毛右側 zensin(63); magarisusumu1(20); zensin(62); magarisusumu1(117); zensin(61); kaiten2(67);//前髪の角度 soroeru(70); write(47);//前髪右側を書く zensin(62); kaiten2(70);//前髪の角度 soroeru(65); write(37);//前髪左側を書く zensin(62); kaiten2(47); soroeru(70); write(117); zensin(62); magarisusumu1(20); zensin(62); magarisusumu1(130);//髪の毛左側 zensin(62); kaiten1(65); soroeru(63); write(39);//髪の毛完成 ここまでで髪の毛の部分を書き上げる。髪の毛右側とか左側というのは髪パーツの一番外側のタテ線のことである。 ここまでで髪の毛の部分を書き上げる。髪の毛右側とか左側というのは髪パーツの一番外側のタテ線のことである。ここは一か所がずれると全体がずれていくのでプログラミングするのに時間がかかった。正直に言うともう少しコンパクトにしたかった。同じような命令が続いていて見た目が悪い。 zensin(77); kaiten1(160); zensin(148);//本来の輪郭よりちょっと長めに kaiten2(tyokkaku); soroeru(65); write(65);//輪郭を書く 輪郭を書く。一本線だが始点と終点が髪の毛の部分と合わないと顔のパーツもずれていくので細かく調整した。 kaiten2(100); zensin(20);//口の高さまで kaiten2(100); soroeru(100);//口の端まで write(36);//口を書く 口を書く。顔の中心に書けるように時間を調整した。書く時間が長すぎたり曲がる角度がずれたりするとニヒルな笑みを浮かべた絵になってしまうので丁寧に調整した。 kaiten1(tyokkaku); soroeru(30); write(20);//左目を書く soroeru(20); kaiten2(tyokkaku); zensin(40);//中心が右目になるように kaiten1(tyokkaku); write(20);//右目を書く } 目を書いて完成。目は口がずれない限り顔の中におさまるようになっている。 *反省 [#y110fd27] -プログラムが汚い&br; プログラミングにとりかかるのが遅れてしまい、何度も同じ命令をしているので行数が多く終わってからもっと綺麗にまとめられるのに気づいた。特に髪の毛の部分はそれが顕著にみられる。次にプログラミングするときは余裕を持ち、スマートに組めるようにしたい。 -ロボット本体のアクシデント&br; ある時から、ロボットが前進する際にまっすぐ進まず軽く曲がってしまうようになった。また、前述したように床との相性や電池残量による回転する速度の変化もあった。私のプログラムは長時間前進したり細かく回転する命令が多く、これらのアクシデントの影響を大きく受けた。素早く対処できるようなプログラミングを心がけたい。 -完成した絵を保存しなかった&br; 一度非常に完成度の高い似顔絵が書けたのだが、その紙はどこかへいってしまった。授業中に書いたものは失敗に終わってしまったため、完成した絵はここに載せることができなかった。