2018b/Member/tomflat14/Mission2
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
検索
|
最終更新
|
ヘルプ
|
ログイン
]
開始行:
目次
#contents
* 課題2 [#v2998a0d]
下の図のようなコースを作成し、指定されたコースを走行し途...
#ref(./2018b-mission2.png,10)
今回、私が走行させるコースは第一コースで
ロボットを長方形X内におき、Aをスタート
Bを右折
Kで一時停止して左折
Jを直進
Iを直進
Hを左折
Gで一時停止して左折
Eで一時停止して右折
Lを経て正方形Y内に入って停止
ボールはロボットが弧KJIH上にある時にQ地点の空き缶に当...
というものだ
図で表すと・・・
#ref(ko-su.png):
*ロボットの概要 [#g730a7c1]
ロボットの全体像↓(進行方向は写真右方向)
#ref(19651.jpg):
一つ目のモーターにボールを転がす機能を付け、二つ目と三つ...
矢印の方向に棒を動かしボールを転がす↓
#ref(19651_LIV2.jpg):
光センサーと超音波センサー、後輪は以下の写真のように取り...
#ref(19655_LI.jpg):
進行方向とは逆向きに超音波センサーを付けている。はじめは...
*プログラム [#g58dc551]
使える光センサーが一つだけなので幅2cmの黒線のふちを光セン...
「白」「白と黒の境界線」「黒」で動きを変えるようにした。...
それぞれの光センサーの細かい値↓
#ref(line.png):
以上より
1,ラインの右端をトレースする関数
2,ラインの左端をトレースする関数
3,円周上を走行する関数
4,空き缶を探知しボールを当てる関数
合計4つの関数を使用しプログラムを作成した。
**ラインの右端をトレースする関数 [#r12b3ac8]
はじめの何秒(t_min間)かは交差点を判断しても停止せず、そ...
ここでそれぞれの関数で定義したt_start,t0,t1の説明をする。...
従って、t1-t0で白or黒を連続で探知し続けた時間を示す。
参考↓
#ref(./21594.jpg)
この図の黄色の丸番号と下記関数のコメントの丸番号が対応し...
void follow_line_migi(long t_min)
{
SetSensorLight(S1);
long t_start=CurrentTick(); //関数...
long t0=CurrentTick(); //白or黒...
long t_max=150; //連続して黒...
long t1=CurrentTick(); //曲がる動...
long t_kosa=200; //交差点の判断までの時間
while(t1-t_start<t_min){ //t_minの間交差点の判断...
if(SENSOR_1>60){
if(t1-t0<t_max){
OnFwd(OUT_C,40);Off(OUT_A); //少し白の...
}else{
OnFwd(OUT_C,20);OnRev(OUT_A,50); //大き...
}
}else if(SENSOR_1>50){
OnFwd(OUT_AC,30); //白と黒の境界線なので...
t0=CurrentTick(); ...
}else{
if(t1-t0<t_max){
OnFwd(OUT_A,40);Off(OUT_C); //少し黒の...
}else{
OnFwd(OUT_A,20);OnRev(OUT_C,50); //大き...
}
}
t1=CurrentTick(); //?右左折or直進が終わった...
}
PlaySound(SOUND_CLICK); //音を鳴らしここから交差...
while(true){
if(SENSOR_1>60){
if(t1-t0<t_max){
OnFwd(OUT_C,40);Off(OUT_A); //少し白の...
}else{
OnFwd(OUT_C,20);OnRev(OUT_A,50); //大き...
}
}else if(SENSOR_1>50){
OnFwd(OUT_AC,40); //白と黒の境界線なので...
t0=CurrentTick(); ...
}else{
if(t1-t0<t_max){
OnFwd(OUT_A,40);Off(OUT_C); //少し黒の...
}else if(t1-t0<t_kosa){
OnFwd(OUT_A,20);OnRev(OUT_C,50); //大き...
}else{
Off(OUT_AC);break; //?黒の時間が一定値以上...
}
}
t1=CurrentTick(); //?右左折or直進が終わった...
}
Off(OUT_AC); //?止まる
PlaySound(SOUND_CLICK); //音を鳴らし交差点と判断...
}
**ラインの左端をトレースする関数 [#da00466a]
「ラインの右端をトレースする関数」と同様に、はじめの何秒...
t_startは関数が始まった時間を記録する。t0は白or黒を探知し...
上記の「ラインの右端をトレースする関数」にある参考画像の...
void follow_line_hidari(long t_min)
{
SetSensorLight(S1);
long t_start=CurrentTick(); //関数が始ま...
long t0=CurrentTick(); //白or黒の時間...
long t_max=150; //連続して黒...
long t1=CurrentTick(); //曲がる動作を...
long t_kosa=200;
while(t1-t_start<t_min){ //t_minの間交差点の判断...
if(SENSOR_1>60){
if(t1-t0<t_max){
OnFwd(OUT_A,40);Off(OUT_C); //少し白の...
}else{
OnFwd(OUT_A,20);OnRev(OUT_C,50); //大き...
}
}else if(SENSOR_1>50){
OnFwd(OUT_AC,40); //白と黒の境界線なので...
t0=CurrentTick(); ...
}else{
if(t1-t0<t_max){
OnFwd(OUT_C,40);Off(OUT_A); //少し黒の...
}else{
OnFwd(OUT_C,20);OnRev(OUT_A,50); //大き...
}
}
t1=CurrentTick(); //?右左折or直進が終わった...
}
Off(OUT_AC);
PlaySound(SOUND_CLICK); //音を鳴らしここから交差...
while(true){
if(SENSOR_1>60){
if(t1-t0<t_max){
OnFwd(OUT_A,40);Off(OUT_C); //少し白の...
}else{
OnFwd(OUT_A,20);OnRev(OUT_C,50); //大き...
}
}else if(SENSOR_1>50){
OnFwd(OUT_AC,30); //白と黒の境界線なので...
t0=CurrentTick(); ...
}else{
if(t1-t0<t_max){
OnFwd(OUT_C,40);Off(OUT_A); //少し黒の...
}else if(t1-t0<t_kosa){
OnFwd(OUT_C,20);OnRev(OUT_A,50); //大き...
}else{
Off(OUT_AC);break; //?黒の時間が一定...
}
}
t1=CurrentTick(); //?右左折or直進が終わった...
}
Off(OUT_AC); //?止まる
PlaySound(SOUND_CLICK); //音を鳴らし交差点と判断...
}
**円周上を走行する関数 [#s78b5dee]
円周上を交差点判断しても停止せずに進む関数。上記の「ライ...
t_startは関数が始まった時間を記録する。t0は白or黒を探知し...
void follow_line_ensyu(long t_min)
{
SetSensorLight(S1);
long t_start=CurrentTick(); //関数が始...
long t0=CurrentTick(); //白or黒...
long t_max=150; //連続して黒の限界値
long t_kousa=200; //交差点判断
long t1=CurrentTick(); //曲がる動作を...
while(t1-t_start<t_min){
if(SENSOR_1>60){
if(t1-t0<t_max){
OnFwd(OUT_A,40);Off(OUT_C);
}else{
OnFwd(OUT_A,30);OnRev(OUT_C,60);
}
}else if(SENSOR_1>50){
OnFwd(OUT_AC,30);
t0=CurrentTick();
}else{
if(t1-t0<t_max){
OnFwd(OUT_C,40);Off(OUT_A);
}else if(t1-t0<t_kousa){
OnFwd(OUT_C,30);OnRev(OUT_A,50);
}else{
OnFwd(OUT_AC,40);Wait(200);PlaySound(SOUND_CLI...
}
}
t1=CurrentTick();
}
Off(OUT_AC);
PlaySound(SOUND_CLICK);
}
**空き缶を探知しボールを当てる関数 [#sd91fe1c]
超音波センサーで空き缶を探知しその方向を向いてボールを当...
void search_direction()
{
ResetTachoCount(OUT_ABC); //モーターの角度をリセット
OnFwd(OUT_A,50);
OnRev(OUT_C,50);
SetSensorLowspeed(S4); //端子4に超音波センサー
int d1;
d1=1000; //最小距離を1000と定義する
long t0=CurrentTick();
long t1=CurrentTick();
long t2=CurrentTick();
while(t2-t0<=3570){ //3570の間回り続ける
t2=CurrentTick();
if(SensorUS(S4)<d1){ //センサーで探知し最小距離より短...
d1=SensorUS(S4); //最小値を再定義
PlaySound(SOUND_CLICK);
t1=CurrentTick();
}
t2=CurrentTick();
}
t0=CurrentTick();
Off(OUT_AC);
OnFwd(OUT_C,50);
OnRev(OUT_A,50);
Wait(t0-t1); //センサーで最後に最小値のd1を探知した...
Off(OUT_AC);
Wait(1000);
RotateMotorEx(OUT_AC,50,360,100,true,false); //ボールを...
RotateMotor(OUT_B,30,60);
Wait(5000);
RotateMotor(OUT_B,50,-60);
RotateMotorEx(OUT_AC,50,380,100,true,false);
}
***没案 [#ca601e09]
はじめに作った「空き缶を探知しボールを当てる関数」。先生...
void search_direction()
{
OnFwd(OUT_A,50);
OnRev(OUT_C,50);
SetSensorLowspeed(S4);
int d1;
d1=1000;
long t0=CurrentTick();
long t1=CurrentTick();
while(t1-t0<3570){
if(SensorUS(S4)<d1){
d1=SensorUS(S4);
PlaySound(SOUND_CLICK);
}
t1=CurrentTick();
}
while(true){
if(SensorUS(S4)==d1){
PlaySound(SOUND_CLICK);
Off(OUT_AC);
break;
}
}
}
なぜ精確性を欠くかというと、二つ目のwhile文にある"if(Sens...
** 完成したプログラム [#r2c92666]
task main()
{
follow_line_migi(1); //A~Bの右を進む
OnFwd(OUT_AC,50); //車線変更
Wait(200);
follow_line_hidari(1); //B~Kの左を進む
PlaySound(SOUND_CLICK);
Wait(1000); //Kにて一時停止
OnFwd(OUT_C,50);
Wait(500);
follow_line_ensyu(15000); //円周回る
search_direction(); //缶にボール当てる
follow_line_hidari(5000); //〜Gまで進む
Wait(1000); //Gにて一時停止
OnFwd(OUT_C,50); //Gを左折
Wait(500);
follow_line_migi(1); //G~Eの右を進む
follow_line_migi(15000);
Wait(1000); //Eにて一時停止
follow_line_migi(3000); //E~Lの右を進む
Wait(1000);
OnFwd(OUT_AC,50);
Wait(1000);
Off(OUT_AC);
OnFwd(OUT_A,50);
Wait(2000);
Off(OUT_AC);
}
*まとめ [#n5faf5d7]
**結果 [#f3dce85a]
・結論からいうと、発表日に発表することが出来なかった。
・発表日当日、先生からの指摘により「空き缶を探知しボー...
・上記されている「空き缶を探知しボールを当てる関数」は...
・その他の関数の動作にあまり不備はなかったが電池の消耗...
**考察 [#rf327cfc]
・「空き缶を探知しボールを当てる関数」を作る際先生がお...
・電池の消耗が激しかった。機体かプログラムに工夫を加え...
・NXT本体の支えが非常に不安定でちょっとした振動でバラン...
**感想 [#a3f4c67a]
今回は授業日の午前中にプログラムが完成し課題も達成してい...
終了行:
目次
#contents
* 課題2 [#v2998a0d]
下の図のようなコースを作成し、指定されたコースを走行し途...
#ref(./2018b-mission2.png,10)
今回、私が走行させるコースは第一コースで
ロボットを長方形X内におき、Aをスタート
Bを右折
Kで一時停止して左折
Jを直進
Iを直進
Hを左折
Gで一時停止して左折
Eで一時停止して右折
Lを経て正方形Y内に入って停止
ボールはロボットが弧KJIH上にある時にQ地点の空き缶に当...
というものだ
図で表すと・・・
#ref(ko-su.png):
*ロボットの概要 [#g730a7c1]
ロボットの全体像↓(進行方向は写真右方向)
#ref(19651.jpg):
一つ目のモーターにボールを転がす機能を付け、二つ目と三つ...
矢印の方向に棒を動かしボールを転がす↓
#ref(19651_LIV2.jpg):
光センサーと超音波センサー、後輪は以下の写真のように取り...
#ref(19655_LI.jpg):
進行方向とは逆向きに超音波センサーを付けている。はじめは...
*プログラム [#g58dc551]
使える光センサーが一つだけなので幅2cmの黒線のふちを光セン...
「白」「白と黒の境界線」「黒」で動きを変えるようにした。...
それぞれの光センサーの細かい値↓
#ref(line.png):
以上より
1,ラインの右端をトレースする関数
2,ラインの左端をトレースする関数
3,円周上を走行する関数
4,空き缶を探知しボールを当てる関数
合計4つの関数を使用しプログラムを作成した。
**ラインの右端をトレースする関数 [#r12b3ac8]
はじめの何秒(t_min間)かは交差点を判断しても停止せず、そ...
ここでそれぞれの関数で定義したt_start,t0,t1の説明をする。...
従って、t1-t0で白or黒を連続で探知し続けた時間を示す。
参考↓
#ref(./21594.jpg)
この図の黄色の丸番号と下記関数のコメントの丸番号が対応し...
void follow_line_migi(long t_min)
{
SetSensorLight(S1);
long t_start=CurrentTick(); //関数...
long t0=CurrentTick(); //白or黒...
long t_max=150; //連続して黒...
long t1=CurrentTick(); //曲がる動...
long t_kosa=200; //交差点の判断までの時間
while(t1-t_start<t_min){ //t_minの間交差点の判断...
if(SENSOR_1>60){
if(t1-t0<t_max){
OnFwd(OUT_C,40);Off(OUT_A); //少し白の...
}else{
OnFwd(OUT_C,20);OnRev(OUT_A,50); //大き...
}
}else if(SENSOR_1>50){
OnFwd(OUT_AC,30); //白と黒の境界線なので...
t0=CurrentTick(); ...
}else{
if(t1-t0<t_max){
OnFwd(OUT_A,40);Off(OUT_C); //少し黒の...
}else{
OnFwd(OUT_A,20);OnRev(OUT_C,50); //大き...
}
}
t1=CurrentTick(); //?右左折or直進が終わった...
}
PlaySound(SOUND_CLICK); //音を鳴らしここから交差...
while(true){
if(SENSOR_1>60){
if(t1-t0<t_max){
OnFwd(OUT_C,40);Off(OUT_A); //少し白の...
}else{
OnFwd(OUT_C,20);OnRev(OUT_A,50); //大き...
}
}else if(SENSOR_1>50){
OnFwd(OUT_AC,40); //白と黒の境界線なので...
t0=CurrentTick(); ...
}else{
if(t1-t0<t_max){
OnFwd(OUT_A,40);Off(OUT_C); //少し黒の...
}else if(t1-t0<t_kosa){
OnFwd(OUT_A,20);OnRev(OUT_C,50); //大き...
}else{
Off(OUT_AC);break; //?黒の時間が一定値以上...
}
}
t1=CurrentTick(); //?右左折or直進が終わった...
}
Off(OUT_AC); //?止まる
PlaySound(SOUND_CLICK); //音を鳴らし交差点と判断...
}
**ラインの左端をトレースする関数 [#da00466a]
「ラインの右端をトレースする関数」と同様に、はじめの何秒...
t_startは関数が始まった時間を記録する。t0は白or黒を探知し...
上記の「ラインの右端をトレースする関数」にある参考画像の...
void follow_line_hidari(long t_min)
{
SetSensorLight(S1);
long t_start=CurrentTick(); //関数が始ま...
long t0=CurrentTick(); //白or黒の時間...
long t_max=150; //連続して黒...
long t1=CurrentTick(); //曲がる動作を...
long t_kosa=200;
while(t1-t_start<t_min){ //t_minの間交差点の判断...
if(SENSOR_1>60){
if(t1-t0<t_max){
OnFwd(OUT_A,40);Off(OUT_C); //少し白の...
}else{
OnFwd(OUT_A,20);OnRev(OUT_C,50); //大き...
}
}else if(SENSOR_1>50){
OnFwd(OUT_AC,40); //白と黒の境界線なので...
t0=CurrentTick(); ...
}else{
if(t1-t0<t_max){
OnFwd(OUT_C,40);Off(OUT_A); //少し黒の...
}else{
OnFwd(OUT_C,20);OnRev(OUT_A,50); //大き...
}
}
t1=CurrentTick(); //?右左折or直進が終わった...
}
Off(OUT_AC);
PlaySound(SOUND_CLICK); //音を鳴らしここから交差...
while(true){
if(SENSOR_1>60){
if(t1-t0<t_max){
OnFwd(OUT_A,40);Off(OUT_C); //少し白の...
}else{
OnFwd(OUT_A,20);OnRev(OUT_C,50); //大き...
}
}else if(SENSOR_1>50){
OnFwd(OUT_AC,30); //白と黒の境界線なので...
t0=CurrentTick(); ...
}else{
if(t1-t0<t_max){
OnFwd(OUT_C,40);Off(OUT_A); //少し黒の...
}else if(t1-t0<t_kosa){
OnFwd(OUT_C,20);OnRev(OUT_A,50); //大き...
}else{
Off(OUT_AC);break; //?黒の時間が一定...
}
}
t1=CurrentTick(); //?右左折or直進が終わった...
}
Off(OUT_AC); //?止まる
PlaySound(SOUND_CLICK); //音を鳴らし交差点と判断...
}
**円周上を走行する関数 [#s78b5dee]
円周上を交差点判断しても停止せずに進む関数。上記の「ライ...
t_startは関数が始まった時間を記録する。t0は白or黒を探知し...
void follow_line_ensyu(long t_min)
{
SetSensorLight(S1);
long t_start=CurrentTick(); //関数が始...
long t0=CurrentTick(); //白or黒...
long t_max=150; //連続して黒の限界値
long t_kousa=200; //交差点判断
long t1=CurrentTick(); //曲がる動作を...
while(t1-t_start<t_min){
if(SENSOR_1>60){
if(t1-t0<t_max){
OnFwd(OUT_A,40);Off(OUT_C);
}else{
OnFwd(OUT_A,30);OnRev(OUT_C,60);
}
}else if(SENSOR_1>50){
OnFwd(OUT_AC,30);
t0=CurrentTick();
}else{
if(t1-t0<t_max){
OnFwd(OUT_C,40);Off(OUT_A);
}else if(t1-t0<t_kousa){
OnFwd(OUT_C,30);OnRev(OUT_A,50);
}else{
OnFwd(OUT_AC,40);Wait(200);PlaySound(SOUND_CLI...
}
}
t1=CurrentTick();
}
Off(OUT_AC);
PlaySound(SOUND_CLICK);
}
**空き缶を探知しボールを当てる関数 [#sd91fe1c]
超音波センサーで空き缶を探知しその方向を向いてボールを当...
void search_direction()
{
ResetTachoCount(OUT_ABC); //モーターの角度をリセット
OnFwd(OUT_A,50);
OnRev(OUT_C,50);
SetSensorLowspeed(S4); //端子4に超音波センサー
int d1;
d1=1000; //最小距離を1000と定義する
long t0=CurrentTick();
long t1=CurrentTick();
long t2=CurrentTick();
while(t2-t0<=3570){ //3570の間回り続ける
t2=CurrentTick();
if(SensorUS(S4)<d1){ //センサーで探知し最小距離より短...
d1=SensorUS(S4); //最小値を再定義
PlaySound(SOUND_CLICK);
t1=CurrentTick();
}
t2=CurrentTick();
}
t0=CurrentTick();
Off(OUT_AC);
OnFwd(OUT_C,50);
OnRev(OUT_A,50);
Wait(t0-t1); //センサーで最後に最小値のd1を探知した...
Off(OUT_AC);
Wait(1000);
RotateMotorEx(OUT_AC,50,360,100,true,false); //ボールを...
RotateMotor(OUT_B,30,60);
Wait(5000);
RotateMotor(OUT_B,50,-60);
RotateMotorEx(OUT_AC,50,380,100,true,false);
}
***没案 [#ca601e09]
はじめに作った「空き缶を探知しボールを当てる関数」。先生...
void search_direction()
{
OnFwd(OUT_A,50);
OnRev(OUT_C,50);
SetSensorLowspeed(S4);
int d1;
d1=1000;
long t0=CurrentTick();
long t1=CurrentTick();
while(t1-t0<3570){
if(SensorUS(S4)<d1){
d1=SensorUS(S4);
PlaySound(SOUND_CLICK);
}
t1=CurrentTick();
}
while(true){
if(SensorUS(S4)==d1){
PlaySound(SOUND_CLICK);
Off(OUT_AC);
break;
}
}
}
なぜ精確性を欠くかというと、二つ目のwhile文にある"if(Sens...
** 完成したプログラム [#r2c92666]
task main()
{
follow_line_migi(1); //A~Bの右を進む
OnFwd(OUT_AC,50); //車線変更
Wait(200);
follow_line_hidari(1); //B~Kの左を進む
PlaySound(SOUND_CLICK);
Wait(1000); //Kにて一時停止
OnFwd(OUT_C,50);
Wait(500);
follow_line_ensyu(15000); //円周回る
search_direction(); //缶にボール当てる
follow_line_hidari(5000); //〜Gまで進む
Wait(1000); //Gにて一時停止
OnFwd(OUT_C,50); //Gを左折
Wait(500);
follow_line_migi(1); //G~Eの右を進む
follow_line_migi(15000);
Wait(1000); //Eにて一時停止
follow_line_migi(3000); //E~Lの右を進む
Wait(1000);
OnFwd(OUT_AC,50);
Wait(1000);
Off(OUT_AC);
OnFwd(OUT_A,50);
Wait(2000);
Off(OUT_AC);
}
*まとめ [#n5faf5d7]
**結果 [#f3dce85a]
・結論からいうと、発表日に発表することが出来なかった。
・発表日当日、先生からの指摘により「空き缶を探知しボー...
・上記されている「空き缶を探知しボールを当てる関数」は...
・その他の関数の動作にあまり不備はなかったが電池の消耗...
**考察 [#rf327cfc]
・「空き缶を探知しボールを当てる関数」を作る際先生がお...
・電池の消耗が激しかった。機体かプログラムに工夫を加え...
・NXT本体の支えが非常に不安定でちょっとした振動でバラン...
**感想 [#a3f4c67a]
今回は授業日の午前中にプログラムが完成し課題も達成してい...
ページ名: