2019a/Member/Gouki/Mission3
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
検索
|
最終更新
|
ヘルプ
|
ログイン
]
開始行:
目次
#contents
*課題について [#z31d1a0c]
**課題の詳細 [#j3756556]
ボールを運ぶためのロボットを作成し、ボールを運搬して所定...
#ref(2019a/Member/Gouki/Mission3/map3.png,100%);
**フィールドの説明 [#x07bc6d6]
-フィールドは課題2で使用した紙を使用する。
-生協のお弁当の四角いプラ容器2つをそれぞれ円内に置き、片...
-残りの2個の玉は課題2と同じ位置に置く。その際、ゴムタイヤ...
-プラ容器には色をつけたり文字や記号を書いてもよい。
-プラ容器は両面テープ等でフィールドに固定してもよい。
-2枚の紙の境界にはそれぞれ幅1cm、合計2cmの黒線を描いても...
**基本ルール [#w587e337]
-競技時間は審判が続行不能と判断するまで、あるいはリタイア...
-図のA地点または(および)A'地点からスタートする。ただし...
-開始の合図から5秒以内にスタートボタンを押す作業を完了す...
-競技が終了するまで、ロボットに触ったり人間が遠隔で操作し...
-途中でうまく動かなくなった場合、1回限り再スタートするこ...
-競技終了後、ロボットが、ゴールのプラ容器に触れていてはい...
-競技終了後、もともと玉が入っていたプラ容器が、ゴールのプ...
**基本特典の計算方法 [#v3e9c93a]
-プラ容器内の玉を1個運べば8点。二つとも運べば20点。
-L地点とL'地点の玉をどちらか1個運べば4点、2個とも運べば12...
-競技終了後、ゴールのプラ容器が完全に円から出しまった場合...
-競技終了後、ゴールのプラ容器の半分以上が円から出ていれば...
-競技終了後、ゴールのプラ容器にもとのプラ容器が触れていれ...
-競技終了後、ゴールのプラ容器にもとのプラ容器が触れていれ...
-競技終了後、ゴールのプラ容器にロボットが触れていれば、も...
**技術展の計算方法 [#t74989b1]
以下の動作の精度・スピード・確実性などを含めた技術的な工...
-玉を探し取りにいくまでの動作 (3点)
-玉を掴む動作 (3点)
-玉をを運ぶ動作 (2点)
-玉を容器の中に入れる動作 (2点)
-2台のRIS、NXT、EV3の連携の良さ(2点)
-自立型のロボットとしての形や動作の美しさ、斬新さ(2点)
-その他 (3点)
*ロボットについて [#dc407bb5]
私たちのロボットはボールを一つずつ運搬出来るようなロボッ...
そのためきちんと小回りがきくようにするために、コンパクト...
#ref(2019a/Member/Gouki/Mission3/みっしよん3_190814_0005....
#ref(2019a/Member/Gouki/Mission3/みっしよん3_190814_0004....
#ref(2019a/Member/Gouki/Mission3/みっしよん3_190814_0003....
**本体部分 [#rfb9cbf5]
なるべく小さくコンパクトに作った。本体を背面あわせにし、...
センサーは車輪に近づけ、きちんと小回りが可能なセンサー検...
#ref(2019a/Member/Gouki/Mission3/asimawari.jpg,30%);
**アーム部分 [#n6f8d1c4]
アームの部分も本体同様シンプルにし、モーターに直接部品を...
ボールをつかんだり離したり出来るようなクレーン型のアーム...
#ref(2019a/Member/Gouki/Mission3/Inkedみっしよん3_190814_...
#ref(2019a/Member/Gouki/Mission3/Inkedみっしよん3_190814_...
#ref(2019a/Member/Gouki/Mission3/Inkedみっしよん3_190814_...
アームを一番上まで上げるために、補助として輪ゴムを使った。
#ref(2019a/Member/Gouki/Mission3/Inkedみっしよん3_190814_...
*作戦 [#z667c8b6]
**ルートについて [#i3296f07]
私たちはボールを一つずつ運搬するロボットを作ったため、ボ...
トレーに持っていき、ボールを離すという行動を合計4回行う...
そのため次のようなルートでロボットを動かすことにした。
#ref(2019a/Member/Gouki/Mission3/みっしよん3_190814_0007....
?A'を出発しL'のボールを掴み,旋回して容器に入れる.
#ref(2019a/Member/Gouki/Mission3/route1.png,50%);
?次に,そこから直線を突っ切って容器の中のピンポン玉を掴み...
#ref(2019a/Member/Gouki/Mission3/route2.png,50%);
?同じく容器の中のボールをゴールの容器に持っていき入れる.
#ref(2019a/Member/Gouki/Mission3/route3.png,50%);
?最後に,Lにあるボールを掴みゴールの容器に入れる
#ref(2019a/Member/Gouki/Mission3/route4.png,50%);
*プログラムについて [#h6c4ad2e]
今回は本体を2機使い、
-マスター:両車輪、アームの上げ下げ
-スレーブ:ボールをつかむ動作
というように動作を分けて、プログラミングを作った。
**共通のプログラム [#n4cc6b0d]
2機間で通信するために以下のマクロを定義した。
#define SIGNALON1 11
#define SIGNALOFF1 12
#define SIGNALON2 13
#define SIGNALOFF2 14
**アームのプログラム(スレーブ側のプログラム) [#ife08613]
***アームの上げ下げのマクロ [#yfbde368]
#define arm_down OnFwd(OUT_A,25);Wait(1500);Off(OUT_A); ...
#define arm_up OnRev(OUT_A,35);Wait(1500);Off(OUT_A); /...
***スレーブのプログラム [#x33fd690]
#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); //MA...
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を止める
}
}
}
**ライントレース [#zd28da58]
***マクロ [#h278ba8e]
私たちは「完全に真っ白」、「白と境目の間」、「境目」、「...
「完全に黒」の5つの部分に色を分けて測った。~
光センサーで検知する数値を以下のマクロで定義した。
#define black 30
#define white 60
#define lightgray 50
#define darkgray 39
#define center 45
#ref(2019a/Member/Gouki/Mission3/light_sennser.png,15%);
その他様々な動作を以下のように定義した。
#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);...
***左側のライントレース [#a05ab4c7]
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秒間停止
}
***右側のライントレース [#qa9b1ed2]
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); //一秒間停止
}
又、K,L間、K`,L`間ではそのままの出力で直進してしまうとボ...
ボールを飛ばしてしまう可能性があるため、この部分だけ直進...
右側ライントレースにした。それが下記のプログラムである。
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秒間停止
}
***横断 [#d41cbe46]
二つのマップを横断する際、黒を見つけるまで直進するプログ...
プログラムを交互に組み合わせて横断する
-黒を見つけるまで直進
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 Whiteto_Black_L()
{
while(SENSOR_1>black){ //光センサーの値が黒より大き...
OnFwd(OUT_B,25);
OnRev(OUT_C,25); //左旋回
}
Off(OUT_BC); //黒より小さいとき
}
**マスターのプログラム [#g32bc84d]
task main()
{
SetSensorLight(S1); //端子1に光センサー
RemoteStartProgram(CONN,"kodomo.nxc"); //スレーブ...
followline_R(200);
Blackto_White();
followline_L(150);
Blackto_White_R();
followline_R2(150);
SendRemoteNumber(CONN,MAILBOX1,SIGNALON1); //MAILBO...
Wait(1000);
arm_up;
turn;
SendRemoteNumber(CONN,MAILBOX1,SIGNALON2); //MAILBO...
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); //MAILB...
Wait(1000);
arm_up;
turn3;
Whiteto_Black();
Blackto_White();
Whiteto_Black();
Blackto_White();
followline_R(200);
Blackto_White();
turn2;
SendRemoteNumber(CONN,MAILBOX1,SIGNALON2); //MAILB...
Wait(1000);
turn3;
Whiteto_Black();
Blackto_White();
Whiteto_Black();
Blackto_White();
followline_R(200);
Blackto_White();
turn2;
sakittyo;
arm_down;
SendRemoteNumber(CONN,MAILBOX1,SIGNALON1); //MAILB...
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); //MAILB...
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); //MAILB...
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); //MAILB...
Wait(1000);
}
ゴールのトレーをGT,もともとボールを入れてあるトレーをST...
*完成したプログラム [#nd4c0788]
**マスター [#ld48981e]
#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 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);
}
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);
}
**スレーブ [#yb1b6b06]
#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);
}
}
}
*まとめ [#b5c75a06]
今回の課題ではプログラミングもロボットの作成も多くの時間...
ロボットの作成では、ロボットの形、ボールを運ぶ方法など様...
作成した。プログラムではライントレースは課題2で使用した...
使って、論理上ではきちんとコース上を完璧に動くものが作れ...
として、電池が切れたのが原因だと思うが、出力がすぐに弱く...
片方のモーターが不調で同じ出力で直進させても曲がってしま...
ようなことがあり、出力や秒数を毎回毎回調整したりするのに...
時間がかかった。だが、最終的にロボコンでボールを一つしか...
入れられなかったが二位という結果だったので、自分としては...
出会ったと思う。
終了行:
目次
#contents
*課題について [#z31d1a0c]
**課題の詳細 [#j3756556]
ボールを運ぶためのロボットを作成し、ボールを運搬して所定...
#ref(2019a/Member/Gouki/Mission3/map3.png,100%);
**フィールドの説明 [#x07bc6d6]
-フィールドは課題2で使用した紙を使用する。
-生協のお弁当の四角いプラ容器2つをそれぞれ円内に置き、片...
-残りの2個の玉は課題2と同じ位置に置く。その際、ゴムタイヤ...
-プラ容器には色をつけたり文字や記号を書いてもよい。
-プラ容器は両面テープ等でフィールドに固定してもよい。
-2枚の紙の境界にはそれぞれ幅1cm、合計2cmの黒線を描いても...
**基本ルール [#w587e337]
-競技時間は審判が続行不能と判断するまで、あるいはリタイア...
-図のA地点または(および)A'地点からスタートする。ただし...
-開始の合図から5秒以内にスタートボタンを押す作業を完了す...
-競技が終了するまで、ロボットに触ったり人間が遠隔で操作し...
-途中でうまく動かなくなった場合、1回限り再スタートするこ...
-競技終了後、ロボットが、ゴールのプラ容器に触れていてはい...
-競技終了後、もともと玉が入っていたプラ容器が、ゴールのプ...
**基本特典の計算方法 [#v3e9c93a]
-プラ容器内の玉を1個運べば8点。二つとも運べば20点。
-L地点とL'地点の玉をどちらか1個運べば4点、2個とも運べば12...
-競技終了後、ゴールのプラ容器が完全に円から出しまった場合...
-競技終了後、ゴールのプラ容器の半分以上が円から出ていれば...
-競技終了後、ゴールのプラ容器にもとのプラ容器が触れていれ...
-競技終了後、ゴールのプラ容器にもとのプラ容器が触れていれ...
-競技終了後、ゴールのプラ容器にロボットが触れていれば、も...
**技術展の計算方法 [#t74989b1]
以下の動作の精度・スピード・確実性などを含めた技術的な工...
-玉を探し取りにいくまでの動作 (3点)
-玉を掴む動作 (3点)
-玉をを運ぶ動作 (2点)
-玉を容器の中に入れる動作 (2点)
-2台のRIS、NXT、EV3の連携の良さ(2点)
-自立型のロボットとしての形や動作の美しさ、斬新さ(2点)
-その他 (3点)
*ロボットについて [#dc407bb5]
私たちのロボットはボールを一つずつ運搬出来るようなロボッ...
そのためきちんと小回りがきくようにするために、コンパクト...
#ref(2019a/Member/Gouki/Mission3/みっしよん3_190814_0005....
#ref(2019a/Member/Gouki/Mission3/みっしよん3_190814_0004....
#ref(2019a/Member/Gouki/Mission3/みっしよん3_190814_0003....
**本体部分 [#rfb9cbf5]
なるべく小さくコンパクトに作った。本体を背面あわせにし、...
センサーは車輪に近づけ、きちんと小回りが可能なセンサー検...
#ref(2019a/Member/Gouki/Mission3/asimawari.jpg,30%);
**アーム部分 [#n6f8d1c4]
アームの部分も本体同様シンプルにし、モーターに直接部品を...
ボールをつかんだり離したり出来るようなクレーン型のアーム...
#ref(2019a/Member/Gouki/Mission3/Inkedみっしよん3_190814_...
#ref(2019a/Member/Gouki/Mission3/Inkedみっしよん3_190814_...
#ref(2019a/Member/Gouki/Mission3/Inkedみっしよん3_190814_...
アームを一番上まで上げるために、補助として輪ゴムを使った。
#ref(2019a/Member/Gouki/Mission3/Inkedみっしよん3_190814_...
*作戦 [#z667c8b6]
**ルートについて [#i3296f07]
私たちはボールを一つずつ運搬するロボットを作ったため、ボ...
トレーに持っていき、ボールを離すという行動を合計4回行う...
そのため次のようなルートでロボットを動かすことにした。
#ref(2019a/Member/Gouki/Mission3/みっしよん3_190814_0007....
?A'を出発しL'のボールを掴み,旋回して容器に入れる.
#ref(2019a/Member/Gouki/Mission3/route1.png,50%);
?次に,そこから直線を突っ切って容器の中のピンポン玉を掴み...
#ref(2019a/Member/Gouki/Mission3/route2.png,50%);
?同じく容器の中のボールをゴールの容器に持っていき入れる.
#ref(2019a/Member/Gouki/Mission3/route3.png,50%);
?最後に,Lにあるボールを掴みゴールの容器に入れる
#ref(2019a/Member/Gouki/Mission3/route4.png,50%);
*プログラムについて [#h6c4ad2e]
今回は本体を2機使い、
-マスター:両車輪、アームの上げ下げ
-スレーブ:ボールをつかむ動作
というように動作を分けて、プログラミングを作った。
**共通のプログラム [#n4cc6b0d]
2機間で通信するために以下のマクロを定義した。
#define SIGNALON1 11
#define SIGNALOFF1 12
#define SIGNALON2 13
#define SIGNALOFF2 14
**アームのプログラム(スレーブ側のプログラム) [#ife08613]
***アームの上げ下げのマクロ [#yfbde368]
#define arm_down OnFwd(OUT_A,25);Wait(1500);Off(OUT_A); ...
#define arm_up OnRev(OUT_A,35);Wait(1500);Off(OUT_A); /...
***スレーブのプログラム [#x33fd690]
#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); //MA...
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を止める
}
}
}
**ライントレース [#zd28da58]
***マクロ [#h278ba8e]
私たちは「完全に真っ白」、「白と境目の間」、「境目」、「...
「完全に黒」の5つの部分に色を分けて測った。~
光センサーで検知する数値を以下のマクロで定義した。
#define black 30
#define white 60
#define lightgray 50
#define darkgray 39
#define center 45
#ref(2019a/Member/Gouki/Mission3/light_sennser.png,15%);
その他様々な動作を以下のように定義した。
#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);...
***左側のライントレース [#a05ab4c7]
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秒間停止
}
***右側のライントレース [#qa9b1ed2]
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); //一秒間停止
}
又、K,L間、K`,L`間ではそのままの出力で直進してしまうとボ...
ボールを飛ばしてしまう可能性があるため、この部分だけ直進...
右側ライントレースにした。それが下記のプログラムである。
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秒間停止
}
***横断 [#d41cbe46]
二つのマップを横断する際、黒を見つけるまで直進するプログ...
プログラムを交互に組み合わせて横断する
-黒を見つけるまで直進
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 Whiteto_Black_L()
{
while(SENSOR_1>black){ //光センサーの値が黒より大き...
OnFwd(OUT_B,25);
OnRev(OUT_C,25); //左旋回
}
Off(OUT_BC); //黒より小さいとき
}
**マスターのプログラム [#g32bc84d]
task main()
{
SetSensorLight(S1); //端子1に光センサー
RemoteStartProgram(CONN,"kodomo.nxc"); //スレーブ...
followline_R(200);
Blackto_White();
followline_L(150);
Blackto_White_R();
followline_R2(150);
SendRemoteNumber(CONN,MAILBOX1,SIGNALON1); //MAILBO...
Wait(1000);
arm_up;
turn;
SendRemoteNumber(CONN,MAILBOX1,SIGNALON2); //MAILBO...
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); //MAILB...
Wait(1000);
arm_up;
turn3;
Whiteto_Black();
Blackto_White();
Whiteto_Black();
Blackto_White();
followline_R(200);
Blackto_White();
turn2;
SendRemoteNumber(CONN,MAILBOX1,SIGNALON2); //MAILB...
Wait(1000);
turn3;
Whiteto_Black();
Blackto_White();
Whiteto_Black();
Blackto_White();
followline_R(200);
Blackto_White();
turn2;
sakittyo;
arm_down;
SendRemoteNumber(CONN,MAILBOX1,SIGNALON1); //MAILB...
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); //MAILB...
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); //MAILB...
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); //MAILB...
Wait(1000);
}
ゴールのトレーをGT,もともとボールを入れてあるトレーをST...
*完成したプログラム [#nd4c0788]
**マスター [#ld48981e]
#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 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);
}
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);
}
**スレーブ [#yb1b6b06]
#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);
}
}
}
*まとめ [#b5c75a06]
今回の課題ではプログラミングもロボットの作成も多くの時間...
ロボットの作成では、ロボットの形、ボールを運ぶ方法など様...
作成した。プログラムではライントレースは課題2で使用した...
使って、論理上ではきちんとコース上を完璧に動くものが作れ...
として、電池が切れたのが原因だと思うが、出力がすぐに弱く...
片方のモーターが不調で同じ出力で直進させても曲がってしま...
ようなことがあり、出力や秒数を毎回毎回調整したりするのに...
時間がかかった。だが、最終的にロボコンでボールを一つしか...
入れられなかったが二位という結果だったので、自分としては...
出会ったと思う。
ページ名: