2017b/Member/cyanomelana/Mission3
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
検索
|
最終更新
|
ヘルプ
|
ログイン
]
開始行:
#contents
[[2017b/Member]]
*課題3 [#b9fd6f1e]
課題2で使用したコースにピンポン玉が入った紙コップが指定...
#ref(2017b/Member/cyanomelana/Mission3/2017b-mission3.png...
今回の課題3は作業内容がとても多いので、チーム内でロボッ...
***ルールの詳細 [#f899a952]
ルールの詳細はこちらのリンクにありますので参考にしてくだ...
http://yakushi.shinshu-u.ac.jp/robotics/?2017b%2FMission3...
***チームメンバー [#oa518bc5]
横川 友也~
大谷 風吾http://yakushi.shinshu-u.ac.jp/robotics/?cmd=edi...
カ デンエンhttp://yakushi.shinshu-u.ac.jp/robotics/?2017b...
チョウ カイドウhttp://yakushi.shinshu-u.ac.jp/robotics/?2...
(他のメンバーのレポートも参考にしてください。)
*作成したロボット[#sd56a80b]
作成したロボットは一体で、コップを見つける、つかむ、重ね...
#ref(2017b/Member/cyanomelana/Mission3/robo2.PNG,50%,ロボ...
#ref(2017b/Member/cyanomelana/Mission3/robo3.PNG,70%,ロボ...
**ロボットの詳細 [#jbd98e7d]
このロボットは前輪駆動となっており、ロボットの車体がとて...
#ref(2017b/Member/cyanomelana/Mission3/foto1.PNG,80%,課題...
***ロボットの骨組み [#ea7693eb]
このロボットは一体でミッションをこなすためにロボットにNXT...
#ref(2017b/Member/cyanomelana/Mission3/roboex3.gif,80%,ロ...
#ref(2017b/Member/cyanomelana/Mission3/kaizen.PNG,80%,改善)
#ref(2017b/Member/cyanomelana/Mission3/katamukahen.PNG,80...
***各種センサーの取り付け位置 [#md272077]
光センサー
下の画像のようにロボットの左右両方に光センサーを取り付け...
#ref(2017b/Member/cyanomelana/Mission3/hikari.PNG,80%,光...
超音波センサー
コップを見つける超音波センサーはロボット前側中央に取り付...
しかし、「主なプログラミングによる動作の流れ」の項目で詳...
#ref(2017b/Member/cyanomelana/Mission3/tyouonn.PNG,80%,超...
#ref(2017b/Member/cyanomelana/Mission3/tooreru.gif,80%,紙...
***紙コップをつかむ機構 [#hefd249c]
紙コップをつかむ機構は片方の腕を固定し、もう片方の腕をモ...
上から見た図
#ref(2017b/Member/cyanomelana/Mission3/torutoru.gif,80%,...
横から見た図
#ref(2017b/Member/cyanomelana/Mission3/ccc.gif,80%,紙コッ...
***紙コップを上げ下げする機構 [#hcce8a0e]
紙コップを上げ下げするモーターに紙コップをつかむモーター...
#ref(2017b/Member/cyanomelana/Mission3/bbb.gif,80%,紙コッ...
*ロボットの紙コップを取得するときの一連の動きは「主なプ...
*作成したプログラミング [#ye49cd86]
課題3のプログラミングは2機のNXT間でBluetouthを介して通...
**基本的な動作のプログラミング [#t1b7bd8d]
課題3に必要な主なプログラミングは「紙コップを見つけるプ...
***紙コップを見つけて近づくプログラミング [#s55f5497]
どのようにロボットから一番近い紙コップを見つけるのか
ロボットから一番近い紙コップを見つけるためにはセンサーが...
#ref(2017b/Member/cyanomelana/Mission3/ggg.gif,50%,ロボッ...
紙コップを見つけて近づくプログラムは次の1〜4の手順が行わ...
?int searchDirection(long ang)によってどれくらいの角度の...
?指定した角度を回るためにはどのくらいタイヤを回せばよい...
?紙コップに一番近い位置の角度を記憶したらその角度にロボ...
?int searchDirection(long ang)によって一番近い紙コップま...
const float diameter = 5.45; //タイヤ直径
const float track = 10.35; //タイヤトレッド幅
const float pi = 3.1415; //円周率
void fwdDist(float d) //距離 dcm前進 //
{
long angle = d/(diameter*pi)*360.0; //必要なタイヤの回...
RotateMotorEx(OUT_AC, SPEED_SLOW, angle, 0, true ,true);
}
void turnAng(long ang) //角度ang度の時計回りの旋回
{
long angle = track/diameter * ang;
RotateMotorEx(OUT_AC, SPEED_SLOW, angle, 100, true, true);
}
int searchDirection(long ang) //現在の方向を中心にang度...
//障害物までの距離を...
{
long tacho_min; //最も近い距離を実現するタイヤの回転数
int d_min = 300; //最も近い距離の仮の最小値(十分大きく...
long angle = (track/diameter)*ang; //旋回角度からタイヤ...
turnAng(ang/2); //指定された角度の半分を旋回
ResetTachoCount(OUT_AC); //角度計測をリセット
OnFwdSync(OUT_AC,SPEED_SLOW,-100); //半時計回りに旋回
while(MotorTachoCount(OUT_A)<=angle)
{
if (SensorUS(S1)<d_min)
{ //現在の距離が借りの最小値より小さい場合
d_min = SensorUS(S1); //仮の最小値を更新
tacho_min = MotorTachoCount(OUT_A); //この時のタイヤの回...
}
}
OnFwdSyncEx(OUT_AC,SPEED_SLOW,100,RESET_NONE);
until(MotorTachoCount(OUT_A)<=tacho_min || SensorUS(S1)<...
Wait(14); //微調整
Off(OUT_AC);Wait(500);
return d_min;
}
***ライントレースをするプログラム [#i76f8301]
ライントレースするプログラムの詳細は課題2のレポートで詳し...
http://yakushi.shinshu-u.ac.jp/robotics/#g9f1eef7
**主なプログラミングによる動作の流れ [#se4a2410]
ロボットの基本的な動作の流れはつぎのとおりである。
?紙コップを見つける
?センサーを上げる
?紙コップをつかむ
?X地点に向かう
?紙コップを持ち上げる
?センサーを下げる
?紙コップを見つける
***?見つける [#kbfb3162]
ライントレースを使い、紙コップの近くに到着しすると、セン...
#ref(2017b/Member/cyanomelana/Mission3/sensorvartical2.jp...
***?センサーを上げる [#if283a49]
一番近い紙コップを見つけ次第その紙コップの方向にロボット...
#ref(2017b/Member/cyanomelana/Mission3/age.gif,70%,ロボッ...
***?紙コップをつかむ [#j837269e]
センサーを上げた後、紙コップをつかめる位置まで紙コップに...
#ref(2017b/Member/cyanomelana/Mission3/firstcatch.jpg,30%...
***?X地点に向かう [#n6742972]
紙コップをつかんだ後、ライントレースして、X地点まで紙コッ...
***?紙コップを持ち上げる [#w2231491]
X地点の中に紙コップが入ると、紙コップを上げて紙コップの中...
#ref(2017b/Member/cyanomelana/Mission3/fff.gif,80%,ロボッ...
***?センサーを下げる [#r88dd3f2]
ピンポン玉を開放したら、後ろに進みながらX地点の枠を出て、...
#ref(2017b/Member/cyanomelana/Mission3/eee.gif,80%,ロボッ...
***?見つける [#t73e2e58]
紙コップを一個取得した次の動作として、センサーで2つ目の紙...
**プログラミングの全体 [#k9f91207]
まず親機、子機のdefineを次のように定義した。
親機
#define SPEED 100
#define SPEED_SLOW 60
#define turn_left1 OnFwd(OUT_A,80 * x); OnRev(OUT_C,35 *...
#define turn_left2 OnFwd(OUT_A,100 * x); OnFwd(OUT_C,40 ...
#define turn_left3 OnFwd(OUT_A,80 * x); OnRev(OUT_C,90 *...
#define turn_left5 OnFwd(OUT_A,80 * x); OnRev(OUT_C,1 * ...
#define go_forward OnFwd(OUT_A,80 * x); OnFwd(OUT_C,87 *...
#define go_back OnRev(OUT_A,100 * x); OnRev(OUT_C,85 * x...
#define turn_right1 OnRev(OUT_A,35 * x); OnFwd(OUT_C,80 ...
#define turn_right2 OnFwd(OUT_A,30 * x); OnFwd(OUT_C,100...
#define turn_right3 OnRev(OUT_A,80 * x); OnFwd(OUT_C,80 ...
#define AD SendRemoteNumber(1,MAILBOX1,01);//アームを閉...
#define AU SendRemoteNumber(1,MAILBOX1,02);//アームを上...
#define TD OnRev(OUT_B,45 * x); Wait(1000);//超音波セン...
#define TU OnFwd(OUT_B,45 * x); Wait(1000);//超音波セン...
#define CupOff SendRemoteNumber(1,MAILBOX1,03); //コッ...
#define turn_right4 OnRev(OUT_A,80 * x); OnFwd(OUT_C,60 ...
#define turn_right5 OnRev(OUT_A,80 * x); OnFwd(OUT_C,1 *...
#define turn_right6 OnRev(OUT_A,1 * x); OnFwd(OUT_C,80 *...
#define DO 523//音の高さ
#define x 0.65//かけ数
子機
#define ArmDown OnRev(OUT_A,50); Wait(500);//紙コップを...
#define ArmUp OnFwd(OUT_A,70); Wait(300);//紙コップを...
#define ArmClose OnRev(OUT_C,70); Wait(1000);//紙コップ...
#define ArmOpen OnFwd(OUT_C,30); Wait(500);//紙コップを...
#define ArmStay OnRev(OUT_AC,1);//紙コップを強くつかみ続...
ライントレースするプログラムはsubルーチンにした。
sub IKK() //ロボットの左の光センサーが線の右側に沿ってラ...
{
int BP = 0;
while (BP < 125)
{
if (SENSOR_2 < 45)
{
turn_right1;
BP++;
}
else
{
if (SENSOR_2 < 49 )
{
turn_right2;
}
else if (SENSOR_2 < 56 )
{
go_forward;
}
else if (SENSOR_2 < 58)
{
turn_left2;
}
else
{
turn_left1;
}
BP = 0;
}
Wait(1);
}
Off(OUT_AC);
PlayTone(DO,100); Wait(100);
Wait(10);
BP = 0;
}
sub DKK()//ロボットの左側の光センサーが線の左側に沿って...
{
int BP = 0;
while (BP < 170)
{
if (SENSOR_2 < 45)
{
turn_left1;
BP++;
}
else
{
if (SENSOR_2 < 49 )
{
turn_left2;
}
else if (SENSOR_2 < 54 )
{
go_forward;
}
else if (SENSOR_2 < 55)
{
turn_right3;
}
else
{
turn_right4;
}
BP = 0;
}
Wait(1);
}
Off(OUT_AC);
PlayTone(DO,100); Wait(100);
BP = 0;
}
sub DKK2()//ロボットの右側の光センサーが線の左側に沿って...
{
int BP = 0;
while (BP < 170)
{
if (SENSOR_3 < 45)
{
turn_left1;
BP++;
}
else
{
if (SENSOR_3 < 49 )
{
turn_left2;
}
else if (SENSOR_3 < 54 )
{
go_forward;
}
else if (SENSOR_3 < 55)
{
turn_right3;
}
else
{
turn_right4;
}
BP = 0;
}
Wait(1);
}
Off(OUT_AC);
PlayTone(DO,100); Wait(100);
BP = 0;
}
子機のプログラミング
task main ()
{
int msg;
while(true)
{
ReceiveRemoteNumber(MAILBOX1,true,msg);
if (msg == 01)
{
Off(OUT_AC);
ArmDown;//紙コップを下げる
ArmClose;//紙コップをつかむ
msg = 04;
}
if (msg == 02)
{
ArmStay;//紙コップをつかみ続ける
ArmUp;//紙コップを上げる
msg = 04;
}
if (msg == 03)
{
Off(OUT_AC);
ArmUp;//紙コップを上げる
ArmOpen;//紙コップを離す
}
if (msg == 04)
{
ArmStay;//紙コップを強くつかみ続ける
Off(OUT_A);
}
}
}
課題3のプログラミングはできるだけ獲得スコアを得るためにD...
α、βの紙コップの回収のプログラムをそれぞれ次のように分け...
#ref(2017b/Member/cyanomelana/Mission3/giveup.PNG,80%,回...
***紙コップの回収の流れ [#d465f118]
1 C地点まで直進した後左折して、そこからF地点までライ...
2 F地点で交差点を認識した後、超音波センサーが作動してα...
3 αの紙コップをつかむ
4 QS間の線を認識するまで後退。
5 X地点まで紙コップを運ぶ
6 αの紙コップを上げてピンポン玉を枠内に収める
7 ロボットをβの紙コップの方向に向ける
8 センサーを下ろしたあと、超音波センサーが作動してβの紙...
9 βの紙コップを取る
10 QS間の線を認識するまで後退し、X地点まで運ぶ。
11 Y地点に紙コップを置く
***1C地点まで直進した後左折して、そこからF地点までライ...
SetSensorLowspeed(S1);
SetSensorLight(S2);
SetSensorLight(S3);
go_forward;
Wait(500); //少し前進
turn_left3;
Wait(200);
while (SENSOR_2 > 45)
{
turn_left3;
}
turn_right1;
Wait(100);
IKK(); //左のセンサーを使ってF地点までライントレース
turn_left3;その場で左に回る
> Wait(1000); //左向く
***2 F地点で交差点を認識した後、超音波センサーが作動して...
int d = searchDirection(70);//コップ探す
if (d > 10)
{
fwdDist(d-10.0);//コップに近づく
}
TU; //超音波センサーをあげる
go_forward;
Wait(2900);
***3 αの紙コップをつかむ[#d998d7dc]
AD; //コップを取る
Off(OUT_AC);
Wait(3000);
***4 QS間の線を認識するまで後退。[#i3dc1092]
go_back;
Wait(500);
turn_left3;
Wait(700);
while (SENSOR_2 > 45)
{
go_back;
}
go_back;
Wait(250);
Off(OUT_AC);
Wait(200);
while (SENSOR_2 > 45)
{
go_back;
}
go_back;
Wait(450);
Off(OUT_AC);
Wait(450);
while (SENSOR_2 > 45)
{
go_back;
}
go_back;
Wait(250);
Off(OUT_AC);
Wait(200);
turn_right5;
Wait(700);
while (SENSOR_3 > 45)
{
turn_right5;
}
***5 X地点まで紙コップを運ぶ[#m92b020b]
DKK2(); //Sを左折
//Qに到着
turn_right6;
Wait(1100);
while (SENSOR_2 > 45)
{
turn_right6;
}
turn_right6;
Wait(300);
Off(OUT_AC);
Wait(1000);
***6 αの紙コップを上げてピンポン玉を枠内に収める[#p031a658]
go_forward; //Xに入る
Wait(2500);
AU; //Xでコップを上げる
Off(OUT_AC);
Wait(3000);
***7 ロボットをβの紙コップの方向に向ける[#q56fdff8]
go_back;
Wait(1200);
Off(OUT_AC);
Wait(2000);
while (SENSOR_2 > 45)
{
go_back;
}
go_back;
Wait(500);
while (SENSOR_2 > 45)
{
go_back;
}
Off(OUT_AC);
Wait(1000);
turn_right5;
Wait(500);
while (SENSOR_3 > 45)
{
turn_right5;
}
turn_right5;
Wait(600);
while (SENSOR_3 > 45)
{
turn_right5;
}
Off(OUT_AC);
Wait(1000);
go_forward;
Wait(1000);
while (SENSOR_2 > 45)
{
go_forward;
}
Off(OUT_AC);
Wait(1000);
while (SENSOR_3 > 45)
{
turn_left5;
}
turn_left5;
Wait(300);
go_forward;
Wait(500);
***8 センサーを下ろしたあと、超音波センサーが作動してβの...
TD; //超音波下げる
Off(OUT_AC);
Wait(2000);
d = searchDirection(120);//コップ探す
***9 βの紙コップを取る[#i6e93fd1]
if (d > 10)
{
fwdDist(d-10.0);//コップに近づく
}
TU; //超音波センサーをあげる
Off(OUT_AC);
Wait(1000);
go_forward;
Wait(1300);
Off(OUT_AC);
Wait(1000);
turn_left3;
Wait(1400);
Off(OUT_AC);
Wait(2000);
go_forward;
Wait(2300);
go_back;
Wait(100);
Off(OUT_AC);
Wait(500);
AD; //コップを取る(重ねる)
Off(OUT_AC);
Wait(3000);
***10 QS間の線を認識するまで後退しX地点まで運ぶ[#n1af91...
go_back;
Wait(1900);
turn_right3;
Wait(1400);
go_back;
Wait(1300);
while (SENSOR_2 > 45)
{
go_back;
}
turn_left5;
Wait(1200);
while (SENSOR_3 > 45)
{
turn_left5;
}
turn_right5;
Wait(300);
go_forward;
Wait(1000);
while (SENSOR_2 > 45)
{
go_forward; //Xまで直進
}
***11 Y地点に紙コップを置く[#ycea5f4d]
AU; //Xでコップを上げる
turn_left3;//少し方向を調整する
Wait(200);
go_back;
Wait(300);
CupOff;//紙コップをY地点に置く
*結果・感想・反省点 [#vc8eefe7]
**結果 [#d82c4f75]
結果は0点。動いてほしい方向にロボットは動かなかった。超...
**反省点 [#m7a72ca1]
***ロボットについて [#x1cc9378]
・NXT本体の取り付け位置を地面から高い位置にしてしまったの...
・ロボットの後輪を二つ取り付けることでスムーズに動けるよ...
・ロボットの縦方向に筋交いを取り付けたことで少し強度をつ...
***プログラムについて [#t7817fca]
・ロボットの作成に多くの時間を割いてしまったためしっかり...
**感想 [#j5b18dd1]
・どのようなロボットを作成すれば効率よく紙コップを回収で...
・課題1〜3のロボットとプログラミングを作成して、プログ...
終了行:
#contents
[[2017b/Member]]
*課題3 [#b9fd6f1e]
課題2で使用したコースにピンポン玉が入った紙コップが指定...
#ref(2017b/Member/cyanomelana/Mission3/2017b-mission3.png...
今回の課題3は作業内容がとても多いので、チーム内でロボッ...
***ルールの詳細 [#f899a952]
ルールの詳細はこちらのリンクにありますので参考にしてくだ...
http://yakushi.shinshu-u.ac.jp/robotics/?2017b%2FMission3...
***チームメンバー [#oa518bc5]
横川 友也~
大谷 風吾http://yakushi.shinshu-u.ac.jp/robotics/?cmd=edi...
カ デンエンhttp://yakushi.shinshu-u.ac.jp/robotics/?2017b...
チョウ カイドウhttp://yakushi.shinshu-u.ac.jp/robotics/?2...
(他のメンバーのレポートも参考にしてください。)
*作成したロボット[#sd56a80b]
作成したロボットは一体で、コップを見つける、つかむ、重ね...
#ref(2017b/Member/cyanomelana/Mission3/robo2.PNG,50%,ロボ...
#ref(2017b/Member/cyanomelana/Mission3/robo3.PNG,70%,ロボ...
**ロボットの詳細 [#jbd98e7d]
このロボットは前輪駆動となっており、ロボットの車体がとて...
#ref(2017b/Member/cyanomelana/Mission3/foto1.PNG,80%,課題...
***ロボットの骨組み [#ea7693eb]
このロボットは一体でミッションをこなすためにロボットにNXT...
#ref(2017b/Member/cyanomelana/Mission3/roboex3.gif,80%,ロ...
#ref(2017b/Member/cyanomelana/Mission3/kaizen.PNG,80%,改善)
#ref(2017b/Member/cyanomelana/Mission3/katamukahen.PNG,80...
***各種センサーの取り付け位置 [#md272077]
光センサー
下の画像のようにロボットの左右両方に光センサーを取り付け...
#ref(2017b/Member/cyanomelana/Mission3/hikari.PNG,80%,光...
超音波センサー
コップを見つける超音波センサーはロボット前側中央に取り付...
しかし、「主なプログラミングによる動作の流れ」の項目で詳...
#ref(2017b/Member/cyanomelana/Mission3/tyouonn.PNG,80%,超...
#ref(2017b/Member/cyanomelana/Mission3/tooreru.gif,80%,紙...
***紙コップをつかむ機構 [#hefd249c]
紙コップをつかむ機構は片方の腕を固定し、もう片方の腕をモ...
上から見た図
#ref(2017b/Member/cyanomelana/Mission3/torutoru.gif,80%,...
横から見た図
#ref(2017b/Member/cyanomelana/Mission3/ccc.gif,80%,紙コッ...
***紙コップを上げ下げする機構 [#hcce8a0e]
紙コップを上げ下げするモーターに紙コップをつかむモーター...
#ref(2017b/Member/cyanomelana/Mission3/bbb.gif,80%,紙コッ...
*ロボットの紙コップを取得するときの一連の動きは「主なプ...
*作成したプログラミング [#ye49cd86]
課題3のプログラミングは2機のNXT間でBluetouthを介して通...
**基本的な動作のプログラミング [#t1b7bd8d]
課題3に必要な主なプログラミングは「紙コップを見つけるプ...
***紙コップを見つけて近づくプログラミング [#s55f5497]
どのようにロボットから一番近い紙コップを見つけるのか
ロボットから一番近い紙コップを見つけるためにはセンサーが...
#ref(2017b/Member/cyanomelana/Mission3/ggg.gif,50%,ロボッ...
紙コップを見つけて近づくプログラムは次の1〜4の手順が行わ...
?int searchDirection(long ang)によってどれくらいの角度の...
?指定した角度を回るためにはどのくらいタイヤを回せばよい...
?紙コップに一番近い位置の角度を記憶したらその角度にロボ...
?int searchDirection(long ang)によって一番近い紙コップま...
const float diameter = 5.45; //タイヤ直径
const float track = 10.35; //タイヤトレッド幅
const float pi = 3.1415; //円周率
void fwdDist(float d) //距離 dcm前進 //
{
long angle = d/(diameter*pi)*360.0; //必要なタイヤの回...
RotateMotorEx(OUT_AC, SPEED_SLOW, angle, 0, true ,true);
}
void turnAng(long ang) //角度ang度の時計回りの旋回
{
long angle = track/diameter * ang;
RotateMotorEx(OUT_AC, SPEED_SLOW, angle, 100, true, true);
}
int searchDirection(long ang) //現在の方向を中心にang度...
//障害物までの距離を...
{
long tacho_min; //最も近い距離を実現するタイヤの回転数
int d_min = 300; //最も近い距離の仮の最小値(十分大きく...
long angle = (track/diameter)*ang; //旋回角度からタイヤ...
turnAng(ang/2); //指定された角度の半分を旋回
ResetTachoCount(OUT_AC); //角度計測をリセット
OnFwdSync(OUT_AC,SPEED_SLOW,-100); //半時計回りに旋回
while(MotorTachoCount(OUT_A)<=angle)
{
if (SensorUS(S1)<d_min)
{ //現在の距離が借りの最小値より小さい場合
d_min = SensorUS(S1); //仮の最小値を更新
tacho_min = MotorTachoCount(OUT_A); //この時のタイヤの回...
}
}
OnFwdSyncEx(OUT_AC,SPEED_SLOW,100,RESET_NONE);
until(MotorTachoCount(OUT_A)<=tacho_min || SensorUS(S1)<...
Wait(14); //微調整
Off(OUT_AC);Wait(500);
return d_min;
}
***ライントレースをするプログラム [#i76f8301]
ライントレースするプログラムの詳細は課題2のレポートで詳し...
http://yakushi.shinshu-u.ac.jp/robotics/#g9f1eef7
**主なプログラミングによる動作の流れ [#se4a2410]
ロボットの基本的な動作の流れはつぎのとおりである。
?紙コップを見つける
?センサーを上げる
?紙コップをつかむ
?X地点に向かう
?紙コップを持ち上げる
?センサーを下げる
?紙コップを見つける
***?見つける [#kbfb3162]
ライントレースを使い、紙コップの近くに到着しすると、セン...
#ref(2017b/Member/cyanomelana/Mission3/sensorvartical2.jp...
***?センサーを上げる [#if283a49]
一番近い紙コップを見つけ次第その紙コップの方向にロボット...
#ref(2017b/Member/cyanomelana/Mission3/age.gif,70%,ロボッ...
***?紙コップをつかむ [#j837269e]
センサーを上げた後、紙コップをつかめる位置まで紙コップに...
#ref(2017b/Member/cyanomelana/Mission3/firstcatch.jpg,30%...
***?X地点に向かう [#n6742972]
紙コップをつかんだ後、ライントレースして、X地点まで紙コッ...
***?紙コップを持ち上げる [#w2231491]
X地点の中に紙コップが入ると、紙コップを上げて紙コップの中...
#ref(2017b/Member/cyanomelana/Mission3/fff.gif,80%,ロボッ...
***?センサーを下げる [#r88dd3f2]
ピンポン玉を開放したら、後ろに進みながらX地点の枠を出て、...
#ref(2017b/Member/cyanomelana/Mission3/eee.gif,80%,ロボッ...
***?見つける [#t73e2e58]
紙コップを一個取得した次の動作として、センサーで2つ目の紙...
**プログラミングの全体 [#k9f91207]
まず親機、子機のdefineを次のように定義した。
親機
#define SPEED 100
#define SPEED_SLOW 60
#define turn_left1 OnFwd(OUT_A,80 * x); OnRev(OUT_C,35 *...
#define turn_left2 OnFwd(OUT_A,100 * x); OnFwd(OUT_C,40 ...
#define turn_left3 OnFwd(OUT_A,80 * x); OnRev(OUT_C,90 *...
#define turn_left5 OnFwd(OUT_A,80 * x); OnRev(OUT_C,1 * ...
#define go_forward OnFwd(OUT_A,80 * x); OnFwd(OUT_C,87 *...
#define go_back OnRev(OUT_A,100 * x); OnRev(OUT_C,85 * x...
#define turn_right1 OnRev(OUT_A,35 * x); OnFwd(OUT_C,80 ...
#define turn_right2 OnFwd(OUT_A,30 * x); OnFwd(OUT_C,100...
#define turn_right3 OnRev(OUT_A,80 * x); OnFwd(OUT_C,80 ...
#define AD SendRemoteNumber(1,MAILBOX1,01);//アームを閉...
#define AU SendRemoteNumber(1,MAILBOX1,02);//アームを上...
#define TD OnRev(OUT_B,45 * x); Wait(1000);//超音波セン...
#define TU OnFwd(OUT_B,45 * x); Wait(1000);//超音波セン...
#define CupOff SendRemoteNumber(1,MAILBOX1,03); //コッ...
#define turn_right4 OnRev(OUT_A,80 * x); OnFwd(OUT_C,60 ...
#define turn_right5 OnRev(OUT_A,80 * x); OnFwd(OUT_C,1 *...
#define turn_right6 OnRev(OUT_A,1 * x); OnFwd(OUT_C,80 *...
#define DO 523//音の高さ
#define x 0.65//かけ数
子機
#define ArmDown OnRev(OUT_A,50); Wait(500);//紙コップを...
#define ArmUp OnFwd(OUT_A,70); Wait(300);//紙コップを...
#define ArmClose OnRev(OUT_C,70); Wait(1000);//紙コップ...
#define ArmOpen OnFwd(OUT_C,30); Wait(500);//紙コップを...
#define ArmStay OnRev(OUT_AC,1);//紙コップを強くつかみ続...
ライントレースするプログラムはsubルーチンにした。
sub IKK() //ロボットの左の光センサーが線の右側に沿ってラ...
{
int BP = 0;
while (BP < 125)
{
if (SENSOR_2 < 45)
{
turn_right1;
BP++;
}
else
{
if (SENSOR_2 < 49 )
{
turn_right2;
}
else if (SENSOR_2 < 56 )
{
go_forward;
}
else if (SENSOR_2 < 58)
{
turn_left2;
}
else
{
turn_left1;
}
BP = 0;
}
Wait(1);
}
Off(OUT_AC);
PlayTone(DO,100); Wait(100);
Wait(10);
BP = 0;
}
sub DKK()//ロボットの左側の光センサーが線の左側に沿って...
{
int BP = 0;
while (BP < 170)
{
if (SENSOR_2 < 45)
{
turn_left1;
BP++;
}
else
{
if (SENSOR_2 < 49 )
{
turn_left2;
}
else if (SENSOR_2 < 54 )
{
go_forward;
}
else if (SENSOR_2 < 55)
{
turn_right3;
}
else
{
turn_right4;
}
BP = 0;
}
Wait(1);
}
Off(OUT_AC);
PlayTone(DO,100); Wait(100);
BP = 0;
}
sub DKK2()//ロボットの右側の光センサーが線の左側に沿って...
{
int BP = 0;
while (BP < 170)
{
if (SENSOR_3 < 45)
{
turn_left1;
BP++;
}
else
{
if (SENSOR_3 < 49 )
{
turn_left2;
}
else if (SENSOR_3 < 54 )
{
go_forward;
}
else if (SENSOR_3 < 55)
{
turn_right3;
}
else
{
turn_right4;
}
BP = 0;
}
Wait(1);
}
Off(OUT_AC);
PlayTone(DO,100); Wait(100);
BP = 0;
}
子機のプログラミング
task main ()
{
int msg;
while(true)
{
ReceiveRemoteNumber(MAILBOX1,true,msg);
if (msg == 01)
{
Off(OUT_AC);
ArmDown;//紙コップを下げる
ArmClose;//紙コップをつかむ
msg = 04;
}
if (msg == 02)
{
ArmStay;//紙コップをつかみ続ける
ArmUp;//紙コップを上げる
msg = 04;
}
if (msg == 03)
{
Off(OUT_AC);
ArmUp;//紙コップを上げる
ArmOpen;//紙コップを離す
}
if (msg == 04)
{
ArmStay;//紙コップを強くつかみ続ける
Off(OUT_A);
}
}
}
課題3のプログラミングはできるだけ獲得スコアを得るためにD...
α、βの紙コップの回収のプログラムをそれぞれ次のように分け...
#ref(2017b/Member/cyanomelana/Mission3/giveup.PNG,80%,回...
***紙コップの回収の流れ [#d465f118]
1 C地点まで直進した後左折して、そこからF地点までライ...
2 F地点で交差点を認識した後、超音波センサーが作動してα...
3 αの紙コップをつかむ
4 QS間の線を認識するまで後退。
5 X地点まで紙コップを運ぶ
6 αの紙コップを上げてピンポン玉を枠内に収める
7 ロボットをβの紙コップの方向に向ける
8 センサーを下ろしたあと、超音波センサーが作動してβの紙...
9 βの紙コップを取る
10 QS間の線を認識するまで後退し、X地点まで運ぶ。
11 Y地点に紙コップを置く
***1C地点まで直進した後左折して、そこからF地点までライ...
SetSensorLowspeed(S1);
SetSensorLight(S2);
SetSensorLight(S3);
go_forward;
Wait(500); //少し前進
turn_left3;
Wait(200);
while (SENSOR_2 > 45)
{
turn_left3;
}
turn_right1;
Wait(100);
IKK(); //左のセンサーを使ってF地点までライントレース
turn_left3;その場で左に回る
> Wait(1000); //左向く
***2 F地点で交差点を認識した後、超音波センサーが作動して...
int d = searchDirection(70);//コップ探す
if (d > 10)
{
fwdDist(d-10.0);//コップに近づく
}
TU; //超音波センサーをあげる
go_forward;
Wait(2900);
***3 αの紙コップをつかむ[#d998d7dc]
AD; //コップを取る
Off(OUT_AC);
Wait(3000);
***4 QS間の線を認識するまで後退。[#i3dc1092]
go_back;
Wait(500);
turn_left3;
Wait(700);
while (SENSOR_2 > 45)
{
go_back;
}
go_back;
Wait(250);
Off(OUT_AC);
Wait(200);
while (SENSOR_2 > 45)
{
go_back;
}
go_back;
Wait(450);
Off(OUT_AC);
Wait(450);
while (SENSOR_2 > 45)
{
go_back;
}
go_back;
Wait(250);
Off(OUT_AC);
Wait(200);
turn_right5;
Wait(700);
while (SENSOR_3 > 45)
{
turn_right5;
}
***5 X地点まで紙コップを運ぶ[#m92b020b]
DKK2(); //Sを左折
//Qに到着
turn_right6;
Wait(1100);
while (SENSOR_2 > 45)
{
turn_right6;
}
turn_right6;
Wait(300);
Off(OUT_AC);
Wait(1000);
***6 αの紙コップを上げてピンポン玉を枠内に収める[#p031a658]
go_forward; //Xに入る
Wait(2500);
AU; //Xでコップを上げる
Off(OUT_AC);
Wait(3000);
***7 ロボットをβの紙コップの方向に向ける[#q56fdff8]
go_back;
Wait(1200);
Off(OUT_AC);
Wait(2000);
while (SENSOR_2 > 45)
{
go_back;
}
go_back;
Wait(500);
while (SENSOR_2 > 45)
{
go_back;
}
Off(OUT_AC);
Wait(1000);
turn_right5;
Wait(500);
while (SENSOR_3 > 45)
{
turn_right5;
}
turn_right5;
Wait(600);
while (SENSOR_3 > 45)
{
turn_right5;
}
Off(OUT_AC);
Wait(1000);
go_forward;
Wait(1000);
while (SENSOR_2 > 45)
{
go_forward;
}
Off(OUT_AC);
Wait(1000);
while (SENSOR_3 > 45)
{
turn_left5;
}
turn_left5;
Wait(300);
go_forward;
Wait(500);
***8 センサーを下ろしたあと、超音波センサーが作動してβの...
TD; //超音波下げる
Off(OUT_AC);
Wait(2000);
d = searchDirection(120);//コップ探す
***9 βの紙コップを取る[#i6e93fd1]
if (d > 10)
{
fwdDist(d-10.0);//コップに近づく
}
TU; //超音波センサーをあげる
Off(OUT_AC);
Wait(1000);
go_forward;
Wait(1300);
Off(OUT_AC);
Wait(1000);
turn_left3;
Wait(1400);
Off(OUT_AC);
Wait(2000);
go_forward;
Wait(2300);
go_back;
Wait(100);
Off(OUT_AC);
Wait(500);
AD; //コップを取る(重ねる)
Off(OUT_AC);
Wait(3000);
***10 QS間の線を認識するまで後退しX地点まで運ぶ[#n1af91...
go_back;
Wait(1900);
turn_right3;
Wait(1400);
go_back;
Wait(1300);
while (SENSOR_2 > 45)
{
go_back;
}
turn_left5;
Wait(1200);
while (SENSOR_3 > 45)
{
turn_left5;
}
turn_right5;
Wait(300);
go_forward;
Wait(1000);
while (SENSOR_2 > 45)
{
go_forward; //Xまで直進
}
***11 Y地点に紙コップを置く[#ycea5f4d]
AU; //Xでコップを上げる
turn_left3;//少し方向を調整する
Wait(200);
go_back;
Wait(300);
CupOff;//紙コップをY地点に置く
*結果・感想・反省点 [#vc8eefe7]
**結果 [#d82c4f75]
結果は0点。動いてほしい方向にロボットは動かなかった。超...
**反省点 [#m7a72ca1]
***ロボットについて [#x1cc9378]
・NXT本体の取り付け位置を地面から高い位置にしてしまったの...
・ロボットの後輪を二つ取り付けることでスムーズに動けるよ...
・ロボットの縦方向に筋交いを取り付けたことで少し強度をつ...
***プログラムについて [#t7817fca]
・ロボットの作成に多くの時間を割いてしまったためしっかり...
**感想 [#j5b18dd1]
・どのようなロボットを作成すれば効率よく紙コップを回収で...
・課題1〜3のロボットとプログラミングを作成して、プログ...
ページ名: