2017a/Member/tsukuzin/Mission3
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
検索
|
最終更新
|
ヘルプ
|
ログイン
]
開始行:
[[2017a/Member]]
#contents
*Mission3 [#t26ce7e0]
最後の課題はMission2で使用したコートの各所に画像のように...
&ref(2017a/Mission3/2017a-mission3.png,100%,);
*動作の構想について [#c580d2fe]
この競技でどのようにポイントを稼ぐかチーム内で話し合った...
?一台は缶の収集から整列
#ref(2017a/Member/tsukuzin/Mission3/構想1.gif,40%,);
?もう一台がそろえた缶を積む
#ref(2017a/Member/tsukuzin/Mission3/構想2.gif,40%,);
という動作をさせることで合致した。この構想であればMission...
しかしながら、&color(white,red){RIS同士の通信の赤外線が思...
*機構説明 [#p73a8461]
機構はおおまかにに缶を集める機構、缶を積む機構に分かれて...
**缶を集める機構 [#t661736c]
#ref(2017a/Member/tsukuzin/Mission3/アームの機構.gif,120%...
画像はアームの駆動部分である。ウォームギアを使うことで多...
実際にアームを取り付けて動かした画像は下のようになる
#ref(2017a/Member/tsukuzin/Mission3/缶整理.gif,120%,);
**缶を積む機構 [#z596b55b]
缶を積む機構は缶をつかむハンドと缶の上下をさせる機構に分...
***ハンドの機構について [#yc1d374d]
#ref(2017a/Member/tsukuzin/Mission3/ハンドの機構1.JPG,20%...
ハンドの機構もアームの機構同様に、左右対称に動く。缶を持...
***上下の機構 [#d08ba183]
#ref(2017a/Member/tsukuzin/Mission3/上下の機構1.JPG,100%,);
先端には回転センサーが取り付けてある。時間制御にするとそ...
#ref(2017a/Member/tsukuzin/Mission3/上下の機構4.JPG,100%,);
#ref(2017a/Member/tsukuzin/Mission3/上下の機構2.gif,120%,);
機構内部は画像のようになっていて強い動力を得るためにウォ...
2枚目の画像のようにギア付きのシャフトを付けて、左側のラッ...
**実際の動作 [#u228c778]
このハンドと上下の機構で3段まで缶を積むことが出来た。
[[&ref(2017a/Member/tsukuzin/Mission3/缶3段.png,80%,クリ...
*プログラムについて [#s59ea93f]
プログラミングについては作業の効率を優先したので担当者は...
本体の詳しい説明は[[Kenty:http://yakushi.shinshu-u.ac.jp/...
ロボットの動作は
?ロボットはゴール地点と一直線上になるように置く。
?ロボットがアームを開き、円PQRSの淵にくるまで前進をする...
?ここでロボットがアームを閉じると他の空き缶も回収される...
?後退した後、180度旋回して、ハンド側の準備をする。
?ハンドに付いている光センサーの値を読み取って、空き缶に...
?ロボットの開始地点はゴールと一直線上なので、前進して空...
**缶回収用プログラム [#be5d1605]
***関数と定義 [#df71293f]
基本的な動作やロボット間で送受信する際に利用する数字をわ...
#define LINE_BLACK 35 //黒線反応時の光センサ(ライ...
#define CAN_SHORT 46 //缶に接近したときの 光センサ...
#define TURN_TIME 145 //180°反転までの時間
#define APP_TIME 75 //缶接近までの時間
#define ARM_TIME 200 //アームが真横を向くまでの時間
#define FOWORD OnFwd(OUT_AC); //直進
#define BACK OnRev(OUT_AC); //後退
#define STOP Off(OUT_AC); //停止
#define TURN_LEFT OnFwd(OUT_C); OnRev(OUT_A); //左旋回
#define TURN_RIGHT OnFwd(OUT_A); OnRev(OUT_C); //右旋回
#define ARM_OPEN OnFwd(OUT_B); //アーム開
#define ARM_CLOSE OnRev(OUT_B); //アーム閉
#define ARM_STOP Off(OUT_B); //アーム停止
#define ROGER 1 //<受信・送信> 【了解】
#define GO_AHEAD 10 //<送信> 【行動開始】
#define MOTION_END 20 //<受信> 【動作完了】
***グローバル変数 [#w6a1cd68]
一つ目は缶がロボットに十分に接近し、ハンド側に動作の開始...
int trans_sign = 0; //<通信> 送信信号 格納用
int can_cnt = 0; //缶 積み上げ本数カウント用
***サブルーチン [#y1c26230]
以下の二つは「値の初期化→受信するまで待機(一つ目のみ)→...
sub Reception()
{
ClearMessage(); //<通信> 初期化(最後に受信した...
until(Message() == MOTION_END); //<通信> 『20【...
SendMessage(ROGER); //<通信> 『1【了解】』を送信
}
sub Transmission()
{
ClearMessage(); //<通信> 初期化(最後に受信した...
SendMessage(trans_sign); //<通信> 『"trans_sign"の...
until(Message() == ROGER); //<通信> 『1【了解】』...
}
**メインタスク [#h306100f]
メインタスクについてはコメント文で詳しく説明されているが...
task main()
{
/*---------- モータパワー・センサ 設定 ----------*/
SetPower(OUT_AC , 3);
SetSensor(SENSOR_3 , SENSOR_LIGHT); //黒線 認識用
SetSensor(SENSOR_1 , SENSOR_LIGHT); //缶 認識用
/*---------- アームを全開 ----------*/
ARM_CLOSE; //アーム閉
Wait(ARM_TIME); //アームが真横を向くまで閉じる
ARM_STOP;
Wait(100);
/*---------- 缶 回収 ----------*/
FOWORD; // アーム側を前方向として
until(SENSOR_3 < LINE_BLACK); // 2つ目の黒線まで前進
until(SENSOR_3 > LINE_BLACK); //
until(SENSOR_3 < LINE_BLACK); //
STOP; //停止
Wait(100);
ARM_CLOSE; //アーム閉
Wait(ARM_TIME + 50); //アームが平行になるまで閉じる
ARM_STOP;
Wait(100);
BACK; // 缶を揃えるために
Wait(50); // 少し下がる
STOP;
ARM_CLOSE; // アーム閉
Wait(30); // 缶を一列にするためにさらに少し閉じる
ARM_STOP;
ARM_OPEN; // アームを開き、
Wait(ARM_TIME*2 + 80); // スタート時にあった場所...
ARM_STOP;
/*---------- 缶積み上げのための準備 ----------*/
BACK; // 後退して、
until(SENSOR_3 > LINE_BLACK); // 2つ目の黒線まで前進
until(SENSOR_3 < LINE_BLACK); //
STOP;
SetPower(OUT_AC , 7);
TURN_LEFT; // 右方向へ
Wait(TURN_TIME); // 180°旋回
STOP;
SetPower(OUT_AC , 3);
BACK; // ハンド側を前方向として
until(SENSOR_1 > CAN_SHORT); // 缶の手前まで前進
Wait(20); // (ここから下は、ハンド方向を前方向と...
STOP;
/*---------- 缶を積み上げ開始 (3回繰り返し、4段にする)...
while(pile_up_cnt < 3){
trans_sign = GO_AHEAD; //<通信> 『10【行動開始...
Transmission(); // ↳送信
/* - - - - - - - - - - - - - - - - -*/
/* ハンド側が缶の持ち上げを実行 */
/* - - - - - - - - - - - - - - - - -*/
Reception(); //<通信> 『20【動作完了】』が送ら...
BACK; // 缶一つ分だけ(次の缶の手前まで)
until(SENSOR_1 > CAN_SHORT); // 前進する
Wait(20);
STOP;
trans_sign = GO_AHEAD; //<通信> 『10【行動開始...
Transmission(); //
/* ハンドが缶を置き、初期位置に戻る */
Reception(); //<通信> 『20【動作...
can_cnt++; //缶の本数 +1
}
}
**缶積み上げ用 [#b0cd2fe7]
***関数と定義 [#v580aaf1]
積み上げ用も缶回収用同様、基本的な動作、メッセージをわか...
#define HAND_TIME 50 //ハンド開閉 時間
#define ELEVATE_UP OnFwd(OUT_C); //<ハンド昇降>上昇
#define ELEVATE_DOWN OnRev(OUT_C); //<ハンド昇降>降下
#define ELEVATE_STOP Off(OUT_C); //<ハンド昇降>停止
#define HAND_OPEN OnRev(OUT_B); //<ハンド開閉>開
#define HAND_CLOSE OnFwd(OUT_B); //<ハンド開閉>閉
#define HAND_STOP Off(OUT_B); //<ハンド開閉>停止
#define ROGER 1 //<受信・送信> 【了解】
#define GO_AHEAD 10 //<受信> 【行動開始】
#define MOTION_END 20 //<送信> 【動作完了】
***グローバル変数 [#s1a66063]
上2つは缶回収用と同様で、下2つは缶を1段、2段、3段と積んで...
int can_cnt = 0; //積み上げた缶の本数
int trans_sign = 0; //送信用 信号 格納変数
int hand_flag = 0; //<ハンド>開閉 判断用
int elevate_flag = 0; //<ハンド>昇降 判断用
**サブルーチン [#c1a38ef4]
ハンドを上下させるプログラムである。変数の値でif文が分岐...
sub Hand_Elevate()
{
if(elevate_flag == 0){ //ハンド上昇
ELEVATE_UP;
until(SENSOR_1 > 385);
ELEVATE_STOP;
elevate_flag = 1; //ハンド上昇終了 次:降下を実行
}
else if(elevate_flag == 1){ //ハンド降下(缶をのせる)
ELEVATE_DOWN;
until(SENSOR_1 < 360);
ELEVATE_STOP;
elevate_flag = 2; //ハンド降下終了 次:下降を実行
}
else if(elevate_flag == 2){ //ハンド初期位置(一番下)...
ELEVATE_DOWN;
until(SENSOR_1 < 3);
ELEVATE_STOP;
elevate_flag = 0; //ハンド下降終了 次:上昇を実行
}
}
一連の動作は「掴む→押さえる→離す」のように行われていく。...
sub Hand_OC()
{
if(hand_flag == 0){
SetPower(OUT_C , 3);
HAND_CLOSE;
Wait(100);
SetPower(OUT_C , 6);
hand_flag = 1; //ハンド閉 次:ハンドを開く
}
else{
HAND_OPEN;
Wait(HAND_TIME);
HAND_STOP;
hand_flag = 0; //ハンド開 次:ハンドを閉じる
}
}
以下二つはアーム側と同じ機能である。
sub Reception()
{
ClearMessage(); //<通信> 初期化(最後に受信した値...
until(Message() == GO_AHEAD); //<通信> 『10【行動...
SendMessage(ROGER); //<通信> 『1【了解】』を送信
}
sub Transmission()
{
ClearMessage(); //<通信> 初期化 (最後に受信した...
SendMessage(trans_sign); //<通信> 『"trans_sign"の...
until(Message() == ROGER); //<通信> 『1【了解】』...
}
**メインタスク [#q6038d22]
メインタスクの説明はコメント文で説明されているが、kentyさ...
task main()
{
/*---------- モータパワー・センサ 設定 ----------*/
SetSensor(SENSOR_1 , SENSOR_ROTATION); //回転センサ設定
ClearSensor(SENSOR_1); //回転センサ初期化
/*---------- 缶 積み上げ(3回繰り返し、4段にする)---...
while(can_cnt < 3){
Reception(); //<通信> 『10【行動開始】』を受信...
Hand_OC(); //缶をつかむ
Hand_Elevate(); //ハンド上昇
trans_sign = MOTION_END; //<通信> 『20【動作完了...
Transmission(); //送信
/* - - - - - - - - - - - - - - - - - - -*/
/* 駆動側が缶の手前まで移動 */
/* - - - - - - - - - - - - - - - - - - -*/
Reception(); //<通信> 『10【行動開始】』を受信...
Hand_Elevate(); //ハンド下降
Hand_OC(); //缶を放す
Hand_Elevate(); //一番下までハンドを下ろす
trans_sign = MOTION_END; //<信号>『20【動作完了】』
Transmission(); // ↳送信
can_cnt++; //缶の本数 +1
}
Reception();
}
*反省 [#y555790c]
今回のMission3は個々の機構の動作は思い通りに動いたが、い...
終了行:
[[2017a/Member]]
#contents
*Mission3 [#t26ce7e0]
最後の課題はMission2で使用したコートの各所に画像のように...
&ref(2017a/Mission3/2017a-mission3.png,100%,);
*動作の構想について [#c580d2fe]
この競技でどのようにポイントを稼ぐかチーム内で話し合った...
?一台は缶の収集から整列
#ref(2017a/Member/tsukuzin/Mission3/構想1.gif,40%,);
?もう一台がそろえた缶を積む
#ref(2017a/Member/tsukuzin/Mission3/構想2.gif,40%,);
という動作をさせることで合致した。この構想であればMission...
しかしながら、&color(white,red){RIS同士の通信の赤外線が思...
*機構説明 [#p73a8461]
機構はおおまかにに缶を集める機構、缶を積む機構に分かれて...
**缶を集める機構 [#t661736c]
#ref(2017a/Member/tsukuzin/Mission3/アームの機構.gif,120%...
画像はアームの駆動部分である。ウォームギアを使うことで多...
実際にアームを取り付けて動かした画像は下のようになる
#ref(2017a/Member/tsukuzin/Mission3/缶整理.gif,120%,);
**缶を積む機構 [#z596b55b]
缶を積む機構は缶をつかむハンドと缶の上下をさせる機構に分...
***ハンドの機構について [#yc1d374d]
#ref(2017a/Member/tsukuzin/Mission3/ハンドの機構1.JPG,20%...
ハンドの機構もアームの機構同様に、左右対称に動く。缶を持...
***上下の機構 [#d08ba183]
#ref(2017a/Member/tsukuzin/Mission3/上下の機構1.JPG,100%,);
先端には回転センサーが取り付けてある。時間制御にするとそ...
#ref(2017a/Member/tsukuzin/Mission3/上下の機構4.JPG,100%,);
#ref(2017a/Member/tsukuzin/Mission3/上下の機構2.gif,120%,);
機構内部は画像のようになっていて強い動力を得るためにウォ...
2枚目の画像のようにギア付きのシャフトを付けて、左側のラッ...
**実際の動作 [#u228c778]
このハンドと上下の機構で3段まで缶を積むことが出来た。
[[&ref(2017a/Member/tsukuzin/Mission3/缶3段.png,80%,クリ...
*プログラムについて [#s59ea93f]
プログラミングについては作業の効率を優先したので担当者は...
本体の詳しい説明は[[Kenty:http://yakushi.shinshu-u.ac.jp/...
ロボットの動作は
?ロボットはゴール地点と一直線上になるように置く。
?ロボットがアームを開き、円PQRSの淵にくるまで前進をする...
?ここでロボットがアームを閉じると他の空き缶も回収される...
?後退した後、180度旋回して、ハンド側の準備をする。
?ハンドに付いている光センサーの値を読み取って、空き缶に...
?ロボットの開始地点はゴールと一直線上なので、前進して空...
**缶回収用プログラム [#be5d1605]
***関数と定義 [#df71293f]
基本的な動作やロボット間で送受信する際に利用する数字をわ...
#define LINE_BLACK 35 //黒線反応時の光センサ(ライ...
#define CAN_SHORT 46 //缶に接近したときの 光センサ...
#define TURN_TIME 145 //180°反転までの時間
#define APP_TIME 75 //缶接近までの時間
#define ARM_TIME 200 //アームが真横を向くまでの時間
#define FOWORD OnFwd(OUT_AC); //直進
#define BACK OnRev(OUT_AC); //後退
#define STOP Off(OUT_AC); //停止
#define TURN_LEFT OnFwd(OUT_C); OnRev(OUT_A); //左旋回
#define TURN_RIGHT OnFwd(OUT_A); OnRev(OUT_C); //右旋回
#define ARM_OPEN OnFwd(OUT_B); //アーム開
#define ARM_CLOSE OnRev(OUT_B); //アーム閉
#define ARM_STOP Off(OUT_B); //アーム停止
#define ROGER 1 //<受信・送信> 【了解】
#define GO_AHEAD 10 //<送信> 【行動開始】
#define MOTION_END 20 //<受信> 【動作完了】
***グローバル変数 [#w6a1cd68]
一つ目は缶がロボットに十分に接近し、ハンド側に動作の開始...
int trans_sign = 0; //<通信> 送信信号 格納用
int can_cnt = 0; //缶 積み上げ本数カウント用
***サブルーチン [#y1c26230]
以下の二つは「値の初期化→受信するまで待機(一つ目のみ)→...
sub Reception()
{
ClearMessage(); //<通信> 初期化(最後に受信した...
until(Message() == MOTION_END); //<通信> 『20【...
SendMessage(ROGER); //<通信> 『1【了解】』を送信
}
sub Transmission()
{
ClearMessage(); //<通信> 初期化(最後に受信した...
SendMessage(trans_sign); //<通信> 『"trans_sign"の...
until(Message() == ROGER); //<通信> 『1【了解】』...
}
**メインタスク [#h306100f]
メインタスクについてはコメント文で詳しく説明されているが...
task main()
{
/*---------- モータパワー・センサ 設定 ----------*/
SetPower(OUT_AC , 3);
SetSensor(SENSOR_3 , SENSOR_LIGHT); //黒線 認識用
SetSensor(SENSOR_1 , SENSOR_LIGHT); //缶 認識用
/*---------- アームを全開 ----------*/
ARM_CLOSE; //アーム閉
Wait(ARM_TIME); //アームが真横を向くまで閉じる
ARM_STOP;
Wait(100);
/*---------- 缶 回収 ----------*/
FOWORD; // アーム側を前方向として
until(SENSOR_3 < LINE_BLACK); // 2つ目の黒線まで前進
until(SENSOR_3 > LINE_BLACK); //
until(SENSOR_3 < LINE_BLACK); //
STOP; //停止
Wait(100);
ARM_CLOSE; //アーム閉
Wait(ARM_TIME + 50); //アームが平行になるまで閉じる
ARM_STOP;
Wait(100);
BACK; // 缶を揃えるために
Wait(50); // 少し下がる
STOP;
ARM_CLOSE; // アーム閉
Wait(30); // 缶を一列にするためにさらに少し閉じる
ARM_STOP;
ARM_OPEN; // アームを開き、
Wait(ARM_TIME*2 + 80); // スタート時にあった場所...
ARM_STOP;
/*---------- 缶積み上げのための準備 ----------*/
BACK; // 後退して、
until(SENSOR_3 > LINE_BLACK); // 2つ目の黒線まで前進
until(SENSOR_3 < LINE_BLACK); //
STOP;
SetPower(OUT_AC , 7);
TURN_LEFT; // 右方向へ
Wait(TURN_TIME); // 180°旋回
STOP;
SetPower(OUT_AC , 3);
BACK; // ハンド側を前方向として
until(SENSOR_1 > CAN_SHORT); // 缶の手前まで前進
Wait(20); // (ここから下は、ハンド方向を前方向と...
STOP;
/*---------- 缶を積み上げ開始 (3回繰り返し、4段にする)...
while(pile_up_cnt < 3){
trans_sign = GO_AHEAD; //<通信> 『10【行動開始...
Transmission(); // ↳送信
/* - - - - - - - - - - - - - - - - -*/
/* ハンド側が缶の持ち上げを実行 */
/* - - - - - - - - - - - - - - - - -*/
Reception(); //<通信> 『20【動作完了】』が送ら...
BACK; // 缶一つ分だけ(次の缶の手前まで)
until(SENSOR_1 > CAN_SHORT); // 前進する
Wait(20);
STOP;
trans_sign = GO_AHEAD; //<通信> 『10【行動開始...
Transmission(); //
/* ハンドが缶を置き、初期位置に戻る */
Reception(); //<通信> 『20【動作...
can_cnt++; //缶の本数 +1
}
}
**缶積み上げ用 [#b0cd2fe7]
***関数と定義 [#v580aaf1]
積み上げ用も缶回収用同様、基本的な動作、メッセージをわか...
#define HAND_TIME 50 //ハンド開閉 時間
#define ELEVATE_UP OnFwd(OUT_C); //<ハンド昇降>上昇
#define ELEVATE_DOWN OnRev(OUT_C); //<ハンド昇降>降下
#define ELEVATE_STOP Off(OUT_C); //<ハンド昇降>停止
#define HAND_OPEN OnRev(OUT_B); //<ハンド開閉>開
#define HAND_CLOSE OnFwd(OUT_B); //<ハンド開閉>閉
#define HAND_STOP Off(OUT_B); //<ハンド開閉>停止
#define ROGER 1 //<受信・送信> 【了解】
#define GO_AHEAD 10 //<受信> 【行動開始】
#define MOTION_END 20 //<送信> 【動作完了】
***グローバル変数 [#s1a66063]
上2つは缶回収用と同様で、下2つは缶を1段、2段、3段と積んで...
int can_cnt = 0; //積み上げた缶の本数
int trans_sign = 0; //送信用 信号 格納変数
int hand_flag = 0; //<ハンド>開閉 判断用
int elevate_flag = 0; //<ハンド>昇降 判断用
**サブルーチン [#c1a38ef4]
ハンドを上下させるプログラムである。変数の値でif文が分岐...
sub Hand_Elevate()
{
if(elevate_flag == 0){ //ハンド上昇
ELEVATE_UP;
until(SENSOR_1 > 385);
ELEVATE_STOP;
elevate_flag = 1; //ハンド上昇終了 次:降下を実行
}
else if(elevate_flag == 1){ //ハンド降下(缶をのせる)
ELEVATE_DOWN;
until(SENSOR_1 < 360);
ELEVATE_STOP;
elevate_flag = 2; //ハンド降下終了 次:下降を実行
}
else if(elevate_flag == 2){ //ハンド初期位置(一番下)...
ELEVATE_DOWN;
until(SENSOR_1 < 3);
ELEVATE_STOP;
elevate_flag = 0; //ハンド下降終了 次:上昇を実行
}
}
一連の動作は「掴む→押さえる→離す」のように行われていく。...
sub Hand_OC()
{
if(hand_flag == 0){
SetPower(OUT_C , 3);
HAND_CLOSE;
Wait(100);
SetPower(OUT_C , 6);
hand_flag = 1; //ハンド閉 次:ハンドを開く
}
else{
HAND_OPEN;
Wait(HAND_TIME);
HAND_STOP;
hand_flag = 0; //ハンド開 次:ハンドを閉じる
}
}
以下二つはアーム側と同じ機能である。
sub Reception()
{
ClearMessage(); //<通信> 初期化(最後に受信した値...
until(Message() == GO_AHEAD); //<通信> 『10【行動...
SendMessage(ROGER); //<通信> 『1【了解】』を送信
}
sub Transmission()
{
ClearMessage(); //<通信> 初期化 (最後に受信した...
SendMessage(trans_sign); //<通信> 『"trans_sign"の...
until(Message() == ROGER); //<通信> 『1【了解】』...
}
**メインタスク [#q6038d22]
メインタスクの説明はコメント文で説明されているが、kentyさ...
task main()
{
/*---------- モータパワー・センサ 設定 ----------*/
SetSensor(SENSOR_1 , SENSOR_ROTATION); //回転センサ設定
ClearSensor(SENSOR_1); //回転センサ初期化
/*---------- 缶 積み上げ(3回繰り返し、4段にする)---...
while(can_cnt < 3){
Reception(); //<通信> 『10【行動開始】』を受信...
Hand_OC(); //缶をつかむ
Hand_Elevate(); //ハンド上昇
trans_sign = MOTION_END; //<通信> 『20【動作完了...
Transmission(); //送信
/* - - - - - - - - - - - - - - - - - - -*/
/* 駆動側が缶の手前まで移動 */
/* - - - - - - - - - - - - - - - - - - -*/
Reception(); //<通信> 『10【行動開始】』を受信...
Hand_Elevate(); //ハンド下降
Hand_OC(); //缶を放す
Hand_Elevate(); //一番下までハンドを下ろす
trans_sign = MOTION_END; //<信号>『20【動作完了】』
Transmission(); // ↳送信
can_cnt++; //缶の本数 +1
}
Reception();
}
*反省 [#y555790c]
今回のMission3は個々の機構の動作は思い通りに動いたが、い...
ページ名: