[[2008b/MemberOnly/進行状況A]]~
準備中。~
~
~

*課題1:相方の似顔絵を描くロボットの作成。 [#dba545ea]
A3の紙に相方の似顔絵を描くロボットを作成する。
#contents
**ロボット本体の作成 [#r3663451]
***考案 [#e6aab9f3]
似顔絵ロボットを作るときに真っ先に考える必要があるのは、ペンの固定の方法、そして上下させる方法、その機器の取り付け方である。~
ここの班では、ロボット本体にペンを上下させるアームを取り付ける事にした。レゴの取扱説明書に書かれていた優秀な本体をほとんど弄る必要がないからである。~
これにより時間が節約できるものと考えた。
***考案段階での問題と解決策 [#t10e2d71]
アーム型にすると、何も考えずに取り付けるとカーブさせる時に線がぶれてしまう。~
そこで、ここの班では本体の左側の、なるべくタイヤに近いところにペン先があるようにアームをセットした。こうすることで~
#ref(左直覚.gif)
↑左向きに直角な線を描きたいとき:右タイヤのみを前進~
#ref(右直覚.gif)
↑右向きに直角な線を描きたいとき:右タイヤのみをバック~
~
右向きの円弧を描きたいとき:右向きに旋回~
~
これだけの動きができる。~
左向きの円弧を描く事はできないが、無くても大丈夫だと判断しこの方向でいく事に。
***制作段階での問題と解決策 [#k73097e5]
実際にアームを制作したところ、問題が発生した。~
ペンの重みでアームを上げても維持ができずに落下してしまうのである。~
その解決策として、ウォームギアを使う事にした。~
#ref(SANY0010.JPG)
ウォームギアは非常に高トルクを生む上に、ギアの戻りがほとんど発生しないためにアームが落ちない。高トルクのおかげでペンを押さえる力もつよい。
***本体の完成 [#y9144c26]
以上の過程を乗り越え、本体が完成した。~
#ref(SANY0016.JPG)
時間が短縮できるものと考えたが、ウォームギアを組むのと、ペンの固定方法、本体への取り付けに想像以上に時間を食われ、結局完成までに時間がかかってしまった。

**プログラム [#b455f229]
本体完成後、プログラムの作成に移る。~
アーム上下のサブルーチンだけは二人で共通して作る。その後は個別作業。~
~
~
***松島のプログラム [#t635797e]
 
 #define ANGLE 120 //90°曲げる時間
 #define ARM 50 //アームをあげる時間
 
 task main()//メイン関数
 {
	repeat (4){//前髪部分
	str(25);
	turnAL(ANGLE);
	str(25);
	turnAR(ANGLE);
	}
 
	turnAR(ANGLE);
 
	turnR(ANGLE*4);//輪郭
	up();
	turnR(180);
	back(30);
	turnR(60);
	turnR(50);
	str(20);
	down();//口
	turnR(60);
	
 }
 
 void turnAR(int ct)//角で右に曲げる関数
 {
     OnFwd(OUT_C);
     Wait((ct-20)*2);
     fstop();
 }
 
 void turnAL(int ct)//角で左に曲げる関数
 {
     OnRev(OUT_C);
     Wait((ct-20)*2);
     fstop();
 }
 
 void turnR(int ct)//円で右に曲げる関数
 {
     OnFwd(OUT_C);
     OnRev(OUT_A);
     Wait(ct);
     fstop();
 }
 
 void str(int ct)//直進
 {
     OnRev(OUT_A);
     OnRev(OUT_C);
     Wait(ct);
     fstop();
 }
 
 void back(int ct)//後退
 {
	OnFwd(OUT_A+OUT_C);
	Wait(ct);
	fstop();
 } 
 
 sub down()//アームを下げる 
 {
     OnFwd(OUT_B);
     Wait(ARM);
     Off(OUT_B);
 }
 
 sub up()//アームを上げる
 {
    OnRev(OUT_B);
    Wait(ARM+5);
    Off(OUT_B);
 }
 
 sub fstop()//停止
 {
    Off(OUT_A+OUT_C);
 }
それぞれの動作を関数、サブルーチン化した。それぞれの関数、ルーチンの説明はコメントを参照。~
#defineで90度曲がるのにかかる時間は一応指定したが、誤差が生まれるためにあまり役に立たなかった(turnAL関数などのWait((ct-20)*2);なんかで、waitの値がこんなのになってるのはそのせい)~
アームを上げるルーチンのWaitの値に+5が入ってるのも誤差のため。ペンが重いのか、上げる方がわずかに時間を使う事がわかった。


***福永のプログラム [#x3a1719c]
 #define TURN_TIME  200
             
             
             
     task main()
 {    
       OnRev(OUT_A+OUT_C);Wait(180);  
       OnRev(OUT_A+OUT_C);Wait(180);//ここから輪郭を書きはじめる。
            Off(OUT_A+OUT_C);
      OnRev(OUT_A);OnFwd(OUT_C);Wait(230);
           Off(OUT_A+OUT_C);
        OnRev(OUT_A+OUT_C);Wait(180);  
            Off(OUT_A+OUT_C);
      OnRev(OUT_A);OnFwd(OUT_C);Wait(230);
      OnRev(OUT_A);OnFwd(OUT_C);Wait(230);//輪郭終了。
           Off(OUT_A+OUT_C);      
            arm_up();
      OnRev(OUT_A+OUT_C);Wait(180); 
            Off(OUT_A+OUT_C);
      OnFwd(OUT_C);Wait(240); 
            Off(OUT_C); 
      OnRev(OUT_A+OUT_C);Wait(40); 
            Off(OUT_A+OUT_C);
            arm_down();
            arm_down();       //口を書く。
      OnRev(OUT_A+OUT_C);Wait(60);
            Off(OUT_A+OUT_C);
            arm_up();
      OnRev(OUT_A+OUT_C);Wait(40);
            Off(OUT_A+OUT_C); 
      OnFwd(OUT_C);OnRev(OUT_A);Wait(120);
            Off(OUT_C);
      OnFwd(OUT_A+OUT_C);Wait(40);
            Off(OUT_A+OUT_C);
      OnFwd(OUT_C);OnRev(OUT_A);Wait(120);
            Off(OUT_C);  
      OnRev(OUT_A+OUT_C);Wait(30);
            Off(OUT_A+OUT_C); 
             arm_down();
             arm_down();      //目を書く。
      OnRev(OUT_A+OUT_C);Wait(30);
            Off(OUT_A+OUT_C);
            arm_up(); 
      OnRev(OUT_A+OUT_C);Wait(20);
            Off(OUT_A+OUT_C);
            arm_down();
      OnRev(OUT_A+OUT_C);Wait(30);
            Off(OUT_A+OUT_C);
            arm_up(); 
      OnRev(OUT_A+OUT_C);Wait(30);
            Off(OUT_A+OUT_C);
      OnRev(OUT_C);Wait(240);
            Off(OUT_C);
        OnRev(OUT_A+OUT_C);Wait(40);
            Off(OUT_A+OUT_C);
        OnRev(OUT_C);Wait(240);
            Off(OUT_C);
          arm_down();  
        OnRev(OUT_A+OUT_C);Wait(180);
        OnRev(OUT_A+OUT_C);Wait(180);//前髪を書く。
             Off(OUT_A+OUT_C);
                  
    }
  sub     arm_up() ペンを上げる
  sub     arm_up() //ペンを上げる
 {
       OnRev(OUT_B); Wait(55);
       Off(OUT_B);      
    }
  sub      arm_down()ペンを下げる
  sub      arm_down()//ペンを下げる
 {
       OnFwd(OUT_B); Wait(50); 
       Off(OUT_B);
       }

プログラム作成にあたって苦労した点は時間でした。少し変えるだけでだいぶ動きが変わってしまうので何度も試す必要がありました。また関数をうまく使いこなすことができず必要以上に長いプログラムになってしまった。
**結果 [#u4d85af1]
#ref(SANY0014.JPG)
↑松島作
#ref(SANY0015.JPG)
↑福永作

**工夫した点のまとめ [#ie3f2228]
•ウォームギアによるアームの力強い上げ下げ(制作段階での問題と解決参照)~
•アームを真横に装備した事による、直線運動から直接カーブや直角カーブに移れる点。実際の絵でも、このことを生かして作る事ができた。(考案段階での問題とお解決参照)
**反省 [#qba7d0e4]
***松島 [#w66d7fe4]
プログラム作成が想像以上に大変だった。~
Waitの時間だけで移動するだけならともかく、誤差が出てくるため一つ一つWaitの時間を決めなければならずに苦労した。
***福永 [#a72d7515]
マシンを自分の思い道理に動かすのが想像以上に大変だった。何度も試行錯誤し、時間もかなりかかってしまったが、楽しみながら作業することができてよかった。最後の発表では何とか出来上がったので本当にうれしかった。次の課題ではさらに完成度を高めれるようにがんばりたい。



トップ   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS