2019a/Member/Kasai/Mission3
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
検索
|
最終更新
|
ヘルプ
|
ログイン
]
開始行:
[[2019a/Member]]
目次
#contents
*課題3の概要 [#x60ce276]
**課題 [#k9b9a0d1]
ボール運搬ロボット
各場所に配置されている4つのボールを運搬しトレーの中に入...
&ref(2019a/Member/Kasai/Mission3/map3.png);
**フィールドの説明 [#n4781383]
-フィールドは課題2で使用した紙を使用する。
-生協のお弁当の四角いプラ容器2つをそれぞれ円内に置き、片...
-残りの2個の玉は課題2と同じ位置に置く。その際、ゴムタイヤ...
-プラ容器には色をつけたり文字や記号を書いてもよい。
-プラ容器は両面テープ等でフィールドに固定してもよい。
-枚の紙の境界にはそれぞれ幅1cm、合計2cmの黒線を描いてもよ...
**基本ルール [#o4d86912]
-競技時間は審判が続行不能と判断するまで、あるいはリタイア...
-図のA地点または(および)A'地点からスタートする。ただし...
-開始の合図から5秒以内にスタートボタンを押す作業を完了す...
-競技が終了するまで、ロボットに触ったり人間が遠隔で操作し...
-途中でうまく動かなくなった場合、1回限り再スタートするこ...
-競技終了後、ロボットが、ゴールのプラ容器に触れていてはい...
-競技終了後、もともと玉が入っていたプラ容器が、ゴールのプ...
**基本得点の計算方法 [#o929603d]
-プラ容器内の玉を1個運べば8点。二つとも運べば20点。
-L地点とL'地点の玉をどちらか1個運べば4点、2個とも運べば12...
-競技終了後、ゴールのプラ容器が完全に円から出しまった場合...
-競技終了後、ゴールのプラ容器の半分以上が円から出ていれば...
-競技終了後、ゴールのプラ容器にもとのプラ容器が触れていれ...
-競技終了後、ゴールのプラ容器にもとのプラ容器が触れていれ...
-競技終了後、ゴールのプラ容器にロボットが触れていれば、も...
*ロボットについて [#yb212537]
私たちの班は,ボールを一つずつ運ぶタイプのロボットを制作...
&ref(2019a/Member/Kasai/Mission3/zenntai_zou.jpg,50%);
&ref(2019a/Member/Kasai/Mission3/zenntai_mae.jpg,50%); &r...
**本体部分 [#f585eaed]
できるだけ小さくコンパクトになるように作った.本体を背面...
&ref(2019a/Member/Kasai/Mission3/asimawari.jpg,20%);&ref(...
**アームとその周辺 [#eb33daab]
アームも同様にシンプルに制作した.モーターに直接部品をつ...
&ref(2019a/Member/Kasai/Mission3/arm1.png,50%);&ref(2019a...
因みに,アームが重すぎてそのままでは上げ下げできなかった...
&ref(2019a/Member/Kasai/Mission3/sadou_hojo.jpg,60%);
*作戦 [#sc81602d]
**ルートについて [#jec3f046]
私たちの班は一つずつボールを運ぶロボットを作ったため,合...
&ref(2019a/Member/Kasai/Mission3/sakusenn_route.jpg,100%);
?A'を出発しL'のボールを掴み,旋回して容器に入れる.
&ref(2019a/Member/Kasai/Mission3/route1.png,50%);
?次に,そこから直線を突っ切って容器の中のピンポン玉を掴み...
&ref(2019a/Member/Kasai/Mission3/route2.png,50%);
?同じく容器の中のボールをゴールの容器に持っていき入れる.
&ref(2019a/Member/Kasai/Mission3/route3.png,50%);
?最後に,Lにあるボールを掴みゴールの容器に入れる.
&ref(2019a/Member/Kasai/Mission3/route4.png,50%);
*プログラムについて [#y8027e38]
まず,
-マスター:左車輪,右車輪,アームの上げ下げ
-スレーヴ:ボールを掴む動作
で制御している.
**共通するプログラム [#q89589b4]
2台のNXCで通信を行うために、以下のようにマクロを定義をし...
#define SIGNALON1 11
#define SIGNALOFF1 12
#define SIGNALON2 13
#define SIGNALOFF2 14
**アームのプログラム [#ca683c72]
***アームの上げ下げのマクロ [#h1926a7c]
#define arm_down OnFwd(OUT_A,25);Wait(1500);Off(OUT_A); ...
#define arm_up OnRev(OUT_A,35);Wait(1500);Off(OUT_A); /...
***スレーヴ側の制御 [#m1d36065]
#define SIGNALON1 11
#define SIGNALOFF1 12
#define SIGNALON2 13
#define SIGNALOFF2 14
#define CONN 1
task main()
{
int msg;
while(true){
ReceiveRemoteNumber(MAILBOX1,true,msg);
if(msg==SIGNALON1){ //SIGNALON1を受...
OnRev(OUT_A,20);Wait(1000); //ボールを掴む
}else if(msg==SIGNALOFF1){ //SIGNALOFF1を...
Off(OUT_A); //モータAを止める
}else if(msg==SIGNALON2){ //SIGNALON2を受...
OnFwd(OUT_A,20);Wait(1000); //ボールを放す
}else if(msg==SIGNALOFF2){ //SIGNALOFF2を...
Off(OUT_A); //モータAを止める
}
}
}
**ライントレース [#v6dd6f42]
光センサーの数値は以下の通りマクロで定義した.
#define black 30
#define white 60
#define lightgray 50
#define darkgray 39
#define center 45
&ref(2019a/Member/Kasai/Mission3/light_sennser.png,40%);
ライントレースのプログラムは課題2の時とほとんど同じもの...
***マクロ [#g6c5fae1]
基本的な動作,メッセージの値を定義する.
#define CONN 1
#define SIGNALON1 11
#define SIGNALOFF1 12
#define SIGNALON2 13
#define SIGNALOFF2 14
#define turn_right OnFwd(OUT_C,25);OnRev(OUT_B,23); //...
#define turn_left OnFwd(OUT_B,28);OnRev(OUT_C,20); //左折
#define rotate_right OnFwd(OUT_C,25);OnRev(OUT_B,22); /...
#define rotate_left OnFwd(OUT_B,28);OnRev(OUT_C,15); //...
#define go_straight OnFwd(OUT_B,23);OnFwd(OUT_C,20); //...
#define go_straight2 OnFwd(OUT_B,20);OnFwd(OUT_C,17); /...
#define turn OnRev(OUT_C,20);OnFwd(OUT_B,28);Wait(3200);...
#define turn2 OnRev(OUT_B,28);OnFwd(OUT_C,20);Wait(1500)...
#define sakittyo OnFwd(OUT_C,20);OnFwd(OUT_B,23);Wait(11...
#define turn3 OnRev(OUT_B,30);Wait(4800);Off(OUT_BC); /...
#define turn4 OnRev(OUT_B,30);Wait(5200);Off(OUT_BC); //
#define back OnRev(OUT_C,20);OnRev(OUT_B,28);Wait(3000);...
**サブルーチン [#x778946d]
***左側のライントレース [#l1d9eb72]
sub followline_L(int stop_time)
{
long t0=CurrentTick();
while(CurrentTick()-t0<stop_time){ //現在の時刻が一...
if(SENSOR_1<black){ //センサーが黒の時
rotate_left; //左旋回
}else if(SENSOR_1<darkgray){ //センサーが黒灰...
turn_left; //左折
}else if(SENSOR_1>lightgray){ //センサーが白灰...
turn_right; //右折
t0=CurrentTick(); //時間をリセット
}else if(SENSOR_1<center){ //明るさ45以...
go_straight; //直進
t0=CurrentTick(); //時間をリセット
}else{ //それ以外は
rotate_right; //右旋回
t0=CurrentTick(); //時間をリセット
}
}
Off(OUT_BC); //時刻が一定の値を超えると停止
Wait(1000); //1秒間停止
}
***右側のライントレース [#a40d4d55]
sub followline_R(int stop_time)
{
long t0=CurrentTick();
while(CurrentTick()-t0<stop_time){ //現在の時刻が一...
if(SENSOR_1<black){ //センサーが黒の時
rotate_right; //右旋回
}else if(SENSOR_1<darkgray){ //センサーが黒灰...
turn_right; //右折
}else if(SENSOR_1>lightgray){ //センサーが白灰...
turn_left; //左折
t0=CurrentTick(); //時間をリセット
}else if(SENSOR_1<center){ //センサーが...
go_straight; //直進
t0=CurrentTick(); //時間をリセット
}else{ //それ以外は
rotate_left; //左旋回
t0=CurrentTick(); //時間をリセット
}
}
Off(OUT_BC); //一定の時間を超えると停止
Wait(1000); //一秒間停止
}
***右側のライントレース(直進の出力が弱いパターン) [#abb2b...
sub followline_R2(int stop_time)
{
long t0=CurrentTick();
while(CurrentTick()-t0<stop_time){ //時刻がある一...
if(SENSOR_1<black){ //黒なら
rotate_right; //右旋回
t0=CurrentTick(); //時間をリセット
}else if(SENSOR_1<darkgray){ //灰黒色なら
turn_right; //右折
t0=CurrentTick(); //時間をリセット
}else if(SENSOR_1>lightgray){ //灰白色なら
turn_left; //左折
}else if(SENSOR_1<center){ //明るさ45...
go_straight2; //ゆっくり直進
t0=CurrentTick(); //時間をリセット
}else{ //それ以外なら
rotate_left; //左旋回
}
}
Off(OUT_BC); //停止
Wait(2000); //2秒間停止
}
***黒線を横断 [#g2397abe]
-黒を見つけるまで直進
sub Blackto_White()
{
while(SENSOR_1<lightgray){ //光センサーの値が白灰よ...
OnFwd(OUT_C,25);
OnFwd(OUT_B,25); //直進
}
Off(OUT_BC); //白灰より大きくなると止...
}
-白を見つけるまで直進
sub Whiteto_Black()
{
while(SENSOR_1>darkgray){ //光センサーの値が黒灰よ...
OnFwd(OUT_C,25);
OnFwd(OUT_B,25); //直進
}
Off(OUT_BC); //黒灰よりも大きくなると...
}
この2つを組み合わせることで黒線を一本通り越せる.
***その他 [#b4e1022d]
ライントレースの右側と左側を入れ替えるときなどに使う.
-黒を見つけるまで右旋回
sub Whiteto_Black_R()
{
while(SENSOR_1>darkgray){ //光センサーの値が黒灰よ...
OnFwd(OUT_C,25);
OnRev(OUT_B,25); //右旋回
}
Off(OUT_BC); //黒灰よりも小さくなると...
}
-白を見つけるまで右旋回
sub Blackto_White_R()
{
while(SENSOR_1<darkgray){ //光センサーの値が黒灰よ...
OnFwd(OUT_C,25);
OnRev(OUT_B,25); //右旋回
}
Off(OUT_BC); //黒灰よりも大きくなると...
}
-白を見つけるまで左旋回
sub Blackto_White_L()
{
while(SENSOR_1<lightgray){ //光センサーの値が白灰よ...
OnFwd(OUT_B,25);
OnRev(OUT_C,25); //左旋回
}
Off(OUT_BC); //白灰より大きくなると止...
}
-黒を見つけるまで左旋回
sub Whiteto_Black_L()
{
while(SENSOR_1>black){ //光センサーの値が黒より大き...
OnFwd(OUT_B,25);
OnRev(OUT_C,25); //左旋回
}
Off(OUT_BC); //黒より小さいとき
}
**マスターのプログラム [#h247f23a]
task main()
{
SetSensorLight(S1);
RemoteStartProgram(CONN,"kodomo.nxc");
followline_R(200);
Blackto_White();
followline_L(150);
Blackto_White_R();
followline_R2(150);
SendRemoteNumber(CONN,MAILBOX1,SIGNALON1);
Wait(1000);
arm_up;
turn;
SendRemoteNumber(CONN,MAILBOX1,SIGNALON2);
Wait(1000);
followline_R(150);
Blackto_White_L();
followline_L(100);
Blackto_White();
Whiteto_Black();
Blackto_White();
Whiteto_Black();
Blackto_White();
Whiteto_Black();
Blackto_White();
followline_R(150);
Blackto_White();
turn2;
sakittyo;
arm_down;
SendRemoteNumber(CONN,MAILBOX1,SIGNALON1);
Wait(1000);
arm_up;
turn3;
Whiteto_Black();
Blackto_White();
Whiteto_Black();
Blackto_White();
followline_R(200);
Blackto_White();
turn2;
SendRemoteNumber(CONN,MAILBOX1,SIGNALON2);
Wait(1000);
turn3;
Whiteto_Black();
Blackto_White();
Whiteto_Black();
Blackto_White();
followline_R(200);
Blackto_White();
turn2;
sakittyo;
arm_down;
SendRemoteNumber(CONN,MAILBOX1,SIGNALON1);
Wait(1000);
arm_up;
turn3;
Whiteto_Black();
Blackto_White();
Whiteto_Black();
Blackto_White();
Blackto_White_R();
followline_R(200);
Blackto_White();
turn2;
SendRemoteNumber(CONN,MAILBOX1,SIGNALON2);
Wait(1500);
turn4;
arm_down
Whiteto_Black();
Blackto_White();
Whiteto_Black();
Blackto_White();
followline_L(200);
Blackto_White();
followline_R(200);
Blackto_White();
followline_L(200);
Blackto_White();
followline_R(200);
Blackto_White();
followline_L(150);
Blackto_White_R();
followline_R2(125);
SendRemoteNumber(CONN,MAILBOX1,SIGNALON1);
Wait(1000);
arm_up;
turn;
followline_R(100);
Blackto_White_L();
followline_L(100);
Blackto_White();
Whiteto_Black();
Blackto_White();
Whiteto_Black();
Blackto_White();
Whiteto_Black();
Blackto_White();
followline_R(200);
Blackto_White();
turn2;
sakittyo;
SendRemoteNumber(CONN,MAILBOX1,SIGNALON2);
Wait(1000);
}
ゴールのトレーをGT,もともとボールを入れてあるトレーをST...
一つ目の塊は,M'からスタートしL'のボールを掴んでGTに入れ...
二つ目の塊は,L'のボールを入れた後STまで行き,ボールを掴...
三つ目の塊は,STからGTまで行き,ボールを入れるプログラム
四つ目の塊は,ボールを入れてからまたSTまで行き,ボールを...
五つ目の塊は,ボールを掴んでからGTまで行きゴールするまで...
六つ目の塊は,STからLまで移動し,Lのボールを掴むまでのプ...
七つ目の塊は,LからGTまで移動してゴールし,トレーから少し...
である.
*完成したプログラム [#zf89ae7a]
#define CONN 1
#define SIGNALON1 11
#define SIGNALOFF1 12
#define SIGNALON2 13
#define SIGNALOFF2 14
#define turn_right OnFwd(OUT_C,25);OnRev(OUT_B,23);
#define turn_left OnFwd(OUT_B,28);OnRev(OUT_C,20);
#define rotate_right OnFwd(OUT_C,25);OnRev(OUT_B,22);
#define rotate_left OnFwd(OUT_B,28);OnRev(OUT_C,15);
#define go_straight OnFwd(OUT_B,23);OnFwd(OUT_C,20);
#define go_straight2 OnFwd(OUT_B,20);OnFwd(OUT_C,17);
#define turn OnRev(OUT_C,20);OnFwd(OUT_B,28);Wait(3200);...
#define turn2 OnRev(OUT_B,28);OnFwd(OUT_C,20);Wait(1500)...
#define sakittyo OnFwd(OUT_C,20);OnFwd(OUT_B,23);Wait(11...
#define turn3 OnRev(OUT_B,30);Wait(4800);Off(OUT_BC);
#define turn4 OnRev(OUT_B,30);Wait(5200);Off(OUT_BC);
#define back OnRev(OUT_C,20);OnRev(OUT_B,28);Wait(3000);...
#define osidasi OnFwd(OUT_BC,100);Wait(100);Off(OUT_BC);
#define arm_down OnFwd(OUT_A,25);Wait(1500);Off(OUT_A);
#define arm_up OnRev(OUT_A,35);Wait(1500);Off(OUT_A);
#define black 30
#define white 60
#define lightgray 50
#define darkgray 39
#define center 45
sub followline_L(int stop_time)
{
long t0=CurrentTick();
while(CurrentTick()-t0<stop_time){
if(SENSOR_1<black){
rotate_left;
}else if(SENSOR_1<darkgray){
turn_left;
}else if(SENSOR_1>lightgray){
turn_right;
t0=CurrentTick();
}else if(SENSOR_1<center){
go_straight;
t0=CurrentTick();
}else{
rotate_right;
t0=CurrentTick();
}
}
Off(OUT_BC);
Wait(1000);
}
sub followline_R(int stop_time)
{
long t0=CurrentTick();
while(CurrentTick()-t0<stop_time){
if(SENSOR_1<black){
rotate_right;
}else if(SENSOR_1<darkgray){
turn_right;
}else if(SENSOR_1>lightgray){
turn_left;
t0=CurrentTick();
}else if(SENSOR_1<center){
go_straight;
t0=CurrentTick();
}else{
rotate_left;
t0=CurrentTick();
}
}
Off(OUT_BC);
Wait(1000);
}
sub followline_R2(int stop_time)
{
long t0=CurrentTick();
while(CurrentTick()-t0<stop_time){
if(SENSOR_1<black){
rotate_right;
t0=CurrentTick();
}else if(SENSOR_1<darkgray){
turn_right;
t0=CurrentTick();
}else if(SENSOR_1>lightgray){
turn_left;
}else if(SENSOR_1<center){
go_straight2;
t0=CurrentTick();
}else{
rotate_left;
}
}
Off(OUT_BC);
Wait(2000);
}
sub Blackto_White()
{
while(SENSOR_1<lightgray){
OnFwd(OUT_C,25);
OnFwd(OUT_B,25);
}
Off(OUT_BC);
}
sub Whiteto_Black()
{
while(SENSOR_1>darkgray){
OnFwd(OUT_C,25);
OnFwd(OUT_B,25);
}
Off(OUT_BC);
}
sub Whiteto_Black_R()
{
while(SENSOR_1>darkgray){
OnFwd(OUT_C,25);
OnRev(OUT_B,25);
}
Off(OUT_BC);
}
sub Blackto_White_R()
{
while(SENSOR_1<darkgray){
OnFwd(OUT_C,25);
OnRev(OUT_B,25);
}
Off(OUT_BC);
}
sub Blackto_White_L()
{
while(SENSOR_1<lightgray){
OnFwd(OUT_B,25);
OnRev(OUT_C,25);
}
Off(OUT_BC);
}
sub Whiteto_Black_L()
{
while(SENSOR_1>black){
OnFwd(OUT_B,25);
OnRev(OUT_C,25);
}
Off(OUT_BC);
}
task main()
{
SetSensorLight(S1);
RemoteStartProgram(CONN,"kodomo.nxc");
followline_R(200);
Blackto_White();
followline_L(150);
Blackto_White_R();
followline_R2(150);
SendRemoteNumber(CONN,MAILBOX1,SIGNALON1);
Wait(1000);
arm_up;
turn;
SendRemoteNumber(CONN,MAILBOX1,SIGNALON2);
Wait(1000);
followline_R(150);
Blackto_White_L();
followline_L(100);
Blackto_White();
Whiteto_Black();
Blackto_White();
Whiteto_Black();
Blackto_White();
Whiteto_Black();
Blackto_White();
followline_R(150);
Blackto_White();
turn2;
sakittyo;
arm_down;
SendRemoteNumber(CONN,MAILBOX1,SIGNALON1);
Wait(1000);
arm_up;
turn3;
Whiteto_Black();
Blackto_White();
Whiteto_Black();
Blackto_White();
followline_R(200);
Blackto_White();
turn2;
SendRemoteNumber(CONN,MAILBOX1,SIGNALON2);
Wait(1000);
turn3;
Whiteto_Black();
Blackto_White();
Whiteto_Black();
Blackto_White();
followline_R(200);
Blackto_White();
turn2;
sakittyo;
arm_down;
SendRemoteNumber(CONN,MAILBOX1,SIGNALON1);
Wait(1000);
arm_up;
turn3;
Whiteto_Black();
Blackto_White();
Whiteto_Black();
Blackto_White();
Blackto_White_R();
followline_R(200);
Blackto_White();
turn2;
SendRemoteNumber(CONN,MAILBOX1,SIGNALON2);
Wait(1500);
turn4;
arm_down
Whiteto_Black();
Blackto_White();
Whiteto_Black();
Blackto_White();
followline_L(200);
Blackto_White();
followline_R(200);
Blackto_White();
followline_L(200);
Blackto_White();
followline_R(200);
Blackto_White();
followline_L(150);
Blackto_White_R();
followline_R2(125);
SendRemoteNumber(CONN,MAILBOX1,SIGNALON1);
Wait(1000);
arm_up;
turn;
followline_R(100);
Blackto_White_L();
followline_L(100);
Blackto_White();
Whiteto_Black();
Blackto_White();
Whiteto_Black();
Blackto_White();
Whiteto_Black();
Blackto_White();
followline_R(200);
Blackto_White();
turn2;
sakittyo;
SendRemoteNumber(CONN,MAILBOX1,SIGNALON2);
Wait(1000);
}
#define SIGNALON1 11
#define SIGNALOFF1 12
#define SIGNALON2 13
#define SIGNALOFF2 14
#define CONN 1
task main()
{
int msg;
while(true){
ReceiveRemoteNumber(MAILBOX1,true,msg);
if(msg==SIGNALON1){
OnRev(OUT_A,20);Wait(1000);
}else if(msg==SIGNALOFF1){
Off(OUT_A);
}else if(msg==SIGNALON2){
OnFwd(OUT_A,20);Wait(1000);
}else if(msg==SIGNALOFF2){
Off(OUT_A);
}
}
}
*まとめ,感想 [#ndbddb0f]
今回の課題はプログラミングはもちろんのことだが,特にロボ...
プログラミングに関しては,ライントレースは課題2のプログ...
しかし,ロボコンの結果を見れば,トレーのボール一つしか運...
終了行:
[[2019a/Member]]
目次
#contents
*課題3の概要 [#x60ce276]
**課題 [#k9b9a0d1]
ボール運搬ロボット
各場所に配置されている4つのボールを運搬しトレーの中に入...
&ref(2019a/Member/Kasai/Mission3/map3.png);
**フィールドの説明 [#n4781383]
-フィールドは課題2で使用した紙を使用する。
-生協のお弁当の四角いプラ容器2つをそれぞれ円内に置き、片...
-残りの2個の玉は課題2と同じ位置に置く。その際、ゴムタイヤ...
-プラ容器には色をつけたり文字や記号を書いてもよい。
-プラ容器は両面テープ等でフィールドに固定してもよい。
-枚の紙の境界にはそれぞれ幅1cm、合計2cmの黒線を描いてもよ...
**基本ルール [#o4d86912]
-競技時間は審判が続行不能と判断するまで、あるいはリタイア...
-図のA地点または(および)A'地点からスタートする。ただし...
-開始の合図から5秒以内にスタートボタンを押す作業を完了す...
-競技が終了するまで、ロボットに触ったり人間が遠隔で操作し...
-途中でうまく動かなくなった場合、1回限り再スタートするこ...
-競技終了後、ロボットが、ゴールのプラ容器に触れていてはい...
-競技終了後、もともと玉が入っていたプラ容器が、ゴールのプ...
**基本得点の計算方法 [#o929603d]
-プラ容器内の玉を1個運べば8点。二つとも運べば20点。
-L地点とL'地点の玉をどちらか1個運べば4点、2個とも運べば12...
-競技終了後、ゴールのプラ容器が完全に円から出しまった場合...
-競技終了後、ゴールのプラ容器の半分以上が円から出ていれば...
-競技終了後、ゴールのプラ容器にもとのプラ容器が触れていれ...
-競技終了後、ゴールのプラ容器にもとのプラ容器が触れていれ...
-競技終了後、ゴールのプラ容器にロボットが触れていれば、も...
*ロボットについて [#yb212537]
私たちの班は,ボールを一つずつ運ぶタイプのロボットを制作...
&ref(2019a/Member/Kasai/Mission3/zenntai_zou.jpg,50%);
&ref(2019a/Member/Kasai/Mission3/zenntai_mae.jpg,50%); &r...
**本体部分 [#f585eaed]
できるだけ小さくコンパクトになるように作った.本体を背面...
&ref(2019a/Member/Kasai/Mission3/asimawari.jpg,20%);&ref(...
**アームとその周辺 [#eb33daab]
アームも同様にシンプルに制作した.モーターに直接部品をつ...
&ref(2019a/Member/Kasai/Mission3/arm1.png,50%);&ref(2019a...
因みに,アームが重すぎてそのままでは上げ下げできなかった...
&ref(2019a/Member/Kasai/Mission3/sadou_hojo.jpg,60%);
*作戦 [#sc81602d]
**ルートについて [#jec3f046]
私たちの班は一つずつボールを運ぶロボットを作ったため,合...
&ref(2019a/Member/Kasai/Mission3/sakusenn_route.jpg,100%);
?A'を出発しL'のボールを掴み,旋回して容器に入れる.
&ref(2019a/Member/Kasai/Mission3/route1.png,50%);
?次に,そこから直線を突っ切って容器の中のピンポン玉を掴み...
&ref(2019a/Member/Kasai/Mission3/route2.png,50%);
?同じく容器の中のボールをゴールの容器に持っていき入れる.
&ref(2019a/Member/Kasai/Mission3/route3.png,50%);
?最後に,Lにあるボールを掴みゴールの容器に入れる.
&ref(2019a/Member/Kasai/Mission3/route4.png,50%);
*プログラムについて [#y8027e38]
まず,
-マスター:左車輪,右車輪,アームの上げ下げ
-スレーヴ:ボールを掴む動作
で制御している.
**共通するプログラム [#q89589b4]
2台のNXCで通信を行うために、以下のようにマクロを定義をし...
#define SIGNALON1 11
#define SIGNALOFF1 12
#define SIGNALON2 13
#define SIGNALOFF2 14
**アームのプログラム [#ca683c72]
***アームの上げ下げのマクロ [#h1926a7c]
#define arm_down OnFwd(OUT_A,25);Wait(1500);Off(OUT_A); ...
#define arm_up OnRev(OUT_A,35);Wait(1500);Off(OUT_A); /...
***スレーヴ側の制御 [#m1d36065]
#define SIGNALON1 11
#define SIGNALOFF1 12
#define SIGNALON2 13
#define SIGNALOFF2 14
#define CONN 1
task main()
{
int msg;
while(true){
ReceiveRemoteNumber(MAILBOX1,true,msg);
if(msg==SIGNALON1){ //SIGNALON1を受...
OnRev(OUT_A,20);Wait(1000); //ボールを掴む
}else if(msg==SIGNALOFF1){ //SIGNALOFF1を...
Off(OUT_A); //モータAを止める
}else if(msg==SIGNALON2){ //SIGNALON2を受...
OnFwd(OUT_A,20);Wait(1000); //ボールを放す
}else if(msg==SIGNALOFF2){ //SIGNALOFF2を...
Off(OUT_A); //モータAを止める
}
}
}
**ライントレース [#v6dd6f42]
光センサーの数値は以下の通りマクロで定義した.
#define black 30
#define white 60
#define lightgray 50
#define darkgray 39
#define center 45
&ref(2019a/Member/Kasai/Mission3/light_sennser.png,40%);
ライントレースのプログラムは課題2の時とほとんど同じもの...
***マクロ [#g6c5fae1]
基本的な動作,メッセージの値を定義する.
#define CONN 1
#define SIGNALON1 11
#define SIGNALOFF1 12
#define SIGNALON2 13
#define SIGNALOFF2 14
#define turn_right OnFwd(OUT_C,25);OnRev(OUT_B,23); //...
#define turn_left OnFwd(OUT_B,28);OnRev(OUT_C,20); //左折
#define rotate_right OnFwd(OUT_C,25);OnRev(OUT_B,22); /...
#define rotate_left OnFwd(OUT_B,28);OnRev(OUT_C,15); //...
#define go_straight OnFwd(OUT_B,23);OnFwd(OUT_C,20); //...
#define go_straight2 OnFwd(OUT_B,20);OnFwd(OUT_C,17); /...
#define turn OnRev(OUT_C,20);OnFwd(OUT_B,28);Wait(3200);...
#define turn2 OnRev(OUT_B,28);OnFwd(OUT_C,20);Wait(1500)...
#define sakittyo OnFwd(OUT_C,20);OnFwd(OUT_B,23);Wait(11...
#define turn3 OnRev(OUT_B,30);Wait(4800);Off(OUT_BC); /...
#define turn4 OnRev(OUT_B,30);Wait(5200);Off(OUT_BC); //
#define back OnRev(OUT_C,20);OnRev(OUT_B,28);Wait(3000);...
**サブルーチン [#x778946d]
***左側のライントレース [#l1d9eb72]
sub followline_L(int stop_time)
{
long t0=CurrentTick();
while(CurrentTick()-t0<stop_time){ //現在の時刻が一...
if(SENSOR_1<black){ //センサーが黒の時
rotate_left; //左旋回
}else if(SENSOR_1<darkgray){ //センサーが黒灰...
turn_left; //左折
}else if(SENSOR_1>lightgray){ //センサーが白灰...
turn_right; //右折
t0=CurrentTick(); //時間をリセット
}else if(SENSOR_1<center){ //明るさ45以...
go_straight; //直進
t0=CurrentTick(); //時間をリセット
}else{ //それ以外は
rotate_right; //右旋回
t0=CurrentTick(); //時間をリセット
}
}
Off(OUT_BC); //時刻が一定の値を超えると停止
Wait(1000); //1秒間停止
}
***右側のライントレース [#a40d4d55]
sub followline_R(int stop_time)
{
long t0=CurrentTick();
while(CurrentTick()-t0<stop_time){ //現在の時刻が一...
if(SENSOR_1<black){ //センサーが黒の時
rotate_right; //右旋回
}else if(SENSOR_1<darkgray){ //センサーが黒灰...
turn_right; //右折
}else if(SENSOR_1>lightgray){ //センサーが白灰...
turn_left; //左折
t0=CurrentTick(); //時間をリセット
}else if(SENSOR_1<center){ //センサーが...
go_straight; //直進
t0=CurrentTick(); //時間をリセット
}else{ //それ以外は
rotate_left; //左旋回
t0=CurrentTick(); //時間をリセット
}
}
Off(OUT_BC); //一定の時間を超えると停止
Wait(1000); //一秒間停止
}
***右側のライントレース(直進の出力が弱いパターン) [#abb2b...
sub followline_R2(int stop_time)
{
long t0=CurrentTick();
while(CurrentTick()-t0<stop_time){ //時刻がある一...
if(SENSOR_1<black){ //黒なら
rotate_right; //右旋回
t0=CurrentTick(); //時間をリセット
}else if(SENSOR_1<darkgray){ //灰黒色なら
turn_right; //右折
t0=CurrentTick(); //時間をリセット
}else if(SENSOR_1>lightgray){ //灰白色なら
turn_left; //左折
}else if(SENSOR_1<center){ //明るさ45...
go_straight2; //ゆっくり直進
t0=CurrentTick(); //時間をリセット
}else{ //それ以外なら
rotate_left; //左旋回
}
}
Off(OUT_BC); //停止
Wait(2000); //2秒間停止
}
***黒線を横断 [#g2397abe]
-黒を見つけるまで直進
sub Blackto_White()
{
while(SENSOR_1<lightgray){ //光センサーの値が白灰よ...
OnFwd(OUT_C,25);
OnFwd(OUT_B,25); //直進
}
Off(OUT_BC); //白灰より大きくなると止...
}
-白を見つけるまで直進
sub Whiteto_Black()
{
while(SENSOR_1>darkgray){ //光センサーの値が黒灰よ...
OnFwd(OUT_C,25);
OnFwd(OUT_B,25); //直進
}
Off(OUT_BC); //黒灰よりも大きくなると...
}
この2つを組み合わせることで黒線を一本通り越せる.
***その他 [#b4e1022d]
ライントレースの右側と左側を入れ替えるときなどに使う.
-黒を見つけるまで右旋回
sub Whiteto_Black_R()
{
while(SENSOR_1>darkgray){ //光センサーの値が黒灰よ...
OnFwd(OUT_C,25);
OnRev(OUT_B,25); //右旋回
}
Off(OUT_BC); //黒灰よりも小さくなると...
}
-白を見つけるまで右旋回
sub Blackto_White_R()
{
while(SENSOR_1<darkgray){ //光センサーの値が黒灰よ...
OnFwd(OUT_C,25);
OnRev(OUT_B,25); //右旋回
}
Off(OUT_BC); //黒灰よりも大きくなると...
}
-白を見つけるまで左旋回
sub Blackto_White_L()
{
while(SENSOR_1<lightgray){ //光センサーの値が白灰よ...
OnFwd(OUT_B,25);
OnRev(OUT_C,25); //左旋回
}
Off(OUT_BC); //白灰より大きくなると止...
}
-黒を見つけるまで左旋回
sub Whiteto_Black_L()
{
while(SENSOR_1>black){ //光センサーの値が黒より大き...
OnFwd(OUT_B,25);
OnRev(OUT_C,25); //左旋回
}
Off(OUT_BC); //黒より小さいとき
}
**マスターのプログラム [#h247f23a]
task main()
{
SetSensorLight(S1);
RemoteStartProgram(CONN,"kodomo.nxc");
followline_R(200);
Blackto_White();
followline_L(150);
Blackto_White_R();
followline_R2(150);
SendRemoteNumber(CONN,MAILBOX1,SIGNALON1);
Wait(1000);
arm_up;
turn;
SendRemoteNumber(CONN,MAILBOX1,SIGNALON2);
Wait(1000);
followline_R(150);
Blackto_White_L();
followline_L(100);
Blackto_White();
Whiteto_Black();
Blackto_White();
Whiteto_Black();
Blackto_White();
Whiteto_Black();
Blackto_White();
followline_R(150);
Blackto_White();
turn2;
sakittyo;
arm_down;
SendRemoteNumber(CONN,MAILBOX1,SIGNALON1);
Wait(1000);
arm_up;
turn3;
Whiteto_Black();
Blackto_White();
Whiteto_Black();
Blackto_White();
followline_R(200);
Blackto_White();
turn2;
SendRemoteNumber(CONN,MAILBOX1,SIGNALON2);
Wait(1000);
turn3;
Whiteto_Black();
Blackto_White();
Whiteto_Black();
Blackto_White();
followline_R(200);
Blackto_White();
turn2;
sakittyo;
arm_down;
SendRemoteNumber(CONN,MAILBOX1,SIGNALON1);
Wait(1000);
arm_up;
turn3;
Whiteto_Black();
Blackto_White();
Whiteto_Black();
Blackto_White();
Blackto_White_R();
followline_R(200);
Blackto_White();
turn2;
SendRemoteNumber(CONN,MAILBOX1,SIGNALON2);
Wait(1500);
turn4;
arm_down
Whiteto_Black();
Blackto_White();
Whiteto_Black();
Blackto_White();
followline_L(200);
Blackto_White();
followline_R(200);
Blackto_White();
followline_L(200);
Blackto_White();
followline_R(200);
Blackto_White();
followline_L(150);
Blackto_White_R();
followline_R2(125);
SendRemoteNumber(CONN,MAILBOX1,SIGNALON1);
Wait(1000);
arm_up;
turn;
followline_R(100);
Blackto_White_L();
followline_L(100);
Blackto_White();
Whiteto_Black();
Blackto_White();
Whiteto_Black();
Blackto_White();
Whiteto_Black();
Blackto_White();
followline_R(200);
Blackto_White();
turn2;
sakittyo;
SendRemoteNumber(CONN,MAILBOX1,SIGNALON2);
Wait(1000);
}
ゴールのトレーをGT,もともとボールを入れてあるトレーをST...
一つ目の塊は,M'からスタートしL'のボールを掴んでGTに入れ...
二つ目の塊は,L'のボールを入れた後STまで行き,ボールを掴...
三つ目の塊は,STからGTまで行き,ボールを入れるプログラム
四つ目の塊は,ボールを入れてからまたSTまで行き,ボールを...
五つ目の塊は,ボールを掴んでからGTまで行きゴールするまで...
六つ目の塊は,STからLまで移動し,Lのボールを掴むまでのプ...
七つ目の塊は,LからGTまで移動してゴールし,トレーから少し...
である.
*完成したプログラム [#zf89ae7a]
#define CONN 1
#define SIGNALON1 11
#define SIGNALOFF1 12
#define SIGNALON2 13
#define SIGNALOFF2 14
#define turn_right OnFwd(OUT_C,25);OnRev(OUT_B,23);
#define turn_left OnFwd(OUT_B,28);OnRev(OUT_C,20);
#define rotate_right OnFwd(OUT_C,25);OnRev(OUT_B,22);
#define rotate_left OnFwd(OUT_B,28);OnRev(OUT_C,15);
#define go_straight OnFwd(OUT_B,23);OnFwd(OUT_C,20);
#define go_straight2 OnFwd(OUT_B,20);OnFwd(OUT_C,17);
#define turn OnRev(OUT_C,20);OnFwd(OUT_B,28);Wait(3200);...
#define turn2 OnRev(OUT_B,28);OnFwd(OUT_C,20);Wait(1500)...
#define sakittyo OnFwd(OUT_C,20);OnFwd(OUT_B,23);Wait(11...
#define turn3 OnRev(OUT_B,30);Wait(4800);Off(OUT_BC);
#define turn4 OnRev(OUT_B,30);Wait(5200);Off(OUT_BC);
#define back OnRev(OUT_C,20);OnRev(OUT_B,28);Wait(3000);...
#define osidasi OnFwd(OUT_BC,100);Wait(100);Off(OUT_BC);
#define arm_down OnFwd(OUT_A,25);Wait(1500);Off(OUT_A);
#define arm_up OnRev(OUT_A,35);Wait(1500);Off(OUT_A);
#define black 30
#define white 60
#define lightgray 50
#define darkgray 39
#define center 45
sub followline_L(int stop_time)
{
long t0=CurrentTick();
while(CurrentTick()-t0<stop_time){
if(SENSOR_1<black){
rotate_left;
}else if(SENSOR_1<darkgray){
turn_left;
}else if(SENSOR_1>lightgray){
turn_right;
t0=CurrentTick();
}else if(SENSOR_1<center){
go_straight;
t0=CurrentTick();
}else{
rotate_right;
t0=CurrentTick();
}
}
Off(OUT_BC);
Wait(1000);
}
sub followline_R(int stop_time)
{
long t0=CurrentTick();
while(CurrentTick()-t0<stop_time){
if(SENSOR_1<black){
rotate_right;
}else if(SENSOR_1<darkgray){
turn_right;
}else if(SENSOR_1>lightgray){
turn_left;
t0=CurrentTick();
}else if(SENSOR_1<center){
go_straight;
t0=CurrentTick();
}else{
rotate_left;
t0=CurrentTick();
}
}
Off(OUT_BC);
Wait(1000);
}
sub followline_R2(int stop_time)
{
long t0=CurrentTick();
while(CurrentTick()-t0<stop_time){
if(SENSOR_1<black){
rotate_right;
t0=CurrentTick();
}else if(SENSOR_1<darkgray){
turn_right;
t0=CurrentTick();
}else if(SENSOR_1>lightgray){
turn_left;
}else if(SENSOR_1<center){
go_straight2;
t0=CurrentTick();
}else{
rotate_left;
}
}
Off(OUT_BC);
Wait(2000);
}
sub Blackto_White()
{
while(SENSOR_1<lightgray){
OnFwd(OUT_C,25);
OnFwd(OUT_B,25);
}
Off(OUT_BC);
}
sub Whiteto_Black()
{
while(SENSOR_1>darkgray){
OnFwd(OUT_C,25);
OnFwd(OUT_B,25);
}
Off(OUT_BC);
}
sub Whiteto_Black_R()
{
while(SENSOR_1>darkgray){
OnFwd(OUT_C,25);
OnRev(OUT_B,25);
}
Off(OUT_BC);
}
sub Blackto_White_R()
{
while(SENSOR_1<darkgray){
OnFwd(OUT_C,25);
OnRev(OUT_B,25);
}
Off(OUT_BC);
}
sub Blackto_White_L()
{
while(SENSOR_1<lightgray){
OnFwd(OUT_B,25);
OnRev(OUT_C,25);
}
Off(OUT_BC);
}
sub Whiteto_Black_L()
{
while(SENSOR_1>black){
OnFwd(OUT_B,25);
OnRev(OUT_C,25);
}
Off(OUT_BC);
}
task main()
{
SetSensorLight(S1);
RemoteStartProgram(CONN,"kodomo.nxc");
followline_R(200);
Blackto_White();
followline_L(150);
Blackto_White_R();
followline_R2(150);
SendRemoteNumber(CONN,MAILBOX1,SIGNALON1);
Wait(1000);
arm_up;
turn;
SendRemoteNumber(CONN,MAILBOX1,SIGNALON2);
Wait(1000);
followline_R(150);
Blackto_White_L();
followline_L(100);
Blackto_White();
Whiteto_Black();
Blackto_White();
Whiteto_Black();
Blackto_White();
Whiteto_Black();
Blackto_White();
followline_R(150);
Blackto_White();
turn2;
sakittyo;
arm_down;
SendRemoteNumber(CONN,MAILBOX1,SIGNALON1);
Wait(1000);
arm_up;
turn3;
Whiteto_Black();
Blackto_White();
Whiteto_Black();
Blackto_White();
followline_R(200);
Blackto_White();
turn2;
SendRemoteNumber(CONN,MAILBOX1,SIGNALON2);
Wait(1000);
turn3;
Whiteto_Black();
Blackto_White();
Whiteto_Black();
Blackto_White();
followline_R(200);
Blackto_White();
turn2;
sakittyo;
arm_down;
SendRemoteNumber(CONN,MAILBOX1,SIGNALON1);
Wait(1000);
arm_up;
turn3;
Whiteto_Black();
Blackto_White();
Whiteto_Black();
Blackto_White();
Blackto_White_R();
followline_R(200);
Blackto_White();
turn2;
SendRemoteNumber(CONN,MAILBOX1,SIGNALON2);
Wait(1500);
turn4;
arm_down
Whiteto_Black();
Blackto_White();
Whiteto_Black();
Blackto_White();
followline_L(200);
Blackto_White();
followline_R(200);
Blackto_White();
followline_L(200);
Blackto_White();
followline_R(200);
Blackto_White();
followline_L(150);
Blackto_White_R();
followline_R2(125);
SendRemoteNumber(CONN,MAILBOX1,SIGNALON1);
Wait(1000);
arm_up;
turn;
followline_R(100);
Blackto_White_L();
followline_L(100);
Blackto_White();
Whiteto_Black();
Blackto_White();
Whiteto_Black();
Blackto_White();
Whiteto_Black();
Blackto_White();
followline_R(200);
Blackto_White();
turn2;
sakittyo;
SendRemoteNumber(CONN,MAILBOX1,SIGNALON2);
Wait(1000);
}
#define SIGNALON1 11
#define SIGNALOFF1 12
#define SIGNALON2 13
#define SIGNALOFF2 14
#define CONN 1
task main()
{
int msg;
while(true){
ReceiveRemoteNumber(MAILBOX1,true,msg);
if(msg==SIGNALON1){
OnRev(OUT_A,20);Wait(1000);
}else if(msg==SIGNALOFF1){
Off(OUT_A);
}else if(msg==SIGNALON2){
OnFwd(OUT_A,20);Wait(1000);
}else if(msg==SIGNALOFF2){
Off(OUT_A);
}
}
}
*まとめ,感想 [#ndbddb0f]
今回の課題はプログラミングはもちろんのことだが,特にロボ...
プログラミングに関しては,ライントレースは課題2のプログ...
しかし,ロボコンの結果を見れば,トレーのボール一つしか運...
ページ名: