- 追加された行はこの色です。
- 削除された行はこの色です。
目次
#contents
*課題3 [#wdc46bbe]
ピンポン玉と紙コップをそれぞれ所定の位置に運ぶ。
#ref(2017b-mission3.png)
左上のピンポン玉と中央上の紙コップをねらうことにした。
*ロボット説明 [#dea40a76]
ロボット作成を担当したので張り切って作ろうとおもった。エレベーターのように垂直にアームが動くようにして紙コップを積み上げながら持ち運ぶロボットを作る予定だった。しかしどうすればアームを垂直に持ち上げられるのか思いつかなかったのであきらめてしまった。
#ref(Image_b274090.jpg)
赤色で囲った部分はコップを持って旋回するときに紙コップが離れないように包みこむためにアームに取り付けた。黄色で囲った部分は大きい歯車が2つ並んでいるところの両隣にある青い部品のところに歯車の力を直接アームに伝える部品が必要であったが適当なものがなかったので力を伝えられる灰色の部品を使い、短くて黒い棒でアームを押し上げたり押し下げたりできるようにした。緑色で囲ったところはモーターを回しているとモーターが外れてしまうのでモーターのアーム側と本体側を黒色の部品で固定した。水色で囲ったところは課題1で1つのモーターでタイヤを動かすために考えた歯車の配置を利用した。モーターがうみだす力の向きを変えるための配置である。
#ref(Image_04040a2.jpg)
センサーはタイヤのすぐ前に設置した。アームが重くなりすぎたため後ろにRISを設置することでバランスをとった。
*プログラム [#je5439fe]
//あああああああああああああああああああああああ分けた理由書く
**アームを上下させ紙コップを上下させるRIS [#x599a4ba]
定義
#define up(t) OnRev(OUT_A);Wait(t);Off(OUT_AC); //t秒上げる
#define down(t) OnFwd(OUT_A);Wait(t);Off(OUT_AC); //t秒下げる
#define st(t) Off(OUT_AC);Wait(t); //t秒待機
メイン
task main ()
{
Wait(870); //X地点へ行く時間
up(30); //紙コップを持ち上げる
st(200); //本体が紙コップをXの中に入れるまでの時間調整
down(30); //紙コップを下ろす
}
**本体の移動と光センサーと紙コップをつかませるRIS [#v34cc71d]
定義
#define leftSENKAI OnFwd(OUT_A);OnRev(OUT_C); //左旋回
#define leftMAGARU OnFwd(OUT_A);Off(OUT_C); //左折
#define rightSENKAI OnFwd(OUT_C);OnRev(OUT_A); //右旋回
#define rightMAGARU OnFwd(OUT_C);Off(OUT_A); //右折
#define ch OnFwd(OUT_B);Wait(30);Off(OUT_B); //アームを閉じる
#define re OnRev(OUT_B);Wait(20);Off(OUT_B); //アームを開く
#define go(t) OnFwd(OUT_AC);Wait(t);Off(OUT_AC); //t秒前進
#define back(t) OnRev(OUT_AC);Wait(t);Off(OUT_AC); //t秒後退
#define cross_stop Off(OUT_AC);Wait(100); //1秒停止
#define carb 46 //閾値
ライントレース
sub r()
{
SetSensor(SENSOR_2,SENSOR_LIGHT); //端子2に光センサー
ClearTimer(0);
while(FastTimer(0)<=24) //0.24秒以内はループ 超えると交差点判定
{
if(SENSOR_2>carb+5) //センサーが閾値+5の値を超えたら左旋回
{
leftSENKAI
ClearTimer(0); //タイマーリセット
}
else if(SENSOR_2>carb+3) //センサーが閾値+3の値を超えたら左折
{
leftMAGARU
ClearTimer(0);
}
else if(SENSOR_2>carb) //センサーが閾値を超えたら直進
{
OnFwd(OUT_AC);
ClearTimer(0);
}
else if(SENSOR_2>carb-3) //センサーが閾値-3の値を超えたら右折
{
rightMAGARU
ClearTimer(0);
}
else //上記のどの条件にも当てはまらないときに右旋回
{
rightSENKAI
}
}
Off(OUT_AC);
}
メインプログラム
task main ()
{
go(30); //Aの枠から出る
r(); //A〜Bライントレース
leftSENKAI; //0.05秒間左旋回して位置調整
Wait(5);
re; //アームを開く
go(160); //マップ左上の紙コップに近づく
cross_stop; //1秒停止
ch; //アームを閉じコップをつかむ
rightSENKAI; //1.4秒間右旋回して位置調整
Wait(140);
cross_stop; //1秒停止
ch; //移動の振動で紙コップを離してしまうので再びアームを閉じる
go(90); //X地点に近づく
cross_stop; //1秒停止
re; //アームを開きX地点にコップを置く
back(100); //1秒後退して位置調整
leftSENKAI; //0.3秒左旋回して位置調整
Wait(30);
go(200); //2秒前進して位置調整
rightSENKAI; //0.4秒右旋回して障害物に当たらないようにする
Wait(40);
re; //アームを開く
go(250); //Qの上方向にある紙コップを本体で押しながらY地点に向かう
}
*感想まとめ [#b119d611]
ロボットを製作することに時間がかかりすぎてしまいプログラムが間に合わなかった。時間配分をもっと考えるべきだった。今回はプログラム以前にロボットを作ることが難しかった。