2015a/Member/Lawrence/Mission2
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
検索
|
最終更新
|
ヘルプ
|
ログイン
]
開始行:
[[2015a/Member]]
#contents
*初めに [#f183044f]
私はグループの中で、A-Bまでのコースの役割を背負いました。
今回は始めに言いますが、結局成功しませんでした。だけれど...
一方でタイム処理のほうはまだそれに比べればましだという程...
#ref(new_2015-07w-16 23.jpg);
*ロボットの構造 [#i60cbf08]
アームを前面に取り付けて、固定に、本体との接続を利用した。
光センサーはTraceの感覚がちょうどよくなるように、アームと...
また、アームには、歯車を使用して、アームが前面に取り付け...
重心が、前半部分に偏り過ぎていたため、本体の後ろ側に固定...
しかしながら、アームの部分が少し重すぎるためか、少し圧力...
そのほか、始めは、前タイヤと、アームとがある境界を超える...
#ref(3.jpg);
*プログラムの内容 [#m7f8202f]
#define Do 523
#define Re 587
#define Mi 659
#define Fa 698
#define So 784
#define Ra 880
#define Si 988
#define DoX 1047
#define SSS 50
#define AAA 500
#define DoI() PlayTone(Do,SSS);Wait(AAA);
#define ReI() PlayTone(Re,SSS);Wait(AAA);
#define MiI() PlayTone(Mi,SSS);Wait(AAA);
#define FaI() PlayTone(Fa,SSS);Wait(AAA);
#define SoI() PlayTone(So,SSS);Wait(AAA);
#define RaI() PlayTone(Ra,SSS);Wait(AAA);
#define SiI() PlayTone(Si,SSS);Wait(AAA);
#define DoXI() PlayTone(DoX,SSS);Wait(AAA);
#define MTT 300
#define STT 100
#define UTT 300
#define MT 150
#define QTT 600
#define Particular 500
上記のマクロ群は、Trace中にマシンが刻むリズム、または、ゴ...
#define GPT CurrentTick() //Get the Present Time の略
#define Check 1 //光センサーの検知時間
#define Catches RotateMotor(OUT_C,15,80);Off(OUT_C); //...
#define Break Wait(1000); //小休止
#define Threshold 55 //黒レベル
#define GoFor OnFwd(OUT_AB,40);Wait(500);Off(OUT_AB); //...
#define goal RotateMotor(OUT_C,15,-80);Off(OUT_C);OnFwd(...
//ゴール時に、アームを開き、シュートする
sub RandomI(){
int RandomBox = Random(8);
if(RandomBox == 1){ DoI()};
if(RandomBox == 2){ ReI()};
if(RandomBox == 3){ MiI()};
if(RandomBox == 4){ FaI()};
if(RandomBox == 5){ SoI()};
if(RandomBox == 6){ RaI()};
if(RandomBox == 7){ SiI()};
if(RandomBox == 8){ DoXI()};
}
八音階がTrace中の検知ごとに、ランダムになるように、サブル...
task FlagSong(){
while(true)
{
PlayTone(523,STT);Wait(MTT);
PlayTone(587,STT);Wait(MTT);
PlayTone(659,STT);Wait(MTT);
PlayTone(698,STT);Wait(MTT);
PlayTone(659,STT);Wait(MTT);
PlayTone(587,STT);Wait(MTT);
PlayTone(523,50);Wait(MTT);
Wait(300);
PlayTone(659,50);Wait(MTT);
PlayTone(698,50);Wait(MTT);
PlayTone(784,50);Wait(MTT);
PlayTone(880,50);Wait(MTT);
PlayTone(784,50);Wait(MTT);
PlayTone(698,50);Wait(MTT);
PlayTone(659,50);Wait(MTT);
Wait(300);
PlayTone(523,50);Wait(QTT);
PlayTone(523,50);Wait(QTT);
PlayTone(523,50);Wait(QTT);
PlayTone(523,50);Wait(QTT);
PlayTone(523,50);Wait(MT);
PlayTone(523,50);Wait(MT);
PlayTone(587,50);Wait(MT);
PlayTone(587,50);Wait(MT);
PlayTone(659,50);Wait(MT);
PlayTone(659,50);Wait(MT);
PlayTone(698,50);Wait(MT);
PlayTone(698,50);Wait(MT);
PlayTone(659,50);Wait(UTT);
PlayTone(587,50);Wait(UTT);
PlayTone(523,50);Wait(UTT);
Wait(500);
}
}
「かえるのうた」の楽曲である。
task main (){
SetSensorLight(S3); //センサーをセット
long t0 = GPT; //現在時刻を習得
while(GPT-t0 < 6000) //6秒よりも下は、以下の動き
{
OnFwdSync(OUT_AB,60,(SENSOR_3-Threshold)*23...
この関数のみでTraceが可能なのは、(SENSOR_30-Threshold)の...
RandomI(); //ランダムに音を鳴らす。
}
OnFwd(OUT_B,40);Wait(500);Off(OUT_B);
Break
GoFor
Catches
一つ目の交差点に差し掛かったところで、Traceを中断し、前進...
while(GPT-t0 > 6000 && GPT-t0 < 24000)
{
OnFwdSync(OUT_AB,40,(SENSOR_3-Threshold)*23/10);
RandomI();
}
23/10の値はTresholdとSENSOR_3の値が+-のどちらにもなるので...
再び円形内のLINEを音を鳴らしながら、Traceする。
OnFwd(OUT_B,40);Wait(500);Off(OUT_B);
24秒経過後に、第二交差点を乗り越える。
while(GPT-t0 > 24000 && GPT-t0 < 28000)
{
OnFwdSync(OUT_AB,40,(SENSOR_3-Threshold)*23/10);
RandomI();
}
この間は、このプログラムのみで十分で、しっかりと、直角の...
到達する。
start FlagSong;
goal;
Float(OUT_AB);
Wait(12000); //かえるのうた二曲分の長さ
stop FlagSong;
}
ゴールへの到着とともに、「かえるのうた」を演奏し、勢いの...
#ref(www.jpg);
*苦労話 [#afcd3b13]
何度も、何度も、何度も、ロボットを作り替えた。
はじめのロボットは、タイヤがバギーのような形をしたものに...
しかし、このロボットは曲がるときに、前タイヤが、変な角度...
次に、つくったロボットはとても、背が高く、光センサーをつ...
*まとめ [#xcc14554]
今回からはBGMの領域まで踏み込んだので、どうせならと、生物...
*ロボットコンテスト [#i8d4de43]
ロボットコンテストのページがなかったのでこちらに書かせて...
課題2の時点では、Thresholdの値から、黒が連続的に続いて、...
一周目のロボコンのときは、準備が足らず、うまくいかなかっ...
*ロボットの構造 [#h7b8237d]
#ref(Gia.png);
#ref(Gu.png);
#ref(pia.png);
上の写真は実際にコースを走っているマシンである。&br;&br;
少し懲りすぎてしまい、本来の目的の「どれだれ速くゴールで...
後ろのタイヤの部分は、タイヤではなくボールで代用した。&br;
なぜなら、タイヤだと大きな溝、急な方向転換にはついていけ...
アームは歯車を使い直接ボールをつかめるようにした。基本的...
*プログラムの説明 [#m8457fcd]
#define Do 523
#define Re 587
#define Mi 659
#define Fa 698
#define So 784
#define Ra 880
#define Si 988
#define DoX 1047
#define SSS 50
#define AAA 500
#define DoI() PlayTone(Do,SSS);Wait(AAA);
#define ReI() PlayTone(Re,SSS);Wait(AAA);
#define MiI() PlayTone(Mi,SSS);Wait(AAA);
#define FaI() PlayTone(Fa,SSS);Wait(AAA);
#define SoI() PlayTone(So,SSS);Wait(AAA);
#define RaI() PlayTone(Ra,SSS);Wait(AAA);
#define SiI() PlayTone(Si,SSS);Wait(AAA);
#define DoXI() PlayTone(DoX,SSS);Wait(AAA);
ドレミファソラシドの8音階を、PlayToneで鳴らすためのマクロ...
#define CONN 1//Bluetoothのコネクション番号
#define Signal_One 1//受け渡しの番号
#define Use_Motor OUT_AB//瞬時に、モータのポート番号を変...
#define Use_Arm OUT_C//瞬時に、モータのポート番号を変更...
int Trace_Power = 30;//intで設定しておくことで、いつでも...
#define Sync_Trace(int Sync_Ratio) OnFwdSync(Use_Motor,T...
//OnFwdSyncを用いて、その同期率をThresholdの値によって変...
#define DetectTime 1//光センサーの検知時間
int Standard_Sync_Ratio = 60;//基準となる、同期率の値、6...
#define FIC_Maxmum 100//First Intersection Countの略 交...
#define SIC_Maxmum 110//Second Intersection Count
#define TIC_Maxmum 120//Third Intersection Count
#define NIC_Maxmum 90//Nothing Intersection Count Nothin...
#define LIC_Maxmum 120//Last Intersection Count
#define Boundary_Threshold 54//基準となる、Thresholdの値...
#define Final_Curve_Time 600//最後のカーブでボールを離す...
#define First_Limitation 6
int Second_Limitation = 20;
#define Third_Limitation 20
#define Forth_Limitation 4
Limiationの意味は、交差点を曲がってからは、しばらく交差点...
#define After_Second_Recover_Time 4//名の通り、二つ目に...
#define Finish_Time 30 //最後のカープで、交差点判定しな...
#define PlayTone_Time 1//応援に対して、1秒間音を返す。
int IC = 0;//Intersection Counter 交差点判定のためのカウ...
bool Finish = false;//最後で、この値がtrueになると、whil...
int RF = 1;//Reverse Function//ライントレースの方向を反...
long t0 = 0;
long t1 = 0;
long t2 = 0;
long t3 = 0;
long t4 = 0;
long t5 = 0;
long t6 = 0;
ここで、タイムマー設定しておかないと、whileの中で、宣言し...
sub CatchAndStart(){//start CatchAndStart
OnRev(Use_Arm,30);Wait(800);Off(Use_Arm);
Sync_Trace(0)Wait(1000);
}//end CatchAndStart
ボールをキャッチするようの動作
sub Bluetooth_Start(){// start Bluetooth_Start
int msg = 0;
while(msg != 1)
{//start Bluetooth while
ReceiveRemoteNumber(MAILBOX1,true,msg);
if(SENSOR_1 >= Sound_Start){ msg =1; }
if(msg == 1)
{
t0 = CurrentTick();
DoI();ReI();MiI();
CatchAndStart();
while((CurrentTick()-t0)/1000<=3)
{
SendResponseNumber(MAILBOX1,2);
}
}
}//end Bluetooth while
}//end Blutooth_Start
相方のマシーンから、信号が送られてきたら、スタートし、こ...
相方のマシーンがC地点へと向かう。ボールをつかみ、全身して...
によるスタートも可能となっている(本番では使用しなかった)。
sub Line_Trace() {//start sub
if(SENSOR_3 < Boundary_Threshold-10){ Sync_Trace(RF*(...
else if(SENSOR_3 < Boundary_Threshold-9){ Sync_Trace(...
else if(SENSOR_3 < Boundary_Threshold-8){ Sync_Trace(...
else if(SENSOR_3 < Boundary_Threshold-7){ Sync_Trace(R...
else if(SENSOR_3 < Boundary_Threshold-6){ Sync_Trace(R...
else if(SENSOR_3 < Boundary_Threshold-5){ Sync_Trace(...
else if(SENSOR_3 < Boundary_Threshold-4){ Sync_Trace(...
else if(SENSOR_3 < Boundary_Threshold-3){ Sync_Trace(...
else if(SENSOR_3 < Boundary_Threshold-2){ Sync_Trace(RF...
else if(SENSOR_3 < Boundary_Threshold-1){ Sync_Trace(...
else if(SENSOR_3 < Boundary_Threshold){ Sync_Trace(0)...
else if(SENSOR_3 < Boundary_Threshold+1){ Sync_Trace(...
else if(SENSOR_3 < Boundary_Threshold+2){ Sync_Trace(...
else if(SENSOR_3 < Boundary_Threshold+3){ Sync_Trace(...
else if(SENSOR_3 < Boundary_Threshold+4){ Sync_Trace(...
else if(SENSOR_3 < Boundary_Threshold+5){ Sync_Trace(R...
else if(SENSOR_3 < Boundary_Threshold+6){ Sync_Trace(...
else if(SENSOR_3 < Boundary_Threshold+7){ Sync_Trace(...
else if(SENSOR_3 < Boundary_Threshold+8){ Sync_Trace(...
else if(SENSOR_3 < Boundary_Threshold+9){ Sync_Trace(R...
else if(SENSOR_3 < Boundary_Threshold+10){ Sync_Trace(...
else { Sync_Trace(RF...
Wait(DetectTime);
TextOut(0,LCD_LINE1,"SESOR_3");
NumOut(80,LCD_LINE1,SENSOR_3);
TextOut(0,LCD_LINE2,"Passed Time");
NumOut(80,LCD_LINE2,(CurrentTick()-t0)/1000);
TextOut(0,LCD_LINE4,"Motor_A");
NumOut(80,LCD_LINE4,MotorTachoCount(OUT_A));
}//end sub
このプログラムが一番多く使用されるもので、このプログラム...
前半の部分は基準となるThresholdの値から、+-の方向に1ずつ...
また、パワー調整はその値に対応するように、同じように勾配...
また、RF(Reverse Function)をこの位置に挟むことでライント...
後半は、ディスプレイにThresholdの検知値、スタートしてから...
sub FIC_Movement(){//start FIC
DoI();
Sync_Trace(-100);Wait(1000);
Sync_Trace(0);Wait(700);
IC = 0;
}//end FIC
一番目の交差点での動き、ここから交差点判定での動きの定義...
それぞれ異なる音が鳴るように設定してある。
sub SIC_Movement(){//start SIC
SoI();
Sync_Trace(-100);Wait(900);
Sync_Trace(0);Wait(700);
Sync_Trace(100);Wait(800);
OnRevSync(Use_Motor,Trace_Power,0);Wait(0);
IC = 0;
}//end SIC
二番目の交差点での動き
sub TIC_Movement(){//start TIC
RaI();
Sync_Trace(100);Wait(600);
Sync_Trace(0);Wait(700);
IC = 0;
}//end TIC
三番目の交差点での動き
sub NIC_Movement(){//start NIC
DoXI();
Sync_Trace(0);Wait(1300);
IC = 0;
}//end NIC
最後のS字カーブでの動き、トレースを反転させる
sub Finish_Movement(){//start Finish_Movement
RaI();
if(SENSOR_1<100){ Sync_Trace(-100);Wait(Final_Curve_T...
Trace_Power =30;
Finish = true;
Off(Use_Motor);Wait(1000);
OnFwd(Use_Arm,30);Wait(1000);Off(Use_Arm);
OnRevSync(Use_Motor,Trace_Power,0);Wait(800);
long t5 =CurrentTick();
while((CurrentTick()-t5)/1000 <= 2){ SendResponseNu...
OnRevSync(Use_Motor,Trace_Power,0);Wait(2200);
Trace_Power = 50;
OnRevSync(Use_Motor,Trace_Power,100);Wait(1800);Off(Use_...
OnRevSync(Use_Motor,Trace_Power,0);Wait(1200);
}//end Finish_Movement
最後の動き。アームを開いた後にBluetooth通信によって相手側...
後半はマップから離れるための動き。
sub Random_Reaction_PlaySound(){//start Random_Reaction_...
int RandomX = Random(3);
if(SENSOR_1 >=100){//start if
if(RandomX == 1){ PlaySound(SOUND_UP); }
if(RandomX == 2){ PlaySound(SOUND_FAST_UP); }
if(RandomX == 3){ PlaySound(SOUND_DOUBLE_BEEP); }
}//end if
}//end Random_Reaction_PlaySound
この部分は余興の部分で、実際の声援に対して、ロボットが反...
ランダムで3つのうちのどれかの音が反応に使用されるようにな...
task main(){//start task main
SetSensorSound(S1);
SetSensorLight(S3);
t0 = CurrentTick();
while(Finish == false)//最後の動きの部分でFinishがtrue...
{//start ZeroWhile
Bluetooth_Start();
t1 = CurrentTick();
while(IC<=FIC_Maxmum)
{//start RaWhile
Line_Trace();
if((CurrentTick()-t1)/1000<=First_Limitation){ ...
TextOut(0,LCD_LINE3,"First_IC");
NumOut(80,LCD_LINE3,IC);
Random_Reaction_PlaySound();
}//end RaWhile
FIC_Movement();
ここから、交差点判定ごとに部分分けしてあり把握しやすいよ...
ディスプレイに交差点判定に使われる値を表示して、実際調整...
時間の差を1000で割っているのは、人間が秒数として把握しや...
(そこまで細かい時間は実際には不要なので)&br;
なお、カッコが終わるごとにstartとendを用いることでどこま...
t2 = CurrentTick();
while(IC<=SIC_Maxmum)
{//start ShuWhile
Line_Trace();
if((CurrentTick()-t2)/1000<=Second_Limitation){ ...
TextOut(0,LCD_LINE3,"Second_IC");
NumOut(80,LCD_LINE3,IC);
Random_Reaction_PlaySound();
}//end ShuWhile
SIC_Movement();
二つ目の交差点までの動き、Second_Limitationの値は高めに設...
カーブが円いので交差点判定をしてしまうことがよくあったた...
t6 =CurrentTick();
while(IC<=TIC_Maxmum&&(CurrentTick()-t6)/1000 <= Afte...
{//start GYAWhile
RF = -1;
Line_Trace();
TextOut(0,LCD_LINE3,"Third_IC");
NumOut(80,LCD_LINE3,IC);
Random_Reaction_PlaySound();
}//end GYAWhile
TIC_Movement();
三つ目の交差点までの動きだが、少し短すぎるという理由でか...
だったので、時間制御でもしも判定しなくても、同じように交...
t3 = CurrentTick();
while(IC<=NIC_Maxmum)
{//start SHOWhile
RF = -1;
Line_Trace();
if((CurrentTick()-t3)/1000 <= Third_Limitation){ ...
TextOut(0,LCD_LINE3,"Not_IC");
NumOut(80,LCD_LINE3,IC);
Random_Reaction_PlaySound();
}//end SHOWhile
NIC_Movement();
S字カープまでの動き。ロボコン中に指摘があった通りここで、...
アドバンテージがあるとすれば、道が狭くなっている部分を通...
別の道に進む危険を減らせるということがある。
t4 =CurrentTick();
while(IC<=LIC_Maxmum&&(CurrentTick()-t4)/1000<=Finish...
{//start Finishwhile
RF = 1;
Trace_Power = 25;
Standard_Sync_Ratio = 70;
Line_Trace();
if((CurrentTick()-t4)/1000<=Forth_Limitation){ IC ...
Random_Reaction_PlaySound();
}//end Finishwhile
Finish_Movement();
最後の動き。実は交差点で判定をせずにフリーズするという現...
時間制御で保険をかけている。
}//end ZeroWhile
}//end task main
*苦労したところ [#da3830ee]
プログラム面では交差点判定が何度も失敗してしまい、その対...
数値を見えるようにして、把握しやすいようになど、とにかく...
かなり対策したのにも関わらず、実際、本番でも交差点判定を...
また、task main内では時系列にそうように順番にプログラムを...
を走らせたいときに、すぐにコメント文にできるようにした。&...
全体的には、とにかく今回は「どれだけ、修正する速度」を上...
&br;
以下は走行中のロボット
#ref(Siu.png);
#ref(La.png);
#ref(Be.png);
*まとめ [#e36c3927]
まず、始めに言いたいことそれはロボットを触り試行錯誤をし...
初めからうまくいく人など存在しない。ただ、根気を持ってそ...
それさえできれば、ロボットにかぎらずどんなことでも、ゆっ...
ただ、プログラムの場合は間違っているということが非常にハ...
生活の中では完璧に間違っているということを主張することが...
このように、明らかな間違いを提示されて、それを修正すると...
最後にですが、信州大に入ってまさか、ロボットにここまで深...
終了行:
[[2015a/Member]]
#contents
*初めに [#f183044f]
私はグループの中で、A-Bまでのコースの役割を背負いました。
今回は始めに言いますが、結局成功しませんでした。だけれど...
一方でタイム処理のほうはまだそれに比べればましだという程...
#ref(new_2015-07w-16 23.jpg);
*ロボットの構造 [#i60cbf08]
アームを前面に取り付けて、固定に、本体との接続を利用した。
光センサーはTraceの感覚がちょうどよくなるように、アームと...
また、アームには、歯車を使用して、アームが前面に取り付け...
重心が、前半部分に偏り過ぎていたため、本体の後ろ側に固定...
しかしながら、アームの部分が少し重すぎるためか、少し圧力...
そのほか、始めは、前タイヤと、アームとがある境界を超える...
#ref(3.jpg);
*プログラムの内容 [#m7f8202f]
#define Do 523
#define Re 587
#define Mi 659
#define Fa 698
#define So 784
#define Ra 880
#define Si 988
#define DoX 1047
#define SSS 50
#define AAA 500
#define DoI() PlayTone(Do,SSS);Wait(AAA);
#define ReI() PlayTone(Re,SSS);Wait(AAA);
#define MiI() PlayTone(Mi,SSS);Wait(AAA);
#define FaI() PlayTone(Fa,SSS);Wait(AAA);
#define SoI() PlayTone(So,SSS);Wait(AAA);
#define RaI() PlayTone(Ra,SSS);Wait(AAA);
#define SiI() PlayTone(Si,SSS);Wait(AAA);
#define DoXI() PlayTone(DoX,SSS);Wait(AAA);
#define MTT 300
#define STT 100
#define UTT 300
#define MT 150
#define QTT 600
#define Particular 500
上記のマクロ群は、Trace中にマシンが刻むリズム、または、ゴ...
#define GPT CurrentTick() //Get the Present Time の略
#define Check 1 //光センサーの検知時間
#define Catches RotateMotor(OUT_C,15,80);Off(OUT_C); //...
#define Break Wait(1000); //小休止
#define Threshold 55 //黒レベル
#define GoFor OnFwd(OUT_AB,40);Wait(500);Off(OUT_AB); //...
#define goal RotateMotor(OUT_C,15,-80);Off(OUT_C);OnFwd(...
//ゴール時に、アームを開き、シュートする
sub RandomI(){
int RandomBox = Random(8);
if(RandomBox == 1){ DoI()};
if(RandomBox == 2){ ReI()};
if(RandomBox == 3){ MiI()};
if(RandomBox == 4){ FaI()};
if(RandomBox == 5){ SoI()};
if(RandomBox == 6){ RaI()};
if(RandomBox == 7){ SiI()};
if(RandomBox == 8){ DoXI()};
}
八音階がTrace中の検知ごとに、ランダムになるように、サブル...
task FlagSong(){
while(true)
{
PlayTone(523,STT);Wait(MTT);
PlayTone(587,STT);Wait(MTT);
PlayTone(659,STT);Wait(MTT);
PlayTone(698,STT);Wait(MTT);
PlayTone(659,STT);Wait(MTT);
PlayTone(587,STT);Wait(MTT);
PlayTone(523,50);Wait(MTT);
Wait(300);
PlayTone(659,50);Wait(MTT);
PlayTone(698,50);Wait(MTT);
PlayTone(784,50);Wait(MTT);
PlayTone(880,50);Wait(MTT);
PlayTone(784,50);Wait(MTT);
PlayTone(698,50);Wait(MTT);
PlayTone(659,50);Wait(MTT);
Wait(300);
PlayTone(523,50);Wait(QTT);
PlayTone(523,50);Wait(QTT);
PlayTone(523,50);Wait(QTT);
PlayTone(523,50);Wait(QTT);
PlayTone(523,50);Wait(MT);
PlayTone(523,50);Wait(MT);
PlayTone(587,50);Wait(MT);
PlayTone(587,50);Wait(MT);
PlayTone(659,50);Wait(MT);
PlayTone(659,50);Wait(MT);
PlayTone(698,50);Wait(MT);
PlayTone(698,50);Wait(MT);
PlayTone(659,50);Wait(UTT);
PlayTone(587,50);Wait(UTT);
PlayTone(523,50);Wait(UTT);
Wait(500);
}
}
「かえるのうた」の楽曲である。
task main (){
SetSensorLight(S3); //センサーをセット
long t0 = GPT; //現在時刻を習得
while(GPT-t0 < 6000) //6秒よりも下は、以下の動き
{
OnFwdSync(OUT_AB,60,(SENSOR_3-Threshold)*23...
この関数のみでTraceが可能なのは、(SENSOR_30-Threshold)の...
RandomI(); //ランダムに音を鳴らす。
}
OnFwd(OUT_B,40);Wait(500);Off(OUT_B);
Break
GoFor
Catches
一つ目の交差点に差し掛かったところで、Traceを中断し、前進...
while(GPT-t0 > 6000 && GPT-t0 < 24000)
{
OnFwdSync(OUT_AB,40,(SENSOR_3-Threshold)*23/10);
RandomI();
}
23/10の値はTresholdとSENSOR_3の値が+-のどちらにもなるので...
再び円形内のLINEを音を鳴らしながら、Traceする。
OnFwd(OUT_B,40);Wait(500);Off(OUT_B);
24秒経過後に、第二交差点を乗り越える。
while(GPT-t0 > 24000 && GPT-t0 < 28000)
{
OnFwdSync(OUT_AB,40,(SENSOR_3-Threshold)*23/10);
RandomI();
}
この間は、このプログラムのみで十分で、しっかりと、直角の...
到達する。
start FlagSong;
goal;
Float(OUT_AB);
Wait(12000); //かえるのうた二曲分の長さ
stop FlagSong;
}
ゴールへの到着とともに、「かえるのうた」を演奏し、勢いの...
#ref(www.jpg);
*苦労話 [#afcd3b13]
何度も、何度も、何度も、ロボットを作り替えた。
はじめのロボットは、タイヤがバギーのような形をしたものに...
しかし、このロボットは曲がるときに、前タイヤが、変な角度...
次に、つくったロボットはとても、背が高く、光センサーをつ...
*まとめ [#xcc14554]
今回からはBGMの領域まで踏み込んだので、どうせならと、生物...
*ロボットコンテスト [#i8d4de43]
ロボットコンテストのページがなかったのでこちらに書かせて...
課題2の時点では、Thresholdの値から、黒が連続的に続いて、...
一周目のロボコンのときは、準備が足らず、うまくいかなかっ...
*ロボットの構造 [#h7b8237d]
#ref(Gia.png);
#ref(Gu.png);
#ref(pia.png);
上の写真は実際にコースを走っているマシンである。&br;&br;
少し懲りすぎてしまい、本来の目的の「どれだれ速くゴールで...
後ろのタイヤの部分は、タイヤではなくボールで代用した。&br;
なぜなら、タイヤだと大きな溝、急な方向転換にはついていけ...
アームは歯車を使い直接ボールをつかめるようにした。基本的...
*プログラムの説明 [#m8457fcd]
#define Do 523
#define Re 587
#define Mi 659
#define Fa 698
#define So 784
#define Ra 880
#define Si 988
#define DoX 1047
#define SSS 50
#define AAA 500
#define DoI() PlayTone(Do,SSS);Wait(AAA);
#define ReI() PlayTone(Re,SSS);Wait(AAA);
#define MiI() PlayTone(Mi,SSS);Wait(AAA);
#define FaI() PlayTone(Fa,SSS);Wait(AAA);
#define SoI() PlayTone(So,SSS);Wait(AAA);
#define RaI() PlayTone(Ra,SSS);Wait(AAA);
#define SiI() PlayTone(Si,SSS);Wait(AAA);
#define DoXI() PlayTone(DoX,SSS);Wait(AAA);
ドレミファソラシドの8音階を、PlayToneで鳴らすためのマクロ...
#define CONN 1//Bluetoothのコネクション番号
#define Signal_One 1//受け渡しの番号
#define Use_Motor OUT_AB//瞬時に、モータのポート番号を変...
#define Use_Arm OUT_C//瞬時に、モータのポート番号を変更...
int Trace_Power = 30;//intで設定しておくことで、いつでも...
#define Sync_Trace(int Sync_Ratio) OnFwdSync(Use_Motor,T...
//OnFwdSyncを用いて、その同期率をThresholdの値によって変...
#define DetectTime 1//光センサーの検知時間
int Standard_Sync_Ratio = 60;//基準となる、同期率の値、6...
#define FIC_Maxmum 100//First Intersection Countの略 交...
#define SIC_Maxmum 110//Second Intersection Count
#define TIC_Maxmum 120//Third Intersection Count
#define NIC_Maxmum 90//Nothing Intersection Count Nothin...
#define LIC_Maxmum 120//Last Intersection Count
#define Boundary_Threshold 54//基準となる、Thresholdの値...
#define Final_Curve_Time 600//最後のカーブでボールを離す...
#define First_Limitation 6
int Second_Limitation = 20;
#define Third_Limitation 20
#define Forth_Limitation 4
Limiationの意味は、交差点を曲がってからは、しばらく交差点...
#define After_Second_Recover_Time 4//名の通り、二つ目に...
#define Finish_Time 30 //最後のカープで、交差点判定しな...
#define PlayTone_Time 1//応援に対して、1秒間音を返す。
int IC = 0;//Intersection Counter 交差点判定のためのカウ...
bool Finish = false;//最後で、この値がtrueになると、whil...
int RF = 1;//Reverse Function//ライントレースの方向を反...
long t0 = 0;
long t1 = 0;
long t2 = 0;
long t3 = 0;
long t4 = 0;
long t5 = 0;
long t6 = 0;
ここで、タイムマー設定しておかないと、whileの中で、宣言し...
sub CatchAndStart(){//start CatchAndStart
OnRev(Use_Arm,30);Wait(800);Off(Use_Arm);
Sync_Trace(0)Wait(1000);
}//end CatchAndStart
ボールをキャッチするようの動作
sub Bluetooth_Start(){// start Bluetooth_Start
int msg = 0;
while(msg != 1)
{//start Bluetooth while
ReceiveRemoteNumber(MAILBOX1,true,msg);
if(SENSOR_1 >= Sound_Start){ msg =1; }
if(msg == 1)
{
t0 = CurrentTick();
DoI();ReI();MiI();
CatchAndStart();
while((CurrentTick()-t0)/1000<=3)
{
SendResponseNumber(MAILBOX1,2);
}
}
}//end Bluetooth while
}//end Blutooth_Start
相方のマシーンから、信号が送られてきたら、スタートし、こ...
相方のマシーンがC地点へと向かう。ボールをつかみ、全身して...
によるスタートも可能となっている(本番では使用しなかった)。
sub Line_Trace() {//start sub
if(SENSOR_3 < Boundary_Threshold-10){ Sync_Trace(RF*(...
else if(SENSOR_3 < Boundary_Threshold-9){ Sync_Trace(...
else if(SENSOR_3 < Boundary_Threshold-8){ Sync_Trace(...
else if(SENSOR_3 < Boundary_Threshold-7){ Sync_Trace(R...
else if(SENSOR_3 < Boundary_Threshold-6){ Sync_Trace(R...
else if(SENSOR_3 < Boundary_Threshold-5){ Sync_Trace(...
else if(SENSOR_3 < Boundary_Threshold-4){ Sync_Trace(...
else if(SENSOR_3 < Boundary_Threshold-3){ Sync_Trace(...
else if(SENSOR_3 < Boundary_Threshold-2){ Sync_Trace(RF...
else if(SENSOR_3 < Boundary_Threshold-1){ Sync_Trace(...
else if(SENSOR_3 < Boundary_Threshold){ Sync_Trace(0)...
else if(SENSOR_3 < Boundary_Threshold+1){ Sync_Trace(...
else if(SENSOR_3 < Boundary_Threshold+2){ Sync_Trace(...
else if(SENSOR_3 < Boundary_Threshold+3){ Sync_Trace(...
else if(SENSOR_3 < Boundary_Threshold+4){ Sync_Trace(...
else if(SENSOR_3 < Boundary_Threshold+5){ Sync_Trace(R...
else if(SENSOR_3 < Boundary_Threshold+6){ Sync_Trace(...
else if(SENSOR_3 < Boundary_Threshold+7){ Sync_Trace(...
else if(SENSOR_3 < Boundary_Threshold+8){ Sync_Trace(...
else if(SENSOR_3 < Boundary_Threshold+9){ Sync_Trace(R...
else if(SENSOR_3 < Boundary_Threshold+10){ Sync_Trace(...
else { Sync_Trace(RF...
Wait(DetectTime);
TextOut(0,LCD_LINE1,"SESOR_3");
NumOut(80,LCD_LINE1,SENSOR_3);
TextOut(0,LCD_LINE2,"Passed Time");
NumOut(80,LCD_LINE2,(CurrentTick()-t0)/1000);
TextOut(0,LCD_LINE4,"Motor_A");
NumOut(80,LCD_LINE4,MotorTachoCount(OUT_A));
}//end sub
このプログラムが一番多く使用されるもので、このプログラム...
前半の部分は基準となるThresholdの値から、+-の方向に1ずつ...
また、パワー調整はその値に対応するように、同じように勾配...
また、RF(Reverse Function)をこの位置に挟むことでライント...
後半は、ディスプレイにThresholdの検知値、スタートしてから...
sub FIC_Movement(){//start FIC
DoI();
Sync_Trace(-100);Wait(1000);
Sync_Trace(0);Wait(700);
IC = 0;
}//end FIC
一番目の交差点での動き、ここから交差点判定での動きの定義...
それぞれ異なる音が鳴るように設定してある。
sub SIC_Movement(){//start SIC
SoI();
Sync_Trace(-100);Wait(900);
Sync_Trace(0);Wait(700);
Sync_Trace(100);Wait(800);
OnRevSync(Use_Motor,Trace_Power,0);Wait(0);
IC = 0;
}//end SIC
二番目の交差点での動き
sub TIC_Movement(){//start TIC
RaI();
Sync_Trace(100);Wait(600);
Sync_Trace(0);Wait(700);
IC = 0;
}//end TIC
三番目の交差点での動き
sub NIC_Movement(){//start NIC
DoXI();
Sync_Trace(0);Wait(1300);
IC = 0;
}//end NIC
最後のS字カーブでの動き、トレースを反転させる
sub Finish_Movement(){//start Finish_Movement
RaI();
if(SENSOR_1<100){ Sync_Trace(-100);Wait(Final_Curve_T...
Trace_Power =30;
Finish = true;
Off(Use_Motor);Wait(1000);
OnFwd(Use_Arm,30);Wait(1000);Off(Use_Arm);
OnRevSync(Use_Motor,Trace_Power,0);Wait(800);
long t5 =CurrentTick();
while((CurrentTick()-t5)/1000 <= 2){ SendResponseNu...
OnRevSync(Use_Motor,Trace_Power,0);Wait(2200);
Trace_Power = 50;
OnRevSync(Use_Motor,Trace_Power,100);Wait(1800);Off(Use_...
OnRevSync(Use_Motor,Trace_Power,0);Wait(1200);
}//end Finish_Movement
最後の動き。アームを開いた後にBluetooth通信によって相手側...
後半はマップから離れるための動き。
sub Random_Reaction_PlaySound(){//start Random_Reaction_...
int RandomX = Random(3);
if(SENSOR_1 >=100){//start if
if(RandomX == 1){ PlaySound(SOUND_UP); }
if(RandomX == 2){ PlaySound(SOUND_FAST_UP); }
if(RandomX == 3){ PlaySound(SOUND_DOUBLE_BEEP); }
}//end if
}//end Random_Reaction_PlaySound
この部分は余興の部分で、実際の声援に対して、ロボットが反...
ランダムで3つのうちのどれかの音が反応に使用されるようにな...
task main(){//start task main
SetSensorSound(S1);
SetSensorLight(S3);
t0 = CurrentTick();
while(Finish == false)//最後の動きの部分でFinishがtrue...
{//start ZeroWhile
Bluetooth_Start();
t1 = CurrentTick();
while(IC<=FIC_Maxmum)
{//start RaWhile
Line_Trace();
if((CurrentTick()-t1)/1000<=First_Limitation){ ...
TextOut(0,LCD_LINE3,"First_IC");
NumOut(80,LCD_LINE3,IC);
Random_Reaction_PlaySound();
}//end RaWhile
FIC_Movement();
ここから、交差点判定ごとに部分分けしてあり把握しやすいよ...
ディスプレイに交差点判定に使われる値を表示して、実際調整...
時間の差を1000で割っているのは、人間が秒数として把握しや...
(そこまで細かい時間は実際には不要なので)&br;
なお、カッコが終わるごとにstartとendを用いることでどこま...
t2 = CurrentTick();
while(IC<=SIC_Maxmum)
{//start ShuWhile
Line_Trace();
if((CurrentTick()-t2)/1000<=Second_Limitation){ ...
TextOut(0,LCD_LINE3,"Second_IC");
NumOut(80,LCD_LINE3,IC);
Random_Reaction_PlaySound();
}//end ShuWhile
SIC_Movement();
二つ目の交差点までの動き、Second_Limitationの値は高めに設...
カーブが円いので交差点判定をしてしまうことがよくあったた...
t6 =CurrentTick();
while(IC<=TIC_Maxmum&&(CurrentTick()-t6)/1000 <= Afte...
{//start GYAWhile
RF = -1;
Line_Trace();
TextOut(0,LCD_LINE3,"Third_IC");
NumOut(80,LCD_LINE3,IC);
Random_Reaction_PlaySound();
}//end GYAWhile
TIC_Movement();
三つ目の交差点までの動きだが、少し短すぎるという理由でか...
だったので、時間制御でもしも判定しなくても、同じように交...
t3 = CurrentTick();
while(IC<=NIC_Maxmum)
{//start SHOWhile
RF = -1;
Line_Trace();
if((CurrentTick()-t3)/1000 <= Third_Limitation){ ...
TextOut(0,LCD_LINE3,"Not_IC");
NumOut(80,LCD_LINE3,IC);
Random_Reaction_PlaySound();
}//end SHOWhile
NIC_Movement();
S字カープまでの動き。ロボコン中に指摘があった通りここで、...
アドバンテージがあるとすれば、道が狭くなっている部分を通...
別の道に進む危険を減らせるということがある。
t4 =CurrentTick();
while(IC<=LIC_Maxmum&&(CurrentTick()-t4)/1000<=Finish...
{//start Finishwhile
RF = 1;
Trace_Power = 25;
Standard_Sync_Ratio = 70;
Line_Trace();
if((CurrentTick()-t4)/1000<=Forth_Limitation){ IC ...
Random_Reaction_PlaySound();
}//end Finishwhile
Finish_Movement();
最後の動き。実は交差点で判定をせずにフリーズするという現...
時間制御で保険をかけている。
}//end ZeroWhile
}//end task main
*苦労したところ [#da3830ee]
プログラム面では交差点判定が何度も失敗してしまい、その対...
数値を見えるようにして、把握しやすいようになど、とにかく...
かなり対策したのにも関わらず、実際、本番でも交差点判定を...
また、task main内では時系列にそうように順番にプログラムを...
を走らせたいときに、すぐにコメント文にできるようにした。&...
全体的には、とにかく今回は「どれだけ、修正する速度」を上...
&br;
以下は走行中のロボット
#ref(Siu.png);
#ref(La.png);
#ref(Be.png);
*まとめ [#e36c3927]
まず、始めに言いたいことそれはロボットを触り試行錯誤をし...
初めからうまくいく人など存在しない。ただ、根気を持ってそ...
それさえできれば、ロボットにかぎらずどんなことでも、ゆっ...
ただ、プログラムの場合は間違っているということが非常にハ...
生活の中では完璧に間違っているということを主張することが...
このように、明らかな間違いを提示されて、それを修正すると...
最後にですが、信州大に入ってまさか、ロボットにここまで深...
ページ名: