- 追加された行はこの色です。
- 削除された行はこの色です。
[[2015a/Member]]
*テーマ [#y7b72851]
今回のロボットのテーマは「確実にライントレースをすること」「ボールをしっかりつかんでゴールまで運ぶ。」この二つを意識して今回の課題を進めていきたいと思います。
**関数の定義 [#qebc5698]
今回のプログラミングではライントレースを確実にするためにかなりスピードを抑えてみました。おかげでおじいちゃんみたいなかなり遅いスピードでしたがかなり精度の高いライントレースができました。
#define BLACK 36
#define WHITE 48
#define SPEED 18
#define go_forward OnRev(OUT_BC,SPEED);
#define turn_left OnRev(OUT_B,SPEED);Off(OUT_C);
#define turn_right OnFwd(OUT_B,SPEED2);OnRev(OUT_C,SPEED2);
#define STEP 1 //センサーのデータの取得頻度を1[ms]に設定
#define SPEED2 15
#define SPEED3 25
#define grab OnFwd(OUT_A,SPEED3);Wait(1200);Off(OUT_A);
#define shoot turn_left;Wait(800);go_forward;Wait(300);OnRev(OUT_A,SPEED3);Wait(1000);Off(OUT_A);
#define grab OnFwd(OUT_A,SPEED3);Wait(1200);Off(OUT_A); //ボールをつかむ。
#define shoot turn_left;Wait(800);go_forward;Wait(300);OnRev(OUT_A,SPEED3);Wait(1000);Off(OUT_A); //つかんだボールを離す。
**ボールをキャッチ&シュートの構造とプログラミング [#q7ba514d]
今回私が作った中で最もよかった点がボールをつかむための機構です。両方から挟み込みながらボールをすくいあげることでボールをキープすることを可能にしました。参考にしたのはNXCの説明書についているゴルフクラブのようなものを使ってボールを打ち出す機構です。片方側である回転を行えばその逆側では逆回転を行う性質があるのでその性質を生かしてモーター一つで二つの方向を使うことでボールを&size(40){挟む};ことができました
&ref(./17061.jpg,30%);
&ref(./th3MHHYTJ0.jpg,30%);
&ref(./15497.jpg,30%);
下の写真のように十字のギアをかませて縦方向のベクトルの向きをちょうど90°曲げベクトルの向きを変えることができました。これをすることによって腕の部分がスイングするように作ることができました。後、下の写真二枚目の右側にある大きいギアをかませて合計3つのギアを連動して動かすことで、最初の大きいギアが反時計回りの回転をすると真ん中のギアが時計回りをし、最後のベクトルの向きを変えたギアが反時計回りをする構造になっていてこれをすることでギアの回転を一致させプログラミングをする際に混乱を招かないようにしました。アームが少し重量があるのですが、一番左のギアを大きくし、その次のギアを小さくすることで小さなパワーでもアームを動かすことができました。この2つのギアを逆にし一番右が小さいギア十字の裏側が大きいギアにすることで小さいギアのほうがアームの精密な動きできるかと思い試したみたのですが逆にすることでパワーがなくなってしまったので大きいギアのほうを一番最初のギアにしました。
&ref(./18643.jpg,30%);
&ref(./18644.jpg,30%);
*全体のプログラミング [#lb070a2c]
これまでの定義づけやボールに関することを生かしつつ下記のようなプログラミングを作りました。
task main(){
SetSensorLight(S3);
int n=0; //黒の上にいる時間を計測するための変数
int flg1=0; //交差点通過前=0 交差点通過後=1
int flg2=0; //ゴール判定用のフラグ
int flg3=0; //ボールキャッチ前=0 ボールキャッチ後=1
int flgcross=0; //交差点通過前=0 交差点通過後=1
int flggoal=0; //ゴール判定用のフラグ
int flghave=0; //ボールキャッチ前=0 ボールキャッチ後=1
long t0=CurrentTick();
while(flg2==0){
if(CurrentTick()-t0>28500 && flg3==0){ //ボールキャッチ
while(flggoal==0){
if(CurrentTick()-t0>28500 && flghave==0){ //NXTを起動してから28,5秒後且つボールをキャッチする前の時
grab;
flg3=1;
flghave=1;
}else if(SENSOR_3 < BLACK){ //黒の上なら
turn_left;
n++;
if(n>1500 && CurrentTick()-t0>28500 && flg1==0){ //交差点の処理
n++;
if(flgcross==0){
if(n>1500 && CurrentTick()-t0>28500) //黒の上に1.5秒以上&NXTを起動後28,5秒たったなら以下のプログラムが発動
Off(OUT_BC);
n=0; //黒の上にいるカウンターのリセット
flg1=1; //交差点通過フラグをたてる。ここでフラグをたてたら交差点の処理は行われない
flgcross=1; //交差点通過フラグをたてる。ここでフラグをたてたら交差点の処理は行われない
go_forward;
Wait(1000);
}else if(n>2400 && flg1==1){
flg2=1; //ゴール判定用のフラグをたてる
}else if(n>2400 && flgcross==1){ //黒の上に2,4秒以上かつflgcrossを立てて以下のプログラムを発動させる
flggoal=1; //ゴール判定用のフラグをたてる
}
}else if(SENSOR_3 < WHITE){ //グレーなら
turn_left;
n=0; //黒の上にいるカウンターのリセット
}else{ //それ以外(白)なら
turn_right;
n=0; //黒の上にいるカウンターのリセット
}
Wait(STEP); //ここでデータの値が1[ms]になっている
}
shoot;
}
*今回の反省点&良かった点 [#q5a37a02]
やはり最も問題になったのがセンサーの位置とタイヤの位置が遠いということでした。位置が遠いのでわずかですがずれが生じてしまったのでしっかりとセンサーの位置を考えながらロボットを作っていきたいと思いました。今回、自分が一番よくできたと思う点はボールをつかむ部分がよくできたなと思います。後、プログラミングを同じグループの人にほぼほぼ教えてもらいながらだったので自分の理解が足りないところが多かったので練習問題をこなして理解できるようにしました。