2019a/Member/Orangestar/Mission2
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
検索
|
最終更新
|
ヘルプ
|
ログイン
]
開始行:
[[2019a/Member]]
#contents
*課題 [#g8816cf3]
**経路図 [#x490ef6f]
#ref(kadai2.png,zoom,500x300);
**コースの詳細 [#pf34ecb9]
A地点から出発 → M → K(直進) → L(ピンポン玉をつかむ) → K(...
*ロボット本体 [#y38008bf]
**本体部分 [#r4fb0443]
#ref(bodyfront.jpg,left,zoom,400x300);
ベースはNXTキットの基本形ですが、それを改良しました。光セ...
#ref(bodyunder.jpg,zoom,400x300);
下から見た図です、そこまで大きな改良点はありませんが、セ...
#ref(bodyside.jpg,zoom,300x400);
ロボット本体は小回りが利くようなるべく小さくしました。さ...
**アーム [#a9f7ba1b]
アームはギアで動力を伝え,両側から閉じる機構にしました.
#ref(inkedarm2.jpg,zoom,400x300)
**全体像 [#xb638e4d]
#ref(robot201.jpg,zoom,400x300)
ピンポン玉を掴めるだけの最小限のアームと本体によってかな...
*プログラムについて [#dc211f9e]
**そもそも黒線をトレースするには? [#z5e0d4a1]
#ref(linetrace.png,zoom,400x150);
左端をトレースするには白を検知したとき右に,黒を検知した...
右側はそれと逆のことをする.
**交差点を判断する [#tdd7e6e1]
#ref(kousatenn.jpg,zoom,400x300)
交差点を判断するには時間を利用します.交差点ではセンサー...
具体的には黒以外を認識するとタイマーが0にリセットされ、黒...
**プログラム本体 [#t17ff166]
#define turn_right OnFwd(OUT_C,25);OnRev(OUT_B,15);//右折
#define turn_left OnFwd(OUT_B,25);OnRev(OUT_C,15);//左折
#define rotate_right OnFwd(OUT_C,20);OnRev(OUT_B,25);//...
#define rotate_left OnFwd(OUT_B,20);OnRev(OUT_C,25);//左...
#define go_straight OnFwd(OUT_BC,20);//直進
#define go_straight2 OnFwd(OUT_BC,15);//ゆっくり直進
#define turn OnRev(OUT_C,25);OnFwd(OUT_B,25);Wait(1500);...
#define catch OnRev(OUT_A,25);Wait(500);Off(OUT_A);//ピ...
#define release OnFwd(OUT_A,25);Wait(500);Off(OUT_A);//...
#define osidasi OnFwd(OUT_BC,100);Wait(100);Off(OUT_BC);...
#define black 20//黒の値は20
#define white 50//白の値は50
#define lightgray 40//灰白色は40
#define darkgray 28//灰黒色は28
まず,右左折,右旋回,左旋回,直進,ピンポン玉をつかむ,...
**サブルーチン [#za8f3844]
交差点まで左側に沿ってトレースするサブルーチン
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<35){//明るさ35以下で
go_straight;//直進
t0=CurrentTick();//時間をリセット
}else{//それ以外は
rotate_right;//右旋回
t0=CurrentTick();//時間をリセット
}
}
Off(OUT_BC);//時刻が一定の値を超えると停止
Wait(1000);//1秒間停止
}
交差点までラインの右側をトレースするサブルーチン
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<35){//センサーが35以下なら
go_straight;//直進
t0=CurrentTick();//時間をリセット
}else{//それ以外は
rotate_left;//左旋回
t0=CurrentTick();//時間をリセット
}
}
Off(OUT_BC);//一定の時間を超えると停止
Wait(1000);//一秒間停止
}
J地点でのT字路まで右側をトレースするサブルーチン
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<35){//明るさ35以下で
go_straight2;//ゆっくり直進
t0=CurrentTick();時間をリセット
}else{//それ以外なら
rotate_left;//左旋回
}
}
Off(OUT_BC);//停止
Wait(2000);//2秒間停止
}
黒から白,白から黒など,交差点での方向の微調整をするサブ...
sub Blackto_White()//黒から白へ
{
while(SENSOR_1<darkgray){灰黒色の間
OnFwd(OUT_BC,15);//直進
}
Off(OUT_BC);//停止
}
sub Whiteto_Black()//白から黒まで直進
{
while(SENSOR_1>darkgray){//灰黒色まで
OnFwd(OUT_BC,15);//直進
}
Off(OUT_BC);//停止
}
sub Whiteto_Black_R()//白から黒まで右旋回
{
while(SENSOR_1>darkgray){//灰黒色まで
OnFwd(OUT_C,20);
OnRev(OUT_B,20);}//右旋回
Off(OUT_BC);
}
sub Blackto_White_R()//黒から白へ右旋回
{
while(SENSOR_1<darkgray){//灰黒の間
OnFwd(OUT_C,20);
OnRev(OUT_B,20);//右旋回
}
Off(OUT_BC);
}
sub Blackto_White_L()//黒から白へ左旋回
{
while(SENSOR_1<lightgray){//薄灰のとき
OnFwd(OUT_B,20);
OnRev(OUT_C,20);//左に旋回
}
Off(OUT_BC);
}
sub Whiteto_Black_L()白から黒へ左旋回
{
while(SENSOR_1>black){//黒の時
OnFwd(OUT_B,20);
OnRev(OUT_C,20);//左旋回
}
Off(OUT_BC);
}
**メインプログラム [#i47765e4]
task main()
{
SetSensorLight(S1);
followline_R(150);//右側をトレース(B→K)
Blackto_White_L();//黒から白へ
followline_L(200);//
Blackto_White_R();//位置調節
followline_R2(200);//右側をトレース(K→L)
catch;//ピンポン玉をつかむ
turn;//180°回転
followline_R(150);右側をトレース(K→J)
Blackto_White();//位置調節
followline_L(150);//左側をトレース(J→I)
Blackto_White_L();//位置調節
followline_L(200);//左側をトレース(I→H)
Blackto_White();//位置調節
followline_L(200);//左側をトレース(H→G)
Blackto_White();//位置調節
followline_L(200);//左側をトレース(G→F)
Blackto_White();//位置調節
followline_R(150);//右側をトレース(F→D)
Blackto_White();//位置調節
followline_R(150);//右側をトレース(D→B)
release;//ピンポン玉を離す
osidasi;//ピンポン玉を押し出す
}
終了行:
[[2019a/Member]]
#contents
*課題 [#g8816cf3]
**経路図 [#x490ef6f]
#ref(kadai2.png,zoom,500x300);
**コースの詳細 [#pf34ecb9]
A地点から出発 → M → K(直進) → L(ピンポン玉をつかむ) → K(...
*ロボット本体 [#y38008bf]
**本体部分 [#r4fb0443]
#ref(bodyfront.jpg,left,zoom,400x300);
ベースはNXTキットの基本形ですが、それを改良しました。光セ...
#ref(bodyunder.jpg,zoom,400x300);
下から見た図です、そこまで大きな改良点はありませんが、セ...
#ref(bodyside.jpg,zoom,300x400);
ロボット本体は小回りが利くようなるべく小さくしました。さ...
**アーム [#a9f7ba1b]
アームはギアで動力を伝え,両側から閉じる機構にしました.
#ref(inkedarm2.jpg,zoom,400x300)
**全体像 [#xb638e4d]
#ref(robot201.jpg,zoom,400x300)
ピンポン玉を掴めるだけの最小限のアームと本体によってかな...
*プログラムについて [#dc211f9e]
**そもそも黒線をトレースするには? [#z5e0d4a1]
#ref(linetrace.png,zoom,400x150);
左端をトレースするには白を検知したとき右に,黒を検知した...
右側はそれと逆のことをする.
**交差点を判断する [#tdd7e6e1]
#ref(kousatenn.jpg,zoom,400x300)
交差点を判断するには時間を利用します.交差点ではセンサー...
具体的には黒以外を認識するとタイマーが0にリセットされ、黒...
**プログラム本体 [#t17ff166]
#define turn_right OnFwd(OUT_C,25);OnRev(OUT_B,15);//右折
#define turn_left OnFwd(OUT_B,25);OnRev(OUT_C,15);//左折
#define rotate_right OnFwd(OUT_C,20);OnRev(OUT_B,25);//...
#define rotate_left OnFwd(OUT_B,20);OnRev(OUT_C,25);//左...
#define go_straight OnFwd(OUT_BC,20);//直進
#define go_straight2 OnFwd(OUT_BC,15);//ゆっくり直進
#define turn OnRev(OUT_C,25);OnFwd(OUT_B,25);Wait(1500);...
#define catch OnRev(OUT_A,25);Wait(500);Off(OUT_A);//ピ...
#define release OnFwd(OUT_A,25);Wait(500);Off(OUT_A);//...
#define osidasi OnFwd(OUT_BC,100);Wait(100);Off(OUT_BC);...
#define black 20//黒の値は20
#define white 50//白の値は50
#define lightgray 40//灰白色は40
#define darkgray 28//灰黒色は28
まず,右左折,右旋回,左旋回,直進,ピンポン玉をつかむ,...
**サブルーチン [#za8f3844]
交差点まで左側に沿ってトレースするサブルーチン
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<35){//明るさ35以下で
go_straight;//直進
t0=CurrentTick();//時間をリセット
}else{//それ以外は
rotate_right;//右旋回
t0=CurrentTick();//時間をリセット
}
}
Off(OUT_BC);//時刻が一定の値を超えると停止
Wait(1000);//1秒間停止
}
交差点までラインの右側をトレースするサブルーチン
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<35){//センサーが35以下なら
go_straight;//直進
t0=CurrentTick();//時間をリセット
}else{//それ以外は
rotate_left;//左旋回
t0=CurrentTick();//時間をリセット
}
}
Off(OUT_BC);//一定の時間を超えると停止
Wait(1000);//一秒間停止
}
J地点でのT字路まで右側をトレースするサブルーチン
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<35){//明るさ35以下で
go_straight2;//ゆっくり直進
t0=CurrentTick();時間をリセット
}else{//それ以外なら
rotate_left;//左旋回
}
}
Off(OUT_BC);//停止
Wait(2000);//2秒間停止
}
黒から白,白から黒など,交差点での方向の微調整をするサブ...
sub Blackto_White()//黒から白へ
{
while(SENSOR_1<darkgray){灰黒色の間
OnFwd(OUT_BC,15);//直進
}
Off(OUT_BC);//停止
}
sub Whiteto_Black()//白から黒まで直進
{
while(SENSOR_1>darkgray){//灰黒色まで
OnFwd(OUT_BC,15);//直進
}
Off(OUT_BC);//停止
}
sub Whiteto_Black_R()//白から黒まで右旋回
{
while(SENSOR_1>darkgray){//灰黒色まで
OnFwd(OUT_C,20);
OnRev(OUT_B,20);}//右旋回
Off(OUT_BC);
}
sub Blackto_White_R()//黒から白へ右旋回
{
while(SENSOR_1<darkgray){//灰黒の間
OnFwd(OUT_C,20);
OnRev(OUT_B,20);//右旋回
}
Off(OUT_BC);
}
sub Blackto_White_L()//黒から白へ左旋回
{
while(SENSOR_1<lightgray){//薄灰のとき
OnFwd(OUT_B,20);
OnRev(OUT_C,20);//左に旋回
}
Off(OUT_BC);
}
sub Whiteto_Black_L()白から黒へ左旋回
{
while(SENSOR_1>black){//黒の時
OnFwd(OUT_B,20);
OnRev(OUT_C,20);//左旋回
}
Off(OUT_BC);
}
**メインプログラム [#i47765e4]
task main()
{
SetSensorLight(S1);
followline_R(150);//右側をトレース(B→K)
Blackto_White_L();//黒から白へ
followline_L(200);//
Blackto_White_R();//位置調節
followline_R2(200);//右側をトレース(K→L)
catch;//ピンポン玉をつかむ
turn;//180°回転
followline_R(150);右側をトレース(K→J)
Blackto_White();//位置調節
followline_L(150);//左側をトレース(J→I)
Blackto_White_L();//位置調節
followline_L(200);//左側をトレース(I→H)
Blackto_White();//位置調節
followline_L(200);//左側をトレース(H→G)
Blackto_White();//位置調節
followline_L(200);//左側をトレース(G→F)
Blackto_White();//位置調節
followline_R(150);//右側をトレース(F→D)
Blackto_White();//位置調節
followline_R(150);//右側をトレース(D→B)
release;//ピンポン玉を離す
osidasi;//ピンポン玉を押し出す
}
ページ名: