2009a/A4/課題1左?

お絵描きロボットの作成

A3用紙に自分の似顔絵を描くロボットを作成する。

目次

完成までの道のり

  • 基礎部分の作成

   まず最初に基礎となるタイヤの部分パーツについて作成した。

        

 まず最初に僕たちが作ったタイヤ部分は下記のパーツです。↓

DVC00010.JPG

   しかしこれだと安定感が無さそうだったので    

   他のパーツで作ることにした。      

     

 次に試したパーツは下記パーツです。↓

DVC00011.JPG

   これは安定感がありそうなのでタイヤの部分はこれに決定!!

  • アームの作成    

   いろいろ考えた結果これに決定!!   

 アーム部分です↓

015.JPG
  • 本体の作成                    

   基礎ができたので本体の作成に取り掛かった。                

 まず試作1号!!↓

DVC00008.JPG

   しかし問題点発生!!        

   黄色の手みたいなパーツにペンをつけて上げ下げをするが

    上げた時にペンが上のブロックに当たってはね返って

   ペンが下に落ちてしまうことが判明した。      

   その問題点を克服してできたのが下のロボットです。

  完成品!!!↓

011.JPG

   えっと驚くくらいシンプルになりました。

   でもちゃんと動きます。        

   ちなみに写真だとペンが無いけど

   黄色い手みたいなパーツにペンを挟み輪ゴムで止めます。     

  横から見ると↓

013.JPG

   こんな感じです。  

プログラム

  • k山のプログラム
    #define TURN_TIME 15
    task main()
    {
    OnRev(OUT_A);//輪郭を書く
    Wait(850);
    Off(OUT_A+OUT_C);
    OnRev(OUT_B);//ペンを上げる
    Wait(TURN_TIME);
    Off(OUT_B);
    OnFwd(OUT_C);
    Wait(345);
    OnFwd(OUT_A+OUT_C);
    Wait(100);
    Off(OUT_A);
    Wait(173);
    OnFwd(OUT_A+OUT_C);
    Wait(60);
    Off(OUT_A);
    Wait(195);
    OnFwd(OUT_A+OUT_C);
    Wait(85);
    Off(OUT_A+OUT_C);
    OnFwd(OUT_B);//ペンを降ろす
    Wait(TURN_TIME);
    Off(OUT_B);
    OnFwd(OUT_A+OUT_C);//右目を書く
    Wait(30);
    Off(OUT_A+OUT_C);
    OnRev(OUT_B);//ペンを上げる
    Wait(TURN_TIME);
    Off(OUT_B);
    OnFwd(OUT_A+OUT_C);
    Wait(200);
    Off(OUT_A);
    Wait(370);
    OnFwd(OUT_A+OUT_C);
    Wait(100);
    Off(OUT_A+OUT_C);
    OnFwd(OUT_B);//ペンを降ろす
    Wait(TURN_TIME);
    Off(OUT_B);
    OnFwd(OUT_A+OUT_C);//左目を書く
    Wait(30);
    Off(OUT_A+OUT_C);
    OnRev(OUT_B);//ペンを上げる
    Wait(TURN_TIME);
    Off(OUT_B);
    OnFwd(OUT_C);
    Wait(370);
    Off(OUT_C);
    OnFwd(OUT_B);//ペンを降ろす
    Wait(TURN_TIME);
    Off(OUT_B);
    OnFwd(OUT_C);//口を書く
    Wait(35);
    Off(OUT_C);
    OnRev(OUT_B);//ペンを上げる
    Wait(TURN_TIME);
    ff(OUT_B);
    OnFwd(OUT_A+OUT_C);
    Wait(80);
    Float(OUT_A+OUT_C);
    }
    イメージ図:
    無題.jpg
  • 中立な稲妻のプログラム
    #define T_R OnFwd(OUT_A); OnRev(OUT_C); Wait(100);//右に90度曲がる、90度曲がるのは約2秒が必要で、2つの車輪同時に使うと約1秒
    #define T_L OnFwd(OUT_C); OnRev(OUT_A); Wait(100);//左に90度曲がる
    #define G_S OnFwd(OUT_A+OUT_C);//前に進む
    #define T_R2 OnFwd(OUT_A); OnRev(OUT_C);//右に曲がる、90度以外の状況で使う
    #define T_L2 OnFwd(OUT_C); OnRev(OUT_A);//左に曲がる
    #define U_P OnRev(OUT_B); Wait(10); Off(OUT_B);//ペンを上げる、時間よく調整する...
    #define D_N OnFwd(OUT_B); Wait(10); Off(OUT_B);//ペンを降ろす
    task main()
    {
    int M_T = 13;//調整するため変数を使う
    G_S Wait(M_T*15);//輪郭を描く(1)
    T_R2 Wait(75);//5,12,13の三角形の内角、大体67.5度
    G_S Wait(M_T*13);
    T_R2 Wait(75);
    G_S Wait(M_T*5*2^(1/2));//45度二等辺三角形の斜辺
    T_R2 Wait(30);//もともと50(45度)だったが、誤差の原因で、20〜30の範囲になった
    G_S Wait(M_T*15);//ここまで
    T_R
    G_S Wait(M_T*12);//髪を描く(2)前の部分
    T_R
    G_S Wait(M_T*3);
    T_L
    G_S Wait(M_T*3);
    T_R
    G_S Wait(M_T*3);
    T_L
    G_S Wait(M_T*2);//ここまで
    U_P
    T_L
    G_S Wait(M_T*3);
    T_R
    G_S Wait(M_T*3);
    T_L2 Wait(150);
    D_N
    G_S Wait(M_T*2*3*2^(1/2));//髪を描く(3)上の部分
    T_L2 Wait(50);
    G_S Wait(M_T*11);
    T_L2 Wait(50); 
    G_S Wait(M_T*2*3*2^(1/2));//ここまで
    U_P
    T_L2 Wait(50); 
    G_S Wait(M_T*12);
    T_L 
    G_S Wait(M_T*5);
    T_L 
    D_N
    G_S Wait(M_T*2);//口を描く(4)
    T_R
    G_S Wait(M_T*5);
    T_R
    G_S Wait(M_T*2);//ここまで
    U_P
    T_R
    G_S Wait(M_T*3);
    T_R
    G_S Wait(M_T*5);
    D_N
    G_S Wait(M_T*2);//鼻を描く(5)これだけ...
    U_P
    T_L 
    G_S Wait(M_T*4);
    T_R
    G_S Wait(M_T*3);
    T_R
    D_N
    G_S Wait(M_T*3);//眼鏡を描く(6)右目
    T_L 
    G_S Wait(M_T*2);
    T_L
    G_S Wait(M_T*3);//ここまで
    U_P
    T_L 
    G_S Wait(M_T*1);
    T_L
    G_S Wait(M_T*3);
    D_N
    G_S Wait(M_T*2);//横の部分と左目
    T_L
    G_S Wait(M_T*1);
    T_R
    G_S Wait(M_T*5);
    T_R
    G_S Wait(M_T*2);
    T_R
    G_S Wait(M_T*5);
    T_R
    G_S Wait(M_T*1);
    U_P
    T_R
    G_S Wait(M_T*5);
    D_N
    G_S Wait(M_T*1);//最後の部分
    T_L2 Wait(50); 
    G_S Wait(M_T*3);
    U_P
    G_S Wait(M_T*5);//紙を離れるだけ...
    Float(OUT_A+OUT_C);
    }

イメージ図:

CIMG0899.JPG

初めての運行:

CIMG0903.JPG

大失敗!!... ロボットが曲がるときペンを上げることが必要。

その後もう一度改造

CIMG0900.JPG
CIMG0901.JPG
CIMG0902.JPG

なんかミサイルみたいな感じ...

ペンは着実に紙に触れる。

しかし、たまに歯車がかみ合わない。

部品はしっかり貼りつけば...

  • プログラムも更新した。新しい命令を加えた。
#define U_P OnRev(OUT_B); Wait(15); Off(OUT_B);
#define D_N OnFwd(OUT_B); Wait(15); Off(OUT_B);
#define S_P Off(OUT_A+OUT_C); Wait(30);//大きな誤差を避けるため、ある直線を描いた後一度止まる
#define G_S OnFwd(OUT_A+OUT_C);//ただの前に進む
#define U_S U_P S_P//ペンを上げることと一度停止
#define D_G D_N G_S//書く必要なときこの命令を使う、ペンを降ろすことと前に進むこと
#define T_R OnFwd(OUT_A); OnRev(OUT_C); Wait(100); S_P//曲がった後一度止まる
#define T_L OnFwd(OUT_C); OnRev(OUT_A); Wait(100); S_P//同上
#define T_R2 OnFwd(OUT_A); OnRev(OUT_C);
#define T_L2 OnFwd(OUT_C); OnRev(OUT_A);
task main()
{
int M_T = 10;//全体小さくなる
D_G Wait(M_T*15); U_S //この命令は、ある直線を描き、そしてペンを上げ、一度止まるという意味
T_R2 Wait(75); S_P
D_G Wait(M_T*13); U_S
T_R2 Wait(75); S_P
D_G Wait(M_T*5*2^(1/2)); U_S
T_R2 Wait(30); S_P
D_G Wait(M_T*15); U_S
T_R
D_G Wait(M_T*12); U_S
T_R
D_G Wait(M_T*3); U_S
T_L
D_G Wait(M_T*3); U_S
T_R
D_G Wait(M_T*3); U_S
T_L
D_G Wait(M_T*2); U_S
T_L
G_S Wait(M_T*3); S_P//これは書かなくてただ前に進むという命令
T_R
G_S Wait(M_T*3); S_P
T_L2 Wait(150); S_P
D_G Wait(M_T*2*3*2^(1/2)); U_S
T_L2 Wait(50); S_P
D_G Wait(M_T*11); U_S
T_L2 Wait(50); S_P
D_G Wait(M_T*2*3*2^(1/2)); U_S
T_L2 Wait(50); S_P
G_S Wait(M_T*12); S_P
T_L 
G_S Wait(M_T*5); S_P
T_L 
D_G Wait(M_T*2); U_S
T_R
D_G Wait(M_T*5); U_S
T_R
D_G Wait(M_T*2); U_S
T_R
G_S Wait(M_T*3); S_P
T_R
G_S Wait(M_T*5); S_P
D_G Wait(M_T*2); U_S
T_L 
G_S Wait(M_T*4); S_P
T_R
G_S Wait(M_T*3); S_P
T_R
D_G Wait(M_T*3); U_S
T_L
D_G Wait(M_T*2); U_S
T_L
D_G Wait(M_T*3); U_S
T_L 
G_S Wait(M_T*1); S_P
T_L
G_S Wait(M_T*3); S_P
D_G Wait(M_T*2); U_S
T_L
D_G Wait(M_T*1); U_S
T_R
D_G Wait(M_T*5); U_S
T_R
D_G Wait(M_T*2); U_S
T_R
D_G Wait(M_T*5); U_S
T_R
D_G Wait(M_T*1); U_S
T_R
G_S Wait(M_T*5); S_P
D_G Wait(M_T*1); U_S
T_L2 Wait(50); S_P
D_G Wait(M_T*3); U_S
G_S Wait(M_T*5); S_P
Float(OUT_A+OUT_C); S_P
}

感想

  • k山  

   結構大変な作業で苦労した。    

   でも無事に完成してよかった。

   もっと見た目が凄そうなのが作れたらもっとよかったと思う。

  • 中立な稲妻    

   ロボットの動きは

   自分で思っていたよりも

   誤差があって大変だった。 

コメント

  • ペンの上げ下げは今回の課題の一つのポイントだと思うので、そこをきちんと説明していたのは良かったです。
    写真や図にも書き込むことができるので、よりわかりやすい説明にしてください。
    完成した似顔絵の写真も貼ってください -- FI? 2009-05-21 (木) 10:25:03
  • ロボットの説明はとてもわかりやすく、工夫が伝わります。 -- こさか? 2009-05-21 (木) 22:26:51
  • (途切れました、すみません)ただプログラムの方は説明不足で、ロボットの方ほど工夫が伝わりません。説明をつけることで、さらに美しく短いプログラムにする方法が見えてくると思います。 -- こさか? 2009-05-21 (木) 22:27:22
  • ロボットの説明の方は試行錯誤の過程がわかり、良いと思います。あとはプログラムですが、一人目はマクロやサブルーチン等を使ったほうがよいと思います。また、二人目の改善バージョンには説明があったほうがいいです。 -- FI? 2009-06-12 (金) 22:17:17
  • マクロや変数の使い方が微妙なところがあります。たとえばM_Tという変数、プログラムの中で数字を変えないのならば定数(つまりマクロ)で定義した方が良いと思います。マクロや変数は、プログラムをメンテナンスしやすくするためのものです。ですから、しばらく経ってみたときに「これはどういうことをするマクロだったっけ」とならないような命名をした方がいいと思います(次のプログラムからでいいです)。 -- こさか? 2009-07-02 (木) 21:28:07


添付ファイル: file01.jpg 122件 [詳細] fileCIMG0902.JPG 248件 [詳細] fileCIMG0901.JPG 246件 [詳細] fileCIMG0900.JPG 336件 [詳細] fileCIMG0903.JPG 244件 [詳細] file無題.jpg 225件 [詳細] fileCIMG0899.JPG 251件 [詳細] file015.JPG 229件 [詳細] file013.JPG 246件 [詳細] file012.JPG 133件 [詳細] fileDVC00008.JPG 239件 [詳細] fileDVC00011.JPG 242件 [詳細] fileDVC00010.JPG 246件 [詳細] file011.JPG 241件 [詳細]

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