書道ロボット

ロボットの本体は三つに分かれています。まずは本体(前後の移動)、アーム(ペンの上下の動き)とアームを動かす装置です。

全体の写真

本体

本体ではモターを一個で二つのタイヤを動かすのが特徴です。そして、物件が古いため、結構はずれる傾向があるので、後ろに、物件を追加して固定しました。

モター一 上から見ると

 アームを動かす装置

LEGO MINDSTORM SYSTEMでは滑らかな物件がないので、アームを移動するとき、その青く丸い物を歯車の下に置きました。

丸いもの

 アーム

字を書くとき、モターで力をかけないことにしました、つまりグラビティで字を書きます。そして、ペンを置く場所も設置しなければなりません。そして以下の図のようにしました。紙を加えたのはペンから置く場所への摩擦力を減らすためです。そして写真の通り、アームは直接モーターにつけました。そしてその黄色アームの間に、ペンを置いて、輪ゴムで固定しています。

紙

そして、ペンを最大限に出すとき(つまりモター2の限界まで出すとき)アームが揺れるので、この二つの棒を加えて、アームを固定しました。

アームを固定するもの

 プログラム

プログラムは全体的にこのように見えますが、これから、プログラムを説明少しずつ説明します。

#define FRONT_M(a) OnFwd(OUT_A);Wait(a);Off(OUT_A);Wait(100);
#define BACK_M(b) OnRev(OUT_A);Wait(b);Off(OUT_A);Wait(100);
#define LEFT_M(t) OnRev(OUT_B);Wait(t);Off(OUT_B);Wait(100);
#define RIGHT_M(s) OnFwd(OUT_B);Wait(s);Off(OUT_B);Wait(100);
#define ARM_ON OnRev(OUT_C);Wait(10);Off(OUT_C);Wait(150);
#define ARM_OFF OnFwd(OUT_C);Wait(10);Off(OUT_C);Wait(150);
#define LEFTFRONT_M(c) OnFwd(OUT_A);OnRev(OUT_B);Wait(c);Off(OUT_AB);Wait(100);
#define LEFTBACK_M(d) OnRev(OUT_A);OnRev(OUT_B);Wait(d);Off(OUT_AB);Wait(100);
task main()
{
	LEFT_M(15);//ヽ始
	ARM_ON;
	FRONT_M(15);
	ARM_OFF;
	RIGHT_M(15);
	ARM_ON;//開始
	LEFT_M(22);
	BACK_M(13);//3始
	ARM_OFF;
	FRONT_M(13);
	ARM_ON;//こ始
	RIGHT_M(30);
	ARM_OFF;
	LEFT_M(20);
	BACK_M(5);
	ARM_ON;//コ始
	RIGHT_M(30);
	ARM_OFF;
	LEFT_M(20);
	BACK_M(7);
	ARM_ON;//Τ始
	RIGHT_M(28);
	BACK_M(15);//С始
	LEFTFRONT_M(7);//
	Off(OUT_AB);
	ARM_OFF;
	FRONT_M(7);
	LEFT_M(3);
	repeat(2){ //点点
	ARM_ON; 
	LEFTFRONT_M(3);
	ARM_OFF;
	LEFT_M(2);
	BACK_M(2);
	}
	ARM_ON; 
	LEFTFRONT_M(2);
	ARM_OFF;
	LEFT_M(3);
	ARM_ON;
	LEFTBACK_M(2);
	ARM_OFF;
}

 前後左右方向の動き

ここで#defineを使いました。

#define FRONT_M(a) OnFwd(OUT_A);Wait(a);Off(OUT_A);Wait(100);
#define BACK_M(b) OnRev(OUT_A);Wait(b);Off(OUT_A);Wait(100);
#define LEFT_M(t) OnRev(OUT_B);Wait(t);Off(OUT_B);Wait(100);
#define RIGHT_M(s) OnFwd(OUT_B);Wait(s);Off(OUT_B);Wait(100);

英語の意味の通りに、前、後ろ、右と左のペンの動きです。 「馬」という字は棒の長さはそれぞれが違うので、時間の設定では変数を使いました。そうすると、プログラミングをするとき自由に変えられます。

さらに複雑な点という書きになると、

#define LEFTFRONT_M(c) OnFwd(OUT_A);OnRev(OUT_B);Wait(c);Off(OUT_AB);Wait(100);
#define LEFTBACK_M(d) OnRev(OUT_A);OnRev(OUT_B);Wait(d);Off(OUT_AB);Wait(100);

左前と左後ろの動きはこの#defineを使いました。

それぞれの動きは後ろに Wait(100)をつけるのは、字をゆっくり書いてもらい、動きの違和感を減らすためです。

 ペンの上げたり下げたりする動き

#define ARM_ON OnRev(OUT_C);Wait(10);Off(OUT_C);Wait(150);
#define ARM_OFF OnFwd(OUT_C);Wait(10);Off(OUT_C);Wait(150);

ここではWait(150)を使ったのは次の行動に移す前にペンを優しく置けるようにするのです。グラビティを使ったため、ペンが自然に落ちるようにしたのです。

書き順

今回の課題は自分の実家の漢字を書くので、マレーシアの漢字は馬らしいので、馬にしました。

#define をきちんとできたため、これからのプログラミングが楽になるだろうと思いました。 馬のそれぞれの棒の長さを測って、必要な書く時間を予測しました。 鉛筆で書いたものは時間必要な時間で、ボールペンで書いたものは書き順です。

書き順

 書くプログラム

NXCと違って、ここでは角度の問題はありません、あるいは、このロボットは角度のことを考えなくてもいいです。 プログラムを書くのは難しくありません。理論から言うと時間と距離を正確に測れば、書けるはずです。 横棒を書きたいとき、まずはペンを下し、次に、右へ移動することです。そして、元の場所へ戻します。

task main()
{
ARM_ON;
RIGHT_M(x);
ARM_OFF;
LEFT_M(x);
}

縦棒の場合は同様です。

task main()
{
ARM_ON;
FRONT_M(x);
ARM_OFF;
BACK_M(x);
}

 成果

結局、ロボットに書いてもらうとき、このようになってしまいました。

書き順

その中に一番難しいことはその四つの点だろうと思いました。馬の本体を書き終わった後、ペンの位置を変えなければなりませんので、そちらのほうに時間がかかりました。

感想

このロボットで、何回も馬を書いてもらいましたが、毎回書いたものはそれぞれが違う結果になるのです。

考えられるのはまず物件がモターが古いから、出力が違います。例えば、    OnRev(OUT_A);Wait(5);OnFwd(OUT_A);Wait(5); のプログラムで、 理論的に言うと、ロボットが元の場所に戻るはずですが、実際に元の場所よりもっと前のところに泊まりました。

そして、二つ目の理由は、ロボットの構造が悪いことが考えられます。構造が悪くて、モターの出力が完全にロボットの動力になれなくて、力の損失です。そうなると、自分が長さを書くために計算した必要な時間が使えなくなります。


添付ファイル: fileresult.JPG 102件 [詳細] filewritingorder.JPG 95件 [詳細] filepenholder.JPG 101件 [詳細] filemotor2and3.JPG 41件 [詳細] filemotor1-2.JPG 101件 [詳細] filebluespring.JPG 102件 [詳細] filemotor1.JPG 114件 [詳細] filebody.JPG 134件 [詳細] filearmhold.JPG 91件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2016-02-09 (火) 20:20:04