2009a/A2/課題1左

ロボットで似顔絵を描く

[目次]

ロボットを制作する

今回のロボットには、四輪のものを使用した。この基本となる部分は、ほぼ 解説書のまま制作した。

SH350097.JPG

試作1号機の解説

まず、制作したものが下の写真の試作1号機だ。

SH350089.JPG

この試作機は、ペンの後ろの1点をブロックによって固定するようにした。 ペンの上げ下げは、ベルトドライブによって行うことにした。この場合、ペンを何度も上下させるとペンを固定しているパーツがモーターボックスから外れることがあったので、両側から棒で固定した。また、ペンが必要以上に下がらないようにストッパーを装着した。これは、同時に適度な筆圧を保つ役目も果たす。

1号機の問題点

・ペンを1点で支えているので横からの力に弱い。

・ペンの持ち手の強度が不十分

・構造が複雑

・特定のペンしか持てない

試作2号機の解説

 下の写真が1号機に改良を施した二号機

PAP_0095.JPG

ペンの装着方法をブロックの箱組みから、3本のアームと2本の輪ゴムによる固定方法に変更した。これにより単純な構造でありながら、ペンの持ち手の強度及び、より安定した筆圧の確保に成功した。また、一定の太さのペンであれば保持することが可能となった。  もう1点、二号機ではペンの上げ下げの機構も変更した。1号機のベルトドライブからアングルギアによる駆動に変更することで、より確実な可動が可能になった。

PAP_0094.JPG

プログラム

T.I

    プログラムver.1                                                        
int turn_time                                
int curve_time
int re_time
 #define go_straight(T); OnFwd(OUT_A+OUT_C);Wait(t);Off(OUT_A+OUT_C);  //前進
 #define turn_left OnFwd(OUT_C);OnRev(OUT_A);Wait(turn_time);  //左旋回
 #define turn_right OnFwd(OUT_A);OnRev(OUT_C);Wait(turn_time); //右旋回
 #define curve_left OnFwd(OUT_C);Off(OUT_A);Wait(curve_tim); //緩やかに左旋回
 #define pen_up OnRev(OUT_B);Wait(20);Off(OUT_B);       //ペンを上げる
 #define pen_down OnFwd(OUT_B);Wait(20);Off(OUT_B);    //ペンを下げる
 #define re OnRe(OUT_A+OUT_C);Wait(re_time);       //後退
 #define st Off(OUT_A+OUT_C);Wait(100);         //停止
 
 task main()                                     
{
 SetPower(OUT_A+OUT_C,1);  //AとCのモーター出力を1に設定
 SetPower(OUT_B,7);       //Bのモーター出力を7に設定
 pen_down;        
 turn_time=100;     //旋回時間の初期値100
 curve_time=60;         //カーブ時間60
 re_time=40;      //後退時間
 turn_time+=520;    //旋回時間+520
 turn_left;      //輪郭を描く
 Off(OUT_A+OUT_C);   
 turn_time-=600;
 turn_right;
 st;
 pen_up;
 re;
 st;
 pen_down;
 curve_left;           //口を描く
 pen_up;
 re_time+=10;      //後退時間+10
 re;
 turn_tme+=30;
 turn_left;
 st;
 pen_down;
 re_time-=10;    //目を描く
 re;
 st;
 pen_up;
 re;
 st;
 pen_down;
 re;
 pen_up;
 re;
 turn_time-=30;
 turn_left;
 go_straight(260);
 turn_right;
 st;
 pen_down;
 re_time+=210;    //帽子を描く
 re;
 st;
 pen_up;
 go_straight(170);
 turn_time+=70;
 turn_right;
 st;
 pen_down;
 go_straight(40);  //鼻を描く
 OnFwd(OUT_A);
 Wait(20);
 Off(OUT_A+OUT_C);
 }

  プログラムver.2

int turn_time                                
int curve_time
int re_time
 #define go_straight(T); OnFwd(OUT_A+OUT_C);Wait(t);Off(OUT_A+OUT_C);
 #define turn_left OnFwd(OUT_C);OnRev(OUT_A);Wait(turn_time);
 #define turn_right OnFwd(OUT_A);OnRev(OUT_C);Wait(turn_time);
 #define curve_left OnFwd(OUT_C);Off(OUT_A);Wait(curve_tim);
 #define re OnRe(OUT_A+OUT_C);Wait(re_time);
sub pen_up()                   //ペンの上げ下げのコマンドをサブルーチンに変更
  {
OnRev(OUT_B);
Wait(20);
Off(OUT_B);
}
  sub pen_down()
 {
  OnFwd(OUT_B);
  Wait(20);
  Off(OUT_B);
  }
  sub st()         //行動をキャンセルするコマンドをサブルーチン化
 { 
   Off(OUT_A+OUT_C);
   Wait(100);
   task main()
  以下プログラムver.1と同様

Fahim

task main()
{   
  
    
     OnFwd(OUT_A);
     OnRev(OUT_C);    // head
     Wait(415);
     Off(OUT_A+OUT_C);
    OnRev(OUT_B);
    Wait(10);
    Off(OUT_B);
     OnRev(OUT_A+OUT_C);  
     Wait(65);
     OnFwd(OUT_B);
     Wait(10);
     Off(OUT_B);
     OnRev(OUT_A+OUT_C);  // nose
     Wait(25);
     OnRev(OUT_B);
     Wait(10);
     Off(OUT_B);
     OnRev(OUT_A+OUT_C);
     Wait(40);
     Off(OUT_A+OUT_C);
     OnFwd(OUT_A+OUT_C);
     Wait(110);
     OnFwd(OUT_A);OnRev(OUT_C);
     Wait(90);
     Off(OUT_A+OUT_C);
     OnRev(OUT_A+OUT_C);
     Wait(65);
     Off(OUT_A+OUT_C);
     OnFwd(OUT_B);    
     Wait(15);
     Off(OUT_B);
     OnRev(OUT_A+OUT_C);   // Mouth
     Wait(30);
     Off(OUT_A+OUT_C);
     OnRev(OUT_B);
     Wait(15);
     Off(OUT_B);
     OnFwd(OUT_C);OnRev(OUT_A);
     Wait(90);
     Off(OUT_A+OUT_C);
     OnFwd(OUT_A+OUT_C);
     Wait(80);
     Off(OUT_A+OUT_C);
     OnFwd(OUT_A);OnRev(OUT_C);
     Wait(100);
     Off(OUT_A+OUT_C);
     OnFwd(OUT_A+OUT_C);
     Wait(50);
     Off(OUT_A+OUT_C);
     OnFwd(OUT_B);
     Wait(15);
     Off(OUT_B);
     OnRev(OUT_A+OUT_C);   // Eyes
     Wait(30);
     Off(OUT_A+OUT_C);
     OnRev(OUT_B);
     Wait(10);
     OnRev(OUT_A+OUT_C);
     Wait(20);
     Off(OUT_A+OUT_C);
     OnFwd(OUT_B);
     Wait(15);
     Off(OUT_B);
     OnRev(OUT_A+OUT_C);
     Wait(30);
     Off(OUT_A+OUT_C);
     OnRev(OUT_B);
     Wait(15);
     Off(OUT_B);
     
 }

完成品

SH350096.JPG

少し横から見たような似顔絵が完成した。帽子が少し寸足らずな気もするが問題ない範囲と判断。

実際、動かす場所によって動きに多少の誤差が出ているのを確認している。

工夫点

 先に作ったプログラムでは同じ動作を行うためにマクロのみを使用したが、そのためにプログラムの容量が大きくなり転送に時間がかかった。そこで、改良したプログラムでは動作時間に変数を含まないプログラムをマクロからサブルーチンに変更した。  また、本体の移動中に不要なところでペンが上がったり下がったりしたので、移動用のプログラムとペンの上げ下げのプログラムの間に行動をキャンセルするプログラムを挿入した。

感想  

単純な似顔絵を描くだけでも色々工夫してより良いものを作ろうと思うと、なかなか大変なものだと思えた。まだ不満な部分も多々あるが、時間的猶予があまりないので留めておく。次の課題にはさらに力を入れたいと思う。

コメント欄(ご自由にどうぞ)

  • ロボットの説明はよく書けています!ただ、プログラムの工夫の説明は、プログラムソースの間に挟んでいただいた方が見やすいのではないかと思います。それと、「ひとりにつき一つ以上のプログラムを作成すること。」の条件がありますので、誰が書いたプログラムかも明記してください。 -- こさか? 2009-05-21 (木) 22:14:17
  • プログラムに説明を付けてください -- FI? 2009-05-22 (金) 11:05:37
  • 更新しました。 -- Fahim? 2009-05-28 (木) 19:08:35
  • Fahimさんのプログラムに、マクロが使えないか検討してみてください。 -- こさか? 2009-05-28 (木) 23:51:52


添付ファイル: fileSH350097.JPG 217件 [詳細] fileSH350096.JPG 204件 [詳細] fileSH350091.JPG 113件 [詳細] fileSH350092.JPG 130件 [詳細] filePAP_0095.JPG 198件 [詳細] filePAP_0094.JPG 227件 [詳細] filePAP_0093.JPG 118件 [詳細] fileSH350090.JPG 118件 [詳細] fileSH350089.JPG 238件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2009-05-29 (金) 15:08:40 (3738d)