2019a/Member 目次
自分たちは容器内のボールで点数を獲得しようとした。そのためにまず容器ごと掴み、ボールをロボット内に回収、そして移動してボールを別の容器に入れるという作戦を考えた。ロボットを動かすルートは以下のようにした。
比較的大型のロボットであるので多少カーブが苦手になるが四輪の二輪駆動の車体である。前輪の少し前にライントレースように光センサーをつけている。
まず、手前にあるアームの開いた部分で容器をつかめるようになっている。容器をつかんだままアームを持ち上げ、アームをレールにしてボールを転がし車体にボールを回収する。
ここで問題となったことはアームが重く簡単に持ち上がらないということだ。そこでギアをモーターとアームの間に挟み少ない力で重いものを動かせるように改良した。下の画像がそのギアの部分である。
最後に集めたボールを少ない手間で別の容器に移すため、ボールを回収する部分の底を斜めにすることで蓋を開けるだけで勝手に転がるようになっている。また、ボールを回収したケースの出口の高さは所定の容器の高さより高くなっているのでボールを移しやすくなっている。
マスター側にラインセンサーと車輪のためのモーター2つ、スレーブ側にアーム用のモーター3つをつけている。主にマスター側で移動を担当し、スレーブ側でアームの動作の役割分担を行っている。
このメリットとしてアーム動作と車体移動を明確に分けることができ、移動中にアームが動いてしまうといった誤作動を防止してくれる。
#define CONN 1 #define on1 1 #define on2 2 #define on3 3 #define zenshin OnFwd(OUT_BC,60); //前進 #define koushin OnFwd(OUT_BC,-60); //後進 #define migi OnFwd(OUT_B,-70);OnFwd(OUT_C,40); //右回転 #define hidari OnFwd(OUT_B,40);OnFwd(OUT_C,-70); //左回転 #define mi OnFwd(OUT_C,40);Off(OUT_B);//右に進む #define hi OnFwd(OUT_B,40);Off(OUT_C); //左に進む #define tomaru Off(OUT_BC); //ストップ long A=0;//コーナーで止まる時間を計測する変数 long B=0;//ライントレースしている時間を計測する変数
#define on1 1 #define on2 2 #define on3 3 #define tomaru Off(OUT_AB);Wait(100);//ストップ
void re_stop_corner(){ SetSensorLight(S1); while(A<400){//角のタイマーが400になると繰り返し終わり if(SENSOR_1>40){ hi;//白の時左へ A=0;//角のタイマーをリセット B=B+1;ライントレース時間追加 }else{ mi;//黒の時右へ A=A+1;//角のタイマーに1追加 B=B+1; } } tomaru;//停止 Wait(1000); B=0; }//コーナーで止まるライントレース(ラインの右側を進む)
void re_cross_line(){ SetSensorLight(S1); if(SENSOR_1>40){ hi;//白の時左へ B=B+1; }else{ mi;//黒の時右へ B=B+1; } }//コーナーを直進するライントレース(ラインの右側を進む)
task main() { SetSensorLight(S1); while(B<8000){//ライントレースをしている時間をはかるタイマーが8000未満の時 re_cross_line();//ライントレース、交差点渡る } while(B>=8000){//8000以上の時 re_stop_corner(); }//ライントレース、交差点止まる
tomaru; Wait(500); koushin; Wait(1600); mi; Wait(300); zenshin; Wait(1300); migi; Wait(1300); tomaru; Wait(100); koushin; Wait(300); tomaru; Wait(100); zenshin; Wait(300); tomaru; Wait(100);//容器をつかむ位置に移動するための動作
(アームが移動中に容器に当たらないようアームは上に上げた状態でスタートする)
SendRemoteNumber(CONN,MAILBOX1,on2);//スレーブにアームを下げる指示を出す Wait(18000);
zenshin;//容器の前まで移動 Wait(300); tomaru; Wait(100);
SendRemoteNumber(CONN,MAILBOX1,on1); //容器をつかむ、アームをあげる(ここでボールが転がり回収部分に回収)、アームを下げる動作の指示 Wait(30000);
OnFwd(OUT_B,50);OnFwd(OUT_C,-80); Wait(400); tomaru; Wait(100); koushin; Wait(1500); tomaru; Wait(100);//空の容器に回収部分のボール出口が来るように移動
SendRemoteNumber(CONN,MAILBOX1,on3);//ボールを止めていた蓋をあげて、ボールを空の容器に移す Wait(1000);
tomaru; Wait(100); }
task main() { int msg1; int msg2; while(1){ ReceiveRemoteNumber(MAILBOX1,true,msg1); if(msg1==on1){ OnFwd(OUT_B,50); Wait(1500);//容器をつかむ tomaru; OnFwd(OUT_A,-100);アームをあげる Wait(20000);// OnFwd(OUT_A,100); Wait(20000);//アームを下げる tomaru; OnFwd(OUT_B,-50); Wait(1500);//容器を放す tomaru; msg1=100;//msg1に1,2,3以外の値を代入し、ifの外へ } if(msg1==on3){ OnFwd(OUT_C,-30); Wait(200);//蓋を開ける動作 msg1=100; } if(msg1==on2){ OnFwd(OUT_A,100); Wait(20000);//アームを下げる動作 msg1=100; } } }
ロボコン本番であと少しで計画通りボールが回収できそうというところまでいったが成功しなかったことがとても悔しい。
容器内のボールしか拾えないロボットとなってしまったが容器内のボールを回収すると言う点ではアイデアは良かったと思う。
問題点は、上でも少し触れたがアームの重量にある。容器をつかむなどで必要な要素をアームに取り込むとどうしてもどんどん重くなってしまった。ギアを活用してアームを持ち上げることに成功したことは良かったが改善の余地はまだあるとは思う。
今回のロボティクス入門ゼミでロボットとプログラミングをさわり、機械の信頼できる面とそうでない面の両方見ることができて、不安定な部分に苦戦はしたが面白かった。