2017b/Member/Taka/Mission3
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
検索
|
最終更新
|
ヘルプ
|
ログイン
]
開始行:
目次
#contents
*課題 [#g3e72158]
&ref(2017b/Member/Taka/Mission3/2017b-mission3.png,640x48...
ピンポン玉と紙コップを別々に回収してピンポン玉はX地点、紙...
[[2017b/Mission3]]
*ロボットの説明 [#ge5bb7e8]
機体A→&ref(2017b/Member/Taka/Mission3/ロボティクス課題3_...
機体B→&ref(2017b/Member/Taka/Mission3/課題3_22.jpg,240x3...
今回同じようなつくりの機体を2機作成した。それぞれ別で作...
**機体A [#f81a56b2]
前 &ref(2017b/Member/Taka/Mission3/ロボティクス課題3_22....
後ろ &ref(2017b/Member/Taka/Mission3/ロボティクス課題3_8...
機体の前に超音波センサー、後ろに紙コップを掴んで持ち上げ...
**機体B [#x4370c4a]
基本的にはAと同じような機構である。Bにはライトセンサー...
[[2017b/Member/takeshi/Mission3]]
[[2017b/Member/Yoshi/Mission3]]
**紙コップを掴んで持ち上げる機構 [#o2649631]
機体本体にモーターを2つ使ってしまっているので、1つのモ...
&ref(2017b/Member/Taka/Mission3/ロボティクス課題3_4.jpg,2...
紙コップを掴む・持ち上げる・重ねる流れは次の通りだ。
&ref(2017b/Member/Taka/Mission3/ロボ課題3_9.jpg,320x240,...
掴むアームを開いた状態で紙コップの前に行き、紙コップがア...
&ref(2017b/Member/Taka/Mission3/ロボティクス課題3_13.jpg,...
掴むアームがこれ以上閉まらないとなると、アーム全体が上が...
&ref(2017b/Member/Taka/Mission3/ロボティクス課題3_17.jpg,...
紙コップを掴んで持ち上げた状態で動き、すでに置かれている...
*プログラムの説明 [#dbc7025f]
&ref(2017b/Member/Taka/Mission3/ロボ課題3_23.jpg,640x480,...
機体Aは左側、機体Bは右側からスタートする。紙コップは左...
紙コップを取り、ピンポン玉をX地点へ置く順番は、1→2→3の...
Y地点に紙コップを置く順番は、2→1→3の順である。
紙コップ1と3は機体A、紙コップ2は機体Bが担当する。
**機体A [#b0494eca]
正確さや調整のしやすさを考えて遅めのスピードに定義した。
#define SPEED_SLOW 25
紙コップを探して、その紙コップの手前まで進むプログラムで...
const float diameter = 5.45; //タイヤの直径(cm)
const float track = 10.91; //タイヤのトレッド幅(cm)
const float pi = 3.1415; //円周率
void fwdDist(float d) //距離 d cm 前進
{
long angle = d/(diameter*pi)*360.0; //必要なタイヤ...
RotateMotorEx(OUT_AB,SPEED_SLOW, angle,0,true,true);
}
void baDist(float d) //距離 d cm 後進
{
long angle = d/(diameter*pi)*360.0; //必要なタイヤ...
RotateMotorEx(OUT_AB,SPEED_SLOW, -angle,0,true,true);
}
void turnAng(long ang) //角度ang度の時計回りの旋回
{
long angle = track/diameter * ang; //必要なタイヤ...
RotateMotorEx(OUT_AB,SPEED_SLOW, angle,100,true,true);
}
void nturnAng(long ang) //角度ang度の時計回りの旋回
{
long angle = track/diameter * ang; //必要なタイヤ...
RotateMotorEx(OUT_AB,SPEED_SLOW, angle,0,true,true);
}
int searchDirection(long ang) //現在の方向を中心にang度...
//障害物までの距離を...
{
long tacho_min ; //もっとも近い距離を実現するタイ...
int d_min = 300 ; //もっとも近い距離の仮の最小値
long angle = (track/diameter)*ang; //旋回角度からタ...
turnAng(ang/2); //指定された角度の半分を旋回
ResetTachoCount(OUT_AB); //角度計測をリセット
OnFwdSync(OUT_AB,SPEED_SLOW,-100); //反時計回りに...
while(MotorTachoCount(OUT_A)<=angle){
if (SensorUS(S1)<d_min){ //現在の距離が仮...
d_min = SensorUS(S1); //仮の最小値を更新
tacho_min = MotorTachoCount(OUT_A); //この時...
}
}
OnFwdSyncEx(OUT_AB,SPEED_SLOW,100,RESET_NONE);
until(MotorTachoCount(OUT_A)<=tacho_min || SensorUS(...
Wait(14); //微調整
Off(OUT_AB);Wait(500);
return d_min;
}
本文の一番初めのプログラムを例にすると、int d = searchDir...
紙コップを掴んで持ち上げる・アームを開いて下げるプログラ...
sub c_up(float d) //645で最大
{
RotateMotor(OUT_C,-30,d);
Off(OUT_C);
}
sub c_down(float d)
{
RotateMotor(OUT_C,30,d);
Off(OUT_C);
}
プログラムの本文である。
紙コップを取る流れとしては、探して近づき反転してアームを...
task main()
{
SetSensorLowspeed(S1);
int d = searchDirection(30); //紙コップ1の方向を...
if (d > 10){
fwdDist(d-25.0);
}
ここの検知は超音波センサーの取り付け角度の具合でうまくい...
turnAng(200); //200度の時計回りの旋回
c_down(640); //アームを開いて下げる
OnFwdSyncEx(OUT_AB,SPEED_SLOW,100,RESET_NONE);
Off(OUT_AB); //こ...
baDist(12.0); //12cm後退
c_up(260); //紙コップ1をつかんで少し上げる
ResetTachoCount(OUT_AB); //角度計測をリセット
turnAng(110); //110度の時計回りの旋回
OnFwdSyncEx(OUT_AB,SPEED_SLOW,100,RESET_NONE);
Off(OUT_AB); //微...
baDist(11.0); //11cm後退
c_up(330); //紙コップ1を上げ、ピンポン玉をはなす
ResetTachoCount(OUT_AB); //角度計測をリセット
turnAng(90); //90度の時計回りの旋回
OnFwdSyncEx(OUT_AB,SPEED_SLOW,100,RESET_NONE);
Off(OUT_AB); //微...
fwdDist(17.0); //17cm前進
ResetTachoCount(OUT_AB); //角度計測をリセット
turnAng(80); //80度の時計回りの旋回
ResetTachoCount(OUT_AB); //角度計測をリセット
int e = searchDirection(40); //障害の紙コップの方...
int msg; // 受け取った値を格納する変数
while (true) { //メッセージ...
ReceiveRemoteNumber(MAILBOX1,true,msg);
if (msg == 1){
break; //while文を抜け出す
} else {
Off(OUT_AB);
}
Wait(100);
}
Off(OUT_AB);Wait(3000); //3秒停止
while文で機体Bからの信号が来るまで停止させ、信号が来たら...
ResetTachoCount(OUT_AB); //角度計測をリセット
turnAng(30); //30度の時計回りの旋回
OnFwdSyncEx(OUT_AB,SPEED_SLOW,100,RESET_NONE);
Off(OUT_AB); //微...
fwdDist(15.0); //15cm前進
ResetTachoCount(OUT_AB); //角度計測をリセット
int f = searchDirection(30); //紙コップ2の方向を...
if (f > 10){
fwdDist(f-25.0);
}
ResetTachoCount(OUT_AB); //角度計測をリセット
turnAng(156); //156度の時計回りの旋回
OnFwdSyncEx(OUT_AB,SPEED_SLOW,100,RESET_NONE);
Off(OUT_AB); //微...
baDist(8.0); //8cm後退
c_down(100); //アームを開き、紙コップ1をはなす
OnFwdSyncEx(OUT_AB,SPEED_SLOW,100,RESET_NONE);
Off(OUT_AB); //微...
baDist(2.0); //2cm後退
紙コップをはなすだけでは紙コップが完全に入らなかったり引...
OnFwdSyncEx(OUT_AB,SPEED_SLOW,100,RESET_NONE);
Off(OUT_AB); //微...
fwdDist(12.0); //12cm前進
c_up(100); //アームを最大まで上げる
アームを最大まで上げることで、紙コップ3も1の時と同様の...
ResetTachoCount(OUT_AB); //角度計測をリセット
turnAng(230); //230度の時計回りの旋回
ResetTachoCount(OUT_AB); //角度計測をリセット
int g = searchDirection(20); //紙コップ3の方...
if (g > 10){
fwdDist(g-25.0);
}
turnAng(190); //190度の時計回りの旋回
c_down(630); //アームを開いて下げる
OnFwdSyncEx(OUT_AB,SPEED_SLOW,100,RESET_NONE);
Off(OUT_AB); //微...
baDist(16.0); //16cm後退
c_up(270); //紙コップ3をつかんで少し上げる
ResetTachoCount(OUT_AB); //角度計測をリセット
turnAng(140); //140度の時計回りの旋回
c_up(340); //紙コップ3を上げ、ピンポン玉をはなす
ResetTachoCount(OUT_AB); //角度計測をリセット
turnAng(290); //290度の時計回りの旋回
OnFwdSyncEx(OUT_AB,SPEED_SLOW,100,RESET_NONE);
Off(OUT_AB); //微...
baDist(12.0); //12cm後退
ResetTachoCount(OUT_AB); //角度計測をリセット
int h = searchDirection(20); //紙コップ1の方...
if (h > 10){
fwdDist(h-25.0);
}
ResetTachoCount(OUT_AB); //角度計測をリセット
turnAng(156); //156度の時計回りの旋回
OnFwdSyncEx(OUT_AB,SPEED_SLOW,100,RESET_NONE);
Off(OUT_AB); //微...
baDist(8.0); //8cm後退
c_down(100); //アームを開き、紙コップ3をはなす
OnFwdSyncEx(OUT_AB,SPEED_SLOW,100,RESET_NONE);
Off(OUT_AB); //微...
baDist(2.0); //2cm後退
OnFwdSyncEx(OUT_AB,SPEED_SLOW,100,RESET_NONE);
Off(OUT_AB); //微...
fwdDist(12.0); //12cm前進
}
紙コップ3も1と同様にうまく入るように少し揺らす動きを入...
**機体B [#g68c373f]
スピードや時間などを定義している。
#define Apower 37
#define Bpower 34 //直進するのに必要な出力
#define ttime 695 //90度曲がるのに必要な時間
#define SPEED 50
#define SPEED_SLOW 30
サブルーチン。
sub go_for() //前進
{
OnFwd(OUT_A,Apower);
OnFwd(OUT_B,Bpower);
}
sub go_back() //後退
{
OnFwd(OUT_A,-Apower);
OnFwd(OUT_B,-Bpower);
}
sub turnL(float c) //左に曲がる
{
OnFwd(OUT_A,Apower);OnFwd(OUT_B,-Bpower);
Wait(c*ttime);
Float(OUT_AB); //左に曲がる(c×90)度
}
sub turnR(float c) //右に曲がる
{
OnFwd(OUT_A,-Apower);OnFwd(OUT_B,Bpower);
Wait(c*ttime);
Float(OUT_AB); //右に曲がる(c×90)度
}
int cyari(int lsw) //スタート時の位置調整
{
ResetTachoCount(OUT_C);
SetSensorLight(S1);
SetSensorMode(S1,SENSOR_MODE_RAW);
SetSensorTouch(S4);
int i=1;
int lsb=SENSOR_1;
int lsb2=SENSOR_1-1;
while (i==1){
go_for();
lsb2=SENSOR_1;
NumOut(80,LCD_LINE4,lsb2);
if (lsb>lsb2) {
lsb=lsb2;
}
if (lsb+10<lsb2) {
i=10;
}
if (lsb>lsw-150) {
i=1;
}
}
Off(OUT_AB);
NumOut(80,LCD_LINE1,lsw);
NumOut(80,LCD_LINE2,lsb);
return lsb;
}
const float diameter=5.45; //タイヤの直径
const float track=11.35; //タイヤのトレッド幅
const float pi=3.1415; //円周率
void fwdDist(float d) //距離dcm前進
{
long angle=d/(diameter*pi)*360.0;
RotateMotorEx(OUT_AB,SPEED_SLOW,angle,0,true,true);
}
void turnAng(long ang) //角度ang度の時計回りの旋回
{
long angle=track/diameter*ang;
RotateMotorEx(OUT_AB,SPEED_SLOW,angle,100,true,true);
}
sub arm(int c) //アームを動かす
{
RotateMotor(OUT_C, 40,c);
Off(OUT_C);
}
プログラムの本文である。
task main ()
{
ResetTachoCount(OUT_C);
SetSensorLight(S1);
SetSensorMode(S1,SENSOR_MODE_RAW);
SetSensorTouch(S4);
int lsw=SENSOR_1;
int lsb=cyari(lsw);
while(SENSOR_4==0) {}
fwdDist(15);
Wait(15000);
turnL(1.1);//1
PlaySound(SOUND_UP);
Wait(1000);
fwdDist(30);
Wait(1000);
turnAng(40);
PlaySound(SOUND_UP);
turnAng(180);
Wait(1000);
fwdDist(15);
Wait(1000);
arm(550);
Wait(1000);
go_back();
Wait(2000);
Off(OUT_AB);
arm(-180);
Wait(1000);
arm(-45);
Wait(1000);
turnL(1.05);//2
Wait(1000);
arm(-200);
fwdDist(35);
turnL(0.4);
Wait(1000);
arm(100);
PlaySound(SOUND_UP);
SendRemoteNumber(1,MAILBOX1,1);
fwdDist(20);
while(SENSOR_4==0) {}
}
機体Bの大まかな動きの流れとしては、機体Aが紙コップ1の...
[[2017b/Member/takeshi/Mission3]]
[[2017b/Member/Yoshi/Mission3]]
**プログラムの理想の流れ [#z4b60dcd]
プログラムがすべて完璧に動いた場合の理想とする流れである。
&ref(2017b/Member/Taka/Mission3/ロボティクス23.jpg,320x24...
まず機体Aが紙コップ1を検知して、紙コップ1の前へ進む。
&ref(2017b/Member/Taka/Mission3/ロボティクス24.jpg,320x24...
機体Aは紙コップ1を掴む。機体Bは少し前進。
&ref(2017b/Member/Taka/Mission3/ロボティクス25.jpg,320x24...
機体Aは紙コップ1をX地点まで運び、紙コップ1の中にあった...
&ref(2017b/Member/Taka/Mission3/ロボティクス26.jpg,320x24...
機体Aは紙コップ1を持った状態で紙コップ2の上方にある紙...
&ref(2017b/Member/Taka/Mission3/ロボティクス27.jpg,320x24...
機体Aは待機。機体Bは紙コップ2をX地点まで運び、紙コップ...
&ref(2017b/Member/Taka/Mission3/ロボティクス28.jpg,320x24...
機体Aは待機。機体Bは紙コップ2をY地点へ置き、機体Aに信...
&ref(2017b/Member/Taka/Mission3/ロボティクス29.jpg,320x24...
機体Aは信号を受け取った後、Y地点の紙コップ2を検知してそ...
&ref(2017b/Member/Taka/Mission3/ロボティクス30.jpg,320x24...
機体Aは紙コップ3を検知して移動し、紙コップ3を掴む。
&ref(2017b/Member/Taka/Mission3/ロボティクス31.jpg,320x24...
機体Aは紙コップ3をX地点まで運び、紙コップ3の中にあった...
&ref(2017b/Member/Taka/Mission3/ロボティクス32.jpg,320x24...
機体AはY地点の紙コップ1及び2を検知してその前まで行き、...
実際は紙コップ1のピンポンを置くところまではうまくいき、...
*結果と反省 [#m7bd1622]
本番では、実は機体Bが最初に紙コップ2を取りに行き、その...
*感想 [#oba2b888]
今回は、4人で行う課題でロボットも2台だったのでうまく分...
終了行:
目次
#contents
*課題 [#g3e72158]
&ref(2017b/Member/Taka/Mission3/2017b-mission3.png,640x48...
ピンポン玉と紙コップを別々に回収してピンポン玉はX地点、紙...
[[2017b/Mission3]]
*ロボットの説明 [#ge5bb7e8]
機体A→&ref(2017b/Member/Taka/Mission3/ロボティクス課題3_...
機体B→&ref(2017b/Member/Taka/Mission3/課題3_22.jpg,240x3...
今回同じようなつくりの機体を2機作成した。それぞれ別で作...
**機体A [#f81a56b2]
前 &ref(2017b/Member/Taka/Mission3/ロボティクス課題3_22....
後ろ &ref(2017b/Member/Taka/Mission3/ロボティクス課題3_8...
機体の前に超音波センサー、後ろに紙コップを掴んで持ち上げ...
**機体B [#x4370c4a]
基本的にはAと同じような機構である。Bにはライトセンサー...
[[2017b/Member/takeshi/Mission3]]
[[2017b/Member/Yoshi/Mission3]]
**紙コップを掴んで持ち上げる機構 [#o2649631]
機体本体にモーターを2つ使ってしまっているので、1つのモ...
&ref(2017b/Member/Taka/Mission3/ロボティクス課題3_4.jpg,2...
紙コップを掴む・持ち上げる・重ねる流れは次の通りだ。
&ref(2017b/Member/Taka/Mission3/ロボ課題3_9.jpg,320x240,...
掴むアームを開いた状態で紙コップの前に行き、紙コップがア...
&ref(2017b/Member/Taka/Mission3/ロボティクス課題3_13.jpg,...
掴むアームがこれ以上閉まらないとなると、アーム全体が上が...
&ref(2017b/Member/Taka/Mission3/ロボティクス課題3_17.jpg,...
紙コップを掴んで持ち上げた状態で動き、すでに置かれている...
*プログラムの説明 [#dbc7025f]
&ref(2017b/Member/Taka/Mission3/ロボ課題3_23.jpg,640x480,...
機体Aは左側、機体Bは右側からスタートする。紙コップは左...
紙コップを取り、ピンポン玉をX地点へ置く順番は、1→2→3の...
Y地点に紙コップを置く順番は、2→1→3の順である。
紙コップ1と3は機体A、紙コップ2は機体Bが担当する。
**機体A [#b0494eca]
正確さや調整のしやすさを考えて遅めのスピードに定義した。
#define SPEED_SLOW 25
紙コップを探して、その紙コップの手前まで進むプログラムで...
const float diameter = 5.45; //タイヤの直径(cm)
const float track = 10.91; //タイヤのトレッド幅(cm)
const float pi = 3.1415; //円周率
void fwdDist(float d) //距離 d cm 前進
{
long angle = d/(diameter*pi)*360.0; //必要なタイヤ...
RotateMotorEx(OUT_AB,SPEED_SLOW, angle,0,true,true);
}
void baDist(float d) //距離 d cm 後進
{
long angle = d/(diameter*pi)*360.0; //必要なタイヤ...
RotateMotorEx(OUT_AB,SPEED_SLOW, -angle,0,true,true);
}
void turnAng(long ang) //角度ang度の時計回りの旋回
{
long angle = track/diameter * ang; //必要なタイヤ...
RotateMotorEx(OUT_AB,SPEED_SLOW, angle,100,true,true);
}
void nturnAng(long ang) //角度ang度の時計回りの旋回
{
long angle = track/diameter * ang; //必要なタイヤ...
RotateMotorEx(OUT_AB,SPEED_SLOW, angle,0,true,true);
}
int searchDirection(long ang) //現在の方向を中心にang度...
//障害物までの距離を...
{
long tacho_min ; //もっとも近い距離を実現するタイ...
int d_min = 300 ; //もっとも近い距離の仮の最小値
long angle = (track/diameter)*ang; //旋回角度からタ...
turnAng(ang/2); //指定された角度の半分を旋回
ResetTachoCount(OUT_AB); //角度計測をリセット
OnFwdSync(OUT_AB,SPEED_SLOW,-100); //反時計回りに...
while(MotorTachoCount(OUT_A)<=angle){
if (SensorUS(S1)<d_min){ //現在の距離が仮...
d_min = SensorUS(S1); //仮の最小値を更新
tacho_min = MotorTachoCount(OUT_A); //この時...
}
}
OnFwdSyncEx(OUT_AB,SPEED_SLOW,100,RESET_NONE);
until(MotorTachoCount(OUT_A)<=tacho_min || SensorUS(...
Wait(14); //微調整
Off(OUT_AB);Wait(500);
return d_min;
}
本文の一番初めのプログラムを例にすると、int d = searchDir...
紙コップを掴んで持ち上げる・アームを開いて下げるプログラ...
sub c_up(float d) //645で最大
{
RotateMotor(OUT_C,-30,d);
Off(OUT_C);
}
sub c_down(float d)
{
RotateMotor(OUT_C,30,d);
Off(OUT_C);
}
プログラムの本文である。
紙コップを取る流れとしては、探して近づき反転してアームを...
task main()
{
SetSensorLowspeed(S1);
int d = searchDirection(30); //紙コップ1の方向を...
if (d > 10){
fwdDist(d-25.0);
}
ここの検知は超音波センサーの取り付け角度の具合でうまくい...
turnAng(200); //200度の時計回りの旋回
c_down(640); //アームを開いて下げる
OnFwdSyncEx(OUT_AB,SPEED_SLOW,100,RESET_NONE);
Off(OUT_AB); //こ...
baDist(12.0); //12cm後退
c_up(260); //紙コップ1をつかんで少し上げる
ResetTachoCount(OUT_AB); //角度計測をリセット
turnAng(110); //110度の時計回りの旋回
OnFwdSyncEx(OUT_AB,SPEED_SLOW,100,RESET_NONE);
Off(OUT_AB); //微...
baDist(11.0); //11cm後退
c_up(330); //紙コップ1を上げ、ピンポン玉をはなす
ResetTachoCount(OUT_AB); //角度計測をリセット
turnAng(90); //90度の時計回りの旋回
OnFwdSyncEx(OUT_AB,SPEED_SLOW,100,RESET_NONE);
Off(OUT_AB); //微...
fwdDist(17.0); //17cm前進
ResetTachoCount(OUT_AB); //角度計測をリセット
turnAng(80); //80度の時計回りの旋回
ResetTachoCount(OUT_AB); //角度計測をリセット
int e = searchDirection(40); //障害の紙コップの方...
int msg; // 受け取った値を格納する変数
while (true) { //メッセージ...
ReceiveRemoteNumber(MAILBOX1,true,msg);
if (msg == 1){
break; //while文を抜け出す
} else {
Off(OUT_AB);
}
Wait(100);
}
Off(OUT_AB);Wait(3000); //3秒停止
while文で機体Bからの信号が来るまで停止させ、信号が来たら...
ResetTachoCount(OUT_AB); //角度計測をリセット
turnAng(30); //30度の時計回りの旋回
OnFwdSyncEx(OUT_AB,SPEED_SLOW,100,RESET_NONE);
Off(OUT_AB); //微...
fwdDist(15.0); //15cm前進
ResetTachoCount(OUT_AB); //角度計測をリセット
int f = searchDirection(30); //紙コップ2の方向を...
if (f > 10){
fwdDist(f-25.0);
}
ResetTachoCount(OUT_AB); //角度計測をリセット
turnAng(156); //156度の時計回りの旋回
OnFwdSyncEx(OUT_AB,SPEED_SLOW,100,RESET_NONE);
Off(OUT_AB); //微...
baDist(8.0); //8cm後退
c_down(100); //アームを開き、紙コップ1をはなす
OnFwdSyncEx(OUT_AB,SPEED_SLOW,100,RESET_NONE);
Off(OUT_AB); //微...
baDist(2.0); //2cm後退
紙コップをはなすだけでは紙コップが完全に入らなかったり引...
OnFwdSyncEx(OUT_AB,SPEED_SLOW,100,RESET_NONE);
Off(OUT_AB); //微...
fwdDist(12.0); //12cm前進
c_up(100); //アームを最大まで上げる
アームを最大まで上げることで、紙コップ3も1の時と同様の...
ResetTachoCount(OUT_AB); //角度計測をリセット
turnAng(230); //230度の時計回りの旋回
ResetTachoCount(OUT_AB); //角度計測をリセット
int g = searchDirection(20); //紙コップ3の方...
if (g > 10){
fwdDist(g-25.0);
}
turnAng(190); //190度の時計回りの旋回
c_down(630); //アームを開いて下げる
OnFwdSyncEx(OUT_AB,SPEED_SLOW,100,RESET_NONE);
Off(OUT_AB); //微...
baDist(16.0); //16cm後退
c_up(270); //紙コップ3をつかんで少し上げる
ResetTachoCount(OUT_AB); //角度計測をリセット
turnAng(140); //140度の時計回りの旋回
c_up(340); //紙コップ3を上げ、ピンポン玉をはなす
ResetTachoCount(OUT_AB); //角度計測をリセット
turnAng(290); //290度の時計回りの旋回
OnFwdSyncEx(OUT_AB,SPEED_SLOW,100,RESET_NONE);
Off(OUT_AB); //微...
baDist(12.0); //12cm後退
ResetTachoCount(OUT_AB); //角度計測をリセット
int h = searchDirection(20); //紙コップ1の方...
if (h > 10){
fwdDist(h-25.0);
}
ResetTachoCount(OUT_AB); //角度計測をリセット
turnAng(156); //156度の時計回りの旋回
OnFwdSyncEx(OUT_AB,SPEED_SLOW,100,RESET_NONE);
Off(OUT_AB); //微...
baDist(8.0); //8cm後退
c_down(100); //アームを開き、紙コップ3をはなす
OnFwdSyncEx(OUT_AB,SPEED_SLOW,100,RESET_NONE);
Off(OUT_AB); //微...
baDist(2.0); //2cm後退
OnFwdSyncEx(OUT_AB,SPEED_SLOW,100,RESET_NONE);
Off(OUT_AB); //微...
fwdDist(12.0); //12cm前進
}
紙コップ3も1と同様にうまく入るように少し揺らす動きを入...
**機体B [#g68c373f]
スピードや時間などを定義している。
#define Apower 37
#define Bpower 34 //直進するのに必要な出力
#define ttime 695 //90度曲がるのに必要な時間
#define SPEED 50
#define SPEED_SLOW 30
サブルーチン。
sub go_for() //前進
{
OnFwd(OUT_A,Apower);
OnFwd(OUT_B,Bpower);
}
sub go_back() //後退
{
OnFwd(OUT_A,-Apower);
OnFwd(OUT_B,-Bpower);
}
sub turnL(float c) //左に曲がる
{
OnFwd(OUT_A,Apower);OnFwd(OUT_B,-Bpower);
Wait(c*ttime);
Float(OUT_AB); //左に曲がる(c×90)度
}
sub turnR(float c) //右に曲がる
{
OnFwd(OUT_A,-Apower);OnFwd(OUT_B,Bpower);
Wait(c*ttime);
Float(OUT_AB); //右に曲がる(c×90)度
}
int cyari(int lsw) //スタート時の位置調整
{
ResetTachoCount(OUT_C);
SetSensorLight(S1);
SetSensorMode(S1,SENSOR_MODE_RAW);
SetSensorTouch(S4);
int i=1;
int lsb=SENSOR_1;
int lsb2=SENSOR_1-1;
while (i==1){
go_for();
lsb2=SENSOR_1;
NumOut(80,LCD_LINE4,lsb2);
if (lsb>lsb2) {
lsb=lsb2;
}
if (lsb+10<lsb2) {
i=10;
}
if (lsb>lsw-150) {
i=1;
}
}
Off(OUT_AB);
NumOut(80,LCD_LINE1,lsw);
NumOut(80,LCD_LINE2,lsb);
return lsb;
}
const float diameter=5.45; //タイヤの直径
const float track=11.35; //タイヤのトレッド幅
const float pi=3.1415; //円周率
void fwdDist(float d) //距離dcm前進
{
long angle=d/(diameter*pi)*360.0;
RotateMotorEx(OUT_AB,SPEED_SLOW,angle,0,true,true);
}
void turnAng(long ang) //角度ang度の時計回りの旋回
{
long angle=track/diameter*ang;
RotateMotorEx(OUT_AB,SPEED_SLOW,angle,100,true,true);
}
sub arm(int c) //アームを動かす
{
RotateMotor(OUT_C, 40,c);
Off(OUT_C);
}
プログラムの本文である。
task main ()
{
ResetTachoCount(OUT_C);
SetSensorLight(S1);
SetSensorMode(S1,SENSOR_MODE_RAW);
SetSensorTouch(S4);
int lsw=SENSOR_1;
int lsb=cyari(lsw);
while(SENSOR_4==0) {}
fwdDist(15);
Wait(15000);
turnL(1.1);//1
PlaySound(SOUND_UP);
Wait(1000);
fwdDist(30);
Wait(1000);
turnAng(40);
PlaySound(SOUND_UP);
turnAng(180);
Wait(1000);
fwdDist(15);
Wait(1000);
arm(550);
Wait(1000);
go_back();
Wait(2000);
Off(OUT_AB);
arm(-180);
Wait(1000);
arm(-45);
Wait(1000);
turnL(1.05);//2
Wait(1000);
arm(-200);
fwdDist(35);
turnL(0.4);
Wait(1000);
arm(100);
PlaySound(SOUND_UP);
SendRemoteNumber(1,MAILBOX1,1);
fwdDist(20);
while(SENSOR_4==0) {}
}
機体Bの大まかな動きの流れとしては、機体Aが紙コップ1の...
[[2017b/Member/takeshi/Mission3]]
[[2017b/Member/Yoshi/Mission3]]
**プログラムの理想の流れ [#z4b60dcd]
プログラムがすべて完璧に動いた場合の理想とする流れである。
&ref(2017b/Member/Taka/Mission3/ロボティクス23.jpg,320x24...
まず機体Aが紙コップ1を検知して、紙コップ1の前へ進む。
&ref(2017b/Member/Taka/Mission3/ロボティクス24.jpg,320x24...
機体Aは紙コップ1を掴む。機体Bは少し前進。
&ref(2017b/Member/Taka/Mission3/ロボティクス25.jpg,320x24...
機体Aは紙コップ1をX地点まで運び、紙コップ1の中にあった...
&ref(2017b/Member/Taka/Mission3/ロボティクス26.jpg,320x24...
機体Aは紙コップ1を持った状態で紙コップ2の上方にある紙...
&ref(2017b/Member/Taka/Mission3/ロボティクス27.jpg,320x24...
機体Aは待機。機体Bは紙コップ2をX地点まで運び、紙コップ...
&ref(2017b/Member/Taka/Mission3/ロボティクス28.jpg,320x24...
機体Aは待機。機体Bは紙コップ2をY地点へ置き、機体Aに信...
&ref(2017b/Member/Taka/Mission3/ロボティクス29.jpg,320x24...
機体Aは信号を受け取った後、Y地点の紙コップ2を検知してそ...
&ref(2017b/Member/Taka/Mission3/ロボティクス30.jpg,320x24...
機体Aは紙コップ3を検知して移動し、紙コップ3を掴む。
&ref(2017b/Member/Taka/Mission3/ロボティクス31.jpg,320x24...
機体Aは紙コップ3をX地点まで運び、紙コップ3の中にあった...
&ref(2017b/Member/Taka/Mission3/ロボティクス32.jpg,320x24...
機体AはY地点の紙コップ1及び2を検知してその前まで行き、...
実際は紙コップ1のピンポンを置くところまではうまくいき、...
*結果と反省 [#m7bd1622]
本番では、実は機体Bが最初に紙コップ2を取りに行き、その...
*感想 [#oba2b888]
今回は、4人で行う課題でロボットも2台だったのでうまく分...
ページ名: