2017b/Member/n1sh1/Mission2
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
検索
|
最終更新
|
ヘルプ
|
ログイン
]
開始行:
目次
#contents
*課題について [#i8b16bd9]
今回の課題は図のコースをライントレースして紙コップを移動...
#ref(./course.png,80%,コース)
*ロボットについて [#x0c03986]
**全体について [#v6642b36]
&ref(2017b/Member/n1sh1/Mission2/robot1全体.jpg,40%,ロボ...
私たちのグループでは画像のようなシンプルなロボットを作っ...
**センサー位置について [#weeaab06]
&ref(2017b/Member/n1sh1/Mission2/robotセンサー.png,90%,セ...
付属の説明書に載っているロボットを用いたかったのだが、ど...
**紙コップを取る機構について [#w0f6ca9c]
&ref(2017b/Member/n1sh1/Mission2/robotアーム.jpg,45%,ロボ...
前述のように紙コップを取るモーターを取り付けることが難し...
***ずれても取れるように [#f2786734]
&ref(2017b/Member/n1sh1/Mission2/robotキャッチ中.jpg,50%,...
&ref(2017b/Member/n1sh1/Mission2/robotキャッチ後.jpg,55%,...
紙コップを取ろうとロボットの少しのずれでうまく取ることが...
*プログラムについて [#a9bde67b]
今回のプログラムでは「比例制御」を用いることにより、より滑...
***比例制御について [#gdc785e5]
「比例制御」とは、その名の通り明るさに比例してモーターの回...
**各定義 [#b4ac7b6c]
このようにセンサーに関係する値だけを定義した。他にも定義...
#define sensor SENSOR_2 //センサーの値
#define black 30 //黒の値
#define white 58 //白の値
#define threshold (black+white)*0.5 //閾値(前述の明るさ...
#define deflection (sensor-threshold) //センサーの値と閾...
**サブルーチン [#f8842420]
***トレース [#ua6957d9]
黒線の右側をトレースするときは、go_forward_in(),左側をgo_...
sub go_forward_in(int x) //前方へ(黒線の右側)
{
OnFwd(OUT_A,23+deflection*x);
OnFwd(OUT_B,25-deflection*x);
}
sub go_forward_out(int x) //前方へ(黒線の左側)
{
OnFwd(OUT_A,23+deflection*x);
OnFwd(OUT_B,25-deflection*x);
}
下の2つは、F-C間のヘアピンカーブをトレースするときに使う...
sub go_left(int x) //左前方へ
{
OnFwd(OUT_A,20+deflection*x);
OnFwd(OUT_B,-20-deflection*x);
}
sub go_right(int x) //右前方へ
{
OnFwd(OUT_A,-20+deflection*x);
OnFwd(OUT_B,20-deflection*x);
}
***交差点識別 [#v0d5c7dc]
交差点を判別するためのサブルーチンである。センサーが黒線...
sub intertify_in() //交差点まで(黒線の右側)
{
long t=CurrentTick();
while(CurrentTick()-t<=150){
if(sensor>white-5){
go_forward_in(1.5);
t=CurrentTick();
}else if(sensor>black+7){
go_forward_in(1.5);
t=CurrentTick();
}else{
go_forward_in(1.5);
}
}
Off(OUT_AB);
Wait(10);
}
sub intertify_out() //交差点まで(黒線の左側)
{
long t1=CurrentTick();
while(CurrentTick()-t1<=150){
if(sensor>white-5){
go_forward_out(-1.5);
t1=CurrentTick();
}else if(sensor>black+7){
go_forward_out(-1.5);
t1=CurrentTick();
}else{
go_forward_out(-1.5);
}
}
Off(OUT_AB);
Wait(10);
}
***急カーブのトレース [#rfcb3fd2]
交差点識別のサブルーチンでは交差点ではないところを交差点...
sub curve_in(int curve_in_time) //急カーブ(黒線の右側)
{
long ti=CurrentTick();
while(CurrentTick()-ti<=curve_in_time){
if(sensor>white-5){
go_left(1.8);
}else if(sensor>black+7){
go_forward_in(1.5);
}else{
go_right(1.8);
}
}
Off(OUT_AB);
Wait(10);
}
sub curve_out(long curve_out_time) //急カーブ(黒線の左側)
{
long to=CurrentTick();
while(CurrentTick()-to<=curve_out_time){
if(sensor>white-5){
go_right(-1.8);
}else if(sensor>black+7){
go_forward_out(-1.5);
}else{
go_left(-1.8);
}
}
Off(OUT_AB);
Wait(10);
}
***再びラインとレースするために [#z365c128]
交差点識別した直後、センサーは黒線の真ん中あたりに来る。...
sub escape_straight() //黒線からの脱出(直進)
{
while(sensor<white-10){
OnFwd(OUT_A,25); OnFwd(OUT_B,35);
}
Off(OUT_AB);
Wait(100);
while(sensor>black+10){
OnFwd(OUT_A,30); OnFwd(OUT_B,-20);
}
Off(OUT_AB);
Wait(10);
}
sub escape_CP() //黒線からの脱出(C,P)
{
while(sensor<white-10){
OnFwd(OUT_A,30); OnFwd(OUT_B,30);
}
Off(OUT_AB);
Wait(100);
while(sensor>threshold){
OnFwd(OUT_A,-30); OnFwd(OUT_B,30);
}
Off(OUT_AB);
Wait(10);
}
sub escape_R() //黒線からの脱出(R)
{
while(sensor<white-5){
OnFwd(OUT_A,30);
}
Off(OUT_AB);
Wait(10);
}
sub escape_Q() //黒線からの脱出(Q)
{
while(sensor<threshold){
OnFwd(OUT_A,30); OnFwd(OUT_B,15);
}
Off(OUT_AB);
Wait(100);
while(sensor>black+10){
OnFwd(OUT_A,30);
}
Off(OUT_AB);
Wait(10);
}
sub escape_F() //黒線からの脱出(F)
{
while(sensor<white-5){
OnFwd(OUT_A,40);
}
Off(OUT_A);
Wait(10);
while(sensor>threshold+7){
OnFwd(OUT_A,30);
}
Off(OUT_A);
Wait(10);
}
***紙コップのキャッチ&リリース [#s81a38e4]
アームを上げ下げするためのサブルーチンである。ギア比が1:2...
void cup(int c) //取るとき+1,置くとき-1
{
Wait(500);
RotateMotor(OUT_C,50,-360*c);
Wait(2000);
}
紙コップを取るときはどうしても黒線から外れなければいけな...
sub turn(int i) //90°時計回り+1,反時計回り-1
{
OnFwd(OUT_A,-40*i); OnFwd(OUT_B,40*i);
Wait(800);
Off(OUT_AB);
Wait(100);
}
上の2つのサブルーチンを作ったので、正負を代入するだけでキ...
sub catch() //紙コップ取る
{
turn(+1);
cup(+1);
turn(-1);
}
sub put() //紙コップ置く
{
turn(-1);
cup(-1);
turn(+1);
}
***本文 [#b1f133ff]
この通りである。前述のように引数は実験的に出したものであ...
task main()
{
SetSensorLight(S2);
//A-B
intertify_in();
//B-C
escape_straight();
curve_in(25000);
intertify_in();
//C-R
escape_CP();
curve_out(31000);
intertify_out();
//R-P
Wait(500);
PlaySound(SOUND_CLICK);
escape_R();
intertify_out();
//P-(X)-Q
escape_CP();
curve_out(4500);
Wait(2000);
catch();
intertify_out();
//Q-S
escape_Q();
intertify_in();
//S-(Y)-S
Wait(500);
PlaySound(SOUND_CLICK);
escape_straight();
curve_in(12000);
Wait(1000);
put();
intertify_in();
//S-F
Wait(500);
PlaySound(SOUND_CLICK);
escape_straight();
intertify_in();
//F-C
Wait(500);
PlaySound(SOUND_CLICK);
escape_F();
intertify_in();
//C-D
Wait(500);
PlaySound(SOUND_CLICK);
turn(+1);
OnFwd(OUT_AB,50);
Wait(1500);
Off(OUT_AB);
PlaySound(SOUND_CLICK);
}
*まとめ [#q66796d5]
今回の課題は、課題1と比べると格段に難しかったと感じる。難...
終了行:
目次
#contents
*課題について [#i8b16bd9]
今回の課題は図のコースをライントレースして紙コップを移動...
#ref(./course.png,80%,コース)
*ロボットについて [#x0c03986]
**全体について [#v6642b36]
&ref(2017b/Member/n1sh1/Mission2/robot1全体.jpg,40%,ロボ...
私たちのグループでは画像のようなシンプルなロボットを作っ...
**センサー位置について [#weeaab06]
&ref(2017b/Member/n1sh1/Mission2/robotセンサー.png,90%,セ...
付属の説明書に載っているロボットを用いたかったのだが、ど...
**紙コップを取る機構について [#w0f6ca9c]
&ref(2017b/Member/n1sh1/Mission2/robotアーム.jpg,45%,ロボ...
前述のように紙コップを取るモーターを取り付けることが難し...
***ずれても取れるように [#f2786734]
&ref(2017b/Member/n1sh1/Mission2/robotキャッチ中.jpg,50%,...
&ref(2017b/Member/n1sh1/Mission2/robotキャッチ後.jpg,55%,...
紙コップを取ろうとロボットの少しのずれでうまく取ることが...
*プログラムについて [#a9bde67b]
今回のプログラムでは「比例制御」を用いることにより、より滑...
***比例制御について [#gdc785e5]
「比例制御」とは、その名の通り明るさに比例してモーターの回...
**各定義 [#b4ac7b6c]
このようにセンサーに関係する値だけを定義した。他にも定義...
#define sensor SENSOR_2 //センサーの値
#define black 30 //黒の値
#define white 58 //白の値
#define threshold (black+white)*0.5 //閾値(前述の明るさ...
#define deflection (sensor-threshold) //センサーの値と閾...
**サブルーチン [#f8842420]
***トレース [#ua6957d9]
黒線の右側をトレースするときは、go_forward_in(),左側をgo_...
sub go_forward_in(int x) //前方へ(黒線の右側)
{
OnFwd(OUT_A,23+deflection*x);
OnFwd(OUT_B,25-deflection*x);
}
sub go_forward_out(int x) //前方へ(黒線の左側)
{
OnFwd(OUT_A,23+deflection*x);
OnFwd(OUT_B,25-deflection*x);
}
下の2つは、F-C間のヘアピンカーブをトレースするときに使う...
sub go_left(int x) //左前方へ
{
OnFwd(OUT_A,20+deflection*x);
OnFwd(OUT_B,-20-deflection*x);
}
sub go_right(int x) //右前方へ
{
OnFwd(OUT_A,-20+deflection*x);
OnFwd(OUT_B,20-deflection*x);
}
***交差点識別 [#v0d5c7dc]
交差点を判別するためのサブルーチンである。センサーが黒線...
sub intertify_in() //交差点まで(黒線の右側)
{
long t=CurrentTick();
while(CurrentTick()-t<=150){
if(sensor>white-5){
go_forward_in(1.5);
t=CurrentTick();
}else if(sensor>black+7){
go_forward_in(1.5);
t=CurrentTick();
}else{
go_forward_in(1.5);
}
}
Off(OUT_AB);
Wait(10);
}
sub intertify_out() //交差点まで(黒線の左側)
{
long t1=CurrentTick();
while(CurrentTick()-t1<=150){
if(sensor>white-5){
go_forward_out(-1.5);
t1=CurrentTick();
}else if(sensor>black+7){
go_forward_out(-1.5);
t1=CurrentTick();
}else{
go_forward_out(-1.5);
}
}
Off(OUT_AB);
Wait(10);
}
***急カーブのトレース [#rfcb3fd2]
交差点識別のサブルーチンでは交差点ではないところを交差点...
sub curve_in(int curve_in_time) //急カーブ(黒線の右側)
{
long ti=CurrentTick();
while(CurrentTick()-ti<=curve_in_time){
if(sensor>white-5){
go_left(1.8);
}else if(sensor>black+7){
go_forward_in(1.5);
}else{
go_right(1.8);
}
}
Off(OUT_AB);
Wait(10);
}
sub curve_out(long curve_out_time) //急カーブ(黒線の左側)
{
long to=CurrentTick();
while(CurrentTick()-to<=curve_out_time){
if(sensor>white-5){
go_right(-1.8);
}else if(sensor>black+7){
go_forward_out(-1.5);
}else{
go_left(-1.8);
}
}
Off(OUT_AB);
Wait(10);
}
***再びラインとレースするために [#z365c128]
交差点識別した直後、センサーは黒線の真ん中あたりに来る。...
sub escape_straight() //黒線からの脱出(直進)
{
while(sensor<white-10){
OnFwd(OUT_A,25); OnFwd(OUT_B,35);
}
Off(OUT_AB);
Wait(100);
while(sensor>black+10){
OnFwd(OUT_A,30); OnFwd(OUT_B,-20);
}
Off(OUT_AB);
Wait(10);
}
sub escape_CP() //黒線からの脱出(C,P)
{
while(sensor<white-10){
OnFwd(OUT_A,30); OnFwd(OUT_B,30);
}
Off(OUT_AB);
Wait(100);
while(sensor>threshold){
OnFwd(OUT_A,-30); OnFwd(OUT_B,30);
}
Off(OUT_AB);
Wait(10);
}
sub escape_R() //黒線からの脱出(R)
{
while(sensor<white-5){
OnFwd(OUT_A,30);
}
Off(OUT_AB);
Wait(10);
}
sub escape_Q() //黒線からの脱出(Q)
{
while(sensor<threshold){
OnFwd(OUT_A,30); OnFwd(OUT_B,15);
}
Off(OUT_AB);
Wait(100);
while(sensor>black+10){
OnFwd(OUT_A,30);
}
Off(OUT_AB);
Wait(10);
}
sub escape_F() //黒線からの脱出(F)
{
while(sensor<white-5){
OnFwd(OUT_A,40);
}
Off(OUT_A);
Wait(10);
while(sensor>threshold+7){
OnFwd(OUT_A,30);
}
Off(OUT_A);
Wait(10);
}
***紙コップのキャッチ&リリース [#s81a38e4]
アームを上げ下げするためのサブルーチンである。ギア比が1:2...
void cup(int c) //取るとき+1,置くとき-1
{
Wait(500);
RotateMotor(OUT_C,50,-360*c);
Wait(2000);
}
紙コップを取るときはどうしても黒線から外れなければいけな...
sub turn(int i) //90°時計回り+1,反時計回り-1
{
OnFwd(OUT_A,-40*i); OnFwd(OUT_B,40*i);
Wait(800);
Off(OUT_AB);
Wait(100);
}
上の2つのサブルーチンを作ったので、正負を代入するだけでキ...
sub catch() //紙コップ取る
{
turn(+1);
cup(+1);
turn(-1);
}
sub put() //紙コップ置く
{
turn(-1);
cup(-1);
turn(+1);
}
***本文 [#b1f133ff]
この通りである。前述のように引数は実験的に出したものであ...
task main()
{
SetSensorLight(S2);
//A-B
intertify_in();
//B-C
escape_straight();
curve_in(25000);
intertify_in();
//C-R
escape_CP();
curve_out(31000);
intertify_out();
//R-P
Wait(500);
PlaySound(SOUND_CLICK);
escape_R();
intertify_out();
//P-(X)-Q
escape_CP();
curve_out(4500);
Wait(2000);
catch();
intertify_out();
//Q-S
escape_Q();
intertify_in();
//S-(Y)-S
Wait(500);
PlaySound(SOUND_CLICK);
escape_straight();
curve_in(12000);
Wait(1000);
put();
intertify_in();
//S-F
Wait(500);
PlaySound(SOUND_CLICK);
escape_straight();
intertify_in();
//F-C
Wait(500);
PlaySound(SOUND_CLICK);
escape_F();
intertify_in();
//C-D
Wait(500);
PlaySound(SOUND_CLICK);
turn(+1);
OnFwd(OUT_AB,50);
Wait(1500);
Off(OUT_AB);
PlaySound(SOUND_CLICK);
}
*まとめ [#q66796d5]
今回の課題は、課題1と比べると格段に難しかったと感じる。難...
ページ名: