- 追加された行はこの色です。
- 削除された行はこの色です。
*ライントレースロボ [#qf87f342]
#contents
**課題内容 [#od12bf8f]
~決められたコースを缶を運びながら進む.
#ref(マップ.gif),nolink
**本体の構造 [#ad9f8127]
~本体は、NXTの組み立て例をベースにし前輪2つ、後輪1つの3輪である。
~前輪は左右それぞれが独立し動く。
~また,機体前方にタッチセンサと光センサを取り付けた.
#ref(本体改.gif),nolink
#ref(センサ.gif),nolink
**アーム部分 [#i4007825]
~四角形の枠をかぶせるように動く.
#ref(上げ.gif),nolink
#ref(下げ.gif),nolink
**プログラム [#h9d325cf]
~回転をサブルーチンで簡単にした.
sub hidari()
{
OnFwd(OUT_B,50); OnRev(OUT_C,50);
}
sub migi()
{
OnFwd(OUT_C,50); OnRev(OUT_B,50);
}
***前進・交差点確認 [#y8b42f8c]
~前進と交差する所のチェックを一つのサブルーチンにした.
~前進は光センサが黒と白を交互に通るようにした.
~曲がり角は光センサが黒いところを通る時間が一定値を超えたかでチェックするようにした.
~さらに回数のカウントを入れることで,何回チェックしたかで停止を制御できるようにした.
~このとき黒い所を通る時間をタイマーで記録し変数に代入する.
~曲がり角はタイマーの時間が一定値(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){
while(SENSOR_2<b_jou){//b_jou 黒い部分のしきい値
hidari();
}
n=CurrentTick(); n=n-t;
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){
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){
while(SENSOR_2<b_jou){//b_jou 黒い部分のしきい値
migi();
}
n=CurrentTick(); n=n-t;
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){
while(SENSOR_2>w_jou){//w_jou 白い部分のしきい値
hidari();
}
mflg=0;
}
}
}
***アームの上下 [#mc94138e]
~上下もサブルーチンで作った.
~タッチセンサの感知と下げる動作を連動させた.
~上がるときのほうが時間がかかるので,上がるときの時間を長くした.
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);
migi(); Wait(turn*2); Off(OUT_BC);//アームを上げたあと下がって反転する
}
***全体 [#y170e0d5]
#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);
}