目次

課題

A3の紙に相棒の似顔絵を書くロボットを作成する。

ひとりにつき一つ以上のプログラムを作成する。

ロボット

DSC_0001.jpg
車体の右側にモーターを取り付け、ペンを持つ腕の部分が上下に動くようなパーツを作りました。

前面

DSC_02.jpg


前面の黄色いパーツにペンをはさみ、ゴムでペンを固定する。
ペンは、細くてあまり凹凸のないものでないとうまくはさめませんでしたが、一度はさんでゴムで固定すればしっかりと取り付けられます。


DSC_08.jpg


モーターの部分と本体がとれやすかったので、写真のように固定してあります。またパーツ自体も固定してあります。

右側面

DSC_03.jpg


右面にモーターを置き、ペンを持つ腕が動くようにしてあります。
ゴムが1個だけだと、ペンの重みに負けて、腕が上がらないことがあったので、ゴムを2個使うことで、より安定して腕の部分を動かせるようにしました。

DSC_0004.jpg


ゴムの部分は、最初はギアを使っていたが、ギアだと腕の上下が早すぎるのでゴムに変えて早さの調節をしました。

プログラム

roboA.jpg
プログラムAによる顔
roboP.jpg
プログラムBによる顔

A

P-A.jpg
#define TURN_TIME 105 //右に曲がる時間
#define turn_right OnFwd(OUT_A);OnRev(OUT_C);Wait(TURN_TIME);Off(OUT_A+OUT_C) //右に曲がる
#define turn_left(t) OnFwd(OUT_C);OnRev(OUT_A);Wait(t);Off(OUT_A+OUT_C) //左に曲がる
#define go_straight(t) OnRev(OUT_A+OUT_C);Wait(t);Off(OUT_A+OUT_C); //直進
#define UP OnRev(OUT_B);Wait(15);Off(OUT_B); //ペンを上げる
#define DOWN OnFwd(OUT_B);Wait(15);Off(OUT_B); //ペンを下げる
task main()
{
OnFwd(OUT_A); //輪郭を描く
OnRev(OUT_C);
Wait(420);
Off(OUT_A+OUT_C);

go_straight(230); //前髪の線を描く

UP;
turn_right;
go_straight(5);
turn_right;
go_straight(230);
DOWN;

repeat(2){      //目の線を描く
 UP;
 go_straight(35);
 DOWN;
 go_straight(35)
 }

UP;
turn_left(113);
go_straight(25)
turn_left(65);
go_straight(190)
DOWN;

go_straight(35)  //口を描く
}

(作成者:三澤)

B

P-B.jpg
#define UPANDDOWN_TIME             20         // 鉛筆を上げるし下げる時間
#define TURN_90                    110        // 90度曲がる時間 
#define TURN_360                   415        //  360度曲がる時間
#define ZIG_TIME                   5          // ジグザグする時間 
#define WRITE                      1          // 描くか決める変数 
#define NO_WRITE                   0          // 描くか決める変数

int	iFlag = 0;                            // 鉛筆が上がっているか確認する変数

// 鉛筆を上げる関数
sub up ()
{
    if ( iFlag == 1 )                         // 鉛筆が上がっているか確認した後で進む
    {
        OnRev ( OUT_B );                      // B モータを作動して鉛筆を上げる
        Wait ( UPANDDOWN_TIME );
        Off ( OUT_B );
        iFlag = 0;                            // 鉛筆が上がっていることをチェックする
    }	
}

// 鉛筆を下げる関数
sub down()
{
     if ( iFlag == 0 )                        // 鉛筆が下がっているか確認した後で進む
     {
         OnFwd ( OUT_B );                     // B モータを作動して鉛筆を下げる
         Wait ( UPANDDOWN_TIME );
         Off ( OUT_B );
         iFlag = 1;                           // 鉛筆が下がっていることをチェックする
     }
}

// ロボットを前進させる関数
// iTime : 動く時間
// iWriteFlag : 描くか決める変数
void go ( int iTime, int iWriteFlag )
{
    if ( iWriteFlag == 1 )                    // iWriteFlag=1のとき鉛筆を下げる
    {
        down ();
    }
    else
    {
        up ();
    }
    OnFwd ( OUT_A + OUT_C );                  // A モータとCモータを作動する
    Wait ( iTime );	
    Off ( OUT_A + OUT_C );
}

// ロボットを後進させる関数
// iTime : 動く時間
// iWriteFlag : 描くか決める変数
void back ( int iTime, int iWriteFlag )
{
    if ( iWriteFlag == 1 )                    // iWriteFlag=1のとき鉛筆を下げる
    {
         down ();
    }
    else
    {
        up ();
    }
    OnRev ( OUT_A + OUT_C );                  // A モータとCモータを作動する
    Wait ( iTime );
    Off ( OUT_A + OUT_C );
}

// ロボットを左に曲がらせる関数
// iTime : 動く時間
// iWriteFlag : 描くか決める変数
void turn_left ( int iTime, int iWriteFlag )
{
    if ( iWriteFlag == 1 )                    // iWriteFlag=1のとき鉛筆を下げる
    {
         down ();
    }
    else
    {
         up ();
    }
    OnRev ( OUT_A );                          // Aモータを作動する
    OnFwd ( OUT_C );                          // Cモータを作動する
    Wait ( iTime );
    Off ( OUT_A + OUT_C );
}

// ロボットを右に曲がらせる関数
// iTime : 動く時間
// iWriteFlag : 描くか決める変数
void turn_right ( int iTime, int iWriteFlag )
{
    if ( iWriteFlag == 1 )                    // iWriteFlag=1のとき鉛筆を下げる
    {
       down ();
    }
    else
    {
        up ();
    }
    OnFwd ( OUT_A );                          // Aモータを作動する
    OnRev ( OUT_C );                          // Cモータを作動する
    Wait ( iTime );
    Off ( OUT_A + OUT_C );
}

// ロボットをジグザグに線を描かせる関数
// iTime : 動く時間
// iStron : ジグザグする強さ
void write_zig ( int iTime, int iStrong )
{
    int	iCount = 0;
    int	iLoop;
	
    iCount = iTime / ZIG_TIME;
	
    down ();
    for ( iLoop = 0 ; iLoop < iCount ; iLoop++ )  // ジグザグするために繰り返す部分
     
   {
        OnFwd ( OUT_A );                       // 右に少し動く
        Wait ( iStrong );
        Off ( OUT_A );
		
        OnFwd ( OUT_A + OUT_C );               // 前に少し動く
        Wait ( ZIG_TIME / 2 );
        Off ( OUT_A + OUT_C );
		
        OnFwd ( OUT_C );                       // 左に少し動く
        Wait ( iStrong ); 
        Off ( OUT_C );
		
        OnFwd ( OUT_A + OUT_C );               // 前に少し動く
        Wait ( ZIG_TIME / 2 );
        Off ( OUT_A + OUT_C );
    }
    up ();
}

task main ( )
 {

    // 顔の輪郭を描く部分
    turn_right ( TURN_360, WRITE );
	
    // 髪を描く部分
    go ( 50, NO_WRITE );
    turn_right ( TURN_90, NO_WRITE );
    back ( 190, NO_WRITE );
    go ( 190, WRITE );
  
    // 目を描く部分
    turn_right ( TURN_90, NO_WRITE );
    go ( 70, NO_WRITE );
    turn_right ( TURN_90, NO_WRITE );
    back ( 200, NO_WRITE );
    go ( 40, NO_WRITE );
    write_zig ( 40, 2 );
    go ( 40, NO_WRITE );
    write_zig ( 40, 2 );
	
    // 鼻を描く部分
    back ( 15, NO_WRITE );
    turn_left ( TURN_90, NO_WRITE );
    back ( 70, NO_WRITE );
    go ( 30, WRITE );

    // 口を描く部分
    go ( 130, NO_WRITE );
    turn_left ( TURN_90, NO_WRITE );
    go ( 110, NO_WRITE );
    turn_right ( TURN_90 * 2, NO_WRITE );
    write_zig ( 25, 10 );	
	
 }

(作成者:朴)

難しかった、できなかったところ

・ペンを上げ下げする部分のパーツを作るのがとても大変だった。
なんとかペンを上下に上げ下げ出来るパーツを作りたかったので、自分たちで作った。今現在ゴムだったところは、実は前はギアで出来ていて、上げ下げするスピードが速すぎたので、ゴムに替えました。ゴムにしてから、速さがちょうど良くなり、プログラムも楽になりました。しかしこのパーツはペンを挟みこんでいるのではなく、最終的にゴムで固定しているので、ペンを下ろしたときに若干ずれてしまったりするので、そこは課題が残りました。

・毎回機械の動き方が微妙に違うので、距離の計算をするのが大変だった。
同じプログラムでも、1回やる度に目や口の位置がずれてしまった。でも少しずれても違和感のないようにプログラムを組んで、なんとか顔になるようにした。

コメントをどうぞ

書くべきことは書けており、プログラムを工夫しています。気になる点が残るので、授業中に確認します。



添付ファイル: fileP-B.jpg 338件 [詳細] fileP-A.jpg 354件 [詳細] fileDSC_08.jpg 344件 [詳細] fileDSC_03.jpg 326件 [詳細] fileDSC_02.jpg 361件 [詳細] fileDSC_0008.jpg 194件 [詳細] fileDSC_0004.jpg 328件 [詳細] fileDSC_0003.jpg 186件 [詳細] fileDSC_0002.jpg 187件 [詳細] fileDSC_0001.jpg 322件 [詳細] fileroboP.jpg 348件 [詳細] fileroboA.jpg 321件 [詳細]

トップ   編集 凍結 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2008-08-08 (金) 14:57:52