#contents
ホーム[[2017b/Member]]
*このベージは山下由伸のページです。 [#hfe78483]
*1課題 [#hfe78483]
これまで住んだことのある都道府県名、市町村名、地区名などの中から2文字以上のものを選び、それをA4の紙を書くロボットを製作せよ。

**はじめまして [#afc62274]
こんにちはよろしくお願いします。
&ref(2017b/Member/Yoshi/Mission1/DSC_2076.JPG,10%,月の写真);
これより私の出身地である「埼玉」を書くことにした
*2ロボットの紹介 [#hfe78483]
**ロボット制作にあたって[#afc62274]
私たちがろぼっとを作るにあたってまず、モーター1つにつき一方向に動くいわゆるXY式のものを目指しました。調べた結果、[[2016b/Member/ta.kashi/Mission1]]が私たちの理想像に近かったため、このページの画像を参考にロボットを作りました。

私達のチーム(二人)はロボットの形式として
参考にした画像

&ref(2016b/Member/ta.kashi/Mission1/Fig_001.JPG,50%,参考にした画像);
**ロボットの形 [#n402669d]
&ref(2017b/Member/Yoshi/Mission1/ko-zenntaizu.jpg,50%,子の全体像);
&ref(2017b/Member/Yoshi/Mission1/dodai-zenntai.jpg,87%,土台の全体像);
&br;
右のロボットが土台となりX軸方向に自由に移動できる。
&br;
左のロボットが土台のレールにのり、レール上をY軸方向に移動したり、筆ペンを上下に動かす。

&ref(2017b/Member/Yoshi/Mission1/robo-zenntai.jpg,90%,全体像);
&br;
完成形は上図のようになっています。

X方向には無制限に動けますがY方向にはレールの長さ分のみしか動けません。しかし今回はA4の紙に字を書くということで紙の短辺をロボットのY方向にすることで問題を回避しました。
*3ロボット作成で工夫した点 [#r3f47f32]

**土台部分(X軸) [#w709e2dc]
&ref(2017b/Member/Yoshi/Mission1/dodai-yokohaba.jpg,70%,全体像);

ロボットの安定性を高めるためにタイヤの間隔をひろくとりました。またモーターにタイヤを二つ取り付けることで二輪駆動を実現しています。

**上部(Y軸、ペンの上下) [#k25b8768]
&ref(2017b/Member/Yoshi/Mission1/ko-hukann.jpg,70%,全体像);
&ref(2017b/Member/Yoshi/Mission1/ko-pen.gif,43%,ペンの機構);

参考サイトに習い、上部の安定性を向上するために、レールの内側と同じ幅で突起を取り付けました。

また筆ペンの上下機構がレール上からずれていてバランスが悪いために反対側に重りとしてタイヤを付けました。

2枚目の画像のようにペンを上下する機構はモーターの回転する動きからウォームギアで上下の動きに変換しています。

*4プログラム [#t1f283c1]
**定義した定数 [#o1329b1a]

プログラムを簡略化し、開発しやすくするためにいくつか定数を定義しました。
&br;
以下はその抜粋です

 #define Apower 35
 #define Bpower 34  
 #define Ytime 1624  //y軸で10cm進むのに必要なおおよその時間
 #define gotime 1692  //x軸で10cm進むのに必要なおおよその時間
 #define bai 0.8  //文字を書く倍率
解説が必要なのは少ないでしょうが、まず上二つが移動用モーターの出力です。AがX軸でBがY軸に対応しています。数値が違うのは特に意味はりません。ただ全力で動かずかつ弱すぎない出力にしました。
&br;
次の二つはそれぞれの方向で定義した出力で動かした際に10cm進むのにかかる時間(ms)です。電池の消耗とモーターの個性に簡単に対応できるようにするために作りました。
&br;
最後の定数の「bai」は文字を書く際の倍率です。プログラム上のすべてのモーターの駆動時間にbaiをかけることで簡単に文字の大きさを調整できます

**定義したサブ関数 [#m9587eea]

定数と同様にいくつかサブ関数を定義しました。これにより可読性を高め、他人が見てもわかりやすくなります。
&br;
以下はその抜粋です

 sub go_forX(float t)
 {
     OnFwd(OUT_A,Apower);
     Wait(t*gotime*bai);
     Float(OUT_AB);  //前進X(t×10)cm
     Wait(1000);
 }
 sub go_backX(float t) 
 {
     OnFwd(OUT_A,-Apower);
     Wait(t*gotime*bai);
     Float(OUT_AB);  //後進X(t×10)cm
     Wait(1000);
 }
 sub go_forY(float t)
 {
     OnFwd(OUT_B,-Bpower);
     Wait(t*Ytime*bai);
     Float(OUT_AB);  //前進Y(t×10)cm
     Wait(1000);
 }
 sub go_backY(float t) 
 {
     OnFwd(OUT_B,Bpower);
     Wait(t*Ytime*bai);
     Float(OUT_AB);  //後進Y(t×10)cm
     Wait(1000);
 }
 sub penup() 
 {
     RotateMotor(OUT_C, 10,50);
     Wait(1500);
     Off(OUT_C);  //ペンを上げる
 }
 sub pendown() 
 {
     RotateMotor(OUT_C, -10,50);
     Wait(1500);
     Off(OUT_C);  //ペンを下げる
 }
 sub go_XY(float t)
 {
     OnFwd(OUT_B,-Bpower);
     OnFwd(OUT_A,Apower);
     Wait(t*Ytime*bai);
     Float(OUT_AB);  //斜めYは(t×10)cm
     Wait(1000);
     penup();
     OnFwd(OUT_B,Bpower);
     OnFwd(OUT_A,-Apower);
     Wait(t*Ytime*bai);
     Float(OUT_AB);
     Wait(1000);
 }
 sub go_XY2(float t)
 {
     OnFwd(OUT_B,-Bpower);
     OnFwd(OUT_A,-Apower);
     Wait(t*Ytime*bai);
     Float(OUT_AB);  //斜めYは(t×10)cm
     Wait(1000);
     penup();
     OnFwd(OUT_B,Bpower);
     OnFwd(OUT_A,Apower);
     Wait(t*Ytime*bai);
     Float(OUT_AB);
     Wait(1000);
 }

定義したサブ関数は大きく分けてペンを所定の位置に動かすもの(go_forX、go_backX、go_forY、go_backY、go_XY、go_XY2)とペンを上下するもの(penup、pendown)に分かれます。
&br;
まず所定の位置に動かすものは、すべて変数tがモーターの駆動として設定されています。t=1,bai=1の時においてXYどちらも10cm程動くようになっているためtをいくつにするかで進む距離を決定できます。
&br;
またロボットが動いたとは機体が揺れることを考慮して1秒の待機時間を入れてあります。

「go_XY、go_XY2」はペンが斜めに移動する用の関数です斜めに移動して戻ってくるところまでがセットになっています。

ペンを上下するものは単純です。モーターを特定の角度だけ回転させる関数でペンの上下をしています。

**実行するプログラム [#t144e1c4]

ここまでで定義したものを使って「埼玉」と書くために以下のようにtask mainを作りました

 task main ()
 {
    ResetTachoCount(OUT_C);
    penup();
    go_backY(1.2);
    go_backY(0.9);  //調整1
    pendown();
    go_backX(0.7); //よこ
    go_backX(0.5); //よこ(土)
    penup();
    go_forY(0.3);
    pendown();
    go_forX(0.7); //よこ
    go_backX(0.35); //よこ
    go_backY(0.4); //縦
    go_forX(0.5); //よこ
    penup();
    go_backX(0.8);
    go_backY(0.2);
    go_backX(0.25); //よこ
    pendown();
    go_backY(0.5); //縦
    penup();
    go_backX(0.6);//移動to大
    go_backY(0.4);
    pendown();
    go_forY(0.2); //たて()大
    for (int i=1 ; i<=15;i++) {
        go_forX(0.02);
        go_forY(0.02);
    }
    go_XY(0.25); //斜め1
    pendown();
    go_XY2(0.25); //斜め2
    go_forX(0.25);
    pendown();
    go_backX(0.5); //横(大)
    penup();
    go_forY(0.5); //移動to可
    go_forX(0.4);
    pendown();
    go_backX(0.5); //可はじめ
    go_forY(0.5);
    penup();
    go_forX(0.4);
    go_backY(0.1);
    pendown();
    go_backY(0.3); //口
    go_backX(0.3);
    go_forY(0.3);
    go_forX(0.3);
    penup();
    go_backX(0.9); //移動to(玉)
    go_forY(0.5);
    go_backY(0.3);
    pendown();
    for (int i=1 ; i<=15;i++) {
        go_backX(0.02);
        go_forY(0.02);
    }
    go_backY(1.2);//  |
    penup();
    go_backY(0.3);
    go_forX(0.3);
    pendown();
    go_forX(0.3);
    go_backX(0.6);
    go_backX(0.6);//  --
    penup();
    go_forY(0.6);
    pendown();
    go_forX(0.6); //司
    go_backX(0.6);
    go_forY(0.6);
    go_forX(0.6);//  --
    penup();
    go_forX(0.5);
    go_backY(0.1);
    go_forY(1);
    go_backY(0.3);
    pendown();
    go_backY(0.3);
    go_backX(0.3);
    go_forY(0.3);
    go_forX(0.3);
    go_backX(0.6);//  --
    penup();
    go_forX(0.2);
    go_backY(0.4);
    pendown();
    go_XY2(0.25);//斜め(玉)
    penup();
 }

というものを作りました
特出して書くことはないと思いますが、「埼」から「玉」に移動する際にY軸の位置をレールの端に合わせてずれにくいようにしています

*5実行結果 [#yce51899]

こうして作ったロボットとプログラムを動かしてみた。まず倍率を0.8倍にして動かした。
&br;
その結果

&ref(2017b/Member/Yoshi/Mission1/kekka1.jpg,87%,埼玉1);
&br;
のように最後の一画が少しはみ出た。なので今度は倍率を0.5倍にして動かした。
&br;
その結果

&ref(2017b/Member/Yoshi/Mission1/kekka2.jpg,87%,埼玉1);
&br;
となりはみ出ずに書くことができた。


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