2016a/Member/kosi/Mission3
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
検索
|
最終更新
|
ヘルプ
|
ログイン
]
開始行:
[[2016a/Member]]
目次
#contents
*はじめに [#e2420186]
今回の課題は課題2で作成したコースを使って紙コップを積み...
私は採点の報告係を担当しました。
*ロボットの紹介 [#lc1cff07]
**ロボットの説明 [#fd2bca38]
当初の計画では、私達の班がライントレスをして紙コップを中...
そこでまず私達の班が作った機体と実際に使用した機体の2つ...
**当初予定していた機体について [#v012c0da]
こちらの機体は写真を撮っていなかったので少しわかりにくい...
この機体については、紙コップを取る離す動作、紙コップをラ...
他にも紙コップを認識する方法としてタッチセンサーを使って...
**実際に使用した機体について [#s97d349f]
こっちの機体は本体の中央付近にライントレス用の光センサー...
紙コップを積み上げるために用いた機体の方法は、飲み口の凸...
本体から2つの角がありその幅は約7センチほどにし、紙コッ...
その繰り返しで積み上がります。
角が回転するように先端に光センサーを用いて、先端まで動力...
これが実際の写真です。
&ref(2016a/Member/kosi/Mission3/1470853893715.jpg,30%,);
*プログラム [#eb1a9e9e]
**defineについて [#c75b3f16]
#define CROSS_TIME 40
#define BALANCE_TIME 40
#define roll_left OnRev(OUT_A); OnFwd(OUT_C); //左回転
#define turn_left OnFwd(OUT_C); Off(OUT_A); //左旋回
#define go OnFwd(OUT_A); OnFwd(OUT_C); //前進
#define turn_right OnFwd(OUT_A); Off(OUT_C); //右旋回
#define roll_right OnFwd(OUT_A); OnRev(OUT_C); //右回転
#define back OnRev(OUT_A); OnRev(OUT_C); Wait(100); Off(...
#define top OnRev(OUT_C); OnFwd(OUT_A); Wait(CROSS_TIME)...
#define left OnRev(OUT_A); OnFwd(OUT_C); Wait(20);
#define right OnRev(OUT_C); OnFwd(OUT_A); Wait(80); OnFw...
基本的な動作の定義です。
**subの説明 [#i68f30b1]
sub line_l(){
int ch=0; //ループ脱出用変数
ClearTimer(0); //交差点判別用のタイマー初期化
ClearTimer(1); //交差点誤判別防止用のタイマー初期化
while(ch==0) //chが0の時はループを続ける
{
if(SENSOR_2 > 53) //白部分 右回転
{
ClearTimer(0); //黒部分ではないので交差点...
roll_right;
}
else if(SENSOR_2 > 52) //弱白部分 右旋回
{
ClearTimer(0); //黒部分ではないので交差点...
turn_right;
}
else if(SENSOR_2 > 44) //境界部分 直進
{
ClearTimer(0); //黒部分ではないので交差点...
go;
}
else if(SENSOR_2 > 41) //弱黒部分 左旋回
{
ClearTimer(0); //黒部分ではないので交差点...
turn_left;
}
else{ //黒部分 左回転
roll_left;
}
if(FastTimer(0)>CROSS_TIME&&FastTimer(1)>l_time...
Off(OUT_AC); //車輪を止める
PlaySound(SOUND_UP); //音を鳴らす
Wait(100); //1秒待つ
ch=1; //ループ脱出の為にchを1にする
}
Wait(1); //0.01秒待つ
}
このsubはライントレスをするsubです。
黒の線の左境界面をトレースします。
sub balance_l(){
int ch=0; //ループ脱出用変数
ClearTimer(0); //姿勢判別用のタイマー初期化
while(ch==0) //chが0の時はループを続ける
{
ClearTimer(1); //ライントレース時間判別用のタ...
while(FastTimer(1)<200&&ch==0) //FastTimer(1)が...
{
if(SENSOR_2 > 53) //白部分 右回転
{
ClearTimer(0); //境界部分ではないので...
roll_right;
}
else if(SENSOR_2 > 52) //弱白部分 右旋回
{
ClearTimer(0); //境界部分ではないので...
turn_right;
}
else if(SENSOR_2 > 44) //境界部分 直進
{
go;
}
else if(SENSOR_2 > 41) //弱黒部分 左旋回
{
ClearTimer(0); //境界部分ではないので...
turn_left;
}
else{ //黒部分 左回転
ClearTimer(0); //境界部分ではないので...
roll_left;
}
if(FastTimer(0)>BALANCE_TIME) //姿勢判別
{
Off(OUT_AC); //車輪を止める
PlaySound(SOUND_UP); //音を鳴らす
Wait(100); //1秒待つ
ch=1; //ループ脱出の為にchを1にする
}
Wait(1); //0.01秒待つ
}
if(ch==0)
{
back; //約2秒分の後退
back;
}
}
このsubは、左側境界面の機体の制御用プログラムです。
どうしてもライントレスからすぐに直線させると毎回違った方...
sub balance_r(){
int ch=0; //ループ脱出用変数
ClearTimer(0); //姿勢判別用のタイマー初期化
while(ch==0) //chが0の時はループを続ける
{
ClearTimer(1); //ライントレース時間判別用のタ...
while(FastTimer(1)<200&&ch==0)//FastTimer(1)が2...
{
if(SENSOR_2 > 53) //白部分 左回転
{
ClearTimer(0); //境界部分ではないので...
roll_left;
}
else if(SENSOR_2 > 52) //弱白部分 左旋回
{
ClearTimer(0); //境界部分ではないので...
turn_left;
}
else if(SENSOR_2 > 44) //境界部分 直進
{
go;
}
else if(SENSOR_2 > 41) //弱黒部分 右旋回
{
ClearTimer(0); //境界部分ではないので...
turn_right;
}
else{ //黒部分 右回転
ClearTimer(0); //境界部分ではないので...
roll_right;
}
if(FastTimer(0)>BALANCE_TIME) //姿勢判別
{
Off(OUT_AC); //車輪を止める
PlaySound(SOUND_UP); //音を鳴らす
Wait(100); //1秒待つ
ch=1; //ループ脱出の為にchを1にする
}
Wait(1); //0.01秒待つ
}
if(ch==0)
{
back; //約2秒分の後退
back;
}
}
このsubはひとつ上の右側境界面用のプログラムです。
sub cup(){
OnRev(OUT_B); //アームを下す
Wait(50);
Off(OUT_B);
OnFwd(OUT_AC); //前進
while(SENSOR_1<42); //光センサーが紙コップを認識す...
Off(OUT_AC); //停止
OnFwd(OUT_B); //アームを上げる
Wait(50);
Off(OUT_B);
}
このsubは紙コップを取るための動作です。
sub turn(){
OnFwd(OUT_C); //左回転
OnRev(OUT_A);
Wait(100); //黒部分から白部分に出るための時間(D地...
while(SENSOR_2>41); //白部分である場合は回転し続ける
Off(OUT_AC); //停止
}
交差点を左に曲がるためのsubです。
sub last(){
OnFwd(OUT_AC); //前進
Wait(50); //約0.5秒待つ
Off(OUT_AC);
OnRev(OUT_B); //アームを下す
Wait(50); //約0.5秒待つ
Off(OUT_B);
OnFwd(OUT_A); //右回転
OnRev(OUT_C);
Wait(100); //約1秒待つ
back; //約2秒間後進する(1秒ではアームが紙コップに...
back;
}
最後に積み上げた紙コップを指定された場所へ設置するためのs...
**メインプログラム [#y291d4d1]
task main ()
{
SetSensor(SENSOR_1, SENSOR_LIGHT); //光センサー1の...
SetSensor(SENSOR_2, SENSOR_LIGHT); //光センサー2の...
OnFwd(OUT_AC); //スタート地点の枠から脱出
Wait(60);
//C地点までの移動
line_l(); //左側境界部分をトレース
left; //P地点を左折
l_time=400; //次の交差点までの秒数を4秒に設定
line_l(); //左側境界部分をトレース
right; //S地点を右折
balance_l(); //左境界部分での姿勢制御
//紙コップ回収作業
cup(); //1つ目の紙コップ取得
back; //後進
//D地点までの移動
turn(); //左回転
balance_r(); //右境界部分での姿勢制御
//紙コップ回収作業
cup(); //2つ目の紙コップ取得
back; //後進
//C地点までの移動
turn(); //左回転
OnFwd(OUT_AC); //前進
Wait(20);
balance_r(); //右境界部分での姿勢制御
//紙コップ回収作業
cup(); //3つ目の紙コップ取得
back; //後進
//D地点までの移動
turn(); //左回転
OnFwd(OUT_AC); //前進
Wait(20);
balance_r(); //右境界部分での姿勢制御
//紙コップ回収作業
cup(); //4つ目の紙コップ取得
back; //約4秒間後進
back;
back;
back;
l_time=200; //次の交差点までの秒数を2秒に設定
//左境界部分へ移動
OnFwd(OUT_C); //左回転
OnRev(OUT_A);
Wait(50);
OnFwd(OUT_AC); //前進
Wait(30);
//Q地点までの移動
line_l(); //左側境界部分をトレース
left; //S地点を左折
line_l(); //左側境界部分をトレース
left; //P地点を左折
line_l(); //左側境界部分をトレース
//紙コップの設置
last();
}
これがメインプログラムです。
*感想 [#u9303ff4]
**課題3の結果 [#ic362b2c]
2回目のやり直しが成功し優勝となりました。
**全体として [#sf1f4d25]
結果は合計点数35.2点で晴れて優勝することが出来ました。
しかし、班での活動中は班員皆レベルが高く話し合いについて...
機体に関しても当初の2体使う計画ではなくなったので結果優...
今回の課題3は機体づくり、作戦等、課題1,2では比較的優...
自分は工学部でこれからもたくさんプログラムに関与していく...
終了行:
[[2016a/Member]]
目次
#contents
*はじめに [#e2420186]
今回の課題は課題2で作成したコースを使って紙コップを積み...
私は採点の報告係を担当しました。
*ロボットの紹介 [#lc1cff07]
**ロボットの説明 [#fd2bca38]
当初の計画では、私達の班がライントレスをして紙コップを中...
そこでまず私達の班が作った機体と実際に使用した機体の2つ...
**当初予定していた機体について [#v012c0da]
こちらの機体は写真を撮っていなかったので少しわかりにくい...
この機体については、紙コップを取る離す動作、紙コップをラ...
他にも紙コップを認識する方法としてタッチセンサーを使って...
**実際に使用した機体について [#s97d349f]
こっちの機体は本体の中央付近にライントレス用の光センサー...
紙コップを積み上げるために用いた機体の方法は、飲み口の凸...
本体から2つの角がありその幅は約7センチほどにし、紙コッ...
その繰り返しで積み上がります。
角が回転するように先端に光センサーを用いて、先端まで動力...
これが実際の写真です。
&ref(2016a/Member/kosi/Mission3/1470853893715.jpg,30%,);
*プログラム [#eb1a9e9e]
**defineについて [#c75b3f16]
#define CROSS_TIME 40
#define BALANCE_TIME 40
#define roll_left OnRev(OUT_A); OnFwd(OUT_C); //左回転
#define turn_left OnFwd(OUT_C); Off(OUT_A); //左旋回
#define go OnFwd(OUT_A); OnFwd(OUT_C); //前進
#define turn_right OnFwd(OUT_A); Off(OUT_C); //右旋回
#define roll_right OnFwd(OUT_A); OnRev(OUT_C); //右回転
#define back OnRev(OUT_A); OnRev(OUT_C); Wait(100); Off(...
#define top OnRev(OUT_C); OnFwd(OUT_A); Wait(CROSS_TIME)...
#define left OnRev(OUT_A); OnFwd(OUT_C); Wait(20);
#define right OnRev(OUT_C); OnFwd(OUT_A); Wait(80); OnFw...
基本的な動作の定義です。
**subの説明 [#i68f30b1]
sub line_l(){
int ch=0; //ループ脱出用変数
ClearTimer(0); //交差点判別用のタイマー初期化
ClearTimer(1); //交差点誤判別防止用のタイマー初期化
while(ch==0) //chが0の時はループを続ける
{
if(SENSOR_2 > 53) //白部分 右回転
{
ClearTimer(0); //黒部分ではないので交差点...
roll_right;
}
else if(SENSOR_2 > 52) //弱白部分 右旋回
{
ClearTimer(0); //黒部分ではないので交差点...
turn_right;
}
else if(SENSOR_2 > 44) //境界部分 直進
{
ClearTimer(0); //黒部分ではないので交差点...
go;
}
else if(SENSOR_2 > 41) //弱黒部分 左旋回
{
ClearTimer(0); //黒部分ではないので交差点...
turn_left;
}
else{ //黒部分 左回転
roll_left;
}
if(FastTimer(0)>CROSS_TIME&&FastTimer(1)>l_time...
Off(OUT_AC); //車輪を止める
PlaySound(SOUND_UP); //音を鳴らす
Wait(100); //1秒待つ
ch=1; //ループ脱出の為にchを1にする
}
Wait(1); //0.01秒待つ
}
このsubはライントレスをするsubです。
黒の線の左境界面をトレースします。
sub balance_l(){
int ch=0; //ループ脱出用変数
ClearTimer(0); //姿勢判別用のタイマー初期化
while(ch==0) //chが0の時はループを続ける
{
ClearTimer(1); //ライントレース時間判別用のタ...
while(FastTimer(1)<200&&ch==0) //FastTimer(1)が...
{
if(SENSOR_2 > 53) //白部分 右回転
{
ClearTimer(0); //境界部分ではないので...
roll_right;
}
else if(SENSOR_2 > 52) //弱白部分 右旋回
{
ClearTimer(0); //境界部分ではないので...
turn_right;
}
else if(SENSOR_2 > 44) //境界部分 直進
{
go;
}
else if(SENSOR_2 > 41) //弱黒部分 左旋回
{
ClearTimer(0); //境界部分ではないので...
turn_left;
}
else{ //黒部分 左回転
ClearTimer(0); //境界部分ではないので...
roll_left;
}
if(FastTimer(0)>BALANCE_TIME) //姿勢判別
{
Off(OUT_AC); //車輪を止める
PlaySound(SOUND_UP); //音を鳴らす
Wait(100); //1秒待つ
ch=1; //ループ脱出の為にchを1にする
}
Wait(1); //0.01秒待つ
}
if(ch==0)
{
back; //約2秒分の後退
back;
}
}
このsubは、左側境界面の機体の制御用プログラムです。
どうしてもライントレスからすぐに直線させると毎回違った方...
sub balance_r(){
int ch=0; //ループ脱出用変数
ClearTimer(0); //姿勢判別用のタイマー初期化
while(ch==0) //chが0の時はループを続ける
{
ClearTimer(1); //ライントレース時間判別用のタ...
while(FastTimer(1)<200&&ch==0)//FastTimer(1)が2...
{
if(SENSOR_2 > 53) //白部分 左回転
{
ClearTimer(0); //境界部分ではないので...
roll_left;
}
else if(SENSOR_2 > 52) //弱白部分 左旋回
{
ClearTimer(0); //境界部分ではないので...
turn_left;
}
else if(SENSOR_2 > 44) //境界部分 直進
{
go;
}
else if(SENSOR_2 > 41) //弱黒部分 右旋回
{
ClearTimer(0); //境界部分ではないので...
turn_right;
}
else{ //黒部分 右回転
ClearTimer(0); //境界部分ではないので...
roll_right;
}
if(FastTimer(0)>BALANCE_TIME) //姿勢判別
{
Off(OUT_AC); //車輪を止める
PlaySound(SOUND_UP); //音を鳴らす
Wait(100); //1秒待つ
ch=1; //ループ脱出の為にchを1にする
}
Wait(1); //0.01秒待つ
}
if(ch==0)
{
back; //約2秒分の後退
back;
}
}
このsubはひとつ上の右側境界面用のプログラムです。
sub cup(){
OnRev(OUT_B); //アームを下す
Wait(50);
Off(OUT_B);
OnFwd(OUT_AC); //前進
while(SENSOR_1<42); //光センサーが紙コップを認識す...
Off(OUT_AC); //停止
OnFwd(OUT_B); //アームを上げる
Wait(50);
Off(OUT_B);
}
このsubは紙コップを取るための動作です。
sub turn(){
OnFwd(OUT_C); //左回転
OnRev(OUT_A);
Wait(100); //黒部分から白部分に出るための時間(D地...
while(SENSOR_2>41); //白部分である場合は回転し続ける
Off(OUT_AC); //停止
}
交差点を左に曲がるためのsubです。
sub last(){
OnFwd(OUT_AC); //前進
Wait(50); //約0.5秒待つ
Off(OUT_AC);
OnRev(OUT_B); //アームを下す
Wait(50); //約0.5秒待つ
Off(OUT_B);
OnFwd(OUT_A); //右回転
OnRev(OUT_C);
Wait(100); //約1秒待つ
back; //約2秒間後進する(1秒ではアームが紙コップに...
back;
}
最後に積み上げた紙コップを指定された場所へ設置するためのs...
**メインプログラム [#y291d4d1]
task main ()
{
SetSensor(SENSOR_1, SENSOR_LIGHT); //光センサー1の...
SetSensor(SENSOR_2, SENSOR_LIGHT); //光センサー2の...
OnFwd(OUT_AC); //スタート地点の枠から脱出
Wait(60);
//C地点までの移動
line_l(); //左側境界部分をトレース
left; //P地点を左折
l_time=400; //次の交差点までの秒数を4秒に設定
line_l(); //左側境界部分をトレース
right; //S地点を右折
balance_l(); //左境界部分での姿勢制御
//紙コップ回収作業
cup(); //1つ目の紙コップ取得
back; //後進
//D地点までの移動
turn(); //左回転
balance_r(); //右境界部分での姿勢制御
//紙コップ回収作業
cup(); //2つ目の紙コップ取得
back; //後進
//C地点までの移動
turn(); //左回転
OnFwd(OUT_AC); //前進
Wait(20);
balance_r(); //右境界部分での姿勢制御
//紙コップ回収作業
cup(); //3つ目の紙コップ取得
back; //後進
//D地点までの移動
turn(); //左回転
OnFwd(OUT_AC); //前進
Wait(20);
balance_r(); //右境界部分での姿勢制御
//紙コップ回収作業
cup(); //4つ目の紙コップ取得
back; //約4秒間後進
back;
back;
back;
l_time=200; //次の交差点までの秒数を2秒に設定
//左境界部分へ移動
OnFwd(OUT_C); //左回転
OnRev(OUT_A);
Wait(50);
OnFwd(OUT_AC); //前進
Wait(30);
//Q地点までの移動
line_l(); //左側境界部分をトレース
left; //S地点を左折
line_l(); //左側境界部分をトレース
left; //P地点を左折
line_l(); //左側境界部分をトレース
//紙コップの設置
last();
}
これがメインプログラムです。
*感想 [#u9303ff4]
**課題3の結果 [#ic362b2c]
2回目のやり直しが成功し優勝となりました。
**全体として [#sf1f4d25]
結果は合計点数35.2点で晴れて優勝することが出来ました。
しかし、班での活動中は班員皆レベルが高く話し合いについて...
機体に関しても当初の2体使う計画ではなくなったので結果優...
今回の課題3は機体づくり、作戦等、課題1,2では比較的優...
自分は工学部でこれからもたくさんプログラムに関与していく...
ページ名: