2018b/Member/riho/Mission3
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
検索
|
最終更新
|
ヘルプ
|
ログイン
]
開始行:
目次
#contents
*課題3 [#e40a6e93]
**ボール運搬ロボット [#gc2da996]
青と赤のボールを運搬して、それぞれ所定の350ml缶の上に乗せ...
**コース [#p43f2f90]
#ref(2018b/Member/riho/Mission3/2018b-mission3.jpg,80%,コ...
私のグループでは、上の図のように
+Xからスタート
+Gで赤いボールを取る
+Fを通過しEを直進
+Dで缶を探しボールを置く
+ボールを置いたらDに戻る
+Eを右折
+Iを直進して青いボールを取る
+缶を探しボールを置く
という経路でロボットを動かすことにした。
*ロボットの説明 [#n6d09df4]
**ロボットの全体像 [#t9ba1293]
今回のミッションではNXTの本体が2つ使えたので、NXTの本体...
また、2つのNXTを横に並べることと、後ろのタイヤ(駆動輪)...
#ref(2018b/Member/riho/Mission3/IMG_1122.jpg,50%,ロボット...
**アーム [#m163f6d4]
-アームの持ち上げ
1つのモータはアームの持ち上げに使った。
#ref(2018b/Member/riho/Mission3/IMG_1128.jpg,50%,横から見...
これはモータを回すことで、写真のように?小さな歯車が回り、...
-アームの開け閉め
#ref(2018b/Member/riho/Mission3/IMG_1120.jpg,70%,ロボット...
モータを回すと、上の写真のように?黒い小さな歯車が回り、?...
#ref(2018b/Member/riho/Mission3/IMG_1129.jpg,70%,ボールの...
上の図はボールを掴む仕組みを床と平行方向の目線で見た時の...
**センサ [#v0b2c9c8]
#ref(2018b/Member/riho/Mission3/IMG_1119.jpg,50%,センサの...
-光センサ
課題2の時と同様に、光センサの値を見ながら白色と黒色の値...
-超音波センサ
今回のボールの持ち上げ方は上記で述べたようにアームを上げ...
*通信 [#y0c074d2]
**通信の仕組み [#nf5c9192]
2体あるNXTの1つを親機、1つを子機とする。親機が主体とな...
今回はアームの開け閉め時、アームの上げ下げ時に通信を使用...
*プログラムの説明 [#o85242e9]
**ライントレース [#yf494112]
課題2と同じである。「真っ白」「白と境界線の間」「境界線...
#ref(2018b/Member/riho/Mission3/IMG_1131.jpg,60%,光センサ...
光センサで測定すると「真っ白」は58以上、「白と境界線の間...
線の左側を進むので、「真っ白」の時は右旋回、「白と境界線...
#ref(2018b/Member/riho/Mission3/IMG_1130.jpg,60%,光センサ...
そのプログラムは以下のとおりである。
まず、以下のプログラムを定義しておく。
#define turn_l1 OnFwd(OUT_B,33);OnRev(OUT_C,33); //左旋回
#define turn_r1 OnFwd(OUT_C,33);OnRev(OUT_B,33); //右旋回
#define turn_l0 OnFwd(OUT_B,30);Off(OUT_C); //左折
#define turn_r0 Off(OUT_B);OnFwd(OUT_C,30); //右折
#define go_s OnFwd(OUT_BC,30); //直進
左旋回と右旋回の時だけモータのパワーを33にした。それはロ...
SetSensorLight(S1); //1番に繋がっている光センサを使う
if(SENSOR_1>58){ //もし光センサが58以上の値を測定したら
turn_r1; //右旋回
}else if(SENSOR_1>53){ //もし光センサが53以上57以下の...
turn_r0; //右折
}else if(SENSOR_1>44){ //もし光センサが44以上52以下の値...
go_s; //直進 ...
}else if(SENSOR_1>34){ //もし光センサが34以上43以下の値...
turn_l0; //左折 ...
}else{ //もし光センサが33以下の値を測定したら
turn_l1; //左旋回
}
これを応用して交差点を見つけたら終わるプログラムを作る。...
#ref(2018b/Member/riho/Mission3/IMG_1133.jpg,60%,交差点を...
図の赤い矢印は全て同じ長さである。直線上にある矢印は、白...
これを利用して以下のような交差点に入ると終わるプログラム...
void tuuzyou()
{
SetSensorLight(S1); //1番に繋がっている光センサを使う
long t0; //long型のt0を定義 ...
t0=CurrentTick(); //現在の時間を記録
while(CurrentTick()-t0<90){ //現在の時間とt0の差が...
if(SENSOR_1>58){ //もし光センサが58以上の値を測...
turn_r1; //右旋回
t0=CurrentTick(); //t0を更新する ...
}else if(SENSOR_1>53){ //もし光センサが53以上5...
turn_r0; //右折
t0=CurrentTick(); //t0を更新する
}else if(SENSOR_1>44){ //もし光センサが44以上52...
go_s; //直進
t0=CurrentTick(); //t0を更新する ...
}else if(SENSOR_1>34){ //もし光センサが34以上43...
turn_l0; //左折
t0=CurrentTick(); //t0を更新する ...
}else{ //もし光センサが33以下の値を測定したら
turn_l1; //左旋回
}
}
}
これは、「真っ黒」以外が測定されるたびにt5を更新すると現...
これを基本としてライントレースのプログラムを作る。
***G-F間の止まらないプログラム [#ie76575f]
GとFの間にある急カーブやFの直角だと交差点と同じように「真...
void special()
{
SetSensorLight(S1); //1番に繋がっている光センサを...
long t1; //long型のt1を定義する ...
t1=CurrentTick() //現在の時間を記録
while(CurrentTick()-t1<23500){ //現在の時間とt1の差...
if(SENSOR_1>58){ //もし光センサが58以上の値を測...
turn_r1; //右旋回
}else if(SENSOR_1>53){ //もし光センサが53以上5...
turn_r0; //右折
}else if(SENSOR_1>44){ //もし光センサが44以上52...
go_s; //直進 ...
}else if(SENSOR_1>34){ //もし光センサが34以上43...
turn_l0; //左折 ...
}else{ //もし光センサが33以下の値を測定したら
turn_l1; //左旋回
}
}
}
***Eの交差点を直進するプログラム [#rdfb6961]
Eの交差点を直進するには、まず交差点を認識してライントレー...
void massugu()
{ ...
turn_r1; //右旋回
Wait(150); //右旋回を0.15秒実行
go_s; //直進
Wait(1200); //直進を1.2秒実行
}
交差点を見つけてロボットが「tuuzyou」のプログラムを終える...
***Dの直角を認識するプログラム [#rf4c2994]
Dの位置でボールを探そうとしていたので、Dの直角で止まらな...
#ref(2018b/Member/riho/Mission3/IMG_1135.jpg,60%,直角Dの...
ということは、「真っ白」を認識したら終わるプログラムを作...
void sirotuuzyou()
{
SetSensorLight(S1); //1番に繋がっている光センサを使う
long t2; //long型のt2を定義 ...
t2=CurrentTick(); //現在の時間を記録
while(CurrentTick()-t2<90){ //現在の時間とt2の差が0....
if(SENSOR_1>58){ //もし光センサが58以上の値を測...
turn_r1; //右旋回
}else if(SENSOR_1>53){ //もし光センサが53以上5...
turn_r0; //右折
t2=CurrentTick(); //t2を更新する
}else if(SENSOR_1>44){ //もし光センサが44以上52...
go_s; //直進
t2=CurrentTick(); //t2を更新する ...
}else if(SENSOR_1>34){ //もし光センサが34以上43...
turn_l0; //左折
t2=CurrentTick(); //t2を更新する ...
}else{ //もし光センサが33以下の値を測定したら
turn_l1; //左旋回
t2=CurrentTick(); //t2を更新する
}
}
}
***D-E間の線の右側を沿って進み、Eの直角でも止まらないプロ...
まずは、今までとは違い、線の右側を沿って進むプログラムを...
#ref(2018b/Member/riho/Mission3/IMG_1132.jpg,60%,右側通行...
線の左側に沿って進むプログラムは、光センサが測定する値が...
SetSensorLight(S1); //1番に繋がっている光センサを使う
if(SENSOR_1>58){ //もし光センサが58以上の値を測定したら
turn_l1; //左旋回
}else if(SENSOR_1>53){ //もし光センサが53以上57以下の...
turn_l0; //左折
}else if(SENSOR_1>44){ //もし光センサが44以上52以下の値...
go_s; //直進 ...
}else if(SENSOR_1>34){ //もし光センサが34以上43以下の値...
turn_r0; //右折 ...
}else{ //もし光センサが33以下の値を測定したら
turn_r1; //右旋回
}
これを応用してD-E間を通る時間をあらかじめ測定してその時間...
void gyakuspe()
{
SetSensorLight(S1); //1番に繋がっている光センサを使う
long t6; //long型のt6を定義 ...
t6=CurrentTick(); //現在の時間を記録 ...
while(CurrentTick()-t6<6000){ //現在の時間とt6の差...
if(SENSOR_1>58){ //もし光センサが58以上の値を測...
turn_l1; //左旋回
}else if(SENSOR_1>53){ //もし光センサが53以上57以...
turn_l0; //左折
}else if(SENSOR_1>44){ //もし光センサが44以上52以下...
go_s; //直進 ...
}else if(SENSOR_1>34){ //もし光センサが34以上43以下...
turn_r0; //右折 ...
}else{ //もし光センサが33以下の値を測定したら
turn_r1; //右旋回
}
}
}
***Iの交差点で直進するプログラム [#uba7966a]
Iの交差点で直進するには線の右側に沿って進み、交差点を認識...
void gyakutuuzyou() ...
{
SetSensorLight(S1); //1番に繋がっている光センサを使う
long t5; //long型のt5を定義する ...
t5=CurrentTick(); //現在の時間を記録
while(CurrentTick()-t5<90){ //現在の時間とt5の差が...
if(SENSOR_1>58){ //もし光センサが58以上の値を測...
turn_l1; //左旋回
t5=CurrentTick(); //t5を更新する
}else if(SENSOR_1>53){ //もし光センサが53以上5...
turn_l0; //左折
t5=CurrentTick(); //t5を更新する
}else if(SENSOR_1>44){ //もし光センサが44以上52...
go_s; //直進
t5=CurrentTick(); //t5を更新する ...
}else if(SENSOR_1>34){ //もし光センサが34以上43...
turn_r0; //右折
t5=CurrentTick(); //t5を更新する ...
}else{ //もし光センサが33以下の値を測定したら
turn_r1; //右旋回
}
}
}
線の左側に沿って進むプログラムと同様に、交差点があると、...
#ref(2018b/Member/riho/Mission3/IMG_1134.jpg,60%,右側で交...
これを用いる。「真っ黒」以外が測定されるたびにt5を更新す...
交差点を認知して直進するには、「task main」中に今のプログ...
**ボールを掴むプログラム [#a457f9b0]
ボーつを掴む時は通信を使った。
#define CONN 1 //子機の接続番号
を定義し、
まずは親機のプログラム
void tukamu()
{
RemoteStartProgram(CONN,"CATCH.rxe"); //ボール取る...
Wait(9000); //ボ...
}
?は子機にあらかじめ入れておいた「CATCH.nxc」というプログ...
?はあらかじめ子機で「CATCH.nxc」を実行する時間を測定して...
次に子機のプログラムは
#define UP OnFwd(OUT_B,20);Wait(4750);Off(OUT_BC); //...
#define DOWN OnRev(OUT_B,20);Wait(2600);Off(OUT_BC); //...
#define CATCH OnRev(OUT_C,15);Wait(725);Off(OUT_BC); //...
を定義して
task main()
{
DOWN //アームを下げる
CATCH //元々腕は開いていてアームの腕を閉じてボールを掴む
UP //アームを持ち上げる
}
**缶を探して缶に置くプログラム [#ve422815]
***ロボットからの距離が最小の物体を探す [#q2645e2c]
コンテストではダミーの缶も置けたが、私たちのグループはダ...
まず
#define speed 70
#define speed_s 50
const float diameter=5.54; //タイヤの直径(cm) ...
const float track=10.35; //タイヤのトレッド幅(cm)
const float pi=3.1415; //円周率
と定義し、
void fwdDist(float d)
{
long angle; ...
angle= d/(diameter*pi)*360.0;
RotateMotorEx(OUT_BC,speed_s,angle,0,true,true); ...
}
void turnAng(long ang) //角度ang度の時計回りの旋回をする
{
long angle;
angle=track/diameter*ang;
RotateMotorEx(OUT_BC,speed_s,angle,100,true,true);
} ...
int searchDirection(long ang) //現在の方向を中心にang度...
//障害...
{
long angle,tacho_min=0,tacho_corr;
int d_min;
d_min=300; //仮の最小値
angle=(track/diameter)*ang; //旋回角度からタイヤの...
turnAng(ang/2); //指定された角度の半分を旋回する
ResetTachoCount(OUT_BC); //角度計測をリセット ...
OnFwdSync(OUT_BC,speed_s,-100); //反時計回りに旋回...
while(MotorTachoCount(OUT_B)<=angle){
if(SensorUS(S4)<d_min){
d_min=SensorUS(S4); //仮の最小値を更新する
tacho_min=MotorTachoCount(OUT_B);
}
} ...
OnFwdSyncEx(OUT_BC,speed_s,100,RESET_NONE);
until(MotorTachoCount(OUT_B)<=tacho_min||SensorUS(S4...
Wait(14); //微調整
Off(OUT_BC);Wait(500);
return d_min;
}
上のプログラムは、ロボットが回転することによって、ロボッ...
#ref(2018b/Member/riho/Mission3/IMG_1053.jpg,60%,超音波セ...
そして、測定が終わったら、測定したd_minの中で1番小さい値...
***缶の近くに移動する [#h6b052df]
あらかじめ超音波センサを用いて缶にボールを置くのに適して...
SetSensorLowspeed(S4); //4番に繋いだ超音波センサを使う
int d=searchDirection(360); //int型でdを定義し、ロボッ...
if (d>13.5){ //もし見つけた最小値の距...
fwdDist(d-13.5); //缶とロボットの距離が13.5cmになる...
}
***ボールを置くプログラム [#c82e4c0c]
ボールを置くときは通信を使う。
#define CONN 1 //子機の接続番号
を定義し、
親機のプログラムは
RemoteStartProgram(CONN,"lost.rxe"); //ボール置く...?
Wait(2000); //親機の待ち時間...?
ボールを掴むプログラムと同様である。?は子機に「lost.nxc」...
?はあらかじめ子機が「lost.nxc」のプログラムを実行する時間...
次に子機のプログラムは
#define LOST OnFwd(OUT_C,15);Wait(685);Off(OUT_C); //...
を定義して、
task main(){ //ボールを持って腕は上がっている状態から
LOST //アームを広げてボールを置く
}
***缶を探して赤いボールを缶に置いて元いたDに戻るプログラ...
上記のプログラムを組み合わせて缶を探してボールを置いて元...
void sagasu()
{
SetSensorLowspeed(S4); //4番に繋いだ超音波センサを...
int d=searchDirection(360); //int型でdを定義し、ロ...
if (d>13.5){ //もし見つけた最小値...
long t3,t4; //long型のt3,t4を定義する
t3=CurrentTick(); //ロボットが缶に近づく前の時...
fwdDist(d-13.5); //缶とロボットの距離が13.5cmに...
t4=CurrentTick(); //ロボットが缶に近づいた後の...
stoop; //親機はボールを置く際に動かないのでモー...
RemoteStartProgram(CONN,"lost.rxe"); //親機が...
Wait(2000); //子機がボールを置いている時間、親...
OnRev(OUT_BC,30); //元の位置(直角D)に戻るため...
Wait(t4-t3); //t4-t3の時間後退させる...? ...
}
}
?のt3はロボットが缶に近づく前の時間で、t4はロボットが缶に...
***缶を探して青いボールを缶に置くプログラム [#j7c36667]
上記の缶を探して赤いボールを缶に置いて元いたDに戻るプログ...
void sagasu2()
{
SetSensorLowspeed(S4); //4番に繋いだ超音波センサを...
int e=searchDirection(100); //int型でeを定義し、ロ...
if (e>13.5){ //もし見つけた最小値...
t3=CurrentTick(); //ロボットが缶に近づく前の時...
fwdDist(e-13.5); //缶とロボットの距離が13.5cmに...
stoop; //親機はボールを置く際に動かないのでモー...
RemoteStartProgram(CONN,"lost.rxe"); //親機が...
Wait(2000); //子機がボールを置いている時間、親...
stoop; //これでミッションが終わりなのでモータを止め...
}
}
?で
int d=searchDirection(360);
にすると、缶の位置はサイコロで決まるので、赤いボールを乗...
*メインプログラム [#nbc9d5f3]
task main()
{
go_s; //Xから赤いボールの方向に直進 ...
Wait(1000); //1秒間直進
stoop; //ボールを掴むためロボットの動きを一旦止める
tukamu(); //赤いボールを掴んで持ち上げる
go_s; //交差点Dを直進
Wait(2000); //2秒間直進
special(); //D-F間の急カーブとFの直角があっても止ま...
tuuzyou(); //F-E間ライントレースをしてEの交差点を認...
massugu(); //Eの交差点は直進 ...
sirotuuzyou(); //Dの直角で終わるプログラム
sagasu(); //缶を探して、缶に近づいて、赤いボールを...
gyakuspe(); //D-E間の走行でEの直角があっても終わら...
gyakutuuzyou(); //E-I間の走行で、Iの交差点で終わる...
go_s; //直進して青いボールを撮れる距離まで移動する
Wait(700); //0.7秒間直進
stoop; //ボールを掴むためロボットの動きを一旦止める
tukamu(); //ボールを掴んで持ち上げる ...
sagasu2(); //缶を探して、缶に近づいて、青いボールを...
}
*まとめ [#y672fdfb]
**反省点 [#mb4d4d15]
-缶一直線にロボットが近づくときと近づかないときがあった
これによってボールが缶に乗るときと乗らないときがあり、本...
また超音波センサは超音波を出して物体によって反射され、跳...
-赤いボールを置く缶を探すためにロボットが回転した際、ロボ...
缶の近くで探したほうが正確に測定できると思い直角Dで缶を探...
**感想 [#x6ff1ed4]
今回はミッション3回目でプログラムを作るのも慣れてきたと思...
終了行:
目次
#contents
*課題3 [#e40a6e93]
**ボール運搬ロボット [#gc2da996]
青と赤のボールを運搬して、それぞれ所定の350ml缶の上に乗せ...
**コース [#p43f2f90]
#ref(2018b/Member/riho/Mission3/2018b-mission3.jpg,80%,コ...
私のグループでは、上の図のように
+Xからスタート
+Gで赤いボールを取る
+Fを通過しEを直進
+Dで缶を探しボールを置く
+ボールを置いたらDに戻る
+Eを右折
+Iを直進して青いボールを取る
+缶を探しボールを置く
という経路でロボットを動かすことにした。
*ロボットの説明 [#n6d09df4]
**ロボットの全体像 [#t9ba1293]
今回のミッションではNXTの本体が2つ使えたので、NXTの本体...
また、2つのNXTを横に並べることと、後ろのタイヤ(駆動輪)...
#ref(2018b/Member/riho/Mission3/IMG_1122.jpg,50%,ロボット...
**アーム [#m163f6d4]
-アームの持ち上げ
1つのモータはアームの持ち上げに使った。
#ref(2018b/Member/riho/Mission3/IMG_1128.jpg,50%,横から見...
これはモータを回すことで、写真のように?小さな歯車が回り、...
-アームの開け閉め
#ref(2018b/Member/riho/Mission3/IMG_1120.jpg,70%,ロボット...
モータを回すと、上の写真のように?黒い小さな歯車が回り、?...
#ref(2018b/Member/riho/Mission3/IMG_1129.jpg,70%,ボールの...
上の図はボールを掴む仕組みを床と平行方向の目線で見た時の...
**センサ [#v0b2c9c8]
#ref(2018b/Member/riho/Mission3/IMG_1119.jpg,50%,センサの...
-光センサ
課題2の時と同様に、光センサの値を見ながら白色と黒色の値...
-超音波センサ
今回のボールの持ち上げ方は上記で述べたようにアームを上げ...
*通信 [#y0c074d2]
**通信の仕組み [#nf5c9192]
2体あるNXTの1つを親機、1つを子機とする。親機が主体とな...
今回はアームの開け閉め時、アームの上げ下げ時に通信を使用...
*プログラムの説明 [#o85242e9]
**ライントレース [#yf494112]
課題2と同じである。「真っ白」「白と境界線の間」「境界線...
#ref(2018b/Member/riho/Mission3/IMG_1131.jpg,60%,光センサ...
光センサで測定すると「真っ白」は58以上、「白と境界線の間...
線の左側を進むので、「真っ白」の時は右旋回、「白と境界線...
#ref(2018b/Member/riho/Mission3/IMG_1130.jpg,60%,光センサ...
そのプログラムは以下のとおりである。
まず、以下のプログラムを定義しておく。
#define turn_l1 OnFwd(OUT_B,33);OnRev(OUT_C,33); //左旋回
#define turn_r1 OnFwd(OUT_C,33);OnRev(OUT_B,33); //右旋回
#define turn_l0 OnFwd(OUT_B,30);Off(OUT_C); //左折
#define turn_r0 Off(OUT_B);OnFwd(OUT_C,30); //右折
#define go_s OnFwd(OUT_BC,30); //直進
左旋回と右旋回の時だけモータのパワーを33にした。それはロ...
SetSensorLight(S1); //1番に繋がっている光センサを使う
if(SENSOR_1>58){ //もし光センサが58以上の値を測定したら
turn_r1; //右旋回
}else if(SENSOR_1>53){ //もし光センサが53以上57以下の...
turn_r0; //右折
}else if(SENSOR_1>44){ //もし光センサが44以上52以下の値...
go_s; //直進 ...
}else if(SENSOR_1>34){ //もし光センサが34以上43以下の値...
turn_l0; //左折 ...
}else{ //もし光センサが33以下の値を測定したら
turn_l1; //左旋回
}
これを応用して交差点を見つけたら終わるプログラムを作る。...
#ref(2018b/Member/riho/Mission3/IMG_1133.jpg,60%,交差点を...
図の赤い矢印は全て同じ長さである。直線上にある矢印は、白...
これを利用して以下のような交差点に入ると終わるプログラム...
void tuuzyou()
{
SetSensorLight(S1); //1番に繋がっている光センサを使う
long t0; //long型のt0を定義 ...
t0=CurrentTick(); //現在の時間を記録
while(CurrentTick()-t0<90){ //現在の時間とt0の差が...
if(SENSOR_1>58){ //もし光センサが58以上の値を測...
turn_r1; //右旋回
t0=CurrentTick(); //t0を更新する ...
}else if(SENSOR_1>53){ //もし光センサが53以上5...
turn_r0; //右折
t0=CurrentTick(); //t0を更新する
}else if(SENSOR_1>44){ //もし光センサが44以上52...
go_s; //直進
t0=CurrentTick(); //t0を更新する ...
}else if(SENSOR_1>34){ //もし光センサが34以上43...
turn_l0; //左折
t0=CurrentTick(); //t0を更新する ...
}else{ //もし光センサが33以下の値を測定したら
turn_l1; //左旋回
}
}
}
これは、「真っ黒」以外が測定されるたびにt5を更新すると現...
これを基本としてライントレースのプログラムを作る。
***G-F間の止まらないプログラム [#ie76575f]
GとFの間にある急カーブやFの直角だと交差点と同じように「真...
void special()
{
SetSensorLight(S1); //1番に繋がっている光センサを...
long t1; //long型のt1を定義する ...
t1=CurrentTick() //現在の時間を記録
while(CurrentTick()-t1<23500){ //現在の時間とt1の差...
if(SENSOR_1>58){ //もし光センサが58以上の値を測...
turn_r1; //右旋回
}else if(SENSOR_1>53){ //もし光センサが53以上5...
turn_r0; //右折
}else if(SENSOR_1>44){ //もし光センサが44以上52...
go_s; //直進 ...
}else if(SENSOR_1>34){ //もし光センサが34以上43...
turn_l0; //左折 ...
}else{ //もし光センサが33以下の値を測定したら
turn_l1; //左旋回
}
}
}
***Eの交差点を直進するプログラム [#rdfb6961]
Eの交差点を直進するには、まず交差点を認識してライントレー...
void massugu()
{ ...
turn_r1; //右旋回
Wait(150); //右旋回を0.15秒実行
go_s; //直進
Wait(1200); //直進を1.2秒実行
}
交差点を見つけてロボットが「tuuzyou」のプログラムを終える...
***Dの直角を認識するプログラム [#rf4c2994]
Dの位置でボールを探そうとしていたので、Dの直角で止まらな...
#ref(2018b/Member/riho/Mission3/IMG_1135.jpg,60%,直角Dの...
ということは、「真っ白」を認識したら終わるプログラムを作...
void sirotuuzyou()
{
SetSensorLight(S1); //1番に繋がっている光センサを使う
long t2; //long型のt2を定義 ...
t2=CurrentTick(); //現在の時間を記録
while(CurrentTick()-t2<90){ //現在の時間とt2の差が0....
if(SENSOR_1>58){ //もし光センサが58以上の値を測...
turn_r1; //右旋回
}else if(SENSOR_1>53){ //もし光センサが53以上5...
turn_r0; //右折
t2=CurrentTick(); //t2を更新する
}else if(SENSOR_1>44){ //もし光センサが44以上52...
go_s; //直進
t2=CurrentTick(); //t2を更新する ...
}else if(SENSOR_1>34){ //もし光センサが34以上43...
turn_l0; //左折
t2=CurrentTick(); //t2を更新する ...
}else{ //もし光センサが33以下の値を測定したら
turn_l1; //左旋回
t2=CurrentTick(); //t2を更新する
}
}
}
***D-E間の線の右側を沿って進み、Eの直角でも止まらないプロ...
まずは、今までとは違い、線の右側を沿って進むプログラムを...
#ref(2018b/Member/riho/Mission3/IMG_1132.jpg,60%,右側通行...
線の左側に沿って進むプログラムは、光センサが測定する値が...
SetSensorLight(S1); //1番に繋がっている光センサを使う
if(SENSOR_1>58){ //もし光センサが58以上の値を測定したら
turn_l1; //左旋回
}else if(SENSOR_1>53){ //もし光センサが53以上57以下の...
turn_l0; //左折
}else if(SENSOR_1>44){ //もし光センサが44以上52以下の値...
go_s; //直進 ...
}else if(SENSOR_1>34){ //もし光センサが34以上43以下の値...
turn_r0; //右折 ...
}else{ //もし光センサが33以下の値を測定したら
turn_r1; //右旋回
}
これを応用してD-E間を通る時間をあらかじめ測定してその時間...
void gyakuspe()
{
SetSensorLight(S1); //1番に繋がっている光センサを使う
long t6; //long型のt6を定義 ...
t6=CurrentTick(); //現在の時間を記録 ...
while(CurrentTick()-t6<6000){ //現在の時間とt6の差...
if(SENSOR_1>58){ //もし光センサが58以上の値を測...
turn_l1; //左旋回
}else if(SENSOR_1>53){ //もし光センサが53以上57以...
turn_l0; //左折
}else if(SENSOR_1>44){ //もし光センサが44以上52以下...
go_s; //直進 ...
}else if(SENSOR_1>34){ //もし光センサが34以上43以下...
turn_r0; //右折 ...
}else{ //もし光センサが33以下の値を測定したら
turn_r1; //右旋回
}
}
}
***Iの交差点で直進するプログラム [#uba7966a]
Iの交差点で直進するには線の右側に沿って進み、交差点を認識...
void gyakutuuzyou() ...
{
SetSensorLight(S1); //1番に繋がっている光センサを使う
long t5; //long型のt5を定義する ...
t5=CurrentTick(); //現在の時間を記録
while(CurrentTick()-t5<90){ //現在の時間とt5の差が...
if(SENSOR_1>58){ //もし光センサが58以上の値を測...
turn_l1; //左旋回
t5=CurrentTick(); //t5を更新する
}else if(SENSOR_1>53){ //もし光センサが53以上5...
turn_l0; //左折
t5=CurrentTick(); //t5を更新する
}else if(SENSOR_1>44){ //もし光センサが44以上52...
go_s; //直進
t5=CurrentTick(); //t5を更新する ...
}else if(SENSOR_1>34){ //もし光センサが34以上43...
turn_r0; //右折
t5=CurrentTick(); //t5を更新する ...
}else{ //もし光センサが33以下の値を測定したら
turn_r1; //右旋回
}
}
}
線の左側に沿って進むプログラムと同様に、交差点があると、...
#ref(2018b/Member/riho/Mission3/IMG_1134.jpg,60%,右側で交...
これを用いる。「真っ黒」以外が測定されるたびにt5を更新す...
交差点を認知して直進するには、「task main」中に今のプログ...
**ボールを掴むプログラム [#a457f9b0]
ボーつを掴む時は通信を使った。
#define CONN 1 //子機の接続番号
を定義し、
まずは親機のプログラム
void tukamu()
{
RemoteStartProgram(CONN,"CATCH.rxe"); //ボール取る...
Wait(9000); //ボ...
}
?は子機にあらかじめ入れておいた「CATCH.nxc」というプログ...
?はあらかじめ子機で「CATCH.nxc」を実行する時間を測定して...
次に子機のプログラムは
#define UP OnFwd(OUT_B,20);Wait(4750);Off(OUT_BC); //...
#define DOWN OnRev(OUT_B,20);Wait(2600);Off(OUT_BC); //...
#define CATCH OnRev(OUT_C,15);Wait(725);Off(OUT_BC); //...
を定義して
task main()
{
DOWN //アームを下げる
CATCH //元々腕は開いていてアームの腕を閉じてボールを掴む
UP //アームを持ち上げる
}
**缶を探して缶に置くプログラム [#ve422815]
***ロボットからの距離が最小の物体を探す [#q2645e2c]
コンテストではダミーの缶も置けたが、私たちのグループはダ...
まず
#define speed 70
#define speed_s 50
const float diameter=5.54; //タイヤの直径(cm) ...
const float track=10.35; //タイヤのトレッド幅(cm)
const float pi=3.1415; //円周率
と定義し、
void fwdDist(float d)
{
long angle; ...
angle= d/(diameter*pi)*360.0;
RotateMotorEx(OUT_BC,speed_s,angle,0,true,true); ...
}
void turnAng(long ang) //角度ang度の時計回りの旋回をする
{
long angle;
angle=track/diameter*ang;
RotateMotorEx(OUT_BC,speed_s,angle,100,true,true);
} ...
int searchDirection(long ang) //現在の方向を中心にang度...
//障害...
{
long angle,tacho_min=0,tacho_corr;
int d_min;
d_min=300; //仮の最小値
angle=(track/diameter)*ang; //旋回角度からタイヤの...
turnAng(ang/2); //指定された角度の半分を旋回する
ResetTachoCount(OUT_BC); //角度計測をリセット ...
OnFwdSync(OUT_BC,speed_s,-100); //反時計回りに旋回...
while(MotorTachoCount(OUT_B)<=angle){
if(SensorUS(S4)<d_min){
d_min=SensorUS(S4); //仮の最小値を更新する
tacho_min=MotorTachoCount(OUT_B);
}
} ...
OnFwdSyncEx(OUT_BC,speed_s,100,RESET_NONE);
until(MotorTachoCount(OUT_B)<=tacho_min||SensorUS(S4...
Wait(14); //微調整
Off(OUT_BC);Wait(500);
return d_min;
}
上のプログラムは、ロボットが回転することによって、ロボッ...
#ref(2018b/Member/riho/Mission3/IMG_1053.jpg,60%,超音波セ...
そして、測定が終わったら、測定したd_minの中で1番小さい値...
***缶の近くに移動する [#h6b052df]
あらかじめ超音波センサを用いて缶にボールを置くのに適して...
SetSensorLowspeed(S4); //4番に繋いだ超音波センサを使う
int d=searchDirection(360); //int型でdを定義し、ロボッ...
if (d>13.5){ //もし見つけた最小値の距...
fwdDist(d-13.5); //缶とロボットの距離が13.5cmになる...
}
***ボールを置くプログラム [#c82e4c0c]
ボールを置くときは通信を使う。
#define CONN 1 //子機の接続番号
を定義し、
親機のプログラムは
RemoteStartProgram(CONN,"lost.rxe"); //ボール置く...?
Wait(2000); //親機の待ち時間...?
ボールを掴むプログラムと同様である。?は子機に「lost.nxc」...
?はあらかじめ子機が「lost.nxc」のプログラムを実行する時間...
次に子機のプログラムは
#define LOST OnFwd(OUT_C,15);Wait(685);Off(OUT_C); //...
を定義して、
task main(){ //ボールを持って腕は上がっている状態から
LOST //アームを広げてボールを置く
}
***缶を探して赤いボールを缶に置いて元いたDに戻るプログラ...
上記のプログラムを組み合わせて缶を探してボールを置いて元...
void sagasu()
{
SetSensorLowspeed(S4); //4番に繋いだ超音波センサを...
int d=searchDirection(360); //int型でdを定義し、ロ...
if (d>13.5){ //もし見つけた最小値...
long t3,t4; //long型のt3,t4を定義する
t3=CurrentTick(); //ロボットが缶に近づく前の時...
fwdDist(d-13.5); //缶とロボットの距離が13.5cmに...
t4=CurrentTick(); //ロボットが缶に近づいた後の...
stoop; //親機はボールを置く際に動かないのでモー...
RemoteStartProgram(CONN,"lost.rxe"); //親機が...
Wait(2000); //子機がボールを置いている時間、親...
OnRev(OUT_BC,30); //元の位置(直角D)に戻るため...
Wait(t4-t3); //t4-t3の時間後退させる...? ...
}
}
?のt3はロボットが缶に近づく前の時間で、t4はロボットが缶に...
***缶を探して青いボールを缶に置くプログラム [#j7c36667]
上記の缶を探して赤いボールを缶に置いて元いたDに戻るプログ...
void sagasu2()
{
SetSensorLowspeed(S4); //4番に繋いだ超音波センサを...
int e=searchDirection(100); //int型でeを定義し、ロ...
if (e>13.5){ //もし見つけた最小値...
t3=CurrentTick(); //ロボットが缶に近づく前の時...
fwdDist(e-13.5); //缶とロボットの距離が13.5cmに...
stoop; //親機はボールを置く際に動かないのでモー...
RemoteStartProgram(CONN,"lost.rxe"); //親機が...
Wait(2000); //子機がボールを置いている時間、親...
stoop; //これでミッションが終わりなのでモータを止め...
}
}
?で
int d=searchDirection(360);
にすると、缶の位置はサイコロで決まるので、赤いボールを乗...
*メインプログラム [#nbc9d5f3]
task main()
{
go_s; //Xから赤いボールの方向に直進 ...
Wait(1000); //1秒間直進
stoop; //ボールを掴むためロボットの動きを一旦止める
tukamu(); //赤いボールを掴んで持ち上げる
go_s; //交差点Dを直進
Wait(2000); //2秒間直進
special(); //D-F間の急カーブとFの直角があっても止ま...
tuuzyou(); //F-E間ライントレースをしてEの交差点を認...
massugu(); //Eの交差点は直進 ...
sirotuuzyou(); //Dの直角で終わるプログラム
sagasu(); //缶を探して、缶に近づいて、赤いボールを...
gyakuspe(); //D-E間の走行でEの直角があっても終わら...
gyakutuuzyou(); //E-I間の走行で、Iの交差点で終わる...
go_s; //直進して青いボールを撮れる距離まで移動する
Wait(700); //0.7秒間直進
stoop; //ボールを掴むためロボットの動きを一旦止める
tukamu(); //ボールを掴んで持ち上げる ...
sagasu2(); //缶を探して、缶に近づいて、青いボールを...
}
*まとめ [#y672fdfb]
**反省点 [#mb4d4d15]
-缶一直線にロボットが近づくときと近づかないときがあった
これによってボールが缶に乗るときと乗らないときがあり、本...
また超音波センサは超音波を出して物体によって反射され、跳...
-赤いボールを置く缶を探すためにロボットが回転した際、ロボ...
缶の近くで探したほうが正確に測定できると思い直角Dで缶を探...
**感想 [#x6ff1ed4]
今回はミッション3回目でプログラムを作るのも慣れてきたと思...
ページ名: