- 追加された行はこの色です。
- 削除された行はこの色です。
[[2014b/Member]]
目次(作成途中)
目次
#contents
*課題2の内容 [#y92e66c5]
黒い線で作成したコースに沿って動くロボットを製作する。
ただし交差点では次のような動きをさせる。
一人目
一回目に交差点にさしかかったときは直進~
二回目は左折~
三回目は直進~
四回目は右折~
五回目は右折 → ゴールへ~
#br
二人目~
一回目に交差点にさしかかったときは左折~
二回目は右折~
三回目は左折~
四回目は直進~
五回目は直進 → ゴールへ~
#br
以下を参照
[[課題2:http://yakushi.shinshu-u.ac.jp/robotics/?2014b%2FMission2]]
#br
自分は二人目の動作をさせた。
*ロボット本体 [#d49c5481]
最初の冊子にのっていたライントレース用のロボットは、カーブでセンサーが黒線から外れてしまったので、光センサーを本体からなるべく近くに設置しなおした。~
これによってセンサーが外れることはなくなった。
*プログラム [#v47f2d49]
基本的には冊子に乗っていたライントレースのプログラムを利用した。
**使用したマクロ [#p70c0e10]
***しきい値と各スピード [#bbf908d2]
#define THRESHOLD 45 //センサーのしきい値
#define SPEED_H 50 //前進するときのモーターのスピード
#define SPEED_L 25 //曲がるときのモーターのスピード
***ライントレース [#hb24930a]
#define OnRL(speedR,speedL) OnFwd(OUT_B,speedR);OnFwd(OUT_C,speedL);
前進
#define go_forward OnRL(SPEED_H,SPEED_H);
左に曲がる(両輪)
#define turn_left1 OnRL(SPEED_L,-SPEED_L);
左に曲がる(片輪)
#define turn_left0 OnRL(SPEED_L,0);
右に曲がる(片輪)
#define turn_right0 OnRL(0,SPEED_L);
右に曲がる(両輪)
#define turn_right1 OnRL(-SPEED_L,SPEED_L);
***交差点での動き [#q51ab62c]
#define STEP 1
交差点のしきい値
#define nMAX 150
1秒止まる
#define short_break Off(OUT_BC);Wait(1000);
交差点を渡る時間
#define CROSS_TIME 200
交差点を渡る
#define closs_line OnRL(SPEED_L,SPEED_L);Wait(CROSS_TIME);short_break;
**main関数 [#m6bf1a0f]
task main()
{
SetSensorLight(S3);
int nOnline=0,closs_number=1;
int nOnline=0;
int closs_number=1; //交差点の番号(何回目の交差点か)
***ライントレースと、交差点の判断 [#ofa8e48e]
while(true){
while(nOnline < nMAX){
if(SENSOR_3 < THRESHOLD-15){ //ほぼ黒線上
turn_left1;
PlaySound(SOUND_LOW_BEEP);
PlaySound(SOUND_LOW_BEEP); //低いビープ音を鳴らす
nOnline++;
}else{
if(SENSOR_3 < THRESHOLD-7){ //黒に近い
turn_left0;
}else if(SENSOR_3 < THRESHOLD+7){ //中間
go_forward;
}else if(SENSOR_3 < THRESHOLD+15){ //白に近い
turn_right0;
}else{ //ほぼ白
}else{ //ほとんど白
turn_right1;
PlaySound(SOUND_LOW_BEEP);
PlaySound(SOUND_LOW_BEEP); //低いビープ音を鳴らす
}
nOnline=0;
}
Wait(STEP);
}
***交差点における判断 [#g414f9c3]
/*交差点であるとき*/
if(closs_number != 3){
if(closs_number != 3){ //3回目の交差点のとき、曲がる(回数はとりあえず)
short_break;
turn_right1;Wait(nMAX*STEP);
closs_line;
nOnline=0;
nOnline=0; //回数を1増やす
closs_number++;
closs_number++; //交差点の番号を1増やす
PlaySound(SOUND_CLICK);
PlaySound(SOUND_CLICK); //クリック音を鳴らす
}
else
else //そうでないとき
{
nOnline=0;
nOnline=0; //回数をリセット
closs_number++;
closs_number++; //交差点の番号を1増やす
PlaySound(SOUND_UP);
PlaySound(SOUND_UP); //「テレレー↑」という音をならす
}
}
}
*問題点 [#oab0db83]
いくつか問題が発生して、解決できたものとできなかったものがあった
**問題:交差点の判断ができない(解決済み) [#tc869301]
交差点を正しく認識できなくなった。何度も走らせて確かめたところ、毎回交差点を曲がり角と誤認して左に曲がってしまっていた。
***解決法 [#pb7429cf]
(完全に黒線上にいた回数) < (交差点の判断基準となる回数) となっているはずなので、交差点の判断基準であるnMAXの値を300から150に変更したところ、正常に判断できるようになった。
**問題:小さいカーブを曲がれない(未解決) [#h747523c]
センサーを近くしたことで大きなカーブでは問題なく黒線を追えるようになったが、小さい円の部分を曲がるときにセンサーが外れてしまった。このときのタイヤの動きを観察したところ、外側のタイヤのみが回転して曲がっていたため、内輪差でセンサーが外れてしまっていることがわかった。
***解決法 [#wb019f31]
外側のタイヤの回転だけでは曲がりきれないので、内側のタイヤを逆回転させればよいと思われる。(時間切れで実装に至らなかった。)
*考察・感想 [#v919e07e]
プログラムの問題を修正することに時間がかかってしまい、結局目的の動きをさせることはできなかった。交差点の判断はできているはずなので、あとはカーブを曲がれるようになればあとは「いまが何回目の交差点か」をかぞえて、if文を使って曲がる or 曲がらないの判断をすれば、課題は達成できると思う。~
問題に気づくのが遅れてしまい、対策を考えるのが遅くなったので、次回はもっと早めに試す機会を作るようにしたい。