お絵かきロボットを作ろう!!

目次

ロボット紹介

今回お絵かきロボットを作成するために製作したロボットを紹介します。

ロボットの構造

今回顔を書くために製作したロボットは基本の構造はレールで紙を挟みその上をペンを保持した台車を横に走らせ顔を書く方法です。
今回NXTにしかできないことを探しまし、ロボットアームのような構造(角度設定が簡単にできる。)も試しに作ろうとしましたが部品数の少なさから断念しました。

ロボットの外形
ロボット写真

縦の線を描く。

縦の線を描くためにレールを前後させる必要があります。本体部分の横にモーターを取り付けて前後できるようにします。本体は基本的に前後の動きしかしません。

本体の図

横の線を描く

横の線を書くためにはレールの上をペンを左右に動かす必要があります。横移動させる方法に図2のようはものがありましたが荷重に弱かったため使用しませんでした。

台車の図
往復スライダクランク機構

ロボットの製作

私たちが作ったロボットは大きく4つに分かれます。本体(前後運動)、レール、レール上を走る台車(左右運動)、ペンの上下部の4つです。

本体(前後運動)

本体の構造はバランスをとるためNXT本体をなるべく低くしました。その結果NXT本体をタイヤで挟む構造になりした。
前後運動させるにはなるべく直線のずれを少なくするために四輪で車輪と車輪の間を広く取りました。またモーターの動力を伝える車輪は左右をシャフトで連結させました。
部品削減、軽量化を心がけシンプルな構造です。
モーターを1つ使う。

レール

レールは上にペンを持った台車を走らせるためのものです。レールには台車を走らせるための幅、台車の重さに絶えるための強度が必要です。しかし、パーツ数の都合上レールを上下に組み合わせることができなかったので、レールのつなぎ目を横から覆う形にしました。

レール部分

台車(左右の移動)

左右の移動はレールの上を走る台車によって行います。太いタイヤは本体で使ってしまい細いタイヤしかなかったため筆の摩擦に勝てないのではないかと思いましたが、実際に作ってみたところ問題なく動きました。また、ペンの上下と一体化しており、左右移動用のモーターは立った状態でセットされています。
モーターを1つ使う。

台車ユニット

ペンの上下部

ペンを上下する機構はオームギアをラックとして使い、回転運動を上下運動にするために使用しました。丸の部分にもう一つギアを入れてモーターからの回転を伝えています。モーターは台車ユニットに寝かせた状態で配置しています。また、L字型のパーツを3本使ってマジックハンドを作り、ゴムで固定しています。
モーターを1つ使う。

ラック部分

このロボットの構造上の問題点と予想される解決策

  • このロボットの一番の問題点は紙に対して垂直の方向にレールが曲がってしまうことです。原因は本体とレールの結合部の弱さです。この解決策は、レールの側面を補強する、結合部を補強するなどにより解消されます。しかし今回は部品点数に限界があるため十分に補強はできませんでした。
  • 問題点の一つにペンの固定が不安定なため書かれる絵がぶれてしまいます。この解決策は、ペンのなるべく低いところを支持する、上下ギミックを安定したものにするなどの解決策がありましたがレール同様部品数の限界により納得できるほどには解消することができませんでした。実際にはプログラム上で辻褄を合わせました。
  • 今回のロボットの特徴として直線は書きやすいのに対し、曲線は書きにくい。これをどう解消するかはプログラム上にて曲線を細かな直線とみなす方法がありますが実際にはプログラムが複雑になるため今回は曲線は描きませんでした。

顔を書くプログラム

今回私たちはNXTのモーターの特徴でもあるサーボ機構を使い回転角度の増幅値をとっていくインクレメンタルで書きました。
今回このプログラムは基本的に回転角度を使うことにしました。
ロボット完成後、実際にロボットを走らせて90度でどれほど書くことが出来るのか調べこの様なプログラムにしました。
ペンの上げ下げは数回あるのでサブルーチンを使いました。
斜め線を書くときには二つのモーターを同時に動かすため時間により制御します。製作したロボットで調べたところ前後モーターは50%のスピードで285/1000秒同様の時間で左右モーターは45%のスピードで前後左右90度回りました。

志村

#define NANAME_TIME 570 //直角にかかる時間(Aモーター25% 90度、Bモーター45% 180度)
#define TORQUE 35 //モータースピード35

sub pen_up()
{
    RotateMotor(OUT_C,50,-180); //Cモーター50のスピードで-180度
}

sub pen_down()
{
    RotateMotor(OUT_C,50,180); //Cモーター50のスピードで180度
}

task main()
{
    RotateMotor(OUT_A,TORQUE,-90); //Aモーター、-90度(原点から書き出しへ。)以下指示のないモーターのスピードは35%
    Off(OUT_A);
    pen_down();//ペンを下ろす。
    RotateMotor(OUT_A,TORQUE,-180); //Aモーター、-180度(顔の輪郭を書き始めます。)
    Off(OUT_A);
    OnRev(OUT_A,25);//斜め線を書く。(顎左)
    OnRev(OUT_B,45);
    Wait(NANAME_TIME);
    Off(OUT_B);
    Float(OUT_A);//斜め線を書く。(顎右)
    OnRev(OUT_B,45);
    OnFwd(OUT_A,25);
    Wait(NANAME_TIME);
    Off(OUT_AB);
    RotateMotor(OUT_A,TORQUE,180); //Aモーター、180度(顔の輪郭終わり。)
    RotateMotor(OUT_B,TORQUE,370); //Bモーター、360度、修正10度(頭を書き始めます。)
    Off(OUT_A);
    Float(OUT_B);
    OnFwd(OUT_A,25);//斜め線書く。(頭左)
    OnRev(OUT_B,23);
    Wait(NANAME_TIME);
    Off(OUT_AB);
    RotateMotor(OUT_B,TORQUE,-190); //Bモーター、-180度角度、修正10度
    Off(OUT_B);
    OnRev(OUT_B,23);//斜め線を書く。(頭右)
    OnRev(OUT_A,25);
    Wait(NANAME_TIME);
    Off(OUT_AB);//頭終わり
    pen_up();
    RotateMotor(OUT_A,TORQUE,-60); //Aモーター、-60度(鼻の始めに移動)
    RotateMotor(OUT_B,TORQUE,180); //Bモーター、180度
    Off(OUT_AB);
    pen_down();
    RotateMotor(OUT_A,TORQUE,-60); //Aモーター、-60度(鼻を書く。)
    RotateMotor(OUT_B,TORQUE,-45); //Bモーター、-45度
    Off(OUT_AB);
    pen_up();
    RotateMotor(OUT_A,TORQUE,75); //Aモーター、75度(右目始まりへ移動)
    Off(OUT_A);
    pen_down();
    RotateMotor(OUT_B,TORQUE,-90); //Bモーター、-90度(右目を書く。)
    Off(OUT_B);
    pen_up();
    RotateMotor(OUT_B,TORQUE,225); //Bモーター、270度(左目始まりへ移動)
    Off(OUT_B);
    pen_down();
    RotateMotor(OUT_B,TORQUE,-90); //Bモーター、-90度(左目を書く。)
    Off(OUT_B);
    pen_up();
    RotateMotor(OUT_A,TORQUE,-135); //Aモーター、-135度(口の始まりに移動)
    Off(OUT_A);
    pen_down();
    RotateMotor(OUT_B,TORQUE,-90); //Bモーター、-90度(口を書く。)
    Off(OUT_B);
    pen_up();
    RotateMotor(OUT_B,TORQUE,225); //Bモーター、225度(原点に戻す。)
    RotateMotor(OUT_A,TORQUE,270); //Aモーター、270度
    Off(OUT_AB);
}

修正角度が数ヶ所含まれますが、ペンの抵抗によってレールが曲がってしまったのをプログラムで修正しています。
モータースピード(TORQUE)をグローバル変数にしたのは速さによって図のずれが変わるかどうか調べるためです。速いとずれや線の揺れは大きくなりますが、遅くてもきれいに書くことはできませんでした。
私の完成予想図はこんな感じです。

志村の完成予想図

試し書きです。ここからわかるように横半分がゆがみます。

志村の顔の絵

完成作品です、練習の作品から少しずれています。当日ペンを貸してくださったA1左チームの方ありがとうございました。

完成図。

松澤

#define pen_up RotateMotor(OUT_C, 50, -180);Off(OUT_C);
#define pen_down RotateMotor(OUT_C, 50, 180);Off(OUT_C);
#define MOVE_TIME 570
#define MOVE_HALF 275
#define move_left pen_down;RotateMotor(OUT_B, 50, -60);Off(OUT_B);pen_up;
#define move_down RotateMotor(OUT_A, 50, 30);Off(OUT_A);
task main ()
{
   pen_down;//ペンを下げる
   RotateMotor(OUT_A, 50, -45);//上に45度移動
   Off(OUT_A);
   OnFwd(OUT_B,45);//右斜め上に移動
   OnRev(OUT_A,25);
   Wait(MOVE_TIME);
   Off(OUT_AB);
   OnFwd(OUT_B,45);//右斜め下に移動
   OnFwd(OUT_A,25);
   Wait(MOVE_TIME);
   Off(OUT_AB);
   RotateMotor(OUT_A, 50, 45);//下に45度移動
   Off(OUT_A);
   OnRev(OUT_B,45);//左斜め上に移動
   OnRev(OUT_A,25);
   Wait(MOVE_TIME);
   Off(OUT_AB);
   OnRev(OUT_B,45);//左斜め下に移動
   OnFwd(OUT_A,25);
   Wait(MOVE_TIME);
   Off(OUT_AB);
   RotateMotor(OUT_A, 50, 90);//下に90度移動
   Off(OUT_A);
   OnFwd(OUT_B,45);//右斜め下に移動
   OnFwd(OUT_A,45);
   Wait(MOVE_HALF);
   Off(OUT_AB);
   RotateMotor(OUT_B, 50, 180);//右に180度移動
   Off(OUT_B);
   OnFwd(OUT_B,45);//右斜め上に移動
   OnRev(OUT_A,45);
   Wait(MOVE_HALF);
   Off(OUT_AB);
   RotateMotor(OUT_A, 50, -90);//上に90度移動
   Off(OUT_A);
   pen_up;//ペンを上げる
   RotateMotor(OUT_B, 50, -45);//左に45度移動
   Off(OUT_B);
   move_left;//ペンを下げつつ左に60度移動してペンを上げる
   RotateMotor(OUT_B, 50, -75);//左に75度移動
   Off(OUT_B);
   move_left;//ペンを下げつつ左に60度移動してペンを上げる
   RotateMotor(OUT_B, 50, 110);//右に110度移動
   Off(OUT_B);
   move_down;//下に30度移動
   pen_down;//ペンを下げる
   RotateMotor(OUT_A, 50, 45);//下に45度移動
   Off(OUT_A);
   pen_up;//ペンを上げる
   move_down;//下に30度移動
   RotateMotor(OUT_B, 50, 45);//右に45度移動
   Off(OUT_B);
   pen_down;//ペンを下げる
   RotateMotor(OUT_B, 50, -120);//右に120度移動
   Off(OUT_B);
   pen_up;//ペンを上げる
}
完成予想図です。

完成予想図です。

試し書きです。

試し書きです。完成予想図と比べて頭が小さくなってしまっています。 完成作品です。

完成図です。

感想

志村

今回の課題はお絵かきロボットでしたがロボット製作に多くの時間を使い何回か作り変えました。ほぼすべてのパーツを使ったため強度に多少不安を残す結果ですが今後のロボット作りの糧になると思います。パーツ少なーと嘆きながらも十分レゴを楽しめました。レゴは5歳から遊んでますがNXTは初めてなので新たな可能性にわくわくしています。

松澤

志村くんの感想にもありますが、とにかくパーツ数が少ないのが苦労しました。それでも何とか書けたのでよかったと思います。RCXの経験はあるのですが、NXTは部品がだいぶ違ったのでそれも苦労しました。

コメント

  • 気になることがありましたら、ご自由にコメントしてください。 -- 志村? 2011-11-10 (木) 22:20:44
  • 松澤さんの結果も掲載してください。 -- 松本 2011-11-11 (金) 13:41:10


添付ファイル: filekao_m_kansei.jpg 560件 [詳細] filekao_s_kansei.jpg 543件 [詳細] filekanseizu_m.jpg 590件 [詳細] filehontai_syasin.jpg 551件 [詳細] filekako_m.jpg 483件 [詳細] filekao_s.jpg 554件 [詳細] fileyokuidou_sisaku.gif 1603件 [詳細] filekanseizu_s.gif 499件 [詳細] filedaisya.gif 566件 [詳細] filenxt_honntai.gif 496件 [詳細] filehonntai.gif 479件 [詳細] filePH_238.jpg 601件 [詳細] filePH_241.jpg 594件 [詳細] filePH_236.jpg 631件 [詳細]

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