•つっちー...工学ノ人。
•しゅうた...工学ノ人。
•きみやす...繊維ノ人。
•ゆうき...教育ノ人。
このページに行ってください。 http://yakushi.shinshu-u.ac.jprobotics/?2009a%2F%A5%ED%A5%DC%A5%B3%A5%F3
今回のロボット製作にあたって一つ目の課題は真ん中のところをどうやって越えるかでした。
これにはいくつかあってキャタピラの大きいのを作って乗り越える方法や、
タイヤを工夫して大きな三角形のタイヤで移動と乗り越えることを同時にこなす機構を作る方法、
タイヤ移動を捨てて四足歩行のようにして乗り越える方法、
NQCの黄色い本体自体を階段代わりに置き、
その後は長いコードを使って壁の向こう側で
NQCの本体がない状態で動かす方法(脳ミソで階段作戦)などがありました。
どれも試作段階まで作ったのですが、いまいちで
結局一台でもう一台を運ぶ方法になりました。
そして二つ目の課題はパックをどう掴む(ロボットに乗せる)かでした。
これは横から挟んだりもう一台の反対側から押してもらうなどの方法がありましたが、
挟む時に隣のパックを落としたり、二台の連携が難しかったりで、
パックを上下に挟むことになりました。
三つめの課題は真ん中の段差を越えるときロボットを落とすので
その時の衝撃をどうするか でした。
これには橋を造って下ろし、橋もモーターを使わずに回収する機構を作り解決しました。
ここからやっとプログラム作りに入ろうとしたのですが、ここで大問題発生
『こんなプログラム複雑すぎて作れない!!』
特にライントレースを光センサー一個でやったことがなかったので
プログラムが作れず急きょロボットを最初から作り直すことに…
これがロボコンの前日の夜の出来事でした。
それでできたのが下のロボットです。
これが上に乗って壁の向こう側で作業するロボット ごつい…
↑ちなみに横に飛び出ている棒でパックを引っ掛け
ロボット自体を少しずつ回転させ前にある荷台にパックを落とすことで
パックを取ります
ゴール前まで行ったら荷台についている棒を動かして
パックを押し出してゴールにいれます
そしてこっちが運ぶ方のロボットです
進行方向から左に90°ずれた方向へ上のロボットが進みます
ちなみに写真で言うと左が前進方向で手前に上のロボットが進みます
乗っている状態です でかいですね〜
パック運搬バージョン
int sem_1; int sem_2; int sem_3; #define catch_c repeat(4{OnFwd(OUT_A);OnRev(OUT_C);Wait(10);Off(OUT_A+OUT_C);Wait(150);OnRev(OUT_A);OnFwd(OUT_C);Wait(5);Off(OUT_A+OUT_C);}OnFwd(OUT_C);OnRev(OUT_A);Wait(20); task main() { SetSensor(SENSOR_1, SENSOR_LIGHT); SetSensor(SENSOR_2, SENSOR_TOUCH); SetSensor(SENSOR_3, SENSOR_LIGHT); count=0; sem_1=1; sem_2=0; sem_3=1; while(ture) { if(sem_1==1) { if(sem_3==1) { Wait(3600);//運搬ロボが真ん中まで運んでくれるまで待機 OnFwd(OUT_A+OUT_C);Wait(300);Off(OUT_A+OUT_C);//強引に前に出て反対側に行きます until((SENSOR_1< 40 ) &&(SENSOR_3< 40))//黒の線まで下がります { OnRev(OUT_A+OUT_C); } Off(OUT_A+OUT_C);OnFwd(OUT_A+OUT_C);Wait(30); OnRev(OUT_C);OnFwd(OUT_A);Wait(30);Off(OUT_A+OUT_C); OnRev(OUT_A+OUT_C);Wait(30);//ロボットが大きいので徐々に方向転換をします。 until(SENSOR_2==1)//壁に当たるまで(壁と平行になるまで)回転します { OnRev(OUT_C);OnFwd(OUT_A); } until((SENSOR_1< 40 ) &&(SENSOR_3< 40))//緑のパックから伸びている線にたどり着くまで前進します { OnFwd(OUT_A+OUT_C); } catch_a;//パックを取ります ClearTimer(0); until((SENSOR_3< 40)||(Timer(0) >8)) { bc;a;//ラインに当たるか0.8秒たつまでゴールの方へ方向転換します }//ここはライン当たらないときのことを考えてuntilの条件を二つにしました Off(OUT_A+OUT_C); sem_1=0; sem_2=1; sem_3=0; } } while(sem_2==1)//ここからはゴールへ向かうためのライントレースです--------- ↓ { // | if(sem_3==0) { // | until(SENSOR_2==1) //タッチセンサーが反応したら { //ゴール前だと思われるのでトレースは終わりです | if ((SENSOR_1> 45 ) &&(SENSOR_3> 45)) { // | Off(OUT_A+OUT_C); OnFwd(OUT_A+OUT_C); Wait(30); // | Off(OUT_A+OUT_C); } // | else { // | if ((SENSOR_1< 45 ) &&(SENSOR_3< 45)) {OnFwd(OUT_A+OUT_C);}// | if (SENSOR_3< 45); { // | OnRev(OUT_C); } // | if (SENSOR_1< 45); { // | OnRev(OUT_A); } // | } } // ↓ } ここまでライントレースでした ----------- sem_3=1; sem_2=0; sem_1=2; OnFwd(OUT_B);Wait(30);OnRev(OUT_B);Wait(40);Off(OUT_B);sem_3=1;//モーターでパックをゴールの中に落とします } if(sem_1==2) { if(sem_3==1) { until((SENSOR_1< 40 ) &&(SENSOR_3< 40))//そのままラインに当たるまで { //下がります OnRev(OUT_A+OUT_C); } OnFwd(OUT_A+OUT_C);Wait(40);Off(OUT_A+OUT_C); OnRev(OUT_C);OnFwd(OUT_A);Wait(30);OnRev(OUT_A+OUT_C);Wait(50);//次に端の白いパックを取りにいきます until(SENSOR_3<40) { OnRev(OUT_C);OnFwd(OUT_A); } OnRev(OUT_A+OUT_C);Wait(20);Off(OUT_A+OUT_C); OnRev(OUT_C);OnFwd(OUT_A);Wait(10);Off(OUT_A+OUT_C);//ロボットを壁と平行にするため until(SENSOR_2==1); //近づけつつ、方向を変えていきます { OnRev(OUT_C);OnFwd(OUT_A);//ここで壁にくっつけます } until((SENSOR_1< 40 ) &&(SENSOR_3< 40))//このラインは { //緑のパックがあるところなので OnFwd(OUT_A+OUT_C); } OnRev(OUT_A+OUT_C);Wait(50); OnFwd(OUT_C);OnRev(OUT_A);Wait(50); OnFwd(OUT_A+OUT_C);Wait(50); OnRev(OUT_C);OnFwd(OUT_A);Wait(80); //落して OnFwd(OUT_C);OnRev(OUT_A);Wait(80); OnRev(OUT_A+OUT_C);Wait(50); OnRev(OUT_C);OnFwd(OUT_A);Wait(50); OnFwd(OUT_A+OUT_C);Wait(90); //進みます ClearTimer(0); until(((SENSOR_1< 40 ) &&(SENSOR_3< 40))||(timer(0)>10)) { OnFwd(OUT_A+OUT_C); //ここは白のパックがあるので } catch_a;//取ります OnRev(OUT_A+OUT_C);Wait(80); until((SENSOR_1< 40 ) &&(SENSOR_3< 40)) { OnRev(OUT_A+OUT_C);//ここのラインは緑のパックがあったところなので } //無視してさらに下がります OnRev(OUT_A+OUT_C);Wait(80); until((SENSOR_1< 40 ) &&(SENSOR_3< 40)) { //ここは白のゴールから伸びているラインなので OnRev(OUT_A+OUT_C); } OnRev(OUT_A+OUT_C);Wait(50); //少し下がって until(SENSOR_1<45) //方向転換 { OnFwd(OUT_C);OnRev(OUT_A); } OnFwd(OUT_A+OUT_C);Wait(50);ClearTimer(0);//ゴールへ向かうラインを探します until((SENSOR_1<45) { umtil(Timer(0)>10)//一秒前進して無かったら { OnFwd(OUT_A+OUT_C); } OnFwd(OUT_C);OnRev(OUT_A);Wait(90);//方向転換してさらに探します OnFwd(OUT_A+OUT_C); } sem_1=3; sem_2=1;//ラインがあったら変数を変えて sem_3=0;//ライントレースをしてゴールにいれます } } } } }
相変わらずSEMを使うのでプログラムが分かりにくいかもしれません ライントレースは課題2でやったので、説明を省きます ちなみにSEM_1はロボットの作業がどこまで進んだかを示す変数で SEM_2とSEM_3はライントレースを制御する変数です SEM_1が1のとき→最初からライントレースをするまで SEM_1が2のとき→一個目のパックをゴールに入れてから 二個目を取ってライントレースを始めるまで SEM_2=1 SEM_3=0のときライントレースをします
マシン運搬バージョン
#define mae OnFwd(OUT_A+OUT_C); #define usiro OnRev(OUT_A+OUT_C); #define migi OnFwd(OUT_A);OnRev(OUT_C); #define hidari OnFwd(OUT_C);OnRev(OUT_A); #define teisi Off(OUT_A+OUT_C); #define ikiti 40 task main() { SetSensor(SENSOR_1,SENSOR_LIGHT); SetSensor(SENSOR_3,SENSOR_LIGHT); ClearTimer(0); Wait(100); mae; Wait(200); teisi; Wait(100); migi; Wait(100); teisi; Wait(100); while(Timer(0)<=240) { if(SENSOR_1>ikiti) { OnFwd(OUT_C); Wait(5); Off(OUT_C); } if(SENSOR_1<ikiti) { OnFwd(OUT_A); Wait(5); Off(OUT_A); } if(SENSOR_1&&SENSOR_3<ikiti) { migi; Wait(80); teisi; } } Wait(100); hidari; Wait(120); teisi; Wait(100); mae; Wait(40); teisi; Wait(100); migi; Wait(120); teisi; }
上に乗っているロボットは光センサー2つとタッチセンサー3つを使い
豪華な仕様になっています
今回はロボットの基本方針が決まるまでかなり時間がかかってしまい
最後の詰めがほとんどできませんでした。
むしろ前日にすべて壊して、一から作ったので大変でした。
つっちーの作る機構は毎度貧弱で…
今回は強度も重要だったのでゆうきさん鍛え上げて強くしてもらいました。感謝です。
ロボコンについてアイデアを出そう!!
都合の良い日にちを教えてください