2014b/Member?

目次

はじめに

課題は書道ロボットの作成である。

詳しい内容として、

各自の名前の中の一文字をA4用紙の中に書きなさい。 ただし7画以上の文字を選ぶこと。もし7画以上の文字がない場合には合計7画以上になるように複数の文字を書きなさい。 マクロや関数などを使い、main関数はなるべく単純になるようにプログラムを作ること。

(2014年後期/課題1より)

今回は「香」という文字をロボットに書かせる。

ロボットの説明

IMG_3305 p.gif

ペンを持たせるために赤で囲まれた部分を基礎となる車体に取り付け、ペンを輪ゴムで固定しただけのシンプルな構造である。

ペンはこれからの計算を少しでも楽にするため、ペン先をタイヤとタイヤの中点にいく様に調整を行った。

ロボットの動作・プログラミングの説明

ロボットに求める動きは

・必要な角度を回転させる

・ペンの上げ下げ

の2つが主となる。

全体で使う定義としてSPEED=50、モーターB、Cをそれぞれ右、左のタイヤの動きとして考える。

今回は距離からタイヤの回転角を計算するfloat型の関数を使ったプログラミングを元にロボットを動かしていく。

float GetAngle(float d)
{
const float diameter=5.45;    //タイヤの直径()
const float pi=3.1415;      //円周率(π)
float ang = d/(diameter*pi)*360.0;  //角度を計算する
return ang;          //角度を返す 
}

ロボットを回転させる

文字を書くためには、ロボット本体を回転させる必要がある。ここではペンで書いた線と線を繋げるためにタイヤを片方だけ動かすだけではなく、前後の動きも必要となる。

nxc 説明.gif

タイヤとタイヤの長さ(r)が10.5僂任△襪ら、これを元にfloat型の関数を利用してタイヤの辿る円周の長さ(L=2πrX/360)求める。(X=角度)

また、ペンを上げた位置と同じ場所に持っていくために、実際にロボットを回転させ、縦と横の長さの差を定規で測り、その差をロボットに前後移動させる。

kaitenループ※.gif

※前後の動きは角度によって異なる。

90度回転

90度回転させるための円周の長さは、

L=2×3.1415×10.5×90/360=16.5

また、90度回転した後に10儻緤へ進めると元のペンの位置にいく。

#define Ninety  GetAngle(16.5)
#define Ten GetAngle(10)
#define NBB RotateMotor(OUT_B,SPEED,Ninety);RotateMotor(OUT_BC,-50,Ten);    //右のタイヤを16.5竸覆泙察10儻緤へ→右に90度回転
#define NBC RotateMotor(OUT_C,SPEED,Ninety);RotateMotor(OUT_BC,-50,Ten);    //左に90度回転

60度回転

90度回転と同じやり方で、

L=2×3.1415×10.5×60/360≒10.995

また、3兪以に進んだ後、60度回転し、10.494儻緤へ進めると元の位置にいく。

#define Sixty GetAngle(10.995)
#define Three RotateMotor(OUT_BC,SPEED,GetAngle(3));
#define SixtyBackB Three;RotateMotor(OUT_B,SPEED,Sixty);RotateMotor(OUT_BC,-50,GetAngle(10.494));    //3兪以へ進め、右のタイヤを10.494竸覆泙擦晋紂10.494儻緤へ→右に60度回転
#define SixtyBackC Three;RotateMotor(OUT_C,SPEED,Sixty);RotateMotor(OUT_BC,-50,GetAngle(10.494));    //左に60度回転

20度回転

90度回転と同じやり方で

L=2×3.1415×10.5×20/360≒3.665

また、5竸覆鵑生紂20度回転し、後ろに6.146(3.646+2.5)儻紊蹐鵬爾欧襪噺気琉銘屬砲い。

#define Twenty GetAngle(3.665)
#define Five RotateMotor(OUT_BC,SPEED,GetAngle(5));
#define TwoFiveB RotateMotor(OUT_BC,-50,GetAngle(2.5));
#define TwentyBackB Five;RotateMotor(OUT_B,SPEED,Twenty);RotateMotor(OUT_BC,-50,GetAngle(3.646));TwoFiveB;    //5兪以へ進め、右のタイヤを3.665竸覆泙擦晋紂6.146儻緤へ→右に20度回転
#define TwentyBackC Five;RotateMotor(OUT_C,SPEED,Twenty);RotateMotor(OUT_BC,-50,GetAngle(3.646));TwoFiveB;    //左に20度回転

ペンの動作

ここでは唯一float型の関数を使わずにモーターの回転角度を指定してモーターを回転させることでペンの上げ下げの動作を行う。

#define UP RotateMotor(OUT_A,SPEED,-50);    //ペンを上げる
#define DOWN RotateMotor(OUT_A,SPEED,50);   //ペンを下げる
down up ループ.gif

字を書く

書く順番

「香」を書くために、

1、 崕宗廚鮟颪→◆崙」を書く(「口」→「一」)→「八」を書く→ぁ屮痢廚鮟颪

nxc senn 1.2.gif

2、 屮痢廚鮟颪→横線4本を書く→縦線3本書く→ぁ嵌」を書く

nxc senn 3.gif

順番を3つ考え、プログラミングし、試してみた結果、2の方がまだ上手くかけたので2の書く順番を紹介する。

プログラム

始めに長さを定理しますが、前へ進む距離を英語で表記し、後ろに進む動きは英語で表記したすぐ後ろに”Back”という意味で「B」と表記してあります。

#define Two RotateMotor(OUT_BC,SPEED,GetAngle(2));   //2兪阿某覆燹
#define TwoFive RotateMotor(OUT_BC,SPEED,GetAngle(2.5));  //2.5兪阿某覆燹憤焚捨)
#define ThreeFive RotateMotor(OUT_BC,SPEED,GetAngle(3.5));
#define Four RotateMotor(OUT_BC,SPEED,GetAngle(4)); 
#define FiveFive RotateMotor(OUT_BC,SPEED,GetAngle(5.5));
#define Six RotateMotor(OUT_BC,SPEED,GetAngle(6));
#define Seven RotateMotor(OUT_BC,SPEED,GetAngle(7));
#define Eight RotateMotor(OUT_BC,SPEED,GetAngle(8));
#define Eleven RotateMotor(OUT_BC,SPEED,GetAngle(11));
#define OneB RotateMotor(OUT_BC,-50,GetAngle(1));   //1儻紊蹐某覆燹憤焚捨)
#define ThreeB RotateMotor(OUT_BC,-50,GetAngle(3));
#define SixB RotateMotor(OUT_BC,-50,GetAngle(6));
  • 「ノ」を書く
task main ()
{
Wait(2000);
DOWN;
Eight;    //「ノ」を書く
  • 横線4本引く
UP;
Two;
SixtyBackB;
Two;
NBB;
DOWN;
Eleven; //「十」の「一」を書く
UP;   
NBC;
TwoFive;
NBC;
Two;
DOWN;
Seven;   //「日」の上の「一」を書く
UP;
NBB;
Two;
NBB;
DOWN;
Seven;   //「日」の真ん中の「一」を書く
UP;
NBC;
Two;
NBC;
DOWN;
Seven;   //「日」の下の「一」を書く
UP;
  • 縦線3本引く
NBC;
DOWN;
Four;   //「日」の左の「|」を書く
UP;
NBC;
Seven;
NBC;
DOWN;
Four;   //「日」の右の「|」を書く
UP;
NBC;
ThreeFive;
NBC;
Four;
TwentyBackC;   //角度の大きなズレを修正
TwentyBackC;
DOWN;
Five;   //「十」の「|」を書く
UP;
  • 「八」を書く
ThreeB;
OneB;
OneB;
NBC;
Three;
NBB;
DOWN;
RotateMotor(OUT_B,SPEED,Sixty);   //10.494僂慮未鯢舛ことで「八」を表現する
UP;
}

感想・考察

想像していた以上に「香」を書くことが難しかった。計算上、ピッタリと角度を回転して前後してしまった分戻せばきれいに書けるはずが、何度も角度を回転させると段々とズレが大きくなってしまい、最終的には最後の一画を全然違う場所に書いてしまうということが一度や二度のことではなかった。

そのため、最終的な大きな角度のズレを20度回転で修正していったり、なるべく角度での移動をさける書き方にしたり、書く順番を工夫するなどと試行錯誤を行った。

その甲斐もあって段々と形は整えていったが、自分が理想としているものには程遠いものであった。その原因として、途中で電池が切れそうになったのにも関わらず、電池を交換せずに試行錯誤を行ってしまったこと、後ろのタイヤの摩擦を考えていなかったこと、速さを早くしてしまったがために誤差を生じさせやすくしてしまったこと、そして移動する環境によって動きが変化することがあげられる。この原因に気付いて改善出来ていたら、もっと形の整った字を書くことが出来ただろう。次は原因をもっと見つけられるように様々な角度から考えていきたい。

今回のミッションを終えて、私のロボットは他の班に比べ、工夫が少ないと感じた。あまり考えずにペンの取り付けを行ったため、字が途切れ途切れになってしまったり、余分な線を引いてしまったりと不具合が生じることとなった。また、見た目も面白くないものだったため、もっと工夫をしていけばよかったと思う。次回からはプログラムの調整だけでなく、ロボットの構造の工夫をもっとやっていきたいと思う。


添付ファイル: filekaitenループ※.gif 167件 [詳細] filenxc senn 3.gif 103件 [詳細] filenxc 説明.gif 113件 [詳細] filenxc senn 1.2.gif 112件 [詳細] fileIMG_3305 p.gif 196件 [詳細] filedown up ループ.gif 134件 [詳細] fileIMG_3306.gif 56件 [詳細] fileIMG_3305.gif 73件 [詳細] fileIMG_3304 改訂.gif 80件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2014-12-05 (金) 20:32:55 (1716d)