目次 #contents *課題 [#p1c5cfd9] [[課題2:http://yakushi.shinshu-u.ac.jp/robotics/?2014b%2FMission2]]参照 一人目のコースをやりました。 *ロボットの説明 [#f7f34283] サンプル通りのロボットにライントレースの模造紙の折り目で誤差が出ないよう、光センサーの両脇に写真の部品をつけ、折り目を平らにするよう工夫しました。 #ref(2014b/Member/maika/Mission2/ロボティクス入門.jpg,30%) #ref(2014b/Member/maika/Mission2/ロボティクス入門.jpg,50%) また、ロボット本体のタイヤとがなるべく近くなる位置にセンサを取り付け、センサで感知した結果と実際にロボットが進む方向に差がでないよう意識しました。 *プログラム [#ubb32950] **コースの説明 [#u828e7d9] #ref(2014b/Member/maika/Mission2/ロボティクス入門2.jpg,50%) スタート地点から、上の写真の矢印の、赤、黄緑、青、オレンジ、ピンクのように交差点を渡るようプログラムを作りました。 **定義 [#cb022f1f] #define THRESHOLD 45 //しきい値 #define SPEED_H 50 //直進時の速さ #define SPEED_L 25 //カーブする時の速さ #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); //左旋回 #define STEP 1 //1回の判断で動作させる時間 #define nMAX 150 //カーブとして判断できる黒認識回数の最大値 #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; //交差点を渡る -当初、サンプルプログラムのようにnMAXを300にしていたのですが、交差点でしっかり右左折ができなかったため、半分の150にしたところ、解決しました。 **プログラム [#y742fa4f] task main() { SetSensorLight(S3); //端子3に光センサ int nOnline=0; //続けて黒になった回数(カウンタ) int closs_number=1; //交差点に至った回数(カウンタ) -交差点を順序通り渡るため、カウンターで交差点を認識した回数を数えました。 while(true){ while(nOnline < nMAX){ if(SENSOR_3 < THRESHOLD-15){ //ほぼ黒線上の値の場合 turn_left1; 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{ //ほとんど白の値の場合 turn_right1; PlaySound(SOUND_LOW_BEEP); //低いビープ音を鳴らす } nOnline=0; } Wait(STEP); } -しきい値-15を黒線上、-7をほぼ黒線上、+7を中間値、+15を白い部分と設定しました。 -ライントレースをする際、センサが値を感知して進み方が定まる度に低いビープ音をならすことで、ロボットがどのように動くかわかりやすくしました。 /*交差点であるとき*/ if(closs_number==1){ //直進 short_break; turn_right1; Wait(nMAX*STEP); cross_line; nOnline=0; //回数を1増やす closs_number++; //交差点の番号を1増やす PlaySound(SOUND_CLICK); //クリック音を鳴らす }else if(closs_number==2){ //左折 short_break; turn_right1; Wait(nMAX*STEP); turn_left0; nOnline=0; closs_number++; PlaySound(SOUND_CLICK); }else if(closs_number==3){ //直進 short_break; turn_right1; Wait(nMAX*STEP); cross_line; nOnline=0; closs_number++; PlaySound(SOUND_CLICK); }else if(closs_number==4){ //右折 short_break; turn_right1; Wait(nMAX*STEP); turn_right0; nOnline=0; closs_number++; PlaySound(SOUND_CLICK); }else if(closs_number==5){ //右折 short_break; turn_right1; Wait(nMAX*STEP); turn_right0; nOnline=0; closs_number++; PlaySound(SOUND_CLICK); } } } -交差点では、カウンタの数に合わせて上記のコース説明の通りプログラムを作りました。 -交差点を通過する度、クリック音を鳴らし、ロボットが正確に交差点を渡ったことを確認できるようにしました。 *反省点 [#d113a78c] -交差点の認識はうまくいきましたが、普通のカーブで曲がることができませんでした。 --問題のカーブでセンサーが黒線から外れ、脱線してしまった。 --片方のタイヤだけ回していたため、曲がりきれなかった。 -カーブでしっかり曲がるために、片方のタイヤだけ回すのではなく、両方のタイヤのスピードの調整をしたり、nMAXの調整をもっとしっかり、するべきでした。 -音を鳴らすことで、ロボットがうまく動かなかった時改良がしやすくなりました。 -交差点の判断はクリアできましたが、スタート地点から交差点にたどり着くことができないという課題が多く残る結果になってしまいました。