2017a/Member/Kenty/Mission3
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
検索
|
最終更新
|
ヘルプ
|
ログイン
]
開始行:
#contents
*課題内容 [#efe646a7]
課題3は、課題2で使用したコース上で、各場所に配置され...
コースと缶の配置は下の画像の通りである。~
詳しいルールについては、[[2017a/Mission3]]を参照。
#ref(./コース・缶配置.png,80%,コース全体像と缶配置)
*機構説明 [#e9eadf27]
**缶の回収方法と積み上げ [#gd7f1b9b]
まずロボットを作る上での方向性として、出来るだけライン...
缶を積み上げ、ゴールに配置するまでの動作としては、次の...
~
?コース上に配置されている缶7つ(中身の入っている缶を除く...
#ref(./アニメーション 缶回収.gif,50%,缶回収イメージ)
?180°旋回し、今度はハンド上の部分で缶を1個ずつ積み上...
#ref(./アニメーション 缶積み上げ.gif,30%,缶の積み上げイ...
※ただし、プログラムの調整が間に合わなかったため、授業内...
**アーム部分 [#g1ac1a84]
缶を回収するときに、あまりアームの駆動が速いと缶を倒し...
#ref(./アーム動力画像.jpg,10%,缶動力部分)
また、缶を一度に全て回収するため、アームの長さは缶7個...
下の動画はアームで缶を回収しているときの様子である。
#ref(./缶回収様子.gif,150%,缶回収の様子)
**ハンド部分 [#hb81ff69]
ハンド部分の缶をつかむ機構には、クラッチギアを使用する...
また、缶をつかむときにそのままブロックで缶をつかむと滑...
#ref(./ハンド画像.jpg,10%,ハンド画像)
ハンドの上下機構にはウォームギアから1番大きなギアへ伝...
上下機構の制御には回転センサを用いている。
#ref(./ハンド上下機構.jpg,10%,ハンド上下機構の様子)
*プログラム [#ya2a0468]
**アーム・駆動側 [#i24e48f5]
アーム・駆動部分のプログラムに関しては、授業内で行った...
「定数・マクロ 定義」と「グローバル変数」の部分に関して...
//------------------------------------------------------...
// 缶回収ロボット プログラム //
//------------------------------------------------------...
/*--------------------------------------*/
/* 定数・マクロ 定義 */
/*--------------------------------------*/
/*---------- センサ値 ----------*/
#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 // <受信> 【動作完了】
/*--------------------------------------*/
/* グローバル変数 */
/*--------------------------------------*/
int trans_sign = 0; // <通信> 送信信号 格納用
int can_cnt = 0; // 缶 積み上げ本数カウント用
*** サブルーチン [#wa50550e]
駆動側はアームの動作は1度しかせず、前進後退もサブルー...
受信側は、最後に受信した値を初期化した後、ハンド側から...
送信側は、こちらも一度受信した値を初期化した後、ハンド...
/*--------------------------------------*/
/* <通信> 受信 */
/*--------------------------------------*/
sub Reception()
{
ClearMessage(); // <通信> 初期化(最後に受信し...
until(Message() == MOTION_END); // <通信> 『20...
SendMessage(ROGER); // <通信> 『1【了解】』を送信
}
/*--------------------------------------*/
/* <通信> 送信 */
/*--------------------------------------*/
sub Transmission()
{
ClearMessage(); // <通信> 初期化(最後に受信し...
SendMessage(trans_sign); // <通信> 『"trans_sign"...
until(Message() == ROGER); // <通信> 『1【了解】...
}
*** メインタスク [#q892cc8f]
今までのところでも何回か書いているように、授業内で行っ...
使用しなかった部分については、またその部分だけ取り出し...
/*--------------------------------------*/
/* メインタスク */
/*--------------------------------------*/
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;
ここまでは、機構説明の『缶の回収方法と積み上げ』の?の動...
動作の流れは下のフローチャートの様になっている。~
フローチャートの一番下は結合子の「○」になっているが、こ...
#ref(./フローチャート 缶回収.png,50%,缶回収の流れ)
授業での競技会では、この後”}”でメインタスクを閉じてし...
調整が間に合わなかったのは、下の4行で、ロボットが旋回...
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
}
}
ハンド側との通信による全体の流れは、『プログラムの流れ...
駆動側は、光センサで缶を検知し、缶をつかめる距離まで近...
**ハンド側 [#l14f5178]
ハンド側のプログラムは駆動側と通信を行い、缶を積み上げ...
缶の積み上げの様子は、アーム側のプログラムの説明でも書...
また、ハンド側についても、『定数・マクロ 定義』と『グロ...
//------------------------------------------------------...
// 缶積み上げロボットプログラム //
//------------------------------------------------------...
/*----------------------------------------*/
/* 定数・マクロ 定義 */
/*----------------------------------------*/
#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 // <送信> 【動作完了】
/*----------- グローバル変数 定義 ----------*/
int trans_sign = 0; // 送信用 信号 格納変数
int hand_flag = 0; // <ハンド>開閉 判断用
int elevate_flag = 0; // <ハンド>昇降 判断用
int can_cnt = 0; // 積み上げた缶の本数
*** サブルーチン [#x140c947]
ハンド側のサブルーチンは、通信に使用する受信と送信に加...
~
《 ハンド昇降 》~
/*---------------------------------*/
/* ハンド昇降 */
/*---------------------------------*/
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【了解】...
}
*** メインタスク [#ncc70add]
ハンド側のメインタスクはアーム・駆動側に比べてシンプル...
具体的には、~
《缶を持ち上げる》→《缶を下の缶の上に乗せてハンドを開...
の3つの動作を駆動側からの【行動開始】の信号が送られてく...
アーム・駆動側との通信による連携と動作の流れは『缶積み...
/*---------------------------------*/
/* メインタスク */
/*---------------------------------*/
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(); // <通信> 『10【行動開始】』を受...
}
**缶積み上げの流れと様子 [#a7fba303]
缶積み上げの時の流れは下のフローチャートの様になってい...
アーム・駆動側の1番上は「結合子」の「○」になっているが...
#ref(./フローチャート 缶積み上げ.png,50%,缶積み上げ時の...
~
3段までだが、実際に缶を積み上げている様子をyoutubeに動...
下の画像をクリックするとyoutubeの動画のページに飛ぶよう...
[[&ref(2017a/Member/Kenty/Mission3/積み上げ 動画.png,50%...
*反省・感想 [#u46f6675]
ロボットのコンセプトとして、「敢えてほとんどライントレ...
また、ロボット本体の製作に関しては、「ハンドやアームな...
これまで3つの課題に取り組み、プログラムを作るときに必...
終了行:
#contents
*課題内容 [#efe646a7]
課題3は、課題2で使用したコース上で、各場所に配置され...
コースと缶の配置は下の画像の通りである。~
詳しいルールについては、[[2017a/Mission3]]を参照。
#ref(./コース・缶配置.png,80%,コース全体像と缶配置)
*機構説明 [#e9eadf27]
**缶の回収方法と積み上げ [#gd7f1b9b]
まずロボットを作る上での方向性として、出来るだけライン...
缶を積み上げ、ゴールに配置するまでの動作としては、次の...
~
?コース上に配置されている缶7つ(中身の入っている缶を除く...
#ref(./アニメーション 缶回収.gif,50%,缶回収イメージ)
?180°旋回し、今度はハンド上の部分で缶を1個ずつ積み上...
#ref(./アニメーション 缶積み上げ.gif,30%,缶の積み上げイ...
※ただし、プログラムの調整が間に合わなかったため、授業内...
**アーム部分 [#g1ac1a84]
缶を回収するときに、あまりアームの駆動が速いと缶を倒し...
#ref(./アーム動力画像.jpg,10%,缶動力部分)
また、缶を一度に全て回収するため、アームの長さは缶7個...
下の動画はアームで缶を回収しているときの様子である。
#ref(./缶回収様子.gif,150%,缶回収の様子)
**ハンド部分 [#hb81ff69]
ハンド部分の缶をつかむ機構には、クラッチギアを使用する...
また、缶をつかむときにそのままブロックで缶をつかむと滑...
#ref(./ハンド画像.jpg,10%,ハンド画像)
ハンドの上下機構にはウォームギアから1番大きなギアへ伝...
上下機構の制御には回転センサを用いている。
#ref(./ハンド上下機構.jpg,10%,ハンド上下機構の様子)
*プログラム [#ya2a0468]
**アーム・駆動側 [#i24e48f5]
アーム・駆動部分のプログラムに関しては、授業内で行った...
「定数・マクロ 定義」と「グローバル変数」の部分に関して...
//------------------------------------------------------...
// 缶回収ロボット プログラム //
//------------------------------------------------------...
/*--------------------------------------*/
/* 定数・マクロ 定義 */
/*--------------------------------------*/
/*---------- センサ値 ----------*/
#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 // <受信> 【動作完了】
/*--------------------------------------*/
/* グローバル変数 */
/*--------------------------------------*/
int trans_sign = 0; // <通信> 送信信号 格納用
int can_cnt = 0; // 缶 積み上げ本数カウント用
*** サブルーチン [#wa50550e]
駆動側はアームの動作は1度しかせず、前進後退もサブルー...
受信側は、最後に受信した値を初期化した後、ハンド側から...
送信側は、こちらも一度受信した値を初期化した後、ハンド...
/*--------------------------------------*/
/* <通信> 受信 */
/*--------------------------------------*/
sub Reception()
{
ClearMessage(); // <通信> 初期化(最後に受信し...
until(Message() == MOTION_END); // <通信> 『20...
SendMessage(ROGER); // <通信> 『1【了解】』を送信
}
/*--------------------------------------*/
/* <通信> 送信 */
/*--------------------------------------*/
sub Transmission()
{
ClearMessage(); // <通信> 初期化(最後に受信し...
SendMessage(trans_sign); // <通信> 『"trans_sign"...
until(Message() == ROGER); // <通信> 『1【了解】...
}
*** メインタスク [#q892cc8f]
今までのところでも何回か書いているように、授業内で行っ...
使用しなかった部分については、またその部分だけ取り出し...
/*--------------------------------------*/
/* メインタスク */
/*--------------------------------------*/
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;
ここまでは、機構説明の『缶の回収方法と積み上げ』の?の動...
動作の流れは下のフローチャートの様になっている。~
フローチャートの一番下は結合子の「○」になっているが、こ...
#ref(./フローチャート 缶回収.png,50%,缶回収の流れ)
授業での競技会では、この後”}”でメインタスクを閉じてし...
調整が間に合わなかったのは、下の4行で、ロボットが旋回...
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
}
}
ハンド側との通信による全体の流れは、『プログラムの流れ...
駆動側は、光センサで缶を検知し、缶をつかめる距離まで近...
**ハンド側 [#l14f5178]
ハンド側のプログラムは駆動側と通信を行い、缶を積み上げ...
缶の積み上げの様子は、アーム側のプログラムの説明でも書...
また、ハンド側についても、『定数・マクロ 定義』と『グロ...
//------------------------------------------------------...
// 缶積み上げロボットプログラム //
//------------------------------------------------------...
/*----------------------------------------*/
/* 定数・マクロ 定義 */
/*----------------------------------------*/
#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 // <送信> 【動作完了】
/*----------- グローバル変数 定義 ----------*/
int trans_sign = 0; // 送信用 信号 格納変数
int hand_flag = 0; // <ハンド>開閉 判断用
int elevate_flag = 0; // <ハンド>昇降 判断用
int can_cnt = 0; // 積み上げた缶の本数
*** サブルーチン [#x140c947]
ハンド側のサブルーチンは、通信に使用する受信と送信に加...
~
《 ハンド昇降 》~
/*---------------------------------*/
/* ハンド昇降 */
/*---------------------------------*/
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【了解】...
}
*** メインタスク [#ncc70add]
ハンド側のメインタスクはアーム・駆動側に比べてシンプル...
具体的には、~
《缶を持ち上げる》→《缶を下の缶の上に乗せてハンドを開...
の3つの動作を駆動側からの【行動開始】の信号が送られてく...
アーム・駆動側との通信による連携と動作の流れは『缶積み...
/*---------------------------------*/
/* メインタスク */
/*---------------------------------*/
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(); // <通信> 『10【行動開始】』を受...
}
**缶積み上げの流れと様子 [#a7fba303]
缶積み上げの時の流れは下のフローチャートの様になってい...
アーム・駆動側の1番上は「結合子」の「○」になっているが...
#ref(./フローチャート 缶積み上げ.png,50%,缶積み上げ時の...
~
3段までだが、実際に缶を積み上げている様子をyoutubeに動...
下の画像をクリックするとyoutubeの動画のページに飛ぶよう...
[[&ref(2017a/Member/Kenty/Mission3/積み上げ 動画.png,50%...
*反省・感想 [#u46f6675]
ロボットのコンセプトとして、「敢えてほとんどライントレ...
また、ロボット本体の製作に関しては、「ハンドやアームな...
これまで3つの課題に取り組み、プログラムを作るときに必...
ページ名: