ライントレースロボ

課題内容

決められたコースを缶を運びながら進む.

マップ.gif

本体の構造

本体は、NXTの組み立て例をベースにし前輪2つ、後輪1つの3輪である。

前輪は左右それぞれが独立し動く。

また,機体前方にタッチセンサと光センサを取り付けた.

本体改.gif
センサ.gif

アーム部分

四角形の枠をかぶせるように動く.

上げ.gif
下げ.gif

プログラム

回転をサブルーチンで簡単にした.

sub hidari()
{
	OnFwd(OUT_B,50); OnRev(OUT_C,50);
}
sub migi()
{
	OnFwd(OUT_C,50); OnRev(OUT_B,50);
}

前進・交差点確認

前進と交差する所のチェックを一つのサブルーチンにした.

前進は光センサが黒と白を交互に通るようにした.

このとき黒い所を通る時間をタイマーで記録し変数に代入する.

曲がり角はタイマーの時間が一定値(set)を超えたかでチェックするようにした.

曲がり角は右に行く場合と左に行く場合の2つを用意した.(susumu_lとsusumu_r)

さらに回数のカウントを入れることで,何回目の交差点で止まるかを一回でできるようにした.

また,右方向・左方向の二つを作った.

sub susumu_l(int i){ //左確認
	long t,n;
	SetSensorLight(S2);
	int mflg=0,tflg=0,con=0;
	while(tflg==0){
		if(mflg==0){
			t=CurrentTick();
			OnFwd(OUT_BC,70);Wait(shin);
			while(SENSOR_2<b_jou){//b_jou 黒い部分のしきい値
				hidari();
			}
			n=CurrentTick(); n=n-t;//nに黒い部分を通った時間が入る
			if(n>=set){
				migi(); Wait(n);
				OnFwd(OUT_BC,50); Wait(100);
				Off(OUT_BC);
				con++;
				if(con==i) tflg=1;
				else mflg=1;
			}
			else mflg=1;
		}
		if(mflg==1){
			OnFwd(OUT_BC,70);Wait(shin);
			while(SENSOR_2>w_jou){//w_jou 白い部分のしきい値
				migi();
			}
			mflg=0;
		}
	}
}
sub susumu_r(int i){ //右確認
	long t,n;
	SetSensorLight(S2);
	int mflg=0,tflg=0,con=0;
	while(tflg==0){
		if(mflg==0){
			t=CurrentTick();
			OnFwd(OUT_BC,70);Wait(shin);
			while(SENSOR_2<b_jou){//b_jou 黒い部分のしきい値
				migi();
			}
			n=CurrentTick(); n=n-t;//nに黒い部分を通った時間が入る
			if(n>=set){
				hidari(); Wait(n);
				OnFwd(OUT_BC,50); Wait(100);
				Off(OUT_BC);
				con++;
				if(con==i) tflg=1;
				else mflg=1;
			}
			else mflg=1;
		}
		if(mflg==1){
			OnFwd(OUT_BC,70);Wait(shin);
			while(SENSOR_2>w_jou){//w_jou 白い部分のしきい値
				hidari();
			}
			mflg=0;
		}
	}
}

アームの上下

上下もサブルーチンで作った.

タッチセンサの感知と下げる動作を連動させた.

上がるときのほうが時間がかかるので,上がるときの時間を長くした.

sub arm_d() //下
{
	SetSensorTouch(S1);
	while(SENSOR_1==0){
		OnFwd(OUT_BC,70);
	}
	Off(OUT_BC);
	OnFwd(OUT_A,50); Wait(arm_kai); Off(OUT_A);
}
sub arm_u() //上
{
	OnRev(OUT_A,50); Wait(arm_kai+70); Off(OUT_A);
	OnRev(OUT_BC,70);Wait(120);Off(OUT_BC);
	migi(); Wait(turn*2); Off(OUT_BC);//アームを上げたあと下がって反転する
}

全体

#define set 300
#define b_jou 25
#define w_jou 15
#define arm_kai 100
#define shin 30
#define turn 1000
task main()
{
	susumu_l(1);//A~C
	Wait(1000);
	susumu_l(1);//C~D
	Wait(1000);
	hidari(); Wait(turn); Off(OUT_BC);
	arm_d();//X
	hidari(); Wait(turn); Off(OUT_BC);
	susumu_l(2);//D~F
	hidari(); Wait(turn); Off(OUT_BC);
	susumu_l(1);//F~G
	Wait(1000);
	hidari(); Wait(turn); Off(OUT_BC);
	susumu_l(1);//G
	hidari(); Wait(turn); Off(OUT_BC);
	susumu_r(1);
	migi(); Wait(turn); Off(OUT_BC);
	susumu_l(1);//H0
	Wait(1000);
	migi(); Wait(turn);   Off(OUT_BC);
	susumu_r(1);//H~I
	Wait(1000);
	migi(); Wait(turn);   Off(OUT_BC);
	susumu_r(3);//I~J
	Wait(1000);
	hidari(); Wait(turn); Off(OUT_BC);
	arm_u();//Y
	susumu_l(1);//J~B
	Wait(1000);
	hidari(); Wait(turn); Off(OUT_BC);
	susumu_l(1);//B~A
	OnFwd(OUT_BC,70); Wait(50);
}

考察

缶をつかむ動作・アームを急ごしらえで作ったため,

うまく動作させるまでに余計に時間がかかってしまった。

なのでどこから作るのかを決めてから作るべきだ。


添付ファイル: fileセンサ.gif 133件 [詳細] file本体改.gif 192件 [詳細] file下げ.gif 159件 [詳細] file実演.gif 77件 [詳細] file上げ.gif 162件 [詳細] fileマップ.gif 140件 [詳細]

トップ   編集 凍結 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2018-08-12 (日) 15:37:33