2017b/Member/riko/Mission3
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
検索
|
最終更新
|
ヘルプ
|
ログイン
]
開始行:
目次
#contents
* 課題3のレポートを見る前に [#o928e753]
今回の課題の機体の構想やプログラムの書き方、発想は私の課...
特にこの機体のライントレースのやり方についての詳しい説明...
* 課題3 [#m41fb4d5]
** 内容 [#le8145e6]
課題2で使用した紙を用い、下図のマジェンタの円に逆さまにし...
&ref(2017b/Member/riko/Mission3/課題3_フィールドの図.png,...
** ルール [#cadfbda7]
詳しいルール説明は[[2017年度後期・課題3:http://yakushi.sh...
** チームメンバー [#xd992990]
N5・N6の合同メンバー。課題1・2・3とすべて下記の私を含めた...
主に私は機体を作る作業をしていたのでプログラムについて詳...
・riko
・[[arso:http://yakushi.shinshu-u.ac.jp/robotics/?2017b%2...
・[[tono:http://yakushi.shinshu-u.ac.jp/robotics/?2017b%2...
* 今回の機体について [#t5cc74a2]
今回の課題を成功させるために必要な動きとして、
?フィールド上を自由に動くために動き
?紙コップをつかむ動き
?掴んだ紙コップを持ち上げ、被せる動き
の三点が挙げられる。
?の機構に関しては課題2のものを今回の課題に合わせて少しだ...
?、?の機構は最初の構想ではクワガタのハサミのような形と動...
しかし、1つのモーターで?、?の動きをこなす機構(以下、「ア...
これにより、フィールド上に二台のロボットを動かすことが可...
** アーム機構 [#yb3b004f]
上記のアーム機構についてできる限り詳しく説明するが、私の...
*** 掴む機構_1 [#g57efdf2]
初めに、紙コップをつかむ機構を作る。
ウォームギアを用いることで紙コップを掴む両腕の部分の動き...
&ref(2017b/Member/riko/Mission3/アーム部分_1.PNG,600x350,...
ウォームギアが回る仕組みとしてまず、?の黄色の矢印方向に黒...
次に、真ん中の黒い歯車が回ることで?の赤色の矢印方向に白い...
最後に白い歯車の中の棒が回ることで?の緑色の矢印方向にウォ...
*** 掴む機構_2 [#f7bc3389]
次にウォームギアとそれに隣接する歯車「ウォームホイール」...
この説明においては私が図を書き、説明するよりは下記のURLに...
ウォームギアとは、ねじのような形状のウォームと、それにか...
&ref(2017b/Member/riko/Mission3/ウォームギアとウォームホ...
〇[[「ロボジョイくらぶ」(第二回「平歯車の仕組み」と「か...
*** 掴む機構_3 [#wa92fa91]
次に実際に組み立てた機構のウォームギアとウォームホイール...
&ref(2017b/Member/riko/Mission3/アーム部分_2.PNG,600x350,...
上図の腕部分が回る仕組みとしてまず、?の緑色の矢印方向にウ...
それによって、ウォームホイールに固定された腕部分が?の灰色...
*** アームを持ち上げる機構_0(謝罪) [#u80404b2]
まず初めに、謝罪をさせてもらいます。本当に申し訳ありませ...
あくまで私の意見ですが、機構の理解を得るための近道は実際...
*** アームを持ち上げる機構_1-1 [#qb4fd471]
まず、かさ歯車と呼ばれるものの下図を見てもらいたい。
&ref(2017b/Member/riko/Mission3/かさ歯車による持ち上げる...
上図の青色の矢印はそれぞれの歯車の軸を表していることがわ...
次に?、?の歯車がそれぞれその場に固定されていたと仮定する。
そう仮定した場合、?の歯車を緑色の矢印方向に回したとすると...
*** アームを持ち上げる機構_1-2 [#ub4da0ea]
次に?の歯車自体の回転(灰色の矢印の回転)だけ固定された場合...
&ref(2017b/Member/riko/Mission3/かさ歯車による持ち上げる...
先ほどと同様に?の歯車を緑色の矢印方向に回したとする。
そうした場合、?の歯車の動きとしては?自体の回転は存在せず...
*** アームを持ち上げる機構_2-1 [#j48407ed]
以上の二つの仕組みを利用してアームを持ち上げる機構を作っ...
&ref(2017b/Member/riko/Mission3/アーム機構における置き換...
今回の機構の場合、歯車の負荷値が低い方から順番に回る為「...
下の図は、「掴む機構_3」に記載されている図の表の方を切り...
&ref(2017b/Member/riko/Mission3/掴む機構_1の図の表.PNG,40...
*** アームを持ち上げる機構_2-2 [#bb3f9e19]
次に上図のアームが?に動きをし続けると、両アームが互いのア...
&ref(2017b/Member/riko/Mission3/持ち上げる機構の回転方向....
上図の青色の矢印は?、?の歯車の軸を表している。黄緑色、橙...
*** アームを持ち上げる機構_3 [#p4bbdaab]
上記の機構を利用することで、アーム機構が完成する。そして...
&ref(2017b/Member/riko/Mission3/アーム部分_3.PNG,550x300,...
※おおよそ上の写真の通りに制作されたがロボット本体に取り付...
** アーム機構_工夫点 [#kdc4a642]
このアーム機構の主な工夫点としては三つ挙げられる。
?紙コップを取り込む際の工夫(緑色の枠線)
?紙コップを掴む際の工夫(水色の枠線)
?持ち上げた紙コップを下げるための工夫(赤色の枠線)
&ref(2017b/Member/riko/Mission3/アーム機構_工夫部分.PNG,3...
それぞれの工夫を下記に説明していく。
*** アーム機構_工夫点? [#u7e20bfc]
アームを閉じる際、紙コップを取らなければならない。紙コッ...
&ref(2017b/Member/riko/Mission3/紙コップを内側に取り込む...
&ref(2017b/Member/riko/Mission3/紙コップを内側に取り込む...
上図はアームのタイヤ部分上から見た際の簡略図である。タイ...
また、細かな点ではあるがタイヤのゴムによって紙コップを掴...
*** アーム機構_工夫点?-1 [#g41c004e]
紙コップを掴むとき、紙コップの状態をよりきれいに支える、...
まず紙コップをきれいに支える為の工夫として、三点で支えて...
&ref(2017b/Member/riko/Mission3/紙コップを掴むための工夫_...
上図のように赤色の三点で支えることによって紙コップがぐら...
特徴としては、二点より三点の方が安定する。支える三点の位...
*** アーム機構_工夫点?-2 [#d9aef073]
次に紙コップの体制の話である。普通であるならば、紙コップ...
&ref(2017b/Member/riko/Mission3/紙コップを掴むための工夫_...
上図は紙コップを横から見ている図である。簡単に説明すると...
取り付け方としてはウォームギアの為の棒を短くし、その下に...
※現段階では中心の黒い棒が支えとなっているが機体の完成体で...
*** アーム機構_工夫点? [#m7a0aa22]
今から説明する工夫はアームを締めてから持ち上げるまでは必...
&ref(2017b/Member/riko/Mission3/ストッパー.PNG,400x300,ス...
まず、ストッパーがなかった場合どうなるか。その時の写真が...
&ref(2017b/Member/riko/Mission3/ストッパー_説明.PNG,400x4...
&ref(2017b/Member/riko/Mission3/ストッパーなしの場合.PNG,...
そのため、ストッパーをつけることでウォームギアの前進を止...
** アーム機構_反省 [#nd3118b6]
アーム機構を制作するにあたって、実はこんなに大きなものを...
一つ目は、紙コップを取る際に色々と工夫して取りやすくしよ...
二つ目は、ロボット製作期間が短く、アーム機構の理解に時間...
上記の理由という名の言い訳を述べさせてもらったが、一言付...
** 機体_β版 [#r0110778]
取り合えず、アーム機構にモーターを取り付け、課題2で作った...
&ref(2017b/Member/riko/Mission3/機体_β版_全体.JPG,400x300...
機体の上面、側面からの写真、アーム部分の写真となる。
&ref(2017b/Member/riko/Mission3/機体_β版_上面_横.JPG,400x...
&ref(2017b/Member/riko/Mission3/機体_β版_側面.JPG,400x300...
&ref(2017b/Member/riko/Mission3/機体_β版_アーム_1.JPG,400...
試作品として付けただけなので欠点だらけとなっている。例と...
因みに、この時は三点で支える発想はなかった。
** 機体_完成版 [#ee53e672]
最終的に完成した機体の全体が下の写真となる。この機体の自...
&ref(2017b/Member/riko/Mission3/機体_完成版_全体.JPG,400x...
機体の上面、側面、正面からの写真、アーム部分の写真となる。
&ref(2017b/Member/riko/Mission3/機体_完成版_上方.JPG,400x...
&ref(2017b/Member/riko/Mission3/機体_完成版_側面_スタンド...
&ref(2017b/Member/riko/Mission3/機体_完成版_正面.JPG,400x...
&ref(2017b/Member/riko/Mission3/機体_完成版_アーム.JPG,40...
基本的な構造はβ版と変わらない。この機体は一つのNXTの箱で...
** 機体_完成版_工夫点 [#t4ca023a]
最終的な機体の主な工夫点としては三つ挙げられる。
?アーム機構の体制維持の為の工夫とその他(緑色の枠線)
?スタート地点内に収まる為の工夫(水色の枠線)
?機体本体の体制維持の為の工夫(赤色の枠線)
&ref(2017b/Member/riko/Mission3/機体_完成版_工夫部分.PNG,...
それぞれの工夫を下記に説明していく。
*** 機体_完成版_工夫点?-1 [#z4225233]
アーム機構の仕組み上、持ち上げる際に下図の※と示された部分...
&ref(2017b/Member/riko/Mission3/アーム機構の体制維持の為...
工夫した部分は上図の水色の枠線部分となっている。超音波セ...
*** 機体_完成版_工夫点?-2 [#i980bcca]
工夫として特筆すべきというものではないが、機体を作る際に...
下図のアーム部分がわかるだろうか、この部分が長すぎる、余...
&ref(2017b/Member/riko/Mission3/アームの上げ下げの工夫.PN...
*** 機体_完成版_工夫点? [#ad581265]
機体を作り終え、今回の課題のルールを見直すと「床と接着し...
&ref(2017b/Member/riko/Mission3/スタンド_1.PNG,400x300,ス...
その対策として生まれた工夫が下図のものとなっている。自転...
&ref(2017b/Member/riko/Mission3/スタンド_2.PNG,650x250,ス...
*** 機体_完成版_工夫点? [#h46ca2de]
ここの工夫はあまりにも無計画で機体を制作してしまったおか...
そしてその欠点を補う工夫は下図の赤色の枠線で囲まれた補助...
&ref(2017b/Member/riko/Mission3/補助輪の工夫_1.PNG,400x30...
実際に下図の分、機体のケツが持ち上がっている。
&ref(2017b/Member/riko/Mission3/補助輪の工夫_2.PNG,400x30...
この工夫部分もまだまだ改良の余地があり、できることならこ...
* プログラム [#j25e3fbb]
今回のプログラム制作に私自身はほとんど関与していないため...
** 課題成功への作戦 [#x9755c4f]
上記に数度記載したと思うが今回の私たちの班の作戦として同...
二台を動かすにあたり、スタート位置を二つに分け、作業をす...
&ref(2017b/Member/riko/Mission3/左・右機体の行動範囲.PNG,...
** 紙コップに関するプログラム [#nb2d92f2]
今回の私の仕事の役割分担によって、紙コップに関するプログ...
*** 紙コップを少し持ち上げて割りばし内に入れるプログラム ...
どうやって紙コップの中にピンポン玉を保持したまま割りばし...
&ref(2017b/Member/riko/Mission3/紙コップと割りばし_1.PNG,...
普通に考えると紙コップを持ち上げるだけでピンポン玉が出て...
&ref(2017b/Member/riko/Mission3/紙コップと割りばし_2.PNG,...
上図のように紙コップを割りばし以上の高さから、ピンポン玉...
動き方としては下図のようになる。
&ref(2017b/Member/riko/Mission3/紙コップの割りばし越え.PN...
今回の機体の紙コップの上げ方は斜めに上がるのでそこらのこ...
&ref(2017b/Member/riko/Mission3/紙コップの割りばし越え(斜...
d=searchDirection(15);
if(d>5.0){
catch_cop(700);
OnFwd(OUT_AB,SLOW);
Wait(1400);
Off(OUT_AB);
catch_cop(300);
OnFwd(OUT_AB,-SLOW);
Wait(100);
Off(OUT_AB);
}
恐らく上記のプログラムが紙コップに近づき、掴んだ紙コップ...
*** 紙コップを重ねるプログラム_1 [#p44d8a6c]
初めの予定では紙コップを重ねる時は機体一台でやるつもりで...
そのため、紙コップを確実に重ねられるように2台の機体を連携...
下図は機体の動き方である。前提として左側の機体が子機、右...
?
&ref(2017b/Member/riko/Mission3/紙コップ連携_1.JPG,400x30...
まず、親機(右の機体)が紙コップを持ち、子機(左の機体)が紙...
?
&ref(2017b/Member/riko/Mission3/紙コップ連携_2.JPG,400x30...
子機が腕を閉じ、親機の超音波センサーの邪魔にならないよう...
?
&ref(2017b/Member/riko/Mission3/紙コップ連携_3.JPG,400x30...
親機が紙コップを持ち上げ、超音波センサーの邪魔にならない...
?
&ref(2017b/Member/riko/Mission3/紙コップ連携_4.JPG,400x30...
子機の腕を広げる。
?
&ref(2017b/Member/riko/Mission3/紙コップ連携_5.JPG,400x30...
子機が紙コップに近づく。
?
&ref(2017b/Member/riko/Mission3/紙コップ連携_6.JPG,400x30...
子機が紙コップを掴み動かないようにする。
?
&ref(2017b/Member/riko/Mission3/紙コップ連携_7.JPG,400x30...
親機が子機の持っている紙コップに近づく。
?
&ref(2017b/Member/riko/Mission3/紙コップ連携_8.JPG,400x30...
親機の持っている紙コップを子機の持っている紙コップにかぶ...
?
&ref(2017b/Member/riko/Mission3/紙コップ連携_9.JPG,400x30...
子機が親機に近づくことで紙コップに角度が生まれる。
?
&ref(2017b/Member/riko/Mission3/紙コップ連携_10.JPG,400x3...
子機が腕を広げ、紙コップを離す。
?
&ref(2017b/Member/riko/Mission3/紙コップ連携_11.JPG,400x3...
子機が離れる。
?
&ref(2017b/Member/riko/Mission3/紙コップ連携_12.JPG,400x3...
最後に親機がアームを広げ、紙コップを離すことで紙コップが...
*** 紙コップを重ねるプログラム_2 [#ob6d3d88]
上記の動きをするためのプログラムが下記の通りとなる。ここ...
一つ言えるとしたら、ここのプログラムはBluetoothによる機体...
〇親機(右の機体)
sub tag()
{
keep_cop();
d=searchDirection(15);
if(d>5.0){
SendRemoteNumber(CONN,MAILBOX1,SIGNALON1);
Wait(5000);
fwdDist(d-8.0);
ResetTachoCount(OUT_ABC);
RotateMotorEx(OUT_AB,-SLOW,40,0,true,true);
RotateMotor(OUT_C,SLOW,50);
SendRemoteNumber(CONN,MAILBOX1,SIGNALON2);
Wait(5000);
RotateMotor(OUT_C,SLOW,100);
ResetTachoCount(OUT_ABC);
RotateMotor(OUT_C,SLOW,720);
RotateMotorEx(OUT_AB,-SLOW,120,0,true,true);
}
}
〇子機(左の機体)
sub tag()
{
int msg,counter;
ResetTachoCount(OUT_ABC);
RotateMotor(OUT_C,SLOW,1080);
RotateMotorEx(OUT_AB,-SLOW,360,0,true,true);
RotateMotor(OUT_C,-SLOW,1080);
while(counter==0){
ReceiveRemoteNumber(MAILBOX1,true,msg);
if(msg==SIGNALON) {
ResetTachoCount(OUT_ABC);
RotateMotor(OUT_C,SLOW,1080);
RotateMotorEx(OUT_AB,SLOW,120,0,true,true);
RotateMotor(OUT_C,-SLOW,1080);
counter++;
}
}
counter=0;
while(counter==0){
ReceiveRemoteNumber(MAILBOX1,true,msg);
if(msg==SIGNALON2) {
ResetTachoCount(OUT_ABC);
RotateMotor(OUT_C,SLOW,360);
RotateMotorEx(OUT_AB,SLOW,40,0,true,true);
counter++;
}
}
counter=0;
ResetTachoCount(OUT_ABC);
RotateMotor(OUT_C,SLOW,720);
RotateMotorEx(OUT_AB,-SLOW,120,0,true,true);
}
** 左側機体(子機)のプログラム [#o464f4c8]
正直に言わせてもらう。私は同じ班が書いたプログラムを理解...
以下は左側機体の全体のプログラムとなっている。
〇私以外が書いたプログラムはコメントとして「※」を書いてお...
〇私が課題2で使ったプログラムと同じ部分にはコメントとして...
#define SO 392 ...
#define DO 523 ...
#define MI 659 ...
#define SO_H 784 ...
#define SI 988 ...
#define DO_H 1047 ...
#define MI_H 1318 ...
#define RE 1175 ...
#define SO_SH 1568 ...
#define SIGNALON 11 ...
#define SIGNALON2 12 ...
#define SLOW 30 ...
...
const float diameter=5.45; ...
const float tread=11.3; ...
const float pi=3.1415; ...
...
int d; ...
...
sub fwdDist(float d) ...
{ ...
long angle=d/(diameter*pi)*360.0; ...
RotateMotorEx(OUT_AB,SLOW,angle,0,true,true); ...
} ...
...
sub turnAng(long ang) ...
{ ...
long angle=tread/diameter*ang; ...
RotateMotorEx(OUT_AB,SLOW,angle,100,true,true); ...
} ...
...
int searchDirection(long ang) ...
{ ...
long tacho_min; ...
int d_min=300; ...
...
long angle=(tread/diameter)*ang; ...
turnAng(ang/2); ...
ResetTachoCount(OUT_AB); ...
OnFwdSync(OUT_AB,SLOW,-100); ...
while(MotorTachoCount(OUT_A)<=angle){ ...
if(SensorUS(S3)<d_min){ ...
d_min=SensorUS(S3); ...
tacho_min=MotorTachoCount(OUT_A); ...
} ...
} ...
OnFwdSyncEx(OUT_AB,SLOW,100,RESET_NONE); ...
...
until(MotorTachoCount(OUT_A)<=tacho_min||SensorUS(S3...
Wait(14); ...
Off(OUT_AB); ...
Wait(500); ...
return d_min; ...
} ...
...
sub tag() ...
{ ...
int msg,counter; ...
ResetTachoCount(OUT_ABC); ...
RotateMotor(OUT_C,SLOW,1080); ...
RotateMotorEx(OUT_AB,-SLOW,360,0,true,true); ...
RotateMotor(OUT_C,-SLOW,1080); ...
...
while(counter==0){ ...
ReceiveRemoteNumber(MAILBOX1,true,msg); ...
if(msg==SIGNALON) { ...
ResetTachoCount(OUT_ABC); ...
RotateMotor(OUT_C,SLOW,1080); ...
RotateMotorEx(OUT_AB,SLOW,120,0,true,true);...
RotateMotor(OUT_C,-SLOW,1080); ...
counter++; ...
} ...
} ...
counter=0; ...
...
while(counter==0){ ...
ReceiveRemoteNumber(MAILBOX1,true,msg); ...
if(msg==SIGNALON2) { ...
ResetTachoCount(OUT_ABC); ...
RotateMotor(OUT_C,SLOW,360); ...
RotateMotorEx(OUT_AB,SLOW,40,0,true,true); ...
counter++; ...
} ...
} ...
counter=0; ...
ResetTachoCount(OUT_ABC); ...
RotateMotor(OUT_C,SLOW,720); ...
RotateMotorEx(OUT_AB,-SLOW,120,0,true,true); ...
} ...
sub pose_SE() ...
PlayTone(MI_H,90);Wait(100); ...
PlayTone(DO_H,90);Wait(100); ...
PlayTone(MI_H,90);Wait(100); ...
PlayTone(DO_H,90);Wait(100); ...
} ...
sub one_UP_SE() ...
{ ...
PlayTone(MI,110);Wait(120); ...
PlayTone(SO_H,110);Wait(120); ...
PlayTone(MI_H,110);Wait(120); ...
PlayTone(DO_H,110);Wait(120); ...
PlayTone(RE,110);Wait(120); ...
PlayTone(SO_SH,110);Wait(120); ...
} ...
sub coin_SE() ...
{ ...
PlayTone(SI,90);Wait(100); ...
PlayTone(MI_H,140);Wait(150); ...
} ...
sub Start_SE() ...
{ ...
PlayTone(MI,100);Wait(110); ...
PlayTone(MI,100);Wait(250); ...
PlayTone(MI,100);Wait(160); ...
PlayTone(DO,90);Wait(100); ...
PlayTone(MI,90);Wait(230); ...
PlayTone(SO_H,90);Wait(420); ...
PlayTone(SO,170);Wait(180); ...
} ...
#define move1 OnFwd(OUT_A,40);OnFwd(OUT_B,-35); ...
#define move2 OnFwd(OUT_A,30);OnFwd(OUT_B,-20); ...
#define move3 OnFwd(OUT_A,54);OnFwd(OUT_B,54); ...
#define move4 OnFwd(OUT_B,30);OnFwd(OUT_A,-20); ...
#define move5 OnFwd(OUT_B,40);OnFwd(OUT_A,-35); ...
#define average 45 ...
sub Stop_Motion() ...
{ ...
Wait(300); ...
pose_SE(); ...
Wait(1000); ...
} ...
sub L_Assist_line(int Assist_time) ...
{ ...
long ta=CurrentTick(); ...
while (CurrentTick()-ta<=Assist_time){ ...
if (SENSOR_2<average-11) { ...
move1 ...
}else if (SENSOR_2<average-7){ ...
move2; ...
} else if (SENSOR_2<average+7){ ...
move3; ...
} else if (SENSOR_2<average+11){ ...
move4; ...
} else { ...
move5; ...
} ...
} ...
coin_SE(); ...
} ...
sub R_Assist_line(int Assist_time) ...
{ ...
long tb=CurrentTick(); ...
while (CurrentTick()-tb<=Assist_time){ ...
if (SENSOR_2<average-11) { ...
move5; ...
} else if (SENSOR_2<average-7){ ...
move4; ...
} else if (SENSOR_2<average+7){ ...
move3; ...
} else if (SENSOR_2<average+11){ ...
move2; ...
} else { ...
move1; ...
} ...
} ...
coin_SE(); ...
} ...
sub L_line(int Assist_time,int Stop_time) ...
{ ...
L_Assist_line(Assist_time); ...
long t1=CurrentTick(); ...
while (CurrentTick()-t1<=Stop_time){ ...
if (SENSOR_2<average-11) { ...
move1; ...
} else if (SENSOR_2<average-7){ ...
move2; ...
t1=CurrentTick(); ...
} else if (SENSOR_2<average+7){ ...
move3; ...
t1=CurrentTick(); ...
} else if (SENSOR_2<average+11){ ...
move4; ...
t1=CurrentTick(); ...
} else { ...
move5; ...
t1=CurrentTick(); ...
} ...
} ...
Off(OUT_AB); ...
coin_SE(); ...
} ...
sub R_line(int Assist_time,int Stop_time) ...
{ ...
R_Assist_line(Assist_time); ...
...
long t2=CurrentTick(); ...
while (CurrentTick()-t2<=Stop_time){ ...
if (SENSOR_2<average-11) { ...
move5; ...
} else if (SENSOR_2<average-8){ ...
move4; ...
t2=CurrentTick(); ...
} else if (SENSOR_2<average+6){ ...
move3; ...
t2=CurrentTick(); ...
} else if (SENSOR_2<average+11){ ...
move2; ...
t2=CurrentTick(); ...
} else { ...
move1; ...
t2=CurrentTick(); ...
} ...
} ...
Off(OUT_AB); ...
coin_SE(); ...
} ...
sub White_to_Black(int blight,int A_speed,int B_speed) ...
{ ...
while (SENSOR_2>blight){ ...
OnFwd(OUT_A,A_speed); ...
OnFwd(OUT_B,B_speed); ...
} ...
Off(OUT_AB); ...
} ...
sub Black_to_White(int blight,int A_speed,int B_speed) ...
{ ...
while (SENSOR_2<blight){ ...
OnFwd(OUT_A,A_speed); ...
OnFwd(OUT_B,B_speed); ...
} ...
Off(OUT_AB); ...
} ...
sub Start_Set() ...
{ ...
Start_SE(); ...
move3; ...
Wait(600); ...
White_to_Black(48,30,5); ...
} ...
sub catch_cop(long ang1) ...
{ ...
ResetTachoCount(OUT_C); ...
RotateMotor(OUT_C,-SLOW,ang1); ...
} ...
...
sub release_cop(long ang2) ...
{ ...
ResetTachoCount(OUT_C); ...
RotateMotor(OUT_C,SLOW,ang2); ...
} ...
...
sub release_ball() ...
{ ...
ResetTachoCount(OUT_ABC); ...
OnFwd(OUT_AB,SLOW); ...
Wait(700); ...
Off(OUT_AB); ...
ResetTachoCount(OUT_C); ...
RotateMotor(OUT_C,-SLOW,50); ...
OnFwd(OUT_C,-20); ...
Wait(1000); ...
OnFwd(OUT_AB,-SLOW); ...
Wait(700); ...
Off(OUT_AB); ...
} ...
...
sub keep_cop() ...
{ ...
ResetTachoCount(OUT_C); ...
RotateMotor(OUT_C,-SLOW,50); ...
OnFwd(OUT_C,-20); ...
} ...
task main()
{
SetSensorLight(S2); ...
SetSensorLowspeed(S3); ...
Start_Set(); ...
R_line(300,150); ...
d=searchDirection(15); ...
if(d>5.0){ ...
catch_cop(700); ...
OnFwd(OUT_AB,SLOW); ...
Wait(1400); ...
Off(OUT_AB); ...
catch_cop(300); ...
OnFwd(OUT_AB,-SLOW); ...
Wait(100); ...
Off(OUT_AB); ...
} ...
ResetTachoCount(OUT_A); ...
RotateMotor(OUT_A,-SLOW,370); ...
OnFwd(OUT_AB,SLOW); ...
Wait(600); ...
Off(OUT_AB); ...
catch_cop(40); ...
OnFwd(OUT_C,-SLOW); ...
Wait(1000); ...
Off(OUT_C); ...
OnFwd(OUT_AB,-SLOW); ...
Wait(1000); ...
Off(OUT_AB); ...
White_to_Black(33,35,15); ...
Black_to_White(48,35,15); ...
White_to_Black(33,40,25); ...
Black_to_White(48,-30,0); ...
White_to_Black(33,-30,0); ...
Black_to_White(50,0,-30); ...
White_to_Black(33,35,30); ...
Black_to_White(48,35,30); ...
release_cop(50); ...
tag(); ...
keep_cop(); ...
tag(); ...
OnFwd(OUT_AB,-SLOW); ...
Wait(1000); ...
Off(OUT_AB); ...
}
前回の私のレポート読んだ方であるなら、フィールドの移動方...
紙コップ関連には私は触れることができないが、移動について...
*** 左側機体のプログラムの解説? [#qdc2677e]
場面としてはスタート地点から紙コップを取るところまでの移...
sub Start_Set() //ライントレースを始める...
{
Start_SE(); //スタートのSE
move3; //初めのラインの囲いから...
Wait(600);
White_to_Black(48,30,5); //このプログラムでライン...
}
Start_Set();
R_line(300,150);
上記の移動の説明をする。このコースの出発時は黒線で囲まれ...
&ref(2017b/Member/riko/Mission3/左側機体のプログラムの解...
言葉だけでは分かりずらいの図で表す。上はスタート地点から...
ラインを見つけた後、右側のライントレースを行い交差点認識...
*** 左側機体のプログラムの解説? [#nf966642]
場面としては紙コップからピンポン玉を取り出した後、紙コッ...
OnFwd(OUT_AB,-SLOW);
Wait(1000);
Off(OUT_AB);
まず上記のプログラムは紙コップを持ち上げた場面からの移動...
&ref(2017b/Member/riko/Mission3/左側機体のプログラムの解...
White_to_Black(33,35,15);
Black_to_White(48,35,15);
White_to_Black(33,40,25);
Black_to_White(48,-30,0);
White_to_Black(33,-30,0);
Black_to_White(50,0,-30);
White_to_Black(33,35,30);
Black_to_White(48,35,30);
上記のプログラムは、紙コップをもう一台と重ねるための連携...
&ref(2017b/Member/riko/Mission3/左側機体のプログラムの解...
青い矢印はバック走行を表している。
** 右側機体(親機)のプログラム [#w1f74bf0]
以下は右側機体の全体のプログラムとなっている。
〇私以外が書いたプログラムはコメントとして「※」を書いてお...
〇私が課題2で使ったプログラムと同じ部分にはコメントとして...
#define SO 392 ...
#define DO 523 ...
#define MI 659 ...
#define SO_H 784 ...
#define SI 988 ...
#define DO_H 1047 ...
#define MI_H 1318 ...
#define RE 1175 ...
#define SO_SH 1568 ...
sub pose_SE() ...
PlayTone(MI_H,90);Wait(100); ...
PlayTone(DO_H,90);Wait(100); ...
PlayTone(MI_H,90);Wait(100); ...
PlayTone(DO_H,90);Wait(100); ...
} ...
sub one_UP_SE() ...
{ ...
PlayTone(MI,110);Wait(120); ...
PlayTone(SO_H,110);Wait(120); ...
PlayTone(MI_H,110);Wait(120); ...
PlayTone(DO_H,110);Wait(120); ...
PlayTone(RE,110);Wait(120); ...
PlayTone(SO_SH,110);Wait(120); ...
} ...
sub coin_SE() ...
{ ...
PlayTone(SI,90);Wait(100); ...
PlayTone(MI_H,140);Wait(150); ...
} ...
sub Start_SE() ...
{ ...
PlayTone(MI,100);Wait(110); ...
PlayTone(MI,100);Wait(250); ...
PlayTone(MI,100);Wait(160); ...
PlayTone(DO,90);Wait(100); ...
PlayTone(MI,90);Wait(230); ...
PlayTone(SO_H,90);Wait(420); ...
PlayTone(SO,170);Wait(180); ...
} ...
#define FAST 50 ...
#define SLOW 30 ...
#define CONN 1 ...
#define SIGNALON1 11 ...
#define SIGNALON2 12 ...
...
const float diameter=5.45; ...
const float tread=11.3; ...
const float pi=3.1415; ...
...
int d; ...
...
sub keep_cop() ...
{ ...
ResetTachoCount(OUT_C); ...
RotateMotor(OUT_C,-SLOW,50); ...
OnFwd(OUT_C,-20); ...
} ...
...
sub fwdDist(float d) ...
{ ...
long angle=d/(diameter*pi)*360.0; ...
RotateMotorEx(OUT_AB,SLOW,angle,0,true,true); ...
} ...
...
sub turnAng(long ang) ...
{ ...
long angle=tread/diameter*ang; ...
RotateMotorEx(OUT_AB,SLOW,angle,100,true,true); ...
} ...
...
int searchDirection(long ang) ...
{ ...
long tacho_min; ...
int d_min=300; ...
...
long angle=(tread/diameter)*ang; ...
turnAng(ang/2); ...
ResetTachoCount(OUT_AB); ...
OnFwdSync(OUT_AB,SLOW,-100); ...
while(MotorTachoCount(OUT_A)<=angle){ ...
if(SensorUS(S3)<d_min){ ...
d_min=SensorUS(S3); ...
tacho_min=MotorTachoCount(OUT_A); ...
} ...
} ...
OnFwdSyncEx(OUT_AB,SLOW,100,RESET_NONE); ...
...
until(MotorTachoCount(OUT_A)<=tacho_min||SensorUS(S3...
Wait(14); ...
Off(OUT_AB); ...
Wait(500); ...
return d_min; ...
} ...
...
sub tag() ...
{ ...
keep_cop(); ...
d=searchDirection(15); ...
...
if(d>5.0){ ...
SendRemoteNumber(CONN,MAILBOX1,SIGNALON1); ...
Wait(5000); ...
fwdDist(d-8.0); ...
ResetTachoCount(OUT_ABC); ...
RotateMotorEx(OUT_AB,-SLOW,40,0,true,true); ...
RotateMotor(OUT_C,SLOW,50); ...
...
SendRemoteNumber(CONN,MAILBOX1,SIGNALON2); ...
Wait(5000); ...
RotateMotor(OUT_C,SLOW,100); ...
ResetTachoCount(OUT_ABC); ...
RotateMotor(OUT_C,SLOW,720); ...
RotateMotorEx(OUT_AB,-SLOW,120,0,true,true); ...
} ...
} ...
...
sub catch_cop(long ang1) ...
{ ...
ResetTachoCount(OUT_C); ...
RotateMotor(OUT_C,-SLOW,ang1); ...
} ...
...
sub release_cop(long ang2) ...
{ ...
ResetTachoCount(OUT_C); ...
RotateMotor(OUT_C,SLOW,ang2); ...
} ...
...
sub release_ball() ...
{ ...
ResetTachoCount(OUT_ABC); ...
OnFwd(OUT_AB,SLOW); ...
Wait(700); ...
Off(OUT_AB); ...
ResetTachoCount(OUT_C); ...
RotateMotor(OUT_C,-SLOW,50); ...
OnFwd(OUT_C,-20); ...
Wait(1000); ...
OnFwd(OUT_AB,-SLOW); ...
Wait(700); ...
Off(OUT_AB); ...
} ...
#define move1 OnFwd(OUT_A,40);OnFwd(OUT_B,-35); ...
#define move2 OnFwd(OUT_A,30);OnFwd(OUT_B,-20); ...
#define move3 OnFwd(OUT_A,54);OnFwd(OUT_B,54); ...
#define move4 OnFwd(OUT_B,30);OnFwd(OUT_A,-20); ...
#define move5 OnFwd(OUT_B,40);OnFwd(OUT_A,-35); ...
#define average 45 ...
sub Stop_Motion() ...
{ ...
Wait(300); ...
pose_SE(); ...
Wait(1000); ...
} ...
sub L_Assist_line(int Assist_time) ...
{ ...
long ta=CurrentTick(); ...
while (CurrentTick()-ta<=Assist_time){ ...
if (SENSOR_2<average-11) { ...
move1 ...
}else if (SENSOR_2<average-7){ ...
move2; ...
} else if (SENSOR_2<average+7){ ...
move3; ...
} else if (SENSOR_2<average+11){ ...
move4; ...
} else { ...
move5; ...
} ...
} ...
coin_SE(); ...
} ...
sub R_Assist_line(int Assist_time) ...
{ ...
long tb=CurrentTick(); ...
while (CurrentTick()-tb<=Assist_time){ ...
if (SENSOR_2<average-11) { ...
move5; ...
} else if (SENSOR_2<average-7){ ...
move4; ...
} else if (SENSOR_2<average+7){ ...
move3; ...
} else if (SENSOR_2<average+11){ ...
move2; ...
} else { ...
move1; ...
} ...
} ...
coin_SE(); ...
} ...
sub L_line(int Assist_time,int Stop_time) ...
{ ...
L_Assist_line(Assist_time); ...
long t1=CurrentTick(); ...
while (CurrentTick()-t1<=Stop_time){ ...
if (SENSOR_2<average-11) { ...
move1; ...
} else if (SENSOR_2<average-7){ ...
move2; ...
t1=CurrentTick(); ...
} else if (SENSOR_2<average+7){ ...
move3; ...
t1=CurrentTick(); ...
} else if (SENSOR_2<average+11){ ...
move4; ...
t1=CurrentTick(); ...
} else { ...
move5; ...
t1=CurrentTick(); ...
} ...
} ...
Off(OUT_AB); ...
coin_SE(); ...
} ...
sub R_line(int Assist_time,int Stop_time) ...
{ ...
R_Assist_line(Assist_time); ...
...
long t2=CurrentTick(); ...
while (CurrentTick()-t2<=Stop_time){ ...
if (SENSOR_2<average-11) { ...
move5; ...
} else if (SENSOR_2<average-8){ ...
move4; ...
t2=CurrentTick(); ...
} else if (SENSOR_2<average+6){ ...
move3; ...
t2=CurrentTick(); ...
} else if (SENSOR_2<average+11){ ...
move2; ...
t2=CurrentTick(); ...
} else { ...
move1; ...
t2=CurrentTick(); ...
} ...
} ...
Off(OUT_AB); ...
coin_SE(); ...
} ...
sub White_to_Black(int blight,int A_speed,int B_speed) ...
{ ...
while (SENSOR_2>blight){ ...
OnFwd(OUT_A,A_speed); ...
OnFwd(OUT_B,B_speed); ...
} ...
Off(OUT_AB); ...
} ...
sub Black_to_White(int blight,int A_speed,int B_speed) ...
{ ...
while (SENSOR_2<blight){ ...
OnFwd(OUT_A,A_speed); ...
OnFwd(OUT_B,B_speed); ...
} ...
Off(OUT_AB); ...
} ...
#define reverse_move OnFwd(OUT_A,-54);OnFwd(OUT_B,-50); ...
...
sub reverse_Start_Set() ...
{ ...
reverse_move; ...
Start_SE(); ...
Wait(2000); ...
White_to_Black(48,20,35); ...
} ...
task main()
{
SetSensorLight(S2); ...
SetSensorLowspeed(S3); ...
reverse_Start_Set(); ...
L_line(1300,110); ...
ResetTachoCount(OUT_A); ...
RotateMotor(OUT_A,-SLOW,150); ...
d=searchDirection(15); ...
if(d>5.0){ ...
catch_cop(600); ...
OnFwd(OUT_AB,SLOW); ...
Wait(1000); ...
Off(OUT_AB); ...
catch_cop(500); ...
OnFwd(OUT_AB,-SLOW); ...
Wait(400); ...
Off(OUT_AB); ...
} ...
ResetTachoCount(OUT_B); ...
RotateMotor(OUT_B,-SLOW,110); ...
release_ball(); ...
RsetTachoCount(OUT_A); ...
RotateMotor(OUT_A,-SLOW,130); ...
tag(); ...
OnFwd(OUT_AB,-SLOW); ...
Wait(1000); ...
Off(OUT_AB); ...
White_to_Black(48,35,25); ...
L_line(300,130); ...
Black_to_White(48,0,-30); ...
White_to_Black(33,0,-30); ...
d=searchDirection(15); ...
if(d>5.0){ ...
catch_cop(600); ...
OnFwd(OUT_AB,SLOW); ...
Wait(1000); ...
Off(OUT_AB); ...
catch_cop(500); ...
OnFwd(OUT_AB,-SLOW); ...
Wait(400); ...
Off(OUT_AB); ...
} ...
White_to_Black(33,-30,-30); ...
L_line(150,130); ...
Black_to_White(48,30,30); ...
release_ball(); ...
ResetTachoCount(OUT_A); ...
RotateMotor(OUT_A,-SLOW,130); ...
tag(); ...
ResetTachoCount(OUT_C); ...
RotateMotor(OUT_C,-SLOW,1100); ...
White_to_Black(33,-30,-30); ...
Black_to_White(48,-30,-30); ...
White_to_Black(33,-30,-30); ...
OnFwd(OUT_AB,SLOW); ...
Wait(300); ...
Off(OUT_AB); ...
ResetTachoCount(OUT_C); ...
RotateMotor(OUT_C,SLOW,1200); ...
}
*** 右側機体のプログラムの解説? [#e122a2ce]
場面としてはスタート地点から紙コップを取るところまでの移...
#define reverse_move OnFwd(OUT_A,-54);OnFwd(OUT_B,-50);
sub reverse_Start_Set()
{
reverse_move;
Start_SE();
Wait(2000);
White_to_Black(48,20,35);
}
まず、初めの走行をバックから始める。そのためのプログラム...
reverse_Start_Set();
L_line(1300,110);
&ref(2017b/Member/riko/Mission3/右側機体のプログラムの解...
動きとしては後ろに下がり、その後黒線を見つけ、そのまま交...
*** 右側機体のプログラムの解説? [#q080aeae]
場面としては1個目の紙コップを重ねた後、次の紙コップを見つ...
OnFwd(OUT_AB,-SLOW);
Wait(1000);
Off(OUT_AB);
White_to_Black(48,35,25);
L_line(300,130);
Black_to_White(48,0,-30);
White_to_Black(33,0,-30);
&ref(2017b/Member/riko/Mission3/右側機体のプログラムの解...
動きとしては秒管理によるバックの後、黒線を探し、ライント...
*** 右側機体のプログラムの解説? [#t295b938]
場面としては2個目の紙コップを捕まえた後、それを割りばし内...
White_to_Black(33,-30,-30);
L_line(150,130);
Black_to_White(48,30,30);
release_ball();
&ref(2017b/Member/riko/Mission3/右側機体のプログラムの解...
動きとしてはバックにて黒線を探し、そのままライントレース...
*** 右側機体のプログラムの解説? [#v3c280da]
場面としては紙コップを3つ重ねた後、それを目的地にもってい...
White_to_Black(33,-30,-30);
Black_to_White(48,-30,-30);
White_to_Black(33,-30,-30);
OnFwd(OUT_AB,SLOW);
Wait(300);
Off(OUT_AB);
ResetTachoCount(OUT_C);
RotateMotor(OUT_C,SLOW,1200);
&ref(2017b/Member/riko/Mission3/右側機体のプログラムの解...
動きとしては紙コップを重ね終えた場所からバックで確実に目...
* 結果・反省・感想 [#w4d930a0]
** 結果 [#m39f8878]
1回目は、子機が1個ピンポン玉を枠内に入れたが、子機、親機...
技術点としては平均8.8点となり、全体合計は12.8点。順位は9...
** 反省 [#y702adce]
今回、ロボットもプログラミングも全体的に作りが甘かったと...
超音波センサーの仕組みは左右どちらかから超音波を発し、反...
また、超音波センサーの縦横関係なく、工夫して2回の検知で確...
アームの作りや機体全体の作りをもっと柔軟な発想で生み出す...
** 感想 [#g7ad1f77]
今回、課題3の取り掛かりがテスト終了後でほとんど時間が足り...
しかし、正直なところそんなことはどうでもよいとも思える。...
* 最後に [#zeb05996]
ここまでいろいろとレポートに書いたが改善したい点やほかの...
そして、もしもこのレポートを読んでいる人がこのゼミを受け...
終了行:
目次
#contents
* 課題3のレポートを見る前に [#o928e753]
今回の課題の機体の構想やプログラムの書き方、発想は私の課...
特にこの機体のライントレースのやり方についての詳しい説明...
* 課題3 [#m41fb4d5]
** 内容 [#le8145e6]
課題2で使用した紙を用い、下図のマジェンタの円に逆さまにし...
&ref(2017b/Member/riko/Mission3/課題3_フィールドの図.png,...
** ルール [#cadfbda7]
詳しいルール説明は[[2017年度後期・課題3:http://yakushi.sh...
** チームメンバー [#xd992990]
N5・N6の合同メンバー。課題1・2・3とすべて下記の私を含めた...
主に私は機体を作る作業をしていたのでプログラムについて詳...
・riko
・[[arso:http://yakushi.shinshu-u.ac.jp/robotics/?2017b%2...
・[[tono:http://yakushi.shinshu-u.ac.jp/robotics/?2017b%2...
* 今回の機体について [#t5cc74a2]
今回の課題を成功させるために必要な動きとして、
?フィールド上を自由に動くために動き
?紙コップをつかむ動き
?掴んだ紙コップを持ち上げ、被せる動き
の三点が挙げられる。
?の機構に関しては課題2のものを今回の課題に合わせて少しだ...
?、?の機構は最初の構想ではクワガタのハサミのような形と動...
しかし、1つのモーターで?、?の動きをこなす機構(以下、「ア...
これにより、フィールド上に二台のロボットを動かすことが可...
** アーム機構 [#yb3b004f]
上記のアーム機構についてできる限り詳しく説明するが、私の...
*** 掴む機構_1 [#g57efdf2]
初めに、紙コップをつかむ機構を作る。
ウォームギアを用いることで紙コップを掴む両腕の部分の動き...
&ref(2017b/Member/riko/Mission3/アーム部分_1.PNG,600x350,...
ウォームギアが回る仕組みとしてまず、?の黄色の矢印方向に黒...
次に、真ん中の黒い歯車が回ることで?の赤色の矢印方向に白い...
最後に白い歯車の中の棒が回ることで?の緑色の矢印方向にウォ...
*** 掴む機構_2 [#f7bc3389]
次にウォームギアとそれに隣接する歯車「ウォームホイール」...
この説明においては私が図を書き、説明するよりは下記のURLに...
ウォームギアとは、ねじのような形状のウォームと、それにか...
&ref(2017b/Member/riko/Mission3/ウォームギアとウォームホ...
〇[[「ロボジョイくらぶ」(第二回「平歯車の仕組み」と「か...
*** 掴む機構_3 [#wa92fa91]
次に実際に組み立てた機構のウォームギアとウォームホイール...
&ref(2017b/Member/riko/Mission3/アーム部分_2.PNG,600x350,...
上図の腕部分が回る仕組みとしてまず、?の緑色の矢印方向にウ...
それによって、ウォームホイールに固定された腕部分が?の灰色...
*** アームを持ち上げる機構_0(謝罪) [#u80404b2]
まず初めに、謝罪をさせてもらいます。本当に申し訳ありませ...
あくまで私の意見ですが、機構の理解を得るための近道は実際...
*** アームを持ち上げる機構_1-1 [#qb4fd471]
まず、かさ歯車と呼ばれるものの下図を見てもらいたい。
&ref(2017b/Member/riko/Mission3/かさ歯車による持ち上げる...
上図の青色の矢印はそれぞれの歯車の軸を表していることがわ...
次に?、?の歯車がそれぞれその場に固定されていたと仮定する。
そう仮定した場合、?の歯車を緑色の矢印方向に回したとすると...
*** アームを持ち上げる機構_1-2 [#ub4da0ea]
次に?の歯車自体の回転(灰色の矢印の回転)だけ固定された場合...
&ref(2017b/Member/riko/Mission3/かさ歯車による持ち上げる...
先ほどと同様に?の歯車を緑色の矢印方向に回したとする。
そうした場合、?の歯車の動きとしては?自体の回転は存在せず...
*** アームを持ち上げる機構_2-1 [#j48407ed]
以上の二つの仕組みを利用してアームを持ち上げる機構を作っ...
&ref(2017b/Member/riko/Mission3/アーム機構における置き換...
今回の機構の場合、歯車の負荷値が低い方から順番に回る為「...
下の図は、「掴む機構_3」に記載されている図の表の方を切り...
&ref(2017b/Member/riko/Mission3/掴む機構_1の図の表.PNG,40...
*** アームを持ち上げる機構_2-2 [#bb3f9e19]
次に上図のアームが?に動きをし続けると、両アームが互いのア...
&ref(2017b/Member/riko/Mission3/持ち上げる機構の回転方向....
上図の青色の矢印は?、?の歯車の軸を表している。黄緑色、橙...
*** アームを持ち上げる機構_3 [#p4bbdaab]
上記の機構を利用することで、アーム機構が完成する。そして...
&ref(2017b/Member/riko/Mission3/アーム部分_3.PNG,550x300,...
※おおよそ上の写真の通りに制作されたがロボット本体に取り付...
** アーム機構_工夫点 [#kdc4a642]
このアーム機構の主な工夫点としては三つ挙げられる。
?紙コップを取り込む際の工夫(緑色の枠線)
?紙コップを掴む際の工夫(水色の枠線)
?持ち上げた紙コップを下げるための工夫(赤色の枠線)
&ref(2017b/Member/riko/Mission3/アーム機構_工夫部分.PNG,3...
それぞれの工夫を下記に説明していく。
*** アーム機構_工夫点? [#u7e20bfc]
アームを閉じる際、紙コップを取らなければならない。紙コッ...
&ref(2017b/Member/riko/Mission3/紙コップを内側に取り込む...
&ref(2017b/Member/riko/Mission3/紙コップを内側に取り込む...
上図はアームのタイヤ部分上から見た際の簡略図である。タイ...
また、細かな点ではあるがタイヤのゴムによって紙コップを掴...
*** アーム機構_工夫点?-1 [#g41c004e]
紙コップを掴むとき、紙コップの状態をよりきれいに支える、...
まず紙コップをきれいに支える為の工夫として、三点で支えて...
&ref(2017b/Member/riko/Mission3/紙コップを掴むための工夫_...
上図のように赤色の三点で支えることによって紙コップがぐら...
特徴としては、二点より三点の方が安定する。支える三点の位...
*** アーム機構_工夫点?-2 [#d9aef073]
次に紙コップの体制の話である。普通であるならば、紙コップ...
&ref(2017b/Member/riko/Mission3/紙コップを掴むための工夫_...
上図は紙コップを横から見ている図である。簡単に説明すると...
取り付け方としてはウォームギアの為の棒を短くし、その下に...
※現段階では中心の黒い棒が支えとなっているが機体の完成体で...
*** アーム機構_工夫点? [#m7a0aa22]
今から説明する工夫はアームを締めてから持ち上げるまでは必...
&ref(2017b/Member/riko/Mission3/ストッパー.PNG,400x300,ス...
まず、ストッパーがなかった場合どうなるか。その時の写真が...
&ref(2017b/Member/riko/Mission3/ストッパー_説明.PNG,400x4...
&ref(2017b/Member/riko/Mission3/ストッパーなしの場合.PNG,...
そのため、ストッパーをつけることでウォームギアの前進を止...
** アーム機構_反省 [#nd3118b6]
アーム機構を制作するにあたって、実はこんなに大きなものを...
一つ目は、紙コップを取る際に色々と工夫して取りやすくしよ...
二つ目は、ロボット製作期間が短く、アーム機構の理解に時間...
上記の理由という名の言い訳を述べさせてもらったが、一言付...
** 機体_β版 [#r0110778]
取り合えず、アーム機構にモーターを取り付け、課題2で作った...
&ref(2017b/Member/riko/Mission3/機体_β版_全体.JPG,400x300...
機体の上面、側面からの写真、アーム部分の写真となる。
&ref(2017b/Member/riko/Mission3/機体_β版_上面_横.JPG,400x...
&ref(2017b/Member/riko/Mission3/機体_β版_側面.JPG,400x300...
&ref(2017b/Member/riko/Mission3/機体_β版_アーム_1.JPG,400...
試作品として付けただけなので欠点だらけとなっている。例と...
因みに、この時は三点で支える発想はなかった。
** 機体_完成版 [#ee53e672]
最終的に完成した機体の全体が下の写真となる。この機体の自...
&ref(2017b/Member/riko/Mission3/機体_完成版_全体.JPG,400x...
機体の上面、側面、正面からの写真、アーム部分の写真となる。
&ref(2017b/Member/riko/Mission3/機体_完成版_上方.JPG,400x...
&ref(2017b/Member/riko/Mission3/機体_完成版_側面_スタンド...
&ref(2017b/Member/riko/Mission3/機体_完成版_正面.JPG,400x...
&ref(2017b/Member/riko/Mission3/機体_完成版_アーム.JPG,40...
基本的な構造はβ版と変わらない。この機体は一つのNXTの箱で...
** 機体_完成版_工夫点 [#t4ca023a]
最終的な機体の主な工夫点としては三つ挙げられる。
?アーム機構の体制維持の為の工夫とその他(緑色の枠線)
?スタート地点内に収まる為の工夫(水色の枠線)
?機体本体の体制維持の為の工夫(赤色の枠線)
&ref(2017b/Member/riko/Mission3/機体_完成版_工夫部分.PNG,...
それぞれの工夫を下記に説明していく。
*** 機体_完成版_工夫点?-1 [#z4225233]
アーム機構の仕組み上、持ち上げる際に下図の※と示された部分...
&ref(2017b/Member/riko/Mission3/アーム機構の体制維持の為...
工夫した部分は上図の水色の枠線部分となっている。超音波セ...
*** 機体_完成版_工夫点?-2 [#i980bcca]
工夫として特筆すべきというものではないが、機体を作る際に...
下図のアーム部分がわかるだろうか、この部分が長すぎる、余...
&ref(2017b/Member/riko/Mission3/アームの上げ下げの工夫.PN...
*** 機体_完成版_工夫点? [#ad581265]
機体を作り終え、今回の課題のルールを見直すと「床と接着し...
&ref(2017b/Member/riko/Mission3/スタンド_1.PNG,400x300,ス...
その対策として生まれた工夫が下図のものとなっている。自転...
&ref(2017b/Member/riko/Mission3/スタンド_2.PNG,650x250,ス...
*** 機体_完成版_工夫点? [#h46ca2de]
ここの工夫はあまりにも無計画で機体を制作してしまったおか...
そしてその欠点を補う工夫は下図の赤色の枠線で囲まれた補助...
&ref(2017b/Member/riko/Mission3/補助輪の工夫_1.PNG,400x30...
実際に下図の分、機体のケツが持ち上がっている。
&ref(2017b/Member/riko/Mission3/補助輪の工夫_2.PNG,400x30...
この工夫部分もまだまだ改良の余地があり、できることならこ...
* プログラム [#j25e3fbb]
今回のプログラム制作に私自身はほとんど関与していないため...
** 課題成功への作戦 [#x9755c4f]
上記に数度記載したと思うが今回の私たちの班の作戦として同...
二台を動かすにあたり、スタート位置を二つに分け、作業をす...
&ref(2017b/Member/riko/Mission3/左・右機体の行動範囲.PNG,...
** 紙コップに関するプログラム [#nb2d92f2]
今回の私の仕事の役割分担によって、紙コップに関するプログ...
*** 紙コップを少し持ち上げて割りばし内に入れるプログラム ...
どうやって紙コップの中にピンポン玉を保持したまま割りばし...
&ref(2017b/Member/riko/Mission3/紙コップと割りばし_1.PNG,...
普通に考えると紙コップを持ち上げるだけでピンポン玉が出て...
&ref(2017b/Member/riko/Mission3/紙コップと割りばし_2.PNG,...
上図のように紙コップを割りばし以上の高さから、ピンポン玉...
動き方としては下図のようになる。
&ref(2017b/Member/riko/Mission3/紙コップの割りばし越え.PN...
今回の機体の紙コップの上げ方は斜めに上がるのでそこらのこ...
&ref(2017b/Member/riko/Mission3/紙コップの割りばし越え(斜...
d=searchDirection(15);
if(d>5.0){
catch_cop(700);
OnFwd(OUT_AB,SLOW);
Wait(1400);
Off(OUT_AB);
catch_cop(300);
OnFwd(OUT_AB,-SLOW);
Wait(100);
Off(OUT_AB);
}
恐らく上記のプログラムが紙コップに近づき、掴んだ紙コップ...
*** 紙コップを重ねるプログラム_1 [#p44d8a6c]
初めの予定では紙コップを重ねる時は機体一台でやるつもりで...
そのため、紙コップを確実に重ねられるように2台の機体を連携...
下図は機体の動き方である。前提として左側の機体が子機、右...
?
&ref(2017b/Member/riko/Mission3/紙コップ連携_1.JPG,400x30...
まず、親機(右の機体)が紙コップを持ち、子機(左の機体)が紙...
?
&ref(2017b/Member/riko/Mission3/紙コップ連携_2.JPG,400x30...
子機が腕を閉じ、親機の超音波センサーの邪魔にならないよう...
?
&ref(2017b/Member/riko/Mission3/紙コップ連携_3.JPG,400x30...
親機が紙コップを持ち上げ、超音波センサーの邪魔にならない...
?
&ref(2017b/Member/riko/Mission3/紙コップ連携_4.JPG,400x30...
子機の腕を広げる。
?
&ref(2017b/Member/riko/Mission3/紙コップ連携_5.JPG,400x30...
子機が紙コップに近づく。
?
&ref(2017b/Member/riko/Mission3/紙コップ連携_6.JPG,400x30...
子機が紙コップを掴み動かないようにする。
?
&ref(2017b/Member/riko/Mission3/紙コップ連携_7.JPG,400x30...
親機が子機の持っている紙コップに近づく。
?
&ref(2017b/Member/riko/Mission3/紙コップ連携_8.JPG,400x30...
親機の持っている紙コップを子機の持っている紙コップにかぶ...
?
&ref(2017b/Member/riko/Mission3/紙コップ連携_9.JPG,400x30...
子機が親機に近づくことで紙コップに角度が生まれる。
?
&ref(2017b/Member/riko/Mission3/紙コップ連携_10.JPG,400x3...
子機が腕を広げ、紙コップを離す。
?
&ref(2017b/Member/riko/Mission3/紙コップ連携_11.JPG,400x3...
子機が離れる。
?
&ref(2017b/Member/riko/Mission3/紙コップ連携_12.JPG,400x3...
最後に親機がアームを広げ、紙コップを離すことで紙コップが...
*** 紙コップを重ねるプログラム_2 [#ob6d3d88]
上記の動きをするためのプログラムが下記の通りとなる。ここ...
一つ言えるとしたら、ここのプログラムはBluetoothによる機体...
〇親機(右の機体)
sub tag()
{
keep_cop();
d=searchDirection(15);
if(d>5.0){
SendRemoteNumber(CONN,MAILBOX1,SIGNALON1);
Wait(5000);
fwdDist(d-8.0);
ResetTachoCount(OUT_ABC);
RotateMotorEx(OUT_AB,-SLOW,40,0,true,true);
RotateMotor(OUT_C,SLOW,50);
SendRemoteNumber(CONN,MAILBOX1,SIGNALON2);
Wait(5000);
RotateMotor(OUT_C,SLOW,100);
ResetTachoCount(OUT_ABC);
RotateMotor(OUT_C,SLOW,720);
RotateMotorEx(OUT_AB,-SLOW,120,0,true,true);
}
}
〇子機(左の機体)
sub tag()
{
int msg,counter;
ResetTachoCount(OUT_ABC);
RotateMotor(OUT_C,SLOW,1080);
RotateMotorEx(OUT_AB,-SLOW,360,0,true,true);
RotateMotor(OUT_C,-SLOW,1080);
while(counter==0){
ReceiveRemoteNumber(MAILBOX1,true,msg);
if(msg==SIGNALON) {
ResetTachoCount(OUT_ABC);
RotateMotor(OUT_C,SLOW,1080);
RotateMotorEx(OUT_AB,SLOW,120,0,true,true);
RotateMotor(OUT_C,-SLOW,1080);
counter++;
}
}
counter=0;
while(counter==0){
ReceiveRemoteNumber(MAILBOX1,true,msg);
if(msg==SIGNALON2) {
ResetTachoCount(OUT_ABC);
RotateMotor(OUT_C,SLOW,360);
RotateMotorEx(OUT_AB,SLOW,40,0,true,true);
counter++;
}
}
counter=0;
ResetTachoCount(OUT_ABC);
RotateMotor(OUT_C,SLOW,720);
RotateMotorEx(OUT_AB,-SLOW,120,0,true,true);
}
** 左側機体(子機)のプログラム [#o464f4c8]
正直に言わせてもらう。私は同じ班が書いたプログラムを理解...
以下は左側機体の全体のプログラムとなっている。
〇私以外が書いたプログラムはコメントとして「※」を書いてお...
〇私が課題2で使ったプログラムと同じ部分にはコメントとして...
#define SO 392 ...
#define DO 523 ...
#define MI 659 ...
#define SO_H 784 ...
#define SI 988 ...
#define DO_H 1047 ...
#define MI_H 1318 ...
#define RE 1175 ...
#define SO_SH 1568 ...
#define SIGNALON 11 ...
#define SIGNALON2 12 ...
#define SLOW 30 ...
...
const float diameter=5.45; ...
const float tread=11.3; ...
const float pi=3.1415; ...
...
int d; ...
...
sub fwdDist(float d) ...
{ ...
long angle=d/(diameter*pi)*360.0; ...
RotateMotorEx(OUT_AB,SLOW,angle,0,true,true); ...
} ...
...
sub turnAng(long ang) ...
{ ...
long angle=tread/diameter*ang; ...
RotateMotorEx(OUT_AB,SLOW,angle,100,true,true); ...
} ...
...
int searchDirection(long ang) ...
{ ...
long tacho_min; ...
int d_min=300; ...
...
long angle=(tread/diameter)*ang; ...
turnAng(ang/2); ...
ResetTachoCount(OUT_AB); ...
OnFwdSync(OUT_AB,SLOW,-100); ...
while(MotorTachoCount(OUT_A)<=angle){ ...
if(SensorUS(S3)<d_min){ ...
d_min=SensorUS(S3); ...
tacho_min=MotorTachoCount(OUT_A); ...
} ...
} ...
OnFwdSyncEx(OUT_AB,SLOW,100,RESET_NONE); ...
...
until(MotorTachoCount(OUT_A)<=tacho_min||SensorUS(S3...
Wait(14); ...
Off(OUT_AB); ...
Wait(500); ...
return d_min; ...
} ...
...
sub tag() ...
{ ...
int msg,counter; ...
ResetTachoCount(OUT_ABC); ...
RotateMotor(OUT_C,SLOW,1080); ...
RotateMotorEx(OUT_AB,-SLOW,360,0,true,true); ...
RotateMotor(OUT_C,-SLOW,1080); ...
...
while(counter==0){ ...
ReceiveRemoteNumber(MAILBOX1,true,msg); ...
if(msg==SIGNALON) { ...
ResetTachoCount(OUT_ABC); ...
RotateMotor(OUT_C,SLOW,1080); ...
RotateMotorEx(OUT_AB,SLOW,120,0,true,true);...
RotateMotor(OUT_C,-SLOW,1080); ...
counter++; ...
} ...
} ...
counter=0; ...
...
while(counter==0){ ...
ReceiveRemoteNumber(MAILBOX1,true,msg); ...
if(msg==SIGNALON2) { ...
ResetTachoCount(OUT_ABC); ...
RotateMotor(OUT_C,SLOW,360); ...
RotateMotorEx(OUT_AB,SLOW,40,0,true,true); ...
counter++; ...
} ...
} ...
counter=0; ...
ResetTachoCount(OUT_ABC); ...
RotateMotor(OUT_C,SLOW,720); ...
RotateMotorEx(OUT_AB,-SLOW,120,0,true,true); ...
} ...
sub pose_SE() ...
PlayTone(MI_H,90);Wait(100); ...
PlayTone(DO_H,90);Wait(100); ...
PlayTone(MI_H,90);Wait(100); ...
PlayTone(DO_H,90);Wait(100); ...
} ...
sub one_UP_SE() ...
{ ...
PlayTone(MI,110);Wait(120); ...
PlayTone(SO_H,110);Wait(120); ...
PlayTone(MI_H,110);Wait(120); ...
PlayTone(DO_H,110);Wait(120); ...
PlayTone(RE,110);Wait(120); ...
PlayTone(SO_SH,110);Wait(120); ...
} ...
sub coin_SE() ...
{ ...
PlayTone(SI,90);Wait(100); ...
PlayTone(MI_H,140);Wait(150); ...
} ...
sub Start_SE() ...
{ ...
PlayTone(MI,100);Wait(110); ...
PlayTone(MI,100);Wait(250); ...
PlayTone(MI,100);Wait(160); ...
PlayTone(DO,90);Wait(100); ...
PlayTone(MI,90);Wait(230); ...
PlayTone(SO_H,90);Wait(420); ...
PlayTone(SO,170);Wait(180); ...
} ...
#define move1 OnFwd(OUT_A,40);OnFwd(OUT_B,-35); ...
#define move2 OnFwd(OUT_A,30);OnFwd(OUT_B,-20); ...
#define move3 OnFwd(OUT_A,54);OnFwd(OUT_B,54); ...
#define move4 OnFwd(OUT_B,30);OnFwd(OUT_A,-20); ...
#define move5 OnFwd(OUT_B,40);OnFwd(OUT_A,-35); ...
#define average 45 ...
sub Stop_Motion() ...
{ ...
Wait(300); ...
pose_SE(); ...
Wait(1000); ...
} ...
sub L_Assist_line(int Assist_time) ...
{ ...
long ta=CurrentTick(); ...
while (CurrentTick()-ta<=Assist_time){ ...
if (SENSOR_2<average-11) { ...
move1 ...
}else if (SENSOR_2<average-7){ ...
move2; ...
} else if (SENSOR_2<average+7){ ...
move3; ...
} else if (SENSOR_2<average+11){ ...
move4; ...
} else { ...
move5; ...
} ...
} ...
coin_SE(); ...
} ...
sub R_Assist_line(int Assist_time) ...
{ ...
long tb=CurrentTick(); ...
while (CurrentTick()-tb<=Assist_time){ ...
if (SENSOR_2<average-11) { ...
move5; ...
} else if (SENSOR_2<average-7){ ...
move4; ...
} else if (SENSOR_2<average+7){ ...
move3; ...
} else if (SENSOR_2<average+11){ ...
move2; ...
} else { ...
move1; ...
} ...
} ...
coin_SE(); ...
} ...
sub L_line(int Assist_time,int Stop_time) ...
{ ...
L_Assist_line(Assist_time); ...
long t1=CurrentTick(); ...
while (CurrentTick()-t1<=Stop_time){ ...
if (SENSOR_2<average-11) { ...
move1; ...
} else if (SENSOR_2<average-7){ ...
move2; ...
t1=CurrentTick(); ...
} else if (SENSOR_2<average+7){ ...
move3; ...
t1=CurrentTick(); ...
} else if (SENSOR_2<average+11){ ...
move4; ...
t1=CurrentTick(); ...
} else { ...
move5; ...
t1=CurrentTick(); ...
} ...
} ...
Off(OUT_AB); ...
coin_SE(); ...
} ...
sub R_line(int Assist_time,int Stop_time) ...
{ ...
R_Assist_line(Assist_time); ...
...
long t2=CurrentTick(); ...
while (CurrentTick()-t2<=Stop_time){ ...
if (SENSOR_2<average-11) { ...
move5; ...
} else if (SENSOR_2<average-8){ ...
move4; ...
t2=CurrentTick(); ...
} else if (SENSOR_2<average+6){ ...
move3; ...
t2=CurrentTick(); ...
} else if (SENSOR_2<average+11){ ...
move2; ...
t2=CurrentTick(); ...
} else { ...
move1; ...
t2=CurrentTick(); ...
} ...
} ...
Off(OUT_AB); ...
coin_SE(); ...
} ...
sub White_to_Black(int blight,int A_speed,int B_speed) ...
{ ...
while (SENSOR_2>blight){ ...
OnFwd(OUT_A,A_speed); ...
OnFwd(OUT_B,B_speed); ...
} ...
Off(OUT_AB); ...
} ...
sub Black_to_White(int blight,int A_speed,int B_speed) ...
{ ...
while (SENSOR_2<blight){ ...
OnFwd(OUT_A,A_speed); ...
OnFwd(OUT_B,B_speed); ...
} ...
Off(OUT_AB); ...
} ...
sub Start_Set() ...
{ ...
Start_SE(); ...
move3; ...
Wait(600); ...
White_to_Black(48,30,5); ...
} ...
sub catch_cop(long ang1) ...
{ ...
ResetTachoCount(OUT_C); ...
RotateMotor(OUT_C,-SLOW,ang1); ...
} ...
...
sub release_cop(long ang2) ...
{ ...
ResetTachoCount(OUT_C); ...
RotateMotor(OUT_C,SLOW,ang2); ...
} ...
...
sub release_ball() ...
{ ...
ResetTachoCount(OUT_ABC); ...
OnFwd(OUT_AB,SLOW); ...
Wait(700); ...
Off(OUT_AB); ...
ResetTachoCount(OUT_C); ...
RotateMotor(OUT_C,-SLOW,50); ...
OnFwd(OUT_C,-20); ...
Wait(1000); ...
OnFwd(OUT_AB,-SLOW); ...
Wait(700); ...
Off(OUT_AB); ...
} ...
...
sub keep_cop() ...
{ ...
ResetTachoCount(OUT_C); ...
RotateMotor(OUT_C,-SLOW,50); ...
OnFwd(OUT_C,-20); ...
} ...
task main()
{
SetSensorLight(S2); ...
SetSensorLowspeed(S3); ...
Start_Set(); ...
R_line(300,150); ...
d=searchDirection(15); ...
if(d>5.0){ ...
catch_cop(700); ...
OnFwd(OUT_AB,SLOW); ...
Wait(1400); ...
Off(OUT_AB); ...
catch_cop(300); ...
OnFwd(OUT_AB,-SLOW); ...
Wait(100); ...
Off(OUT_AB); ...
} ...
ResetTachoCount(OUT_A); ...
RotateMotor(OUT_A,-SLOW,370); ...
OnFwd(OUT_AB,SLOW); ...
Wait(600); ...
Off(OUT_AB); ...
catch_cop(40); ...
OnFwd(OUT_C,-SLOW); ...
Wait(1000); ...
Off(OUT_C); ...
OnFwd(OUT_AB,-SLOW); ...
Wait(1000); ...
Off(OUT_AB); ...
White_to_Black(33,35,15); ...
Black_to_White(48,35,15); ...
White_to_Black(33,40,25); ...
Black_to_White(48,-30,0); ...
White_to_Black(33,-30,0); ...
Black_to_White(50,0,-30); ...
White_to_Black(33,35,30); ...
Black_to_White(48,35,30); ...
release_cop(50); ...
tag(); ...
keep_cop(); ...
tag(); ...
OnFwd(OUT_AB,-SLOW); ...
Wait(1000); ...
Off(OUT_AB); ...
}
前回の私のレポート読んだ方であるなら、フィールドの移動方...
紙コップ関連には私は触れることができないが、移動について...
*** 左側機体のプログラムの解説? [#qdc2677e]
場面としてはスタート地点から紙コップを取るところまでの移...
sub Start_Set() //ライントレースを始める...
{
Start_SE(); //スタートのSE
move3; //初めのラインの囲いから...
Wait(600);
White_to_Black(48,30,5); //このプログラムでライン...
}
Start_Set();
R_line(300,150);
上記の移動の説明をする。このコースの出発時は黒線で囲まれ...
&ref(2017b/Member/riko/Mission3/左側機体のプログラムの解...
言葉だけでは分かりずらいの図で表す。上はスタート地点から...
ラインを見つけた後、右側のライントレースを行い交差点認識...
*** 左側機体のプログラムの解説? [#nf966642]
場面としては紙コップからピンポン玉を取り出した後、紙コッ...
OnFwd(OUT_AB,-SLOW);
Wait(1000);
Off(OUT_AB);
まず上記のプログラムは紙コップを持ち上げた場面からの移動...
&ref(2017b/Member/riko/Mission3/左側機体のプログラムの解...
White_to_Black(33,35,15);
Black_to_White(48,35,15);
White_to_Black(33,40,25);
Black_to_White(48,-30,0);
White_to_Black(33,-30,0);
Black_to_White(50,0,-30);
White_to_Black(33,35,30);
Black_to_White(48,35,30);
上記のプログラムは、紙コップをもう一台と重ねるための連携...
&ref(2017b/Member/riko/Mission3/左側機体のプログラムの解...
青い矢印はバック走行を表している。
** 右側機体(親機)のプログラム [#w1f74bf0]
以下は右側機体の全体のプログラムとなっている。
〇私以外が書いたプログラムはコメントとして「※」を書いてお...
〇私が課題2で使ったプログラムと同じ部分にはコメントとして...
#define SO 392 ...
#define DO 523 ...
#define MI 659 ...
#define SO_H 784 ...
#define SI 988 ...
#define DO_H 1047 ...
#define MI_H 1318 ...
#define RE 1175 ...
#define SO_SH 1568 ...
sub pose_SE() ...
PlayTone(MI_H,90);Wait(100); ...
PlayTone(DO_H,90);Wait(100); ...
PlayTone(MI_H,90);Wait(100); ...
PlayTone(DO_H,90);Wait(100); ...
} ...
sub one_UP_SE() ...
{ ...
PlayTone(MI,110);Wait(120); ...
PlayTone(SO_H,110);Wait(120); ...
PlayTone(MI_H,110);Wait(120); ...
PlayTone(DO_H,110);Wait(120); ...
PlayTone(RE,110);Wait(120); ...
PlayTone(SO_SH,110);Wait(120); ...
} ...
sub coin_SE() ...
{ ...
PlayTone(SI,90);Wait(100); ...
PlayTone(MI_H,140);Wait(150); ...
} ...
sub Start_SE() ...
{ ...
PlayTone(MI,100);Wait(110); ...
PlayTone(MI,100);Wait(250); ...
PlayTone(MI,100);Wait(160); ...
PlayTone(DO,90);Wait(100); ...
PlayTone(MI,90);Wait(230); ...
PlayTone(SO_H,90);Wait(420); ...
PlayTone(SO,170);Wait(180); ...
} ...
#define FAST 50 ...
#define SLOW 30 ...
#define CONN 1 ...
#define SIGNALON1 11 ...
#define SIGNALON2 12 ...
...
const float diameter=5.45; ...
const float tread=11.3; ...
const float pi=3.1415; ...
...
int d; ...
...
sub keep_cop() ...
{ ...
ResetTachoCount(OUT_C); ...
RotateMotor(OUT_C,-SLOW,50); ...
OnFwd(OUT_C,-20); ...
} ...
...
sub fwdDist(float d) ...
{ ...
long angle=d/(diameter*pi)*360.0; ...
RotateMotorEx(OUT_AB,SLOW,angle,0,true,true); ...
} ...
...
sub turnAng(long ang) ...
{ ...
long angle=tread/diameter*ang; ...
RotateMotorEx(OUT_AB,SLOW,angle,100,true,true); ...
} ...
...
int searchDirection(long ang) ...
{ ...
long tacho_min; ...
int d_min=300; ...
...
long angle=(tread/diameter)*ang; ...
turnAng(ang/2); ...
ResetTachoCount(OUT_AB); ...
OnFwdSync(OUT_AB,SLOW,-100); ...
while(MotorTachoCount(OUT_A)<=angle){ ...
if(SensorUS(S3)<d_min){ ...
d_min=SensorUS(S3); ...
tacho_min=MotorTachoCount(OUT_A); ...
} ...
} ...
OnFwdSyncEx(OUT_AB,SLOW,100,RESET_NONE); ...
...
until(MotorTachoCount(OUT_A)<=tacho_min||SensorUS(S3...
Wait(14); ...
Off(OUT_AB); ...
Wait(500); ...
return d_min; ...
} ...
...
sub tag() ...
{ ...
keep_cop(); ...
d=searchDirection(15); ...
...
if(d>5.0){ ...
SendRemoteNumber(CONN,MAILBOX1,SIGNALON1); ...
Wait(5000); ...
fwdDist(d-8.0); ...
ResetTachoCount(OUT_ABC); ...
RotateMotorEx(OUT_AB,-SLOW,40,0,true,true); ...
RotateMotor(OUT_C,SLOW,50); ...
...
SendRemoteNumber(CONN,MAILBOX1,SIGNALON2); ...
Wait(5000); ...
RotateMotor(OUT_C,SLOW,100); ...
ResetTachoCount(OUT_ABC); ...
RotateMotor(OUT_C,SLOW,720); ...
RotateMotorEx(OUT_AB,-SLOW,120,0,true,true); ...
} ...
} ...
...
sub catch_cop(long ang1) ...
{ ...
ResetTachoCount(OUT_C); ...
RotateMotor(OUT_C,-SLOW,ang1); ...
} ...
...
sub release_cop(long ang2) ...
{ ...
ResetTachoCount(OUT_C); ...
RotateMotor(OUT_C,SLOW,ang2); ...
} ...
...
sub release_ball() ...
{ ...
ResetTachoCount(OUT_ABC); ...
OnFwd(OUT_AB,SLOW); ...
Wait(700); ...
Off(OUT_AB); ...
ResetTachoCount(OUT_C); ...
RotateMotor(OUT_C,-SLOW,50); ...
OnFwd(OUT_C,-20); ...
Wait(1000); ...
OnFwd(OUT_AB,-SLOW); ...
Wait(700); ...
Off(OUT_AB); ...
} ...
#define move1 OnFwd(OUT_A,40);OnFwd(OUT_B,-35); ...
#define move2 OnFwd(OUT_A,30);OnFwd(OUT_B,-20); ...
#define move3 OnFwd(OUT_A,54);OnFwd(OUT_B,54); ...
#define move4 OnFwd(OUT_B,30);OnFwd(OUT_A,-20); ...
#define move5 OnFwd(OUT_B,40);OnFwd(OUT_A,-35); ...
#define average 45 ...
sub Stop_Motion() ...
{ ...
Wait(300); ...
pose_SE(); ...
Wait(1000); ...
} ...
sub L_Assist_line(int Assist_time) ...
{ ...
long ta=CurrentTick(); ...
while (CurrentTick()-ta<=Assist_time){ ...
if (SENSOR_2<average-11) { ...
move1 ...
}else if (SENSOR_2<average-7){ ...
move2; ...
} else if (SENSOR_2<average+7){ ...
move3; ...
} else if (SENSOR_2<average+11){ ...
move4; ...
} else { ...
move5; ...
} ...
} ...
coin_SE(); ...
} ...
sub R_Assist_line(int Assist_time) ...
{ ...
long tb=CurrentTick(); ...
while (CurrentTick()-tb<=Assist_time){ ...
if (SENSOR_2<average-11) { ...
move5; ...
} else if (SENSOR_2<average-7){ ...
move4; ...
} else if (SENSOR_2<average+7){ ...
move3; ...
} else if (SENSOR_2<average+11){ ...
move2; ...
} else { ...
move1; ...
} ...
} ...
coin_SE(); ...
} ...
sub L_line(int Assist_time,int Stop_time) ...
{ ...
L_Assist_line(Assist_time); ...
long t1=CurrentTick(); ...
while (CurrentTick()-t1<=Stop_time){ ...
if (SENSOR_2<average-11) { ...
move1; ...
} else if (SENSOR_2<average-7){ ...
move2; ...
t1=CurrentTick(); ...
} else if (SENSOR_2<average+7){ ...
move3; ...
t1=CurrentTick(); ...
} else if (SENSOR_2<average+11){ ...
move4; ...
t1=CurrentTick(); ...
} else { ...
move5; ...
t1=CurrentTick(); ...
} ...
} ...
Off(OUT_AB); ...
coin_SE(); ...
} ...
sub R_line(int Assist_time,int Stop_time) ...
{ ...
R_Assist_line(Assist_time); ...
...
long t2=CurrentTick(); ...
while (CurrentTick()-t2<=Stop_time){ ...
if (SENSOR_2<average-11) { ...
move5; ...
} else if (SENSOR_2<average-8){ ...
move4; ...
t2=CurrentTick(); ...
} else if (SENSOR_2<average+6){ ...
move3; ...
t2=CurrentTick(); ...
} else if (SENSOR_2<average+11){ ...
move2; ...
t2=CurrentTick(); ...
} else { ...
move1; ...
t2=CurrentTick(); ...
} ...
} ...
Off(OUT_AB); ...
coin_SE(); ...
} ...
sub White_to_Black(int blight,int A_speed,int B_speed) ...
{ ...
while (SENSOR_2>blight){ ...
OnFwd(OUT_A,A_speed); ...
OnFwd(OUT_B,B_speed); ...
} ...
Off(OUT_AB); ...
} ...
sub Black_to_White(int blight,int A_speed,int B_speed) ...
{ ...
while (SENSOR_2<blight){ ...
OnFwd(OUT_A,A_speed); ...
OnFwd(OUT_B,B_speed); ...
} ...
Off(OUT_AB); ...
} ...
#define reverse_move OnFwd(OUT_A,-54);OnFwd(OUT_B,-50); ...
...
sub reverse_Start_Set() ...
{ ...
reverse_move; ...
Start_SE(); ...
Wait(2000); ...
White_to_Black(48,20,35); ...
} ...
task main()
{
SetSensorLight(S2); ...
SetSensorLowspeed(S3); ...
reverse_Start_Set(); ...
L_line(1300,110); ...
ResetTachoCount(OUT_A); ...
RotateMotor(OUT_A,-SLOW,150); ...
d=searchDirection(15); ...
if(d>5.0){ ...
catch_cop(600); ...
OnFwd(OUT_AB,SLOW); ...
Wait(1000); ...
Off(OUT_AB); ...
catch_cop(500); ...
OnFwd(OUT_AB,-SLOW); ...
Wait(400); ...
Off(OUT_AB); ...
} ...
ResetTachoCount(OUT_B); ...
RotateMotor(OUT_B,-SLOW,110); ...
release_ball(); ...
RsetTachoCount(OUT_A); ...
RotateMotor(OUT_A,-SLOW,130); ...
tag(); ...
OnFwd(OUT_AB,-SLOW); ...
Wait(1000); ...
Off(OUT_AB); ...
White_to_Black(48,35,25); ...
L_line(300,130); ...
Black_to_White(48,0,-30); ...
White_to_Black(33,0,-30); ...
d=searchDirection(15); ...
if(d>5.0){ ...
catch_cop(600); ...
OnFwd(OUT_AB,SLOW); ...
Wait(1000); ...
Off(OUT_AB); ...
catch_cop(500); ...
OnFwd(OUT_AB,-SLOW); ...
Wait(400); ...
Off(OUT_AB); ...
} ...
White_to_Black(33,-30,-30); ...
L_line(150,130); ...
Black_to_White(48,30,30); ...
release_ball(); ...
ResetTachoCount(OUT_A); ...
RotateMotor(OUT_A,-SLOW,130); ...
tag(); ...
ResetTachoCount(OUT_C); ...
RotateMotor(OUT_C,-SLOW,1100); ...
White_to_Black(33,-30,-30); ...
Black_to_White(48,-30,-30); ...
White_to_Black(33,-30,-30); ...
OnFwd(OUT_AB,SLOW); ...
Wait(300); ...
Off(OUT_AB); ...
ResetTachoCount(OUT_C); ...
RotateMotor(OUT_C,SLOW,1200); ...
}
*** 右側機体のプログラムの解説? [#e122a2ce]
場面としてはスタート地点から紙コップを取るところまでの移...
#define reverse_move OnFwd(OUT_A,-54);OnFwd(OUT_B,-50);
sub reverse_Start_Set()
{
reverse_move;
Start_SE();
Wait(2000);
White_to_Black(48,20,35);
}
まず、初めの走行をバックから始める。そのためのプログラム...
reverse_Start_Set();
L_line(1300,110);
&ref(2017b/Member/riko/Mission3/右側機体のプログラムの解...
動きとしては後ろに下がり、その後黒線を見つけ、そのまま交...
*** 右側機体のプログラムの解説? [#q080aeae]
場面としては1個目の紙コップを重ねた後、次の紙コップを見つ...
OnFwd(OUT_AB,-SLOW);
Wait(1000);
Off(OUT_AB);
White_to_Black(48,35,25);
L_line(300,130);
Black_to_White(48,0,-30);
White_to_Black(33,0,-30);
&ref(2017b/Member/riko/Mission3/右側機体のプログラムの解...
動きとしては秒管理によるバックの後、黒線を探し、ライント...
*** 右側機体のプログラムの解説? [#t295b938]
場面としては2個目の紙コップを捕まえた後、それを割りばし内...
White_to_Black(33,-30,-30);
L_line(150,130);
Black_to_White(48,30,30);
release_ball();
&ref(2017b/Member/riko/Mission3/右側機体のプログラムの解...
動きとしてはバックにて黒線を探し、そのままライントレース...
*** 右側機体のプログラムの解説? [#v3c280da]
場面としては紙コップを3つ重ねた後、それを目的地にもってい...
White_to_Black(33,-30,-30);
Black_to_White(48,-30,-30);
White_to_Black(33,-30,-30);
OnFwd(OUT_AB,SLOW);
Wait(300);
Off(OUT_AB);
ResetTachoCount(OUT_C);
RotateMotor(OUT_C,SLOW,1200);
&ref(2017b/Member/riko/Mission3/右側機体のプログラムの解...
動きとしては紙コップを重ね終えた場所からバックで確実に目...
* 結果・反省・感想 [#w4d930a0]
** 結果 [#m39f8878]
1回目は、子機が1個ピンポン玉を枠内に入れたが、子機、親機...
技術点としては平均8.8点となり、全体合計は12.8点。順位は9...
** 反省 [#y702adce]
今回、ロボットもプログラミングも全体的に作りが甘かったと...
超音波センサーの仕組みは左右どちらかから超音波を発し、反...
また、超音波センサーの縦横関係なく、工夫して2回の検知で確...
アームの作りや機体全体の作りをもっと柔軟な発想で生み出す...
** 感想 [#g7ad1f77]
今回、課題3の取り掛かりがテスト終了後でほとんど時間が足り...
しかし、正直なところそんなことはどうでもよいとも思える。...
* 最後に [#zeb05996]
ここまでいろいろとレポートに書いたが改善したい点やほかの...
そして、もしもこのレポートを読んでいる人がこのゼミを受け...
ページ名: