2018a/Member/Tomo/Mission2
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
検索
|
最終更新
|
ヘルプ
|
ログイン
]
開始行:
#contents
*課題 [#b949118c]
今回の課題は、ライントレースをしながら缶を運ぶというもの...
&ref(2018a/Member/Tomo/Mission2/2018a-mission2'.png,70%,...
*ロボットの構造 [#i4a428f2]
ロボットは資料に載っているものを参考に、余計なパーツをオ...
&ref(2018a/Member/Tomo/Mission2/full_picture_2.jpg,70%,全...
缶を捕まえる機構は四角い枠を上から被せるかたちとなってい...
&ref(2018a/Member/Tomo/Mission2/catch_function.jpg,70%,缶...
*ライントレースのプログラム [#g8fc9997]
多くの人はラインとの境界線を移動し続ける形でライントレー...
黒い線上をトレースする動きは、まずその場でロボットを旋回...
**境界を検知して間の角度を割り出すプログラム [#y0955c9e]
sub check()
{
long ct=CurrentTick(); //この時点での時刻を記録
while(SENSOR_2<w_bordor){
OnFwd(OUT_B,C_SPEED);OnRev(OUT_C,C_SPEED); //右側の...
}
Off(OUT_BC);
long ct_2=CurrentTick(); //この時点での時刻を記録
while(SENSOR_2>b_bordor){
OnFwd(OUT_C,C_SPEED);OnRev(OUT_B,C_SPEED); //ライン...
}
while(SENSOR_2<w_bordor){
OnFwd(OUT_C,C_SPEED);OnRev(OUT_B,C_SPEED); //左側の...
}
long ct_3=CurrentTick(); //この時点での時刻を記録
Off(OUT_BC);
ct_4=ct_3-ct_2; //ラインの端から端まで旋回するのにかか...
ct_1=ct_4/2-ct_2+ct; //ラインに対する車体の傾きを計算
}
角度は旋回にかかる時間で考えている。二つ目のwhileは、これ...
**ロボットの進行方向を合わせるプログラム [#c6474b30]
sub front()
{
OnFwd(OUT_B,C_SPEED);OnRev(OUT_C,C_SPEED);
Wait(ct_4/2);
Off(OUT_BC);
}
境界から反対側の境界へ旋回するのにかかる時間を計測して、...
**少しだけ進むプログラム [#kf4d101b]
sub ahead()
{
OnFwd(OUT_BC,SPEED);
Wait(ahead_time);
Off(OUT_BC);
}
[#w29f3248]
また、この3つのサブルーチンのうち「ahead」と「check」は...
sub sequence()
{
ahead();
check();
}
**缶を捉えるプログラム [#j75555e2]
sub catch(int i)
{
RotateMotor(OUT_A, i, 45);
}
サブルーチン化し角度を変数にすることで、捉える時と放す時...
**交差点の判別 [#zc648d92]
交差点の判別にはこのプログラムの特徴ともいえる旋回してラ...
sub check_orig()
{
long ct=CurrentTick(); //この時点での時刻を記録
while(SENSOR_2<w_bordor){
OnFwd(OUT_B,C_SPEED);OnRev(OUT_C,C_SPEED); //右側の...
}
Off(OUT_BC);
long ct_2=CurrentTick(); //この時点での時刻を記録
while(SENSOR_2>b_bordor){
OnFwd(OUT_C,C_SPEED);OnRev(OUT_B,C_SPEED); //ライン...
}
while(SENSOR_2<w_bordor){
OnFwd(OUT_C,C_SPEED);OnRev(OUT_B,C_SPEED); //左側の...
}
long ct_3=CurrentTick(); //この時点での時刻を記録
Off(OUT_BC);
ct_0=ct_3-ct_2; //ラインの端から端まで旋回するのにかか...
OnFwd(OUT_B,C_SPEED);OnRev(OUT_C,C_SPEED); //車体の角...
Wait(ct_0/2);
Off(OUT_BC);
}
最初の旋回のプログラム。基本的には通常の旋回のプログラム...
if((ct_4-ct_0<=200)||(t==1)){ //もし結果の差が200以下ま...
front(); //車体の角度を調整
sequence();PlaySound(SOUND_CLICK); //前進のち...
t=0;
}else if((ct_4-ct_0>200)&&(s<1)){ //もし結果の...
PlaySound(SOUND_UP);
OnFwd(OUT_B,C_SPEED);OnRev(OUT_C,C_SPEED); //...
Wait(ct_4/5);t++;
Off(OUT_BC);
sequence();s++;
メインプログラムでの交差点と直進の一部。これをwhileでルー...
以下は定数、または変数
#define SPEED 50 //直進する際の速度
#define C_SPEED 40 //旋回する際の速度
#define w_bordor 30 //白の閾値
#define b_bordor 20 //黒の閾値
long ct_0;
long ct_4;
long ct_1;
int ahead_time=200; //直進する時間
以下、メインのプログラム
task main()
{
SetSensorTouch(S1);
SetSensorLight(S2);
long t0=CurrentTick();
int t=0;
int s=0;
ahead();
check_orig();PlaySound(SOUND_CLICK); //一度目の旋回...
sequence();PlaySound(SOUND_CLICK);
while(s<7){ //6つ目の分岐...
if((ct_4-ct_0<=200)||(t==1)){
front(); //角度調整
sequence();PlaySound(SOUND_CLICK);
t=0;
}else if((ct_4-ct_0>200)&&(s<1)){ //一つ目の交...
PlaySound(SOUND_UP);
OnFwd(OUT_B,C_SPEED);OnRev(OUT_C,C_SPEED); /...
Wait(ct_4/5);t++;
Off(OUT_BC);
sequence();s++;
}else if((ct_4-ct_0>200)&&(s<2)){ //2つ目の分...
OnFwd(OUT_B,C_SPEED);OnRev(OUT_C,C_SPEED);Pl...
Wait(ct_4/2);
s++;
Off(OUT_BC);Wait(100); //一時停止 本来はこ...
OnFwd(OUT_B,C_SPEED);OnRev(OUT_C,C_SPEED); /...
Wait(ct_4/5);
ahead_time=100;
sequence();
}else if((ct_4-ct_0>200)&&(s<5)){ //3,4つ目の...
OnFwd(OUT_B,C_SPEED);OnRev(OUT_C,C_SPEED);Pl...
Wait(ct_4/5);s++;
sequence();
}else if((ct_4-ct_0>200)&&(s<7)){ //5,6つ目の...
Off(OUT_BC);Wait(100); //一時停止
OnFwd(OUT_B,C_SPEED);OnRev(OUT_C,C_SPEED);Pl...
Wait(ct_4/5*4);t++;
Off(OUT_BC);
sequence();s++;
}
}
while(s<10){
if((t==1)&&(ct_1>-100)&&(ct_1<100)){ //つづら折...
front();
sequence();
ahead_time=300;
t=0;
s++;
}else if((ct_1>-100)&&(ct_1<100)){ //進行方向...
front(); //徐々に進...
sequence();
ahead_time-=20;
}else if((ct_1<-100)||(ct_1<100)){ //進行方向...
ahead_time=200; //一定の距...
front();
sequence();
t=1;
}
}
ahead_time=200;
while(s<16){ //分岐Dを抜けた先...
if((ct_4-ct_0<=200)||(t==1)){
front(); //角度調整
sequence();PlaySound(SOUND_CLICK);
t=0;
}else if((ct_4-ct_0>200)&&(s<11)){ //以下各分...
PlaySound(SOUND_UP);
OnFwd(OUT_B,C_SPEED);OnRev(OUT_C,C_SPEED);
Wait(ct_4/5*4);t++;
Off(OUT_BC);
sequence();s++;
}else if((ct_4-ct_0>200)&&(s<12)){
PlaySound(SOUND_UP);
OnFwd(OUT_B,C_SPEED);OnRev(OUT_C,C_SPEED);
Wait(ct_4/5);t++;
Off(OUT_BC);
sequence();s++;
}else if((ct_4-ct_0>200)&&(s<13)){
OnFwd(OUT_B,C_SPEED);OnRev(OUT_C,C_SPEED);
Wait(ct_4/5*4);
s++;
Off(OUT_BC);Wait(100);
OnFwd(OUT_C,C_SPEED);OnRev(OUT_B,C_SPEED);
Wait(ct_4/5*4);
sequence();
}else if((ct_4-ct_0>200)&&(s<14)){
OnFwd(OUT_B,C_SPEED);OnRev(OUT_C,C_SPEED);
Wait(ct_4/5*4);s++;
sequence();
}else if((ct_4-ct_0>200)&&(s<15)){
OnFwd(OUT_B,C_SPEED);OnRev(OUT_C,C_SPEED);
Wait(ct_4/5*7);s++;
Off(OUT_BC);
Wait(100); //一時停止 本来ならここで缶を...
OnRev(OUT_BC,SPEED);Wait(100); //車体を後退
if(SENSOR_2<b_bordor){ //車体を反転
while(SENSOR_2<w_bordor){
OnFwd(OUT_C,C_SPEED);OnRev(OUT_B,C_SPEE...
}
while(SENSOR_2>b_bordor){
OnFwd(OUT_C,C_SPEED);OnRev(OUT_B,C_SPEE...
}
OnFwd(OUT_C,C_SPEED);OnRev(OUT_B,SPEED);
Wait(ct_0/2);
}else if(SENSOR_2>w_bordor){
while(SENSOR_2>b_bordor){
OnFwd(OUT_C,C_SPEED);OnRev(OUT_B,C_SPEE...
}
OnFwd(OUT_C,C_SPEED);OnRev(OUT_B,SPEED);
Wait(ct_0/2);
}
sequence();
}else if((ct_4-ct_0>200)&&(s<16)){
PlaySound(SOUND_UP);
OnFwd(OUT_B,C_SPEED);OnRev(OUT_C,C_SPEED);
Wait(ct_4/5);t++;
Off(OUT_BC);
sequence();s++;
}
}
while(s<18){ //つづら折...
if((t==1)&&(ct_1>-100)&&(ct_1<100)){
front();
sequence();
t=0;
s++;
}else if((ct_1>-100)&&(ct_1<100)){
front();
sequence();
}else if((ct_1<-100)||(ct_1<100)){
front();
sequence();
t=1;
}
}
while(SENSOR_2<b_bordor){ //長い直線を進む
if((s==18)||(t==1)){
front();
sequence();
ahead_time=350;
t=0;
s++;
}else if(ct_4-ct_0<=200){ //距離を徐々に短くし...
front();
sequence();
ahead_time-=20;
}else if((ct_4-ct_0>200)&&(s<20)){ //交差点を...
ahead_time=200;
front();
Wait(100);
sequence();
t=1;
}else if((ct_4-ct_0>200)&&(s<21)){ //交差点を...
ahead_time=200;
front();
Wait(100);
sequence();
t=1;
}
}
front();
ahead();
Off(OUT_BC);
}
*結果 [#j793f80e]
一つ目の交差点までは曲がれたが、缶の手前で止まることがで...
*反省点 [#a275c0f5]
試行回数が少なく十分にプログラムを見直せなかった。また、...
終了行:
#contents
*課題 [#b949118c]
今回の課題は、ライントレースをしながら缶を運ぶというもの...
&ref(2018a/Member/Tomo/Mission2/2018a-mission2'.png,70%,...
*ロボットの構造 [#i4a428f2]
ロボットは資料に載っているものを参考に、余計なパーツをオ...
&ref(2018a/Member/Tomo/Mission2/full_picture_2.jpg,70%,全...
缶を捕まえる機構は四角い枠を上から被せるかたちとなってい...
&ref(2018a/Member/Tomo/Mission2/catch_function.jpg,70%,缶...
*ライントレースのプログラム [#g8fc9997]
多くの人はラインとの境界線を移動し続ける形でライントレー...
黒い線上をトレースする動きは、まずその場でロボットを旋回...
**境界を検知して間の角度を割り出すプログラム [#y0955c9e]
sub check()
{
long ct=CurrentTick(); //この時点での時刻を記録
while(SENSOR_2<w_bordor){
OnFwd(OUT_B,C_SPEED);OnRev(OUT_C,C_SPEED); //右側の...
}
Off(OUT_BC);
long ct_2=CurrentTick(); //この時点での時刻を記録
while(SENSOR_2>b_bordor){
OnFwd(OUT_C,C_SPEED);OnRev(OUT_B,C_SPEED); //ライン...
}
while(SENSOR_2<w_bordor){
OnFwd(OUT_C,C_SPEED);OnRev(OUT_B,C_SPEED); //左側の...
}
long ct_3=CurrentTick(); //この時点での時刻を記録
Off(OUT_BC);
ct_4=ct_3-ct_2; //ラインの端から端まで旋回するのにかか...
ct_1=ct_4/2-ct_2+ct; //ラインに対する車体の傾きを計算
}
角度は旋回にかかる時間で考えている。二つ目のwhileは、これ...
**ロボットの進行方向を合わせるプログラム [#c6474b30]
sub front()
{
OnFwd(OUT_B,C_SPEED);OnRev(OUT_C,C_SPEED);
Wait(ct_4/2);
Off(OUT_BC);
}
境界から反対側の境界へ旋回するのにかかる時間を計測して、...
**少しだけ進むプログラム [#kf4d101b]
sub ahead()
{
OnFwd(OUT_BC,SPEED);
Wait(ahead_time);
Off(OUT_BC);
}
[#w29f3248]
また、この3つのサブルーチンのうち「ahead」と「check」は...
sub sequence()
{
ahead();
check();
}
**缶を捉えるプログラム [#j75555e2]
sub catch(int i)
{
RotateMotor(OUT_A, i, 45);
}
サブルーチン化し角度を変数にすることで、捉える時と放す時...
**交差点の判別 [#zc648d92]
交差点の判別にはこのプログラムの特徴ともいえる旋回してラ...
sub check_orig()
{
long ct=CurrentTick(); //この時点での時刻を記録
while(SENSOR_2<w_bordor){
OnFwd(OUT_B,C_SPEED);OnRev(OUT_C,C_SPEED); //右側の...
}
Off(OUT_BC);
long ct_2=CurrentTick(); //この時点での時刻を記録
while(SENSOR_2>b_bordor){
OnFwd(OUT_C,C_SPEED);OnRev(OUT_B,C_SPEED); //ライン...
}
while(SENSOR_2<w_bordor){
OnFwd(OUT_C,C_SPEED);OnRev(OUT_B,C_SPEED); //左側の...
}
long ct_3=CurrentTick(); //この時点での時刻を記録
Off(OUT_BC);
ct_0=ct_3-ct_2; //ラインの端から端まで旋回するのにかか...
OnFwd(OUT_B,C_SPEED);OnRev(OUT_C,C_SPEED); //車体の角...
Wait(ct_0/2);
Off(OUT_BC);
}
最初の旋回のプログラム。基本的には通常の旋回のプログラム...
if((ct_4-ct_0<=200)||(t==1)){ //もし結果の差が200以下ま...
front(); //車体の角度を調整
sequence();PlaySound(SOUND_CLICK); //前進のち...
t=0;
}else if((ct_4-ct_0>200)&&(s<1)){ //もし結果の...
PlaySound(SOUND_UP);
OnFwd(OUT_B,C_SPEED);OnRev(OUT_C,C_SPEED); //...
Wait(ct_4/5);t++;
Off(OUT_BC);
sequence();s++;
メインプログラムでの交差点と直進の一部。これをwhileでルー...
以下は定数、または変数
#define SPEED 50 //直進する際の速度
#define C_SPEED 40 //旋回する際の速度
#define w_bordor 30 //白の閾値
#define b_bordor 20 //黒の閾値
long ct_0;
long ct_4;
long ct_1;
int ahead_time=200; //直進する時間
以下、メインのプログラム
task main()
{
SetSensorTouch(S1);
SetSensorLight(S2);
long t0=CurrentTick();
int t=0;
int s=0;
ahead();
check_orig();PlaySound(SOUND_CLICK); //一度目の旋回...
sequence();PlaySound(SOUND_CLICK);
while(s<7){ //6つ目の分岐...
if((ct_4-ct_0<=200)||(t==1)){
front(); //角度調整
sequence();PlaySound(SOUND_CLICK);
t=0;
}else if((ct_4-ct_0>200)&&(s<1)){ //一つ目の交...
PlaySound(SOUND_UP);
OnFwd(OUT_B,C_SPEED);OnRev(OUT_C,C_SPEED); /...
Wait(ct_4/5);t++;
Off(OUT_BC);
sequence();s++;
}else if((ct_4-ct_0>200)&&(s<2)){ //2つ目の分...
OnFwd(OUT_B,C_SPEED);OnRev(OUT_C,C_SPEED);Pl...
Wait(ct_4/2);
s++;
Off(OUT_BC);Wait(100); //一時停止 本来はこ...
OnFwd(OUT_B,C_SPEED);OnRev(OUT_C,C_SPEED); /...
Wait(ct_4/5);
ahead_time=100;
sequence();
}else if((ct_4-ct_0>200)&&(s<5)){ //3,4つ目の...
OnFwd(OUT_B,C_SPEED);OnRev(OUT_C,C_SPEED);Pl...
Wait(ct_4/5);s++;
sequence();
}else if((ct_4-ct_0>200)&&(s<7)){ //5,6つ目の...
Off(OUT_BC);Wait(100); //一時停止
OnFwd(OUT_B,C_SPEED);OnRev(OUT_C,C_SPEED);Pl...
Wait(ct_4/5*4);t++;
Off(OUT_BC);
sequence();s++;
}
}
while(s<10){
if((t==1)&&(ct_1>-100)&&(ct_1<100)){ //つづら折...
front();
sequence();
ahead_time=300;
t=0;
s++;
}else if((ct_1>-100)&&(ct_1<100)){ //進行方向...
front(); //徐々に進...
sequence();
ahead_time-=20;
}else if((ct_1<-100)||(ct_1<100)){ //進行方向...
ahead_time=200; //一定の距...
front();
sequence();
t=1;
}
}
ahead_time=200;
while(s<16){ //分岐Dを抜けた先...
if((ct_4-ct_0<=200)||(t==1)){
front(); //角度調整
sequence();PlaySound(SOUND_CLICK);
t=0;
}else if((ct_4-ct_0>200)&&(s<11)){ //以下各分...
PlaySound(SOUND_UP);
OnFwd(OUT_B,C_SPEED);OnRev(OUT_C,C_SPEED);
Wait(ct_4/5*4);t++;
Off(OUT_BC);
sequence();s++;
}else if((ct_4-ct_0>200)&&(s<12)){
PlaySound(SOUND_UP);
OnFwd(OUT_B,C_SPEED);OnRev(OUT_C,C_SPEED);
Wait(ct_4/5);t++;
Off(OUT_BC);
sequence();s++;
}else if((ct_4-ct_0>200)&&(s<13)){
OnFwd(OUT_B,C_SPEED);OnRev(OUT_C,C_SPEED);
Wait(ct_4/5*4);
s++;
Off(OUT_BC);Wait(100);
OnFwd(OUT_C,C_SPEED);OnRev(OUT_B,C_SPEED);
Wait(ct_4/5*4);
sequence();
}else if((ct_4-ct_0>200)&&(s<14)){
OnFwd(OUT_B,C_SPEED);OnRev(OUT_C,C_SPEED);
Wait(ct_4/5*4);s++;
sequence();
}else if((ct_4-ct_0>200)&&(s<15)){
OnFwd(OUT_B,C_SPEED);OnRev(OUT_C,C_SPEED);
Wait(ct_4/5*7);s++;
Off(OUT_BC);
Wait(100); //一時停止 本来ならここで缶を...
OnRev(OUT_BC,SPEED);Wait(100); //車体を後退
if(SENSOR_2<b_bordor){ //車体を反転
while(SENSOR_2<w_bordor){
OnFwd(OUT_C,C_SPEED);OnRev(OUT_B,C_SPEE...
}
while(SENSOR_2>b_bordor){
OnFwd(OUT_C,C_SPEED);OnRev(OUT_B,C_SPEE...
}
OnFwd(OUT_C,C_SPEED);OnRev(OUT_B,SPEED);
Wait(ct_0/2);
}else if(SENSOR_2>w_bordor){
while(SENSOR_2>b_bordor){
OnFwd(OUT_C,C_SPEED);OnRev(OUT_B,C_SPEE...
}
OnFwd(OUT_C,C_SPEED);OnRev(OUT_B,SPEED);
Wait(ct_0/2);
}
sequence();
}else if((ct_4-ct_0>200)&&(s<16)){
PlaySound(SOUND_UP);
OnFwd(OUT_B,C_SPEED);OnRev(OUT_C,C_SPEED);
Wait(ct_4/5);t++;
Off(OUT_BC);
sequence();s++;
}
}
while(s<18){ //つづら折...
if((t==1)&&(ct_1>-100)&&(ct_1<100)){
front();
sequence();
t=0;
s++;
}else if((ct_1>-100)&&(ct_1<100)){
front();
sequence();
}else if((ct_1<-100)||(ct_1<100)){
front();
sequence();
t=1;
}
}
while(SENSOR_2<b_bordor){ //長い直線を進む
if((s==18)||(t==1)){
front();
sequence();
ahead_time=350;
t=0;
s++;
}else if(ct_4-ct_0<=200){ //距離を徐々に短くし...
front();
sequence();
ahead_time-=20;
}else if((ct_4-ct_0>200)&&(s<20)){ //交差点を...
ahead_time=200;
front();
Wait(100);
sequence();
t=1;
}else if((ct_4-ct_0>200)&&(s<21)){ //交差点を...
ahead_time=200;
front();
Wait(100);
sequence();
t=1;
}
}
front();
ahead();
Off(OUT_BC);
}
*結果 [#j793f80e]
一つ目の交差点までは曲がれたが、缶の手前で止まることがで...
*反省点 [#a275c0f5]
試行回数が少なく十分にプログラムを見直せなかった。また、...
ページ名: