- 追加された行はこの色です。
- 削除された行はこの色です。
[[2019a/Member]]
*課題について [#hfb3148f]
**フィールド [#z296350e]
#ref(./mission3.png)
-フィールドは課題2で使用した紙を使用する。
-生協のお弁当の四角いプラ容器2つをそれぞれ円内に置き、片方に玉を2個入れる。
-残りの2個の玉は課題2と同じ位置に置く。その際、ゴムタイヤやプレートの上に置いてもよい。
-プラ容器には色をつけたり文字や記号を書いてもよい。
-プラ容器は両面テープ等でフィールドに固定してもよい。
-2枚の紙の境界にはそれぞれ幅1cm、合計2cmの黒線を描いてもよい。
**ルール [#vde59d26]
AやA'を出発して各点にあるピンポン玉をつかみ,ゴールのプラ容器に入れる.途中でうまく動かなくなった場合、1回限り再スタートすることができる.また,ロボットが、ゴールのプラ容器に触れていてはいけない.
*機体について [#k12e8145]
#ref(./3.image2.jpeg,50%)
↑制作途中の写真だが,アームの足を平行四辺形のように作り,それを倒すと上についているアームが地面まで届き,ピンポン玉をつかめるようにした.機体を課題2の時より大きくしすぎるとライントレースが上手くいかないと思い,この形にすることで全体的にコンパクトにできた.これによって,ライントレースのサブルーチンやプログラムを課題2と同じものを使えた.
#ref(./3.image3.jpeg,50%)
↑アームの中のアップ写真
#ref(./3.image1.jpeg,50%)
↑ピンポン玉を一個つかむごとにゴールまで運んでいると時間がかかるし,うまく動かない可能性も上がると考えた.そこで,アームでピンポン玉をつかみ,上にあげると右につけたピンポン玉を乗せる部分がアームの真下に,90度回ってくるようにした.そしてゴールにつくと,この機構の横につけたモーターを回し,歯車が噛み合いこの機構を支えている二本の棒の後ろの方だけが少し上あがる.この動きでピンポン玉が乗った部分が傾き,乗っていたピンポン玉がプラ容器に入るように作った.そうすることで一度に数個のピンポン玉を運べるようになった.
#ref(./e1.jpg,25%)
↑しかし最終的に
↑しかし最終的に,アーム部分が重すぎたせいで下に行ってから上にもどらなくなってしまったため,上下に動くシステムを取り除いた.
*メインプログラム [#n0123445]
int white_time=30;
int black_time=20;
#define migisenkai OnFwd(OUT_A); OnFwd(OUT_C);
#define usetsu Off(OUT_A); OnFwd(OUT_C);
#define chokushin OnRev(OUT_A); OnFwd(OUT_C);
#define sasetsu OnRev(OUT_A); Off(OUT_C);
#define hidarisenkai OnRev(OUT_A); OnRev(OUT_C);
#define koutai OnFwd(OUT_A); OnRev(OUT_C);
#define tsukamu 201
#define tomaru 202
プラ容器に入ってるピンポン玉を運ぶプログラムを書いた.~
43〜…白~
40〜43…白灰~
36〜40…灰~
33〜36…黒灰~
〜33…黒~
とした。
black_timeについて・・・黒色を判別している時間をblack_timeとして定義して,交差点の大きさや曲がり角の角度によって時間を変えた.何度も試した結果,Kなどの直角で270度の交差点で止まりたいときは30,つまり0,3秒に設定した.~
**定義 [#v1b1fa14]
int black_time=20; //黒色を判別している時間の設定
#define migisenkai OnFwd(OUT_A); OnFwd(OUT_C); //右に旋回
#define usetsu Off(OUT_A); OnFwd(OUT_C); //右折
#define chokushin OnRev(OUT_A); OnFwd(OUT_C); //直進
#define sasetsu OnRev(OUT_A); Off(OUT_C); //左折
#define hidarisenkai OnRev(OUT_A); OnRev(OUT_C); //左に旋回
#define koutai OnFwd(OUT_A); OnRev(OUT_C); //後退
**サブルーチン [#u1d996a0]
黒線の右側をライントレースするサブルーチン.
sub follow_line2()
{
SetSensor(SENSOR_2,SENSOR_LIGHT);
while(FastTimer(0)<black_time){
if(SENSOR_2<33){
migisenkai
}else if((SENSOR_2>=33)&&(SENSOR_2<36)){
usetsu ClearTimer(0);
}else if((SENSOR_2>=36)&&(SENSOR_2<40)){
chokushin ClearTimer(0);
}else if((SENSOR_2>=40)&&(SENSOR_2<43)){
sasetsu ClearTimer(0);
}else if(SENSOR_2>=43){
hidarisenkai ClearTimer(0);
while(FastTimer(0)<black_time){ //黒色を判別している時間が30より小さい間繰り返す
if(SENSOR_2<33){ //黒色の時
migisenkai //右に旋回
}else if((SENSOR_2>=33)&&(SENSOR_2<36)){ //黒灰色の時
usetsu ClearTimer(0); //右折,タイマー0にセット
}else if((SENSOR_2>=36)&&(SENSOR_2<40)){ //灰色の時
chokushin ClearTimer(0); //直進,タイマー0にセット
}else if((SENSOR_2>=40)&&(SENSOR_2<43)){ //白灰色の時
sasetsu ClearTimer(0); //左折,タイマー0にセット
}else if(SENSOR_2>=43){ //白色の時
hidarisenkai ClearTimer(0); //左に旋回,タイマー0にセット
}
}
Off(OUT_AC);
Wait(100);
ClearTimer(0);
}
**メインプログラム [#f7263b16]
task main(){
SetPower(OUT_AC,7);
SetPower(OUT_AC,7); //モーターの出力を7に設定
機体が重いのでモーターのパワーを最大の7にした.
follow_line2(); //AからKまでのライントレース
follow_line2();
follow_line2();
migisenkai Wait(75); Off(OUT_AC); Wait(100);
chokushin;
Wait(25);
Off(OUT_AC);
Wait(100);
OnRev(OUT_B);
Wait(36);
Off(OUT_B);
Wait(100);
migisenkai;
Wait(60);
Off(OUT_AC);
Wait(100);
chokushin;
Wait(240);
Off(OUT_AC);
Wait(100);
migisenkai;
Wait(75);
Off(OUT_AC);
Wait(100);
OnFwd(OUT_B);
Wait(50);
Off(OUT_B);
課題2と同様,follow_lineが一つだとなぜか動かなかったので二つ書いた.
migisenkai Wait(75); Off(OUT_AC); Wait(100); //正面をプラ容器に向ける
chokushin; Wait(25); Off(OUT_AC); Wait(100); //距離を調整
OnRev(OUT_B); Wait(36); Off(OUT_B); Wait(100); //ピンポン玉をつかむ
migisenkai; Wait(60); Off(OUT_AC); Wait(100); //機体をゴールのプラ容器に向ける
chokushin; Wait(240); Off(OUT_AC); Wait(100); //距離を調整
migisenkai; Wait(75); Off(OUT_AC); Wait(100); //機体をゴールに向ける
OnFwd(OUT_B); Wait(50); Off(OUT_B); //アームを開いてピンポン玉を放す
}
結局,時間的に一つのピンポン玉を運ぶプログラムしか書けなかった.
*反省,まとめ [#d71c5caa]
失敗の一番大きな原因は,時間が足りなかったことだと思う.ロボットを作るのに時間がかかり,動かせるかを試す時間が少なくなってしまった.最初はマスター,スレイブ両方のプログラムを書き,通信して動かすのにも成功していたが,アームが重すぎてモーターの力であげることができないとが分かり,思い切ってRIS本体を一つにし,マスター側だけでピンポン玉をつかみ,運ぶようにした.