*ライントレースロボ [#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){//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; } } } ***アームの上下 [#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);//アームを上げたあと下がって反転する } ***全体 [#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); } **考察 [#v66f70f4] ~缶をつかむ動作・アームを急ごしらえで作ったため, ~うまく動作させるまでに余計に時間がかかってしまった。 ~なのでどこから作るのかを決めてから作るべきだ。