2016a/Member/Junnko/Mission3
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
検索
|
最終更新
|
ヘルプ
|
ログイン
]
開始行:
[[2016a/Member]]
*目次 [#we314833]
#contents
*課題3 [#z07f8dc2]
課題2で使用したコースを用いてC地点とD地点に最大3つずつお...
*ロボット本体の説明 [#z4ce7b36]
**ロボット本体 [#x9773074]
私たちの班は2つのロボット(1つは紙コップを積み上げるロボ...
#ref(2016a/Member/Junnko/Mission3/IMG_7671[1].JPG,10%,ロ...
ロボットを正面から見た写真
積み上げた紙コップをルールに従い、ロボットに接していない...
#ref(2016a/Member/Junnko/Mission3/IMG_7669[1].JPG,10%,ロ...
ロボットを真横から見た写真
**光センサーの位置 [#w4cdee7d]
***ライントレース用 [#j5098b3d]
紙コップを本体と持ち上げるためのアームとの間に入れるため...
#ref(2016a/Member/Junnko/Mission3/IMG_7667[1].JPG,10%,ロ...
ロボットを裏から見た写真
***紙コップの判断用 [#q9201449]
もう一つの光センサーは紙コップをつかんだ(正確に言えば挟...
#ref(2016a/Member/Junnko/Mission3/IMG_7663[1].JPG,10%,光...
**アーム [#u4ece583]
アームを動かす仕組みは、1つのモーターを重心の関係でロボッ...
#ref(2016a/Member/Junnko/Mission3/IMG_7666[1].JPG,10%,ロ...
ロボットのアーム部分
最終的に下の写真のように積み上げていく感じになります。
#ref(2016a/Member/Junnko/Mission3/IMG_7661[1].JPG,10%,ロ...
*プログラムの説明 [#iea09090]
**光センサーの値 [#s0067cc5]
・白部分・・・・53〜
・弱白部分・・・52〜53
・境界部分・・・44〜52
・弱黒部分・・・41〜44
・黒部分・・・・〜41
**タイマーについて [#w6c353e9]
***Fasttimer(1) [#y6b09909]
光センサーが黒部分の判定をしている時にカウントをして、0.4...
***Fasttaimer(2) [#kc2ea43a]
小さなカーブを交差点として誤判別しないために指定秒数間交...
**時間の定義 [#lff95a51]
#define CROSS_TIME 40
#define BALANCE_TIME 40
**基本動作や決まっている動作の定義 [#h6aa94be]
#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...
**左側をラインとレースするプログラム [#fd949803]
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秒待つ
}
}
**姿勢制御の方法 [#t4e6e6d5]
境界部分を判定して、ロボットが線に対して真っ直ぐ向くよ...
真っ直ぐ向くまでライントレースを繰り返すようになってい...
***左境界部分での姿勢制御 [#k2866517]
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;
}
}
}
***右境界部分での姿勢制御 [#z2955700]
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;
}
}
}
**紙コップを積み上げる [#g4b1b4d8]
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);
}
**C地点、D地点への方向転換 [#h6c7933d]
sub turn(){
OnFwd(OUT_C); //左回転
OnRev(OUT_A);
Wait(100); //黒部分から白部分に出るための時間(D地...
while(SENSOR_2>41); //白部分である場合は回転し続ける
Off(OUT_AC); //停止
}
**紙コップを置く [#j30b4cb6]
Q地点までライントレースをしてたどり着いたら、次のように積...
Q地点の交差点判別のあと、機体の姿勢を戻さずにそのまま前進...
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;
}
**メイン [#ed566a9b]
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();
}
*課題3の結果 [#u65c3bdb]
**基本点 [#qd7c8009]
***1回目→0点 [#u1724ed1]
紙コップ判断用のセンサーが断線しかかっていたのが原因だと...
***2回目→30点 [#yd9f3c1d]
最初は6個積み上げようと思っていたがうまくいかず、進路変更...
**技術点→5.2点 [#e6a2dcb0]
1回目が光センサーの関係でうまくいかなかったし、他のグルー...
*感想 [#fd1d2e0e]
今回は最初のロボットの形を作るところから苦戦しました。ど...
みんなと話し合いながらいろんな意見をまとめたりするのが大...
テスト週間とかぶっていたこともあってみんなと時間を合わせ...
いろんな良いことがあって、みんなの知恵があったから今回の...
プログラミングは難しかったけれど、とても有意義な時間でし...
終了行:
[[2016a/Member]]
*目次 [#we314833]
#contents
*課題3 [#z07f8dc2]
課題2で使用したコースを用いてC地点とD地点に最大3つずつお...
*ロボット本体の説明 [#z4ce7b36]
**ロボット本体 [#x9773074]
私たちの班は2つのロボット(1つは紙コップを積み上げるロボ...
#ref(2016a/Member/Junnko/Mission3/IMG_7671[1].JPG,10%,ロ...
ロボットを正面から見た写真
積み上げた紙コップをルールに従い、ロボットに接していない...
#ref(2016a/Member/Junnko/Mission3/IMG_7669[1].JPG,10%,ロ...
ロボットを真横から見た写真
**光センサーの位置 [#w4cdee7d]
***ライントレース用 [#j5098b3d]
紙コップを本体と持ち上げるためのアームとの間に入れるため...
#ref(2016a/Member/Junnko/Mission3/IMG_7667[1].JPG,10%,ロ...
ロボットを裏から見た写真
***紙コップの判断用 [#q9201449]
もう一つの光センサーは紙コップをつかんだ(正確に言えば挟...
#ref(2016a/Member/Junnko/Mission3/IMG_7663[1].JPG,10%,光...
**アーム [#u4ece583]
アームを動かす仕組みは、1つのモーターを重心の関係でロボッ...
#ref(2016a/Member/Junnko/Mission3/IMG_7666[1].JPG,10%,ロ...
ロボットのアーム部分
最終的に下の写真のように積み上げていく感じになります。
#ref(2016a/Member/Junnko/Mission3/IMG_7661[1].JPG,10%,ロ...
*プログラムの説明 [#iea09090]
**光センサーの値 [#s0067cc5]
・白部分・・・・53〜
・弱白部分・・・52〜53
・境界部分・・・44〜52
・弱黒部分・・・41〜44
・黒部分・・・・〜41
**タイマーについて [#w6c353e9]
***Fasttimer(1) [#y6b09909]
光センサーが黒部分の判定をしている時にカウントをして、0.4...
***Fasttaimer(2) [#kc2ea43a]
小さなカーブを交差点として誤判別しないために指定秒数間交...
**時間の定義 [#lff95a51]
#define CROSS_TIME 40
#define BALANCE_TIME 40
**基本動作や決まっている動作の定義 [#h6aa94be]
#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...
**左側をラインとレースするプログラム [#fd949803]
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秒待つ
}
}
**姿勢制御の方法 [#t4e6e6d5]
境界部分を判定して、ロボットが線に対して真っ直ぐ向くよ...
真っ直ぐ向くまでライントレースを繰り返すようになってい...
***左境界部分での姿勢制御 [#k2866517]
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;
}
}
}
***右境界部分での姿勢制御 [#z2955700]
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;
}
}
}
**紙コップを積み上げる [#g4b1b4d8]
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);
}
**C地点、D地点への方向転換 [#h6c7933d]
sub turn(){
OnFwd(OUT_C); //左回転
OnRev(OUT_A);
Wait(100); //黒部分から白部分に出るための時間(D地...
while(SENSOR_2>41); //白部分である場合は回転し続ける
Off(OUT_AC); //停止
}
**紙コップを置く [#j30b4cb6]
Q地点までライントレースをしてたどり着いたら、次のように積...
Q地点の交差点判別のあと、機体の姿勢を戻さずにそのまま前進...
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;
}
**メイン [#ed566a9b]
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();
}
*課題3の結果 [#u65c3bdb]
**基本点 [#qd7c8009]
***1回目→0点 [#u1724ed1]
紙コップ判断用のセンサーが断線しかかっていたのが原因だと...
***2回目→30点 [#yd9f3c1d]
最初は6個積み上げようと思っていたがうまくいかず、進路変更...
**技術点→5.2点 [#e6a2dcb0]
1回目が光センサーの関係でうまくいかなかったし、他のグルー...
*感想 [#fd1d2e0e]
今回は最初のロボットの形を作るところから苦戦しました。ど...
みんなと話し合いながらいろんな意見をまとめたりするのが大...
テスト週間とかぶっていたこともあってみんなと時間を合わせ...
いろんな良いことがあって、みんなの知恵があったから今回の...
プログラミングは難しかったけれど、とても有意義な時間でし...
ページ名: