#contents
**課題3について [#mb50bfa8]
詳しくは[[2017a/Mission3]]
**ロボットについて [#n7d9dc68]
はじめはアーム部分にタイヤを取り付け、そのタイヤを回転さえることによって空き缶を持ち上げるというロボットを作ったが、これだと安定して持ち上げることができないということがわかり、アームと上下する部分を別にした。ぎざぎざした長い棒とぎざぎざした円板をかみ合わせ、モーターを動かしてアームを上下させた。
**プログラミング [#ta298043]
定義
#define go_forward OnFwd(OUT_AC);//前進
#define turn_right OnFwd(OUT_A);//右折
#define turn_left OnFwd(OUT_C);//左折
#define migisenkai OnFwd(OUT_A); OnRev(OUT_C);//右旋回
#define hidarisenkai OnFwd(OUT_C); OnRev(OUT_A);//左旋回
#define power(s) SetPower(OUT_AC,s); //モーターの出力が変更可能
#define sound1 PlaySound(SOUND_UP);
#define sound2 PlaySound(SOUND_DOWN);Wait(100);
#define GO(t) OnFwd(OUT_AC); Wait(t); Off(OUT_AC);//前進時間変更可能
#define SIGNALGRAB 100
#define SIGNALBACK 200
#define back(u) OnRev(OUT_AC); Wait(u); Off(OUT_AC);//後退時間変更可能
サブルーチン
sub trace2()//交差点の判断などは課題�兇了�と同様
{
ClearTimer(0);
while (FastTimer(0)<=25){
if (SENSOR_1 > 49){//右旋回
migisenkai; ClearTimer(0);
} else if (SENSOR_1 > 44){//右折
turn_right; ClearTimer(0);
} else if (SENSOR_1 > 40){//前進
go_forward; ClearTimer(0);
} else if (SENSOR_1 > 36){//左折
turn_left; ClearTimer(0);
} else if (SENSOR_1 > 33){//左旋回
hidarisenkai;//タイマをリセットしない
}
}
Off(OUT_AC);
}
sub hidari1()
{
sound1;
go_forward;
Wait(20);
hidarisenkai;
Wait(40);
turn_left;
Wait(30);
}
sub hidari2()
{
sound2;
go_forward;
Wait(20);
hidarisenkai;
Wait(40);
turn_left;
Wait(30);
}
タスクメイン
task main()
{
SetSensor(SENSOR_1, SENSOR_LIGHT);
power(4);//モーターの出力を調整。課題�兇了�は0であったが、0の場合では出力が足りなかったので、前回の課題のときよりも出力を高めた。
ClearMessage();
GO(100);//スタート枠から前進
trace2();//A-F区間
hidari1();//Fを左折
trace2();//F-Q区間
hidari2();//Qを左方向
trace2();//Q-R区間
hidari1();//Rを左折し、Tに向かう
trace2();//R-T
GO(200);//前進してゴールの中に入る
SendMessage(SIGNALGRAB);//ゴールの位置に到着したことを知らせる。アーム側はこれを受け取ったらアームを動かして缶がゴールの領域に入るようにする
while(true){
until (Message() == SIGNALBACK);//SIGNALBACKを受信するまで待つ
back(300);//後退する
}
}
↑
アームのプログラム †
定義部分
#define grab OnFwd(OUT_C); Wait(100); Off(OUT_C);//アームで缶をつかむ
#define relese OnRev(OUT_C); Wait(100); Off(OUT_C);//アームで缶を離す
#define rift_up OnFwd(OUT_A); Wait(700); Off(OUT_A);//リフトを持ち上げる
#define rift_down1 OnRev(OUT_A); Wait(200); Off(OUT_A);//リフトを次の缶の高さまで下げる
#define rift_down2 OnRev(OUT_A); Wait(300); Off(OUT_A);//リフトを次の缶のつかむ高さまで下げる。つまりはじめの高さまで下げる
#define SIGNALGRAB 100
#define SIGNALBACK 200
#define grab2(s) OnFwd(OUT_C); Wait(s); Off(OUT_C);//缶を掴む時間変更可能
#define relese(t) OnRev(OUT_C); Wait(t); Off(OUT_C);//缶を離す時間変更可能
タスクメイン
task main()
{
SetSensor(SENSOR_1,SENSOR_TOUCH);//センサー1にタッチセンサ
ClearMessage();
int count;//変数を定義
count=0;
while (count<1){//countが1未満の時ループに入る
ClearMessage();//Messageの値を0に初期化
if (Message() == SIGNALGRAB){//SIGNALGRABを受信したらcountに1が足される。受信したらループを抜け出す。
count++;
} else count = 0;//そうでなければcountは0
}
grab2(50);//缶をゴール内にまとめるためにアームを動かす
relese(70);//大きめにアームを開いて缶を完全に離す
SendMessage(SIGNALBACK);//後退するように伝える。
**まとめ [#f33b7819]
今回の課題はとても難しかった。ロボットを作るのにかなりの時間を費やしてしまい、プログラミングを考える時間が余りとれなかった。結果、本番では思い通りの動きができなかった。残念だったが楽しんで取り組めたので良かった。