目次

課題

課題の内容

 ロボットにペンを取り付けて七画以上の文字を一文字書かせる。

文字について

書かせる字と選んだ理由

 「時」を選んだ。大学生は余りある時間をどのように使うか考えさせられるという点と、直角が多く書きやすいのではないかと考えたのが主な理由である。

書き順

 当初は書き順通りに書いてみようと試みたものの、負担が大きいためにロボットができるだけ単純な動きをするような書き順にすることにした。実際の書き順は下図のとおりである。

書き順

機体

全体

  • NXT本体を中心として、左右のタイヤ、後輪、筆ペンの昇降機構などを部品ごと分解できるようにして構成されている。分解できるようにしたのは、持ち運びしやすくするためである。
分解
  • タイヤを縦にして取り付けた所謂高床式の構造になっており、それ故のバランスの悪さ、強度の低さをカバーするために左右対称に取り付けた部品をそれぞれつなぐなどして強度を高めている。
  • 重心は若干後ろにあるために後輪の摩擦が大きくなって回転時の抵抗となってしまったので、もう少し重心の位置や後輪として使う部品を考えればよかったと思う。
全体像

ペンの昇降

 何よりも重要視したのはペン先がロボットの回転軸に来るようにすることである。軸からずれてしまうと、回転時に線もずれてしまう。今回製作したロボットの回転軸はちょうどタイヤの間にあったので、NXT上部に取り付けた昇降機構からペンをタイヤの間に潜り込ませるようにした。またブレを最小限にするためにペンを固定する部品とペン先の降下位置を誘導する部品を取り付けた。

ペンの昇降

プログラム

時間制御

 最初は回転も直進も時間制御でやろうとした。実際それなりにうまくは行くのだが、電圧の関係でどうしても毎回同じ動きにならなかったため回転とペンの昇降に関しては角度制御することにした。

角度制御(最終的なプログラムの定義の説明)

 下記のようにまずは各動作を定義した。直進は時間制御だが、単純にOnFwdだと電圧の関係かまっすぐに進まなかったため、OnFwdSyncを使うことによって両輪を同期して正確に直進できるようにした。OnFwdSyncの括弧の中は、(出力ポート,出力パワー,回転比率)である。回転比率0で前進する。TYOKUSHINに数字をふっているが、これは進む長さによってあらかじめ番号を決めておくことで簡略化しようとしてのことである。しかし実際に動かしてみると、やはり電圧の関係で移動距離が変動してしまったり線と線の間隔も定義した動きではうまくいかないことが多かった。そのためTYOKUSHIN2のみ出力パワーと待機時間を変数にすることで自由度を持たせ、状況に臨機応変に対応できるようにした。また出力パワーを負の値にすることで後退の動作を定義する手間を省くことができた。ただし、変数にしたところは毎回入力せねばならず、その分の手間が増えたのでもっとスマートなプログラムにできればよかったと思う。

#define TYOKUSHIN1 OnFwdSync(OUT_BC,30,0);Wait(200);Off(OUT_BC);Wait(1000);
#define TYOKUSHIN2(t,s) OnFwdSync(OUT_BC,t,0);Wait(s);Off(OUT_BC);Wait(1000);
#define TYOKUSHIN3 OnFwdSync(OUT_BC,30,0);Wait(600);Off(OUT_BC);Wait(1000);

 左回転とペンの昇降については角度制御した。ここで用いたのがRotateMotorである。これはモーターの回転角度を決めるものである。括弧の中は(出力ポート,出力パワー,回転角度)となっている。今回ペンの昇降部品はモーターに直接つく形になっていたので、毎回同じ筆圧になるようにするためには角度制御はちょうどよかった。

 そして左回転の時に用いているRotateMotorExは、回転比率を決め、さらに両輪を同期するか否かと停止の仕方を選択することができる。括弧の中は(出力ポート,出力パワー,回転角度,回転比率,両輪の協調動作,停止状態)で、両輪の協調動作はtrueでする、falseでしないとなり、停止状態はtrueで即時停止falseで減衰停止となる。RotateMotorExを用いることで正確に方向転換できるようになった。しかし右回転はどうしてもうまくいかず(原因不明)、正確な左回転のみすることにした。原因の究明はこれからの課題だ。

#define TURN_L RotateMotorEx(OUT_BC,30,275,100,true,true);Wait(1000);
#define UP RotateMotor(OUT_A,30,60);Wait(1000);
#define DOWN RotateMotor(OUT_A,-30,60);Wait(1000);

最終的なプログラム(本文)

 一筆書きで四角形を描くイメージ。単純な動作であるため安定して綺麗に書くことができた。

task main()
{
   DOWN;
   TYOKUSHIN2(30,300);
   TURN_L;
   TYOKUSHIN2(30,300);
   TURN_L;
   TYOKUSHIN3;
   TURN_L;
   TYOKUSHIN2(30,300);
   TURN_L;
   TYOKUSHIN2(30,350);
   TURN_L;
   TYOKUSHIN2(30,300);
   UP;

 「土」に入る前に「日」の最後の直線からそのままの流れで「寸」の部分の横棒を書き、「土」に向けて方向転換をする。

   TYOKUSHIN1;
   DOWN;
   TYOKUSHIN3;//「寸」の横棒
   UP;
   TURN_L;
   TYOKUSHIN1;
   TURN_L;
   DOWN;

 そして最難関の「土」部分。十字の形になっているがゆえ、線と線の間隔のずれに悩まされた。特に右回転時のずれが大きく、前述のように左回りのみすることにした。また、できるだけ回転をしないようにTYOKUSHIN2の変数に代入する値を変えて後退動作を多く組み込んだ。

   TYOKUSHIN3;
   UP;
   TYOKUSHIN2(-30,300);//縦棒を書く位置まで後退
   TURN_L;
   TURN_L;
   TURN_L;//右回りの誤差が大きいため左回りで270度旋回
   DOWN;
   TYOKUSHIN2(30,400);//縦棒
   UP;
   TYOKUSHIN2(-30,200);//もう一本の横棒を書く位置まで後退
   TURN_L;
   TYOKUSHIN2(30,300);//横棒の始点に移動
   DOWN;
   TYOKUSHIN2(-30,500);//動作簡略化のためバックで書く
   UP;

ハネ、点

 地味にこだわった部分。より人間が書く字に近づけるために工夫した。

   TURN_L;
   TYOKUSHIN2(30,300);//「土」の長い横棒の位置にペン先が降りるように調整
   DOWN;
   TYOKUSHIN3;
   RotateMotorEx(OUT_BC,30,140,100,true,true);//定義したものと回転角度が異なる
   Wait(1000);
   TYOKUSHIN2(-20,300);//ペンを上げずにそのまま書くことで「ハネ」を作った
   UP;
   TYOKUSHIN2(-30,300);
   DOWN;
   UP;//ただペンを上げ下げするだけにして、「点」らしくした
}   

書いた字

失敗例

 回転角度がずれてしまい、各線の始点もめちゃくちゃになっている。最初と比べればどんな字か分かるだけましにはなっているのだが、やはり失敗である。

失敗例

成功例

 書いた字の中では最も綺麗なもの。ペンの固定が甘かったのか、多少ずれてはいるものの全体のバランスは最高に良かった。

成功例

反省と感想

 最終的にちゃんと字が書けたので、ひとまずは及第点だと思う。しかしハード面では後輪の摩擦軽減や重心の位置の調整、ソフト面ではもう少しスマートなプログラムにするべきだったなどと反省点もあった。次回以降の課題では今回の反省を生かしてロボットの製作をしていこうと思う。


添付ファイル: fileDSC_0042.JPG 65件 [詳細] fileDSC_0039.JPG 72件 [詳細] fileDSC_0037.JPG 68件 [詳細] fileDSC_0036.JPG 99件 [詳細] fileDSC_0035.JPG 122件 [詳細] file書き順.jpg 54件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2016-11-10 (木) 23:41:18 (1011d)