目次 #contents *課題1 [#n7042860] これまで住んだことのある都道府県名、市町村名、地区名などの中から2文字以上、かつ合計10画以上のものを選び、それをA4の紙を書くロボットを製作せよ。 **選んだ地名 [#o8c2d8c9] 長野県にある千曲市(ちくまし)という地名を選択した。 *ロボットの説明 [#ue2dc688] 縦方向の移動のための装置A、横方向の移動のための装置B、ペンを降ろすための装置Cからなるプリンター式のロボットを作成した。 NXT本体を乗せた装置Aは装置B,Cを乗せたレールを動かす。装置B,Cはつながっており、装置Aの動かすレールの上を走り、ペンの上げ下げをする。 #ref(千曲3.jpg,,40%,,center) #ref(千曲3.jpg,,40%) ロボットの全体像 #ref(千曲4.jpg,,40%) ロボットの動き **縦方向の移動のためのロボット(装置A) [#wce97ac2] このロボットはNXTとレールとともに縦方向の前後運動をすることができる。モーターにタイヤをつただけの簡単なつくりの車に、タイヤ付きのレールを取り付けたつくりになっている。しかし、動力源が片方のタイヤにしかついていないので、静止状態から動き始めるときにもう片方のタイヤとの動きがずれることがあった。これによりレールが歪み、字が曲がることがあるので、動力源をうまく中央あたりに配置することができればよかったと感じた。 **横方向の移動のためのロボット(装置B) [#z784b20c] このロボットがレールの上を走ることにより、装置Aと合わせて好きな方向にペンを移動させることができる。横線だとこのロボットだけを動かし、斜め線だと装置Aと同時に動かせばよい。 **文字を書くロボット(装置C) [#sc94234d] このロボットは装置Bの上に取り付けられており、モーターと少し離れたところに取り付けたペンを回転させて降ろすシンプルな構造になっている。全体の半分近くがレールの外側に飛び出しているため非常にバランスが悪く倒れてしまう。そのため、ペンをつける側の反対側にブロックをつけて全体の重心を真ん中に近づけるように工夫した。 *プログラムの説明 [#e9d1e1ec] **書き順 [#ee9be190] #ref(千曲5.jpg,,50%) **プログラムを書く際の工夫 [#p60ac187] ・動作後に揺れが生じ字が乱れるため、ペンを降ろす前後に一時停止を挟むことにより揺れを軽減した。 ・縦線を引く際の字の歪みをできる限り減らすために、ペン先を少し強めに紙に接触させるようにした。 ・直線の交点を合わせるのが思いのほか難しい部分は書き順の変更とニ画を一度に書くことで対応した。 **プログラムの定義 [#u5105fb5] #define pen_down OnFwd(OUT_C,8);Wait(1200);Off(OUT_C); //ペンを降ろす #define pen_downa OnFwd(OUT_C,8);Wait(1250);Off(OUT_C); //より深くペンを降ろす #define pen_up OnRev(OUT_C,15);Wait(1700);Off(OUT_C); //ペンを上げる #define all_off Off(OUT_ABC); //すべての動作を停止させる #define power 30; // モーターABの力を30で統一する #define stop_p Wait(1000); //ロボットの揺れを軽減するための停止 **「千」を書くプログラム [#z42b8a35] task main() { ***「千」1画目 [#h3352356] pen_down; //ペンを降ろす 以下同義 stop_p; //ペンを下す前後にロボットの揺れを軽減するための一時停止 以下同義 OnFwd(OUT_A,20);OnFwd(OUT_B,power); //実際に線を引くプログラム Wait(300); all_off; //すべての動作の停止 以下同義 stop_p; pen_up; //ペンを上げる 以下同義 ***「千」2画目 [#vad675fc] OnFwd(OUT_AB,power); //次の線の始点までの移動 Wait(150); all_off; OnFwd(OUT_B,power); //次の線の始点までの移動 Wait(250); all_off; stop_p; pen_down; stop_p; OnRev(OUT_B,power); //実際に線を引くプログラム Wait(1200); all_off; stop_p; pen_up; ***「千」3画目 [#ufefdbb3] OnFwd(OUT_B,power); //次の線の始点までの移動 Wait(670); all_off; OnRev(OUT_A,power); //次の線の始点までの移動 Wait(190); all_off; stop_p; pen_downa; stop_p; OnFwd(OUT_A,power); //実際に線を引くプログラム Wait(600); all_off; stop_p; pen_up; **「曲」を書くプログラム [#a084fe24] ***「曲」1画目 [#w4c2078a] OnFwd(OUT_B,power); //次の線の始点までの移動 Wait(600); all_off; OnFwd(OUT_A,power); //次の線の始点までの移動 Wait(200); all_off; stop_p; pen_downa; stop_p; OnFwd(OUT_A,power); //実際に線を引くプログラム Wait(500); all_off; stop_p; pen_up; ***「曲」2画目 [#t3705d57] OnRev(OUT_A,power); //次の線の始点までの移動 Wait(500); all_off; stop_p; pen_downa; stop_p; OnRev(OUT_B,power); //実際に線を引くプログラム Wait(1200); all_off; stop_p; OnFwd(OUT_A,power); //実際に線を引くプログラム Wait(500); all_off; stop_p; pen_up; ***「曲」3画目 [#pb11962a] OnFwd(OUT_B,power); //次の線の始点までの移動 Wait(800); all_off; OnRev(OUT_A,power); //次の線の始点までの移動 Wait(700); all_off; stop_p; pen_downa; stop_p; OnFwd(OUT_A,power); //実際に線を引くプログラム Wait(700); all_off; stop_p; pen_up; ***「曲」4画目 [#ndfa73a8] OnRev(OUT_B,power); //次の線の始点までの移動 Wait(400); all_off; OnRev(OUT_A,power); //次の線の始点までの移動 Wait(700); all_off; stop_p; pen_downa; stop_p; OnFwd(OUT_A,power); //実際に線を引くプログラム Wait(700); all_off; stop_p; pen_up; ***「曲」5画目 [#cc2dd0c8] OnFwd(OUT_B,power); //次の線の始点までの移動 Wait(800); all_off; OnRev(OUT_A,power); //次の線の始点までの移動 Wait(240); all_off; stop_p; pen_down; stop_p; OnRev(OUT_B,power); //実際に線を引くプログラム Wait(1200); all_off; stop_p; pen_up; ***「曲」6画目 [#w253f6a1] OnFwd(OUT_B,power); //次の線の始点までの移動 Wait(1200); all_off; OnFwd(OUT_A,power); //次の線の始点までの移動 Wait(270); all_off; stop_p; pen_down; stop_p; OnRev(OUT_B,power); //実際に線を引くプログラム Wait(1200); all_off; stop_p; pen_up; **「市」を書くプログラム [#yf90f5ea] ***「市」1と5画目 [#rdd1481b] OnFwd(OUT_B,power); //次の線の始点までの移動 Wait(600); all_off; OnFwd(OUT_A,power); //次の線の始点までの移動 Wait(300); all_off; stop_p; pen_downa; stop_p; OnFwd(OUT_A,power); //実際に線を引くプログラム Wait(900); all_off; stop_p; pen_up; ***「市」2画目 [#q4216148] OnFwd(OUT_B,power); //次の線の始点までの移動 Wait(600); all_off; OnRev(OUT_A,power); //次の線の始点までの移動 Wait(700); all_off; stop_p; pen_down; stop_p; OnRev(OUT_B,power); //実際に線を引くプログラム Wait(1200); all_off; stop_p; pen_up; ***「市」3画目 [#e005123e] OnFwd(OUT_B,power); //次の線の始点までの移動 Wait(1000); all_off; OnFwd(OUT_A,power); //次の線の始点までの移動 Wait(200); all_off; stop_p; pen_downa; stop_p; OnFwd(OUT_A,power); //実際に線を引くプログラム Wait(300); all_off; stop_p; pen_up; ***「市」4画目 [#zf0e0076] OnRev(OUT_A,power); //次の線の始点までの移動 Wait(300); all_off; stop_p; pen_downa; stop_p; OnRev(OUT_B,power); //実際に線を引くプログラム Wait(800); all_off; stop_pOnFwd(OUT_A,power); //実際に線を引くプログラム Wait(300); all_off; stop_p; pen_up; } *ロボットが書いた文字 [#w0ec8800] #ref(千曲1.jpg,,60%) 読める字ではあるが、やはり縦線の歪みが目立った... *問題点とその改善案 [#x4f091a2] ・横線は比較的きれいにかけたが、縦線は歪んでしまった。原因としては、横線は装置Bだけを動かして書くため揺れは抑えられたが、レールごと動かして書く縦線はレールの不安定さもあってか揺れが大きくなったこと。また、レールが高い位置に設置されているため、装置の重心が高くなり不安定になったか、ペン先とモーターの距離が長くなり、アームの揺れが大きくなってしまったことが挙げられるだろう。 これを改善するためには、装置をレールの上を走らせるのではなく、レールから吊り下げることによりできるだけ重心を低くするとともに、アームの長さを短くすることができる。これによって字の歪みはおおよそ改善されるだろう。 ・ペンを上げる時と降ろす時にペン先が周りに触れてしまい、余計な跳ねができてしまった。 この原因として考えられるのは、装置Cをペンを回転させて降ろす仕組みにしたことだろう。はじめはペンを垂直に降ろす機構を考えていたのだが、まっすぐに降ろせてもペンがグラグラして、きれいな字が書けなかったため、簡素ではあるが急遽現在の装置に変更することになった。 これの改善するためには、やはり垂直にペンを降ろす機構を作ることが最も確実であろう。