目次

課題1の内容

自分の名前から一文字選び、その文字をA4用紙一枚に書くロボットを制作する。
ただし7画以上の文字を選ぶこと。7画以上の文字がない場合、合計で7画以上になるよう複数の文字を描く。マクロや関数を用い、main関数はなるべく簡単にする。
(文字が難しくなってしまう場合はイニシャルなどでも可)

 

ロボット本体

相方の提案で 「X軸Y軸Z軸の3つで制御する」 ことをテーマに作成した。 3つのモーターをそれぞれ、

  1. ロボット全体を動かす(X軸)
  2. レール上を筆をぶら下げて動かす(Y軸)
  3. 筆を上げ下げする(Z軸) という動作を割り振った。

これにより、X-Y平面上のX,Y軸の動きで直線を描くことができるので、 プログラムを書くときにとてもわかり易く、調節もしやすくなった。

全体図

robot2.jpg

筆を持った小さな台車がこのロボットの肝である。
モーターが2つつながった台車がレールの上をペンを持って走る。
2つのモーターにはそれぞれ、「筆の上げ下げ」と「X軸方向への動き」という仕事が割り振られている。

このレールの上を台車が行き来するX軸方向への動きと、ロボット全体のY軸方向への動きを使って文字を書く。

robo.jpg

このロボットを作成する過程で最も苦労した点は、台車を走らせるための長いレールを作ることだった。 そもそも部品が限られているなか、台車がまっすぐスムーズに動き、書いているうちにズレてしまわないように設計していった。 最初は本体の重量を減らすため、レールを支える柱の部分にタイヤではなく普通のブロックパーツを使用していた。しかし、動くときの摩擦でロボット全体が引っ張られてしまい、少しずつ向きが変わってしまうことがわかったため、タイヤをつけることになった。部品不足のため強度に不安があり、持ち運びの時に注意が必要だった。

プログラム

私は自分の名前から「朋」という文字を選んだ。

使用したマクロ

/*各スピードの指定*/
#define SPEED_1 30  //X軸方向のスピード
#define SPEED_2 30  //Y軸方向のスピード
#define SPEED_X 0   //X軸方向のスピード(変化)
#define SPEED_Y 30  //Y軸方向のスピード(変化)


/*各軸方向への動きの指定*/
#define go_forward_X(t) Off(OUT_AC); OnFwd(OUT_B,SPEED_1); Wait(t); Off(OUT_B); //X軸方向に   SPEED_1で前進
#define go_back_X(t) OnRev(OUT_B,SPEED_1); Wait(t); Off(OUT_B); //X軸方向にSPEED_1で後退

#define go_forward_Y(t) Off(OUT_BC); OnFwd(OUT_A,SPEED_2); Wait(t); Off(OUT_A); //Y軸方向にSPEED_2で前進
#define go_back_Y(t) OnRev(OUT_A,SPEED_2); Wait(t); Off(OUT_A); //Y軸方向にSPEED_2で後退

#define up_pen ResetTachoCount(OUT_C); RotateMotor(OUT_C,-20,35);  //筆上げ
#define down_pen ResetTachoCount(OUT_C); RotateMotor(OUT_C,20,35); //筆下げ


/*X-Y平面上の斜めの動きの指定(今回は間に合わず使用できなかった)*/
#define go_forward_XY(t) Off(OUT_ABC); OnFwd(OUT_B,SPEED_X); OnFwd(OUT_A,SPEED_Y); Wait(t); Off(OUT_AB); //X軸方向にSPEED_X,Y軸方向にSPEED_Yでそれぞれ前進

main関数

「朋」という字は「月」という文字を2つ並べた字であるので、「月」の文字を描く動作を、開始位置をずらして2回行うことにした。

/*文字の開始位置に筆を下ろした状態ではじめる*/
task main()
{ 
Wait(1000);  //押してから1秒間待つ

go_back_Y(1500);   //↑
無題2.jpg
go_forward_X(750);   //→
go_forward_Y(1500);  //↓
無題4.jpg
up_pen;
go_back_Y(700);  //筆をあげて移動
down_pen;  //筆を下ろす
go_back_X(700);   //←
無題5.jpg
up_pen;
go_back_Y(500);   //筆をあげて移動
down_pen;  //筆を下ろす
go_forward_X(500);   //→
無題6.jpg
up_pen;  //1つ目の”月”終了


/*2つ目の”月”の開始位置へと移動*/
go_forward_X(400);
go_forward_Y(1300);
無題7.jpg
down_pen;  //筆を下ろす

位置をずらし、同じ動きを繰り返す

/*同じように、2つ目の”月”を書き始める*/

go_back_Y(1500);
go_forward_X(750);
go_forward_Y(1500);
up_pen;
go_back_Y(800);
down_pen;
go_back_X(700);
up_pen;
go_back_Y(500);
down_pen;
go_forward_X(500);
up_pen;
}

プログラムについて

実際は同じプログラムを動かしたときに1回目と全く同じ動きをしてはくれなかったため、2回目の数値は少しずつ変更して調整した。最初はサブルーチンを使って全く同じを2回繰り返そうとしていたが、結局プログラムが長く見づらいものになってしまった。 また、斜めの線や曲線を描く命令も作って利用したかったが、時間が足りずに未完成で終わってしまった。斜めの線は容易に実装できそうであったが、曲線の作り方は思いつかなかったので、今後の課題としていく。

結果

前日に全く同じプログラムで試した時は左右対象できれいな文字がかけていたが、本番当日はどうしてもロボット全体が進む縦(Y軸)方向の動きにばらつきが出てしまい、ズレて左右非対称な文字になってしまった。

考察・感想

結果について

本番でおきたズレの原因としては、

  • 電池残量が減ってモータースピードが低下した
  • 前日にテストした場所と摩擦の抵抗が変わった
  • ロボット本体が左右非対称なうえ、台車の位置によって重心が変化してしまうため移動時にかかる力が偏った
     
    などが考えられるが、特に3番目の要素が強く影響していると思われる。重心の偏りには気をつけるようにしていきたい。

ロボット本体・プログラム

ロボット本体の制作にはかなり工夫して時間を費やしたので、その分プログラミングはとてもしやすかった。このX-Y-Z軸で筆を動かす仕組みはプリンターの内部の構造によく似ているので、効率の良い方法だったのかもしれない。
実際に字を書いてみると、うまく行くときとかなりずれてしまうときでかなりバラつきがあった。これはやはりロボット自体がかなり大きいうえに動作部分がいくつもあるため、1回ごとの誤差が大きくなってしまったことが原因だと思われる。プログラムの側で誤差をカバーするのは大変なので、なるべく誤差の少ない動作が可能な設計を心がけるようにしたい。
また、曲線を書こうと思ったときにプログラムが難しく、結局実装できなかったのが残念だった。直線を描くのは簡単に出来たが、曲線が描きにくいのがこのロボットの欠点かも知れない。 プログラムの面では、本体の作成に時間をかけすぎてしまったため、短時間で急いで作成することになった。幸い、このロボットの特徴としてプログラムが容易であったためなんとか間に合わせることができたが、ハードウェアとソフトウェアにかける時間の配分についてはしっかりとした計画を立てて作業をするようにしたい。


添付ファイル: file無題7.jpg 117件 [詳細] file無題6.jpg 126件 [詳細] file無題5.jpg 150件 [詳細] file無題4.jpg 130件 [詳細] file無題3.jpg 55件 [詳細] file無題2.jpg 104件 [詳細] filerobot2.jpg 119件 [詳細] filerobo.jpg 135件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2015-02-11 (水) 22:42:15