2014b/Member/arisyka/Mission3
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
検索
|
最終更新
|
ヘルプ
|
ログイン
]
開始行:
[[2014b/Member]]
#contents
*はじめに [#o4d8a879]
課題3はスタート地点からロボットを進め、2つの紙コップにそ...
([[2014年後期/課題3:http://yakushi.shinshu-u.ac.jp/roboti...
私たちの班のメンバーは、
-[[edaeda:http://yakushi.shinshu-u.ac.jp/robotics/?2014b%...
-[[knee:http://yakushi.shinshu-u.ac.jp/robotics/?2014b%2F...
- kuryu
と私の4人である。
私たちの班の考案は、アームとレールを作り、アームを使って...
*ロボット、またはその動作の説明 [#h9193c48]
**全体 [#ne8db113]
#ref(2014b/Member/arisyka/Mission3/IMG_3870.JPG,20%)
写真のような構造である。
右と左のタイヤの負荷がそれぞれ異なるため、プログラムで左...
**アーム [#y4bd3434]
#ref(2014b/Member/arisyka/Mission3/IMG_3869.gif,30%)
上の写真の赤で囲まれた部分。
1のモーターでアーム全体を上げ下げし、2のモーターでアーム...
アームを動かすために使った定義は以下のようである。
#define SPEED1 45
#define SPEED2 60
#define SPEED3 10
#define SPEED4 30
#define SPEED5 50
#define SPEED6 25
float GetAngle(float d) { //進む距離...
const float diameter=5.45; //タイヤの...
const float pi=3.1415; //円周率
float ang = d/(diameter*pi)*360.0; return ang; //角度を...
}
ここの定義はアーム全体の動きを定義している。(上の写真の?...
#define DOWN RotateMotor(OUT_A,SPEED3,105); //アーム...
#define UP RotateMotor(OUT_A,-SPEED5,105); //アーム全...
#define LDown RotateMotor(OUT_A,SPEED3,25);
#define LUp RotateMotor(OUT_A,-SPEED2,25);
#define Little LDown;Wait(2000);LUp; //ボールを...
#ref(2014b/Member/arisyka/Mission3/armループ2.gif,45%)
ここの定義はアームのハサミ部分の動きを定義している。(上の...
#define Catch RotateMotor(OUT_B,-SPEED4,105); //アー...
#define Separate RotateMotor(OUT_B,SPEED4,105); //アー...
#ref(2014b/Member/arisyka/Mission3/catch&separate.gif,40%)
**レール [#k920454a]
#ref(2014b/Member/arisyka/Mission3/IMG_3873.gif,30%)
上の写真の赤で囲まれた部分。また、橙色で囲まれた部分はボ...
レールを動かすために使った動作は上記に書いたアームの定義...
#define Into1 RotateMotor(OUT_C,SPEED3,20); //ボー...
#define Return1 RotateMotor(OUT_C,-SPEED3,25); //レー...
#define Into2 RotateMotor(OUT_C,SPEED4,30); //ボー...
#define Return2 RotateMotor(OUT_C,-SPEED4,15); //レー...
*プログラム [#ec7cd753]
今回使用するプログラムは上記にも示したアーム・レールの動作...
**超音波センサを利用した動き [#l3e463dd]
ここで紹介しているプログラムは配られたプリントに書かれて...
#define SPEED 50
#define SPEED_SLOW 40
float GetAngle(float d) { //進む距離...
const float diameter=5.45; //タイヤの...
const float pi=3.1415; //円周率
float ang = d/(diameter*pi)*360.0; return ang; //角度を...
}
const float diameter = 5.45;
const float track = 15; //タイヤの...
const float pi = 3.1415;
void fwdDist(float d) { //距離 d ?...
long angle;
angle = d/(diameter*pi)*360.0;
RotateMotorEx(OUT_BC,SPEED_SLOW,angle,0,true,true);
}
void turnAng(long ang) { //角度 ang ...
long angle;
angle = track/diameter * ang;
RotateMotorEx(OUT_BC,SPEED_SLOW,angle,100,true,true);
}
int searchDirection(long ang) { //現在の方...
long angle,tacho_min=0,tacho_corr;
int d_min;
d_min=300; //仮の最小値
angle = (track/diameter)*ang; //旋回角度か...
turnAng(ang/2); //指定された...
ResetTachoCount(OUT_BC); //角度計測をリ...
OnFwdSync(OUT_BC,SPEED_SLOW,-100); //反時計回りに...
while(MotorTachoCount(OUT_B)<=angle){
if(SensorUS(S1)<d_min){
d_min=SensorUS(S1); //仮の最小値を...
PlaySound(SOUND_UP);
tacho_min=MotorTachoCount(OUT_B);
}
}
OnFwdSyncEx(OUT_BC,SPEED_SLOW,100,RESET_NONE);
until(MotorTachoCount(OUT_B)<=tacho_min||SensorUS(S1)<=d...
Wait(14); //微調整
Off(OUT_BC);Wait(500);
return d_min;
}
task main()
{
int d = searchDirection(120); //現在の方向...
if(d > ○){
fwdDist(d-○);}
else {fwdDist(d-○);} //紙コップの...
PlaySound(SOUND_UP);
}
**Bluetoothを利用したプログラム [#x935b665]
2つのNXCがBluetoothでつながっている状態であることを前提で...
ここではマスター側からスレーブ側に指示を出すプログラムを...
#define CONN 1 //スレーブ(...
task main()
{
until (BluetoothStatus(CONN) == NO_ERR); //接続できる...
//マスター側のプログラム//
RemoteStartProgram(CONN, "〜.rxe"); //スレーブ...
}
逆にスレーブ側からマスター側に指示を出す場合は接続番号を0...
**問題点・改善点 [#l23eb6c6]
アームやレールの動作をするプログラムで、始めは全て角度を...
今まで紹介してきたプログラムを複数のプログラムに分け、Blu...
**スレーブ側 [#p93594c5]
***アーム動作(arm time) [#dd328ea5]
#define SPEED1 45
#define SPEED2 60
#define SPEED3 10
#define SPEED4 30
#define SPEED5 50
#define SPEED6 25
float GetAngle(float d)
{
const float diameter=5.45;
const float pi=3.1415;
float ang = d/(diameter*pi)*360.0;
return ang;
}
#define DOWN RotateMotor(OUT_A,SPEED3,105);
#define UP RotateMotor(OUT_A,-SPEED5,105);
#define LDown RotateMotor(OUT_A,SPEED3,25);
#define LUp RotateMotor(OUT_A,-SPEED2,25);
#define Catch RotateMotor(OUT_B,-SPEED4,105);
#define Separate RotateMotor(OUT_B,SPEED4,105);
task main ()
{
OnFwd(OUT_A,10);
Wait(1500);
Catch; //アーム全体を下げ、...
OnRev(OUT_A,50);
Wait(3500); //アーム全体を上げ、...
Wait(2000);
OnFwd(OUT_A,10);
Wait(3500); //アーム全体を下げ、...
Separate;
OnRev(OUT_A,35);
Wait(2000); //アーム全体を上げる(...
Wait(500);
}
***レール動作(rail) [#u382c2a1]
#define SPEED1 45
#define SPEED2 60
#define SPEED3 10
#define SPEED4 30
#define SPEED5 50
float GetAngle(float d)
{
const float diameter=5.45;
const float pi=3.1415;
float ang = d/(diameter*pi)*360.0;
return ang;
}
#define Into1 RotateMotor(OUT_C,SPEED3,20); //ボールを...
#define Return1 RotateMotor(OUT_C,-SPEED3,25);
#define Into2 RotateMotor(OUT_C,SPEED4,30);
#define Return2 RotateMotor(OUT_C,-SPEED4,15);
task main(){
OnFwd(OUT_C,15);
Wait(1000);
Wait(3000); //レールを傾け、4つの内2...
OnRev(OUT_C,30);
Wait(500);
Wait(5000);
OnFwd(OUT_C,25);
Wait(1000);
Wait(3000); //レールを傾け、レールに...
OnRev(OUT_C,30);
Wait(2500);
}
**マスター側 [#wa6a612a]
上記のプログラムの説明で利用した定義にプラスする。
#define turn_right_here OnFwd(OUT_B,SPEED_SLOW);OnFwd(OU...
***本番用に用意したプログラム [#ne735f23]
task main() {
SetSensorLowspeed(S1);
until (BluetoothStatus(CONN) == NO_ERR);
OnFwd(OUT_BC,50); //100cm前に前進...
Wait(5500);
int d1 = searchDirection(120); //紙コップの方向...
if(d1 > 15){
fwdDist(d1-15.0);}
else {fwdDist(d1-15);} //最低値を発見し...
PlaySound(SOUND_UP);
turn_right_here; //アームが掴める...
Wait(2500);
RemoteStartProgram(CONN, "arm time.rxe"); //スレーブの...
Off(OUT_BC);
Wait(10000);
Wait(10000); //スレーブ側の...
Wait(10000);
int angle1 = GetAngle(20);
RotateMotor(OUT_BC,-SPEED,angle1); //20cm後進する
OnFwd(OUT_B,-SPEED);
OnFwd(OUT_C,SPEED); //180度回転
Wait(1500);
angle1 += GetAngle(60);
RotateMotor(OUT_BC,SPEED,angle1); //60cm前進する
int d2 = searchDirection(120);
if(d2 > 15){
fwdDist(d2-15.0);}
else {fwdDist(d2-15);}
PlaySound(SOUND_UP);
turn_right_here;
Wait(200);
RemoteStartProgram(CONN, "arm time.rxe");
Off(OUT_BC);
Wait(10000);
Wait(10000);
Wait(10000);
int angle2 = GetAngle(20);
RotateMotor(OUT_BC,-SPEED,angle2);
OnFwd(OUT_B,-SPEED);
OnFwd(OUT_C,SPEED);
Wait(1500);
angle2 += GetAngle(60);
RotateMotor(OUT_BC,SPEED,angle2);
int d3 = searchDirection(120);
turn_right_here; //微調整
Wait(600);
if(d3 > 15){
fwdDist(d3);}
else {fwdDist(d3);} //紙コップを見つ...
PlaySound(SOUND_UP);
RemoteStartProgram(CONN, "rail.rxe"); //スレーブの「rai...
Off(OUT_BC);
Wait(10000);
Wait(10000);
Wait(10000);
int angle3 = GetAngle(20);
RotateMotor(OUT_BC,-SPEED,angle3);
OnFwd(OUT_B,-SPEED);
OnFwd(OUT_C,SPEED);
Wait(1500);
angle3 += GetAngle(60);
RotateMotor(OUT_BC,SPEED,angle3);
int d4 = searchDirection(120);
turn_right_here;
Wait(600);
if(d4 > 15){
fwdDist(d4);}
else {fwdDist(d4);}
PlaySound(SOUND_UP);
RemoteStartProgram(CONN, "rail.rxe");
}
***最終的に使用したプログラム [#sb4129f9]
本番でsearchDirectionが上手く作動しなかったため、最終手段...
task main() {
SetSensorLowspeed(S1);
until (BluetoothStatus(CONN) == NO_ERR);
OnFwd(OUT_BC,50);
Wait(5500); //100cmほど前進...
turn_right_here; //アームが掴める...
Wait(2000);
RemoteStartProgram(CONN, "arm time.rxe"); //スレーブの...
Off(OUT_BC);
Wait(10000);
Wait(10000); //スレーブ側のプ...
OnFwd(OUT_B,-SPEED);
OnFwd(OUT_C,SPEED);
Wait(700); //別の紙コップを...
OnFwd(OUT_BC,50);
Wait(4000);
RemoteStartProgram(CONN, "rail.rxe"); //スレーブ...
Off(OUT_BC);
}
このプログラムで本番は1つのボールの移動に成功することが出...
*感想 [#f09587f0]
ロボット・プログラムの製作が今までと比べ物にならないほど...
終了行:
[[2014b/Member]]
#contents
*はじめに [#o4d8a879]
課題3はスタート地点からロボットを進め、2つの紙コップにそ...
([[2014年後期/課題3:http://yakushi.shinshu-u.ac.jp/roboti...
私たちの班のメンバーは、
-[[edaeda:http://yakushi.shinshu-u.ac.jp/robotics/?2014b%...
-[[knee:http://yakushi.shinshu-u.ac.jp/robotics/?2014b%2F...
- kuryu
と私の4人である。
私たちの班の考案は、アームとレールを作り、アームを使って...
*ロボット、またはその動作の説明 [#h9193c48]
**全体 [#ne8db113]
#ref(2014b/Member/arisyka/Mission3/IMG_3870.JPG,20%)
写真のような構造である。
右と左のタイヤの負荷がそれぞれ異なるため、プログラムで左...
**アーム [#y4bd3434]
#ref(2014b/Member/arisyka/Mission3/IMG_3869.gif,30%)
上の写真の赤で囲まれた部分。
1のモーターでアーム全体を上げ下げし、2のモーターでアーム...
アームを動かすために使った定義は以下のようである。
#define SPEED1 45
#define SPEED2 60
#define SPEED3 10
#define SPEED4 30
#define SPEED5 50
#define SPEED6 25
float GetAngle(float d) { //進む距離...
const float diameter=5.45; //タイヤの...
const float pi=3.1415; //円周率
float ang = d/(diameter*pi)*360.0; return ang; //角度を...
}
ここの定義はアーム全体の動きを定義している。(上の写真の?...
#define DOWN RotateMotor(OUT_A,SPEED3,105); //アーム...
#define UP RotateMotor(OUT_A,-SPEED5,105); //アーム全...
#define LDown RotateMotor(OUT_A,SPEED3,25);
#define LUp RotateMotor(OUT_A,-SPEED2,25);
#define Little LDown;Wait(2000);LUp; //ボールを...
#ref(2014b/Member/arisyka/Mission3/armループ2.gif,45%)
ここの定義はアームのハサミ部分の動きを定義している。(上の...
#define Catch RotateMotor(OUT_B,-SPEED4,105); //アー...
#define Separate RotateMotor(OUT_B,SPEED4,105); //アー...
#ref(2014b/Member/arisyka/Mission3/catch&separate.gif,40%)
**レール [#k920454a]
#ref(2014b/Member/arisyka/Mission3/IMG_3873.gif,30%)
上の写真の赤で囲まれた部分。また、橙色で囲まれた部分はボ...
レールを動かすために使った動作は上記に書いたアームの定義...
#define Into1 RotateMotor(OUT_C,SPEED3,20); //ボー...
#define Return1 RotateMotor(OUT_C,-SPEED3,25); //レー...
#define Into2 RotateMotor(OUT_C,SPEED4,30); //ボー...
#define Return2 RotateMotor(OUT_C,-SPEED4,15); //レー...
*プログラム [#ec7cd753]
今回使用するプログラムは上記にも示したアーム・レールの動作...
**超音波センサを利用した動き [#l3e463dd]
ここで紹介しているプログラムは配られたプリントに書かれて...
#define SPEED 50
#define SPEED_SLOW 40
float GetAngle(float d) { //進む距離...
const float diameter=5.45; //タイヤの...
const float pi=3.1415; //円周率
float ang = d/(diameter*pi)*360.0; return ang; //角度を...
}
const float diameter = 5.45;
const float track = 15; //タイヤの...
const float pi = 3.1415;
void fwdDist(float d) { //距離 d ?...
long angle;
angle = d/(diameter*pi)*360.0;
RotateMotorEx(OUT_BC,SPEED_SLOW,angle,0,true,true);
}
void turnAng(long ang) { //角度 ang ...
long angle;
angle = track/diameter * ang;
RotateMotorEx(OUT_BC,SPEED_SLOW,angle,100,true,true);
}
int searchDirection(long ang) { //現在の方...
long angle,tacho_min=0,tacho_corr;
int d_min;
d_min=300; //仮の最小値
angle = (track/diameter)*ang; //旋回角度か...
turnAng(ang/2); //指定された...
ResetTachoCount(OUT_BC); //角度計測をリ...
OnFwdSync(OUT_BC,SPEED_SLOW,-100); //反時計回りに...
while(MotorTachoCount(OUT_B)<=angle){
if(SensorUS(S1)<d_min){
d_min=SensorUS(S1); //仮の最小値を...
PlaySound(SOUND_UP);
tacho_min=MotorTachoCount(OUT_B);
}
}
OnFwdSyncEx(OUT_BC,SPEED_SLOW,100,RESET_NONE);
until(MotorTachoCount(OUT_B)<=tacho_min||SensorUS(S1)<=d...
Wait(14); //微調整
Off(OUT_BC);Wait(500);
return d_min;
}
task main()
{
int d = searchDirection(120); //現在の方向...
if(d > ○){
fwdDist(d-○);}
else {fwdDist(d-○);} //紙コップの...
PlaySound(SOUND_UP);
}
**Bluetoothを利用したプログラム [#x935b665]
2つのNXCがBluetoothでつながっている状態であることを前提で...
ここではマスター側からスレーブ側に指示を出すプログラムを...
#define CONN 1 //スレーブ(...
task main()
{
until (BluetoothStatus(CONN) == NO_ERR); //接続できる...
//マスター側のプログラム//
RemoteStartProgram(CONN, "〜.rxe"); //スレーブ...
}
逆にスレーブ側からマスター側に指示を出す場合は接続番号を0...
**問題点・改善点 [#l23eb6c6]
アームやレールの動作をするプログラムで、始めは全て角度を...
今まで紹介してきたプログラムを複数のプログラムに分け、Blu...
**スレーブ側 [#p93594c5]
***アーム動作(arm time) [#dd328ea5]
#define SPEED1 45
#define SPEED2 60
#define SPEED3 10
#define SPEED4 30
#define SPEED5 50
#define SPEED6 25
float GetAngle(float d)
{
const float diameter=5.45;
const float pi=3.1415;
float ang = d/(diameter*pi)*360.0;
return ang;
}
#define DOWN RotateMotor(OUT_A,SPEED3,105);
#define UP RotateMotor(OUT_A,-SPEED5,105);
#define LDown RotateMotor(OUT_A,SPEED3,25);
#define LUp RotateMotor(OUT_A,-SPEED2,25);
#define Catch RotateMotor(OUT_B,-SPEED4,105);
#define Separate RotateMotor(OUT_B,SPEED4,105);
task main ()
{
OnFwd(OUT_A,10);
Wait(1500);
Catch; //アーム全体を下げ、...
OnRev(OUT_A,50);
Wait(3500); //アーム全体を上げ、...
Wait(2000);
OnFwd(OUT_A,10);
Wait(3500); //アーム全体を下げ、...
Separate;
OnRev(OUT_A,35);
Wait(2000); //アーム全体を上げる(...
Wait(500);
}
***レール動作(rail) [#u382c2a1]
#define SPEED1 45
#define SPEED2 60
#define SPEED3 10
#define SPEED4 30
#define SPEED5 50
float GetAngle(float d)
{
const float diameter=5.45;
const float pi=3.1415;
float ang = d/(diameter*pi)*360.0;
return ang;
}
#define Into1 RotateMotor(OUT_C,SPEED3,20); //ボールを...
#define Return1 RotateMotor(OUT_C,-SPEED3,25);
#define Into2 RotateMotor(OUT_C,SPEED4,30);
#define Return2 RotateMotor(OUT_C,-SPEED4,15);
task main(){
OnFwd(OUT_C,15);
Wait(1000);
Wait(3000); //レールを傾け、4つの内2...
OnRev(OUT_C,30);
Wait(500);
Wait(5000);
OnFwd(OUT_C,25);
Wait(1000);
Wait(3000); //レールを傾け、レールに...
OnRev(OUT_C,30);
Wait(2500);
}
**マスター側 [#wa6a612a]
上記のプログラムの説明で利用した定義にプラスする。
#define turn_right_here OnFwd(OUT_B,SPEED_SLOW);OnFwd(OU...
***本番用に用意したプログラム [#ne735f23]
task main() {
SetSensorLowspeed(S1);
until (BluetoothStatus(CONN) == NO_ERR);
OnFwd(OUT_BC,50); //100cm前に前進...
Wait(5500);
int d1 = searchDirection(120); //紙コップの方向...
if(d1 > 15){
fwdDist(d1-15.0);}
else {fwdDist(d1-15);} //最低値を発見し...
PlaySound(SOUND_UP);
turn_right_here; //アームが掴める...
Wait(2500);
RemoteStartProgram(CONN, "arm time.rxe"); //スレーブの...
Off(OUT_BC);
Wait(10000);
Wait(10000); //スレーブ側の...
Wait(10000);
int angle1 = GetAngle(20);
RotateMotor(OUT_BC,-SPEED,angle1); //20cm後進する
OnFwd(OUT_B,-SPEED);
OnFwd(OUT_C,SPEED); //180度回転
Wait(1500);
angle1 += GetAngle(60);
RotateMotor(OUT_BC,SPEED,angle1); //60cm前進する
int d2 = searchDirection(120);
if(d2 > 15){
fwdDist(d2-15.0);}
else {fwdDist(d2-15);}
PlaySound(SOUND_UP);
turn_right_here;
Wait(200);
RemoteStartProgram(CONN, "arm time.rxe");
Off(OUT_BC);
Wait(10000);
Wait(10000);
Wait(10000);
int angle2 = GetAngle(20);
RotateMotor(OUT_BC,-SPEED,angle2);
OnFwd(OUT_B,-SPEED);
OnFwd(OUT_C,SPEED);
Wait(1500);
angle2 += GetAngle(60);
RotateMotor(OUT_BC,SPEED,angle2);
int d3 = searchDirection(120);
turn_right_here; //微調整
Wait(600);
if(d3 > 15){
fwdDist(d3);}
else {fwdDist(d3);} //紙コップを見つ...
PlaySound(SOUND_UP);
RemoteStartProgram(CONN, "rail.rxe"); //スレーブの「rai...
Off(OUT_BC);
Wait(10000);
Wait(10000);
Wait(10000);
int angle3 = GetAngle(20);
RotateMotor(OUT_BC,-SPEED,angle3);
OnFwd(OUT_B,-SPEED);
OnFwd(OUT_C,SPEED);
Wait(1500);
angle3 += GetAngle(60);
RotateMotor(OUT_BC,SPEED,angle3);
int d4 = searchDirection(120);
turn_right_here;
Wait(600);
if(d4 > 15){
fwdDist(d4);}
else {fwdDist(d4);}
PlaySound(SOUND_UP);
RemoteStartProgram(CONN, "rail.rxe");
}
***最終的に使用したプログラム [#sb4129f9]
本番でsearchDirectionが上手く作動しなかったため、最終手段...
task main() {
SetSensorLowspeed(S1);
until (BluetoothStatus(CONN) == NO_ERR);
OnFwd(OUT_BC,50);
Wait(5500); //100cmほど前進...
turn_right_here; //アームが掴める...
Wait(2000);
RemoteStartProgram(CONN, "arm time.rxe"); //スレーブの...
Off(OUT_BC);
Wait(10000);
Wait(10000); //スレーブ側のプ...
OnFwd(OUT_B,-SPEED);
OnFwd(OUT_C,SPEED);
Wait(700); //別の紙コップを...
OnFwd(OUT_BC,50);
Wait(4000);
RemoteStartProgram(CONN, "rail.rxe"); //スレーブ...
Off(OUT_BC);
}
このプログラムで本番は1つのボールの移動に成功することが出...
*感想 [#f09587f0]
ロボット・プログラムの製作が今までと比べ物にならないほど...
ページ名: