- 追加された行はこの色です。
- 削除された行はこの色です。
[[2009]]
*課題2 ライントレースロボットを作る [#qcba8fc1]
A11R タイラー/ピーチクパーチク~
#contents
**ロボット [#h779cce3]
***車体 [#p2c45fc8]
#ref(main.JPG)~
車輪は基本的にローヴァーロボットの幅をつめたもの。~
ローヴァーロボットとの最大の違いは、ギアを縦に組んだこと。~
車高を高くすることで安定感が失われるが、光センサーを仕込みやすくコンパクトな仕上がりとなった。~
前方に伸びた拡張パーツに、センサーやアームを装着する仕組み。
***タッチセンサー [#ibfeb330]
#ref(bamp1.JPG)~
説明書26pのシングルバンパーをほぼそのまま使用したところ、反応しなかった。~
そのため、テコの原理を利用して長いアームのセンサーを作成。~
#ref(bamp2.JPG)
#ref(bamp3.JPG)~
交差点上の牛乳パックをこれで感知する。~
***光センサー [#s27b9c2c]
車輪のすぐ前方に装着。センサーを真下に向けることで正確な場所感知を可能に。~
#ref(light.JPG)
***アーム [#x6cce186]
#ref(arm1JPG.JPG)~
ギアとモーターを直接繋いだアーム。牛乳パックをこれで移動させる。~
白ギアの装着により、アームに負荷がかかってもモーターに悪影響を与えない仕組み。~
しかしシンプルな構造だが脆い。車体への取り付けも不安定。~
#ref(arm2.JPG)
***キャスター [#e0833c33]
重くなる前方部分を支えるためのキャスター。~
p46のキャスターや、回転軸と固定位置を同じにしたキャスターを作ってみた。~
が、安定性の問題でうまくいかず、先輩の意見をもとに車輪でなく支え棒を作成。~
しかし、ロボット自体の重さゆえ堅牢性に欠ける。~
そんなわけでシンプルなキャスターを二つ作った。それぞれを拡張パーツの左右に装着。~
#ref(cas1.JPG)
#ref(cas2.JPG)
***調整 [#of9d5627]
#ref(bamp5.JPG)
#ref(cas3.JPG)~
タイヤが大きすぎて不安定だったので小さくした。~
そのためキャスターもゴムを取り外しコンパクト化。小回りが利くようになった。
***完成 [#x5e75ece]
#ref(comp.JPG)~
なんだかカブトムシにクワガタムシを足したような外見になった。
**コース [#td8c7c25]
***コース1 [#o04034f2]
#ref(course1.JPG)~
交差点:3~
紙の端や交差点が狭い。
***コース2 [#a6ffdafc]
#ref(course2.JPG)~
交差点:3~
コース1の改良版。~
交差点や紙の端など細かいところを改良。
**プロブラム [#ka9d6769]
***1:紙パックをもとの位置に戻したのちコースに戻って進む [#s1680104]
作成:ピーチクパーチク~
~
牛乳パックをよけて進むのはコース的に難しそうだったので、~
アームを使ってパックを退かす方向性でプログラムを組んだ。
#define gs(t) OnFwd(OUT_A+OUT_C);Wait(t);Float(OUT_A+OUT_C); //(t)だけ直進
#define gb(t) OnRev(OUT_A+OUT_C);Wait(t);Float(OUT_A+OUT_C); //(t)だけ後退
#define gs2 OnFwd(OUT_A+OUT_C); //直進
#define close OnRev(OUT_B);Wait(40);Off(OUT_B); //アームを閉じる
#define open OnFwd(OUT_B);Wait(40);Off(OUT_B); //アームを開く
#define THRESHOLD 40 //しきい値
int x = 0; //変数xを定義
task main()
{
SetSensor(SENSOR_2,SENSOR_TOUCH);
SetSensor(SENSOR_1, SENSOR_LIGHT);
SetSensor(SENSOR_3, SENSOR_LIGHT); //センサー定義
SetPower(OUT_A+OUT_C,5); //トルク調整
SetPower(OUT_A,5);
SetPower(OUT_C,5); //トルク調整
while (true) {
gs2
OnFwd(OUT_B); //常にアーム開き続ける
//ライントレースプログラム
if (SENSOR_1 < THRESHOLD) {
OnRev(OUT_A);
Wait(2);
OnFwd(OUT_A);
} else if (SENSOR_3 < THRESHOLD) {
OnRev(OUT_C);
Wait(2);
OnFwd(OUT_C);
} else if ((SENSOR_1 < THRESHOLD) && (SENSOR_3 < THRESHOLD)) {
gs(20)
x = x + 1; //xにx+1を代入
//障害物の感知
}else if (SENSOR_2 == 1) {
ClearTimer(0); //タイマーのセット
gb(110)
gs(70)
//障害物が牛乳パックだったとき
// =タイマーが5,5秒以内だったとき
} else if (( Timer(0) <= 55) && (SENSOR_2 == 1)) {
Float(OUT_A+OUT_C+OUT_B);
close //アームを閉じる
OnRev(OUT_B);
gs(120) //前進
OnFwd(OUT_C);OnRev(OUT_A); //回転
Wait(160);
Float(OUT_A+OUT_C);
Off(OUT_B);
open //アームを開く
gb(70); //後退
OnFwd(OUT_C);OnRev(OUT_A); //回転
Wait(130);
//三周したら自動的に止まる
// =交差点を7回通る (交差点を通る回数ーパックを運ぶ回数+調整値=7)
} else if ((SENSOR_1 < THRESHOLD) && (SENSOR_3 < THRESHOLD) && (x == 7)){
Float(OUT_A+OUT_C);
break; //while文を終了
}
}
}
***2:紙パックを次の交差点まで運んで行き、その交差点に紙パックを残してさらに黒い線に沿って進む [#j981cd9b]
作成:タイラー
#define THOLD 40
#define JAW_SPEED 1
#define DRIVE_SPEED 3
#define turnWait 4
int bite = 0;
int iTurnA = 0;
int iTurnC = 0;
int halfwayA = 0;
int halfwayC = 0;
int adju = 0;
int intersFakeBool1 = 0;
int intersFakeBool2 = 0;
int intersFakeBool3 = 0;
int wlCnt = 0;
void turnAround()
{
Off(OUT_A+OUT_C);
while ((iTurnA == 0)||(iTurnC == 0))
{
OnFwd(OUT_A);
OnRev(OUT_C);
Wait(10);
Off(OUT_A+OUT_C);
if (SENSOR_1 < THOLD)
{
halfwayA = 1;
}
if (SENSOR_3 < THOLD)
{
halfwayC = 1;
}
if ((halfwayA == 1)&&(halfwayC == 1))
{
if (SENSOR_1 > THOLD)
{
iTurnA = 1;
}
else
{
iTurnA = 0;
}
if (SENSOR_3 > THOLD)
{
iTurnC = 1;
}
else
{
iTurnC = 0;
}
}
}
OnFwd(OUT_A);
OnRev(OUT_C);
Wait(8);
Off(OUT_A+OUT_C);
iTurnA = 0;
iTurnC = 0;
halfwayA = 0;
halfwayC = 0;
}
//End turnAround()
void adjust(int backOrFwd)
{//If foward backOrFwd = 0: if backward backOrFwd = 1
if((SENSOR_1 < THOLD) && (SENSOR_3 < THOLD))//=============================
{//Drive Straight if you meet an intersection.
if(backOrFwd == 0)
{
Float(OUT_A+OUT_C);
OnFwd(OUT_A+OUT_C);
Wait(turnWait);
Float(OUT_A+OUT_C);
}
else if(backOrFwd == 1)
{
Float(OUT_A+OUT_C);
OnRev(OUT_A+OUT_C);
Wait(turnWait+5);
Float(OUT_A+OUT_C);
}
}
else if(SENSOR_1 < THOLD)//================================================
{
//Right sensor tripped turn left
if(backOrFwd == 0)
{
Off(OUT_A+OUT_C);
OnFwd(OUT_C);
Wait(turnWait);
Off(OUT_C);
Wait(2);
}
else if(backOrFwd == 1)
{
//Right sensor tripped turn left
//PlaySound(0);
Off(OUT_A+OUT_C);
OnFwd(OUT_A);
OnRev(OUT_C);
Wait(5);
Off(OUT_A+OUT_C);
OnFwd(OUT_A+OUT_C);
Wait(5);
Off(OUT_A+OUT_C);
}
}
else if(SENSOR_3 < THOLD)//==============================================
{
if(backOrFwd == 0)
{
//Left sensor tripped turn right
Off(OUT_A+OUT_C);
OnFwd(OUT_A);
Wait(turnWait);
Off(OUT_A);
Wait(2);
}
else if(backOrFwd == 1)
{
//Left sensor tripped turn right
//PlaySound(0);
Off(OUT_A+OUT_C);
OnRev(OUT_A);
OnFwd(OUT_C);
Wait(5);
Off(OUT_A+OUT_C);
OnFwd(OUT_A+OUT_C);
Wait(5);
Off(OUT_A+OUT_C);
}
}
else
{
if(backOrFwd == 0)
{
//PlaySound(0);
OnFwd(OUT_A+OUT_C);
Wait(5);
Float(OUT_A+OUT_C);
}
else if(backOrFwd == 1)
{
//PlaySound(0);
OnRev(OUT_A+OUT_C);
Wait(5);
Float(OUT_A+OUT_C);
}
}
}
//=============================================================================
//=============================================================================
task main()
{
SetSensor(SENSOR_1,SENSOR_LIGHT); //Right
SetSensor(SENSOR_2,SENSOR_TOUCH);//Touch Sensor
SetSensor(SENSOR_3,SENSOR_LIGHT);//Left
SetPower(OUT_A,DRIVE_SPEED);
SetPower(OUT_B,DRIVE_SPEED);
SetPower(OUT_C,DRIVE_SPEED);
adju = 0;
while(true)
{
if (SENSOR_2 == 1 || bite == 1)
{
if(bite == 0)
{//If first touch milk carton
//Stop and bite,
Off(OUT_A+OUT_C);
Wait(40);
OnFwd(OUT_B);
bite = 1;//Let program know bite has occured
}
else if(bite == 1)
{//Run Normally plus keep biting
OnFwd(OUT_B);
adjust(adju);
//IF both sensors
if(SENSOR_1 < THOLD && SENSOR_3 < THOLD && intersFakeBool2 == 1)
{
PlaySound(4);
//OnFwd(OUT_A+OUT_C);
//Wait(5);
//Off(OUT_A+OUT_C);
while(wlCnt < 25)
{
adjust(adju);
wlCnt = wlCnt + 1;
}
wlCnt = 0;
turnAround();
OnRev(OUT_B);
Wait(300);
while(wlCnt < 5)
{
adjust(1);
}
wlCnt = 0;
//OnRev(OUT_A+OUT_C);
//Wait(30);
turnAround();
OnRev(OUT_B);
intersFakeBool2 = 0;
bite = 0;
}
else if(SENSOR_1 < THOLD && SENSOR_3 < THOLD)
{
intersFakeBool1 = 1;
PlaySound(3);
while(wlCnt < 15)
{
adjust(adju);
wlCnt = wlCnt + 1;
}
wlCnt = 0;
}
else if(intersFakeBool1 == 1)
{
PlaySound(1);
intersFakeBool2 = 1;
}
}
}
else
{ //Run Normally
adjust(adju);
}
}
}
**コメント [#w23da78b]
#comment