2017b/Member/Masa/Mission3
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
検索
|
最終更新
|
ヘルプ
|
ログイン
]
開始行:
目次
#contents
*課題説明 [#y6b26544]
#ref(2017b/Member/Masa/Mission3/2017b-mission3.png,75%,コ...
今回の課題は、ピンポン玉と紙コップを別々に回収し、それぞ...
[[2017b/Mission3]]
*ロボット概要 [#dcdf1a95]
今回ロボットを2台作成した。ロボット本体のつくりはほとんど...
[[2017b/Member/Yoshi/Mission3]]
[[2017b/Member/takeshi/Mission3]]
**ロボット1 [#za3442cb]
#ref(2017b/Member/Masa/Mission3/IMG_2147.jpg,100%,ロボッ...
#ref(2017b/Member/Masa/Mission3/IMG_2148.jpg,100%,ロボッ...
タイヤが付いたモーターが2つとモーター1つで動くアーム、そ...
**ロボット2 [#af5fdf05]
#ref(2017b/Member/Masa/Mission3/IMG_2177.JPG,100%,ロボッ...
#ref(2017b/Member/Masa/Mission3/IMG_2179.JPG,100%,ロボッ...
基本的にロボット1と同じである。違うところとして、写真では...
**紙コップをつかみ、持ち上げる機構 [#z99fb13d]
今回作ったロボットの1番の特徴はモーター1つで紙コップをつ...
#ref(2017b/Member/Masa/Mission3/IMG_2152.jpg,100%,つかん...
アームが開いた状態で紙コップのところまで行く。(アームが...
#ref(2017b/Member/Masa/Mission3/IMG_2153.jpg,100%,つかん...
モーターを回し始めると、アームが紙コップをつかみそれ以上...
#ref(2017b/Member/Masa/Mission3/IMG_2154.jpg,100%,つかん...
そうすると、紙コップと一緒にアームが上がり始める。
#ref(2017b/Member/Masa/Mission3/IMG_2156.jpg,100%,つかん...
このくらいの高さでモーターをとめると、紙コップだけが上が...
#ref(2017b/Member/Masa/Mission3/IMG_2157.jpg,100%,つかん...
ピンポン玉を放したあと、さらにモーターを回すと、構造上部...
#ref(2017b/Member/Masa/Mission3/IMG_2160.jpg,100%,つかん...
しかし、その高さは紙コップを超える高さなので、
#ref(2017b/Member/Masa/Mission3/IMG_2162.jpg,100%,つかん...
モーターを逆にすこし回転させると、、紙コップを重ねること...
*機体を動かす順番 [#m5266be4]
今回ロボットを2つにしたので、2台がぶつからないように経路...
#ref(2017b/Member/Masa/Mission3/IMG_2164.jpg,130%,経路1)
ロボット1が左側、ロボット2が右側から出発する。
#ref(2017b/Member/Masa/Mission3/IMG_2165.jpg,130%,経路2)
まず、ロボット1が超音波センサーで正面の紙コップを探し、手...
#ref(2017b/Member/Masa/Mission3/IMG_2166.jpg,130%,経路3)
ロボット1を右に旋回させピンポン玉を割りばしの枠の中に、入...
#ref(2017b/Member/Masa/Mission3/IMG_2167.jpg,130%,経路4)
ロボット1を上まで移動させ障害物である紙コップを超音波セン...
#ref(2017b/Member/Masa/Mission3/IMG_2168.jpg,130%,経路5)
ロボット2を回転させロボット1と同じようにピンポン玉を枠に...
#ref(2017b/Member/Masa/Mission3/IMG_2169.jpg,130%,経路6)
ロボット2が紙コップをY地点に置き、そのまま邪魔にならない...
#ref(2017b/Member/Masa/Mission3/IMG_2170.jpg,130%,経路7)
信号を受け取ったロボット1は、障害物をよけてからY地点の紙...
#ref(2017b/Member/Masa/Mission3/IMG_2171.jpg,130%,経路8)
少し前に出てから旋回し、最後の紙コップを少し持ち上げる。
#ref(2017b/Member/Masa/Mission3/IMG_2172.jpg,130%,経路9)
その場で旋回して、ピンポン玉を枠の中に入れる。そして、紙...
#ref(2017b/Member/Masa/Mission3/IMG_2173.jpg,130%,経路10)
旋回して少し距離をあけてから、超音波センサーでY地点の紙コ...
*ロボット1のプログラムについて [#f49a1b33]
**定義 [#l8551dde]
#define SPEED_SLOW 25
正確に動いてほ良かったので少し遅めのスピードにした。
**紙コップを探してその手前まで行く関数 [#s404e254]
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 = searchDirection(30)で紙コップの位置をその場を中心...
**紙コップを上げ下げするサブ関数 [#t04652a8]
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);
}
角度指定でモーターがd度回るようにしてある。
**本文 [#z0e6da4d]
task main()
{
SetSensorLowspeed(S1);
int d = searchDirection(30); //紙コップの方向を探し...
if (d > 10){
fwdDist(d-25.0);
}
turnAng(200); //200度時計回りに回転(紙コップを取る...
c_down(640); //アームを下げる
OnFwdSyncEx(OUT_AB,SPEED_SLOW,100,RESET_NONE);
Off(OUT_AB);//この2つを入れないと次のbaDist()がうま...
baDist(12.0); //12cm後進
c_up(260); //紙コップをつかむ
スタート位置から紙コップを探し、手前まで行き反転してから...
ResetTachoCount(OUT_AB); //角度計測をリセット
turnAng(110); //110度時計回りに回転
OnFwdSyncEx(OUT_AB,SPEED_SLOW,100,RESET_NONE);
Off(OUT_AB); //微調整
baDist(11.0); //11cm後進
c_up(330); //ピンポン玉をはなす
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文で信号がきていな...
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); //紙コップの方向を探し...
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); //紙コップを放す
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); //アームを最大まで上げる
ResetTachoCount(OUT_AB); //角度計測をリセット
turnAng(230); //時計回りに230度回転
ResetTachoCount(OUT_AB); //角度計測をリセット
int g = searchDirection(20); //紙コップの方向を探し...
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); //紙コップを少し持ち上げる
ResetTachoCount(OUT_AB); //角度計測をリセット
turnAng(140); //時計回りに140度回転
c_up(340); //紙コップをあげてピンポン玉を放す
最初に、アームを最大まであげて基準とし、次の紙コップを取...
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); //紙コップの方向を探...
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); //紙コップを放す
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前進
}
最初の290度は時計回りしかできなかったため無駄に回っている...
*ロボット2のプログラムについて [#g85500c8]
プログラムについても、別々に作ったので詳細は下のページを...
[[2017b/Member/Yoshi/Mission3]]
[[2017b/Member/takeshi/Mission3]]
**定義 [#j0045168]
#define Apower 37
#define Bpower 34 //直進するのに必要な出力
#define ttime 695 //90度曲がるのに必要な時間
#define SPEED 50
#define SPEED_SLOW 30
**サブ関数 [#xda5ab17]
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)
{
long angle=d/(diameter*pi)*360.0;
RotateMotorEx(OUT_AB,SPEED_SLOW,angle,0,true,true);
}
void turnAng(long ang)
{
long angle=track/diameter*ang;
RotateMotorEx(OUT_AB,SPEED_SLOW,angle,100,true,true);
}
int SearchDirection(long ang) //現在の方向を中心にang度...
{
SetSensorLowspeed(S3);
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(S3)<d_min){ //現在の距離が仮の最小値よ...
d_min = SensorUS(S3); //仮の最小値を更新
tacho_min = MotorTachoCount(OUT_A);//このときのタイ...
}
}
OnFwdSyncEx(OUT_AB,SPEED_SLOW,100,RESET_NONE);
until(MotorTachoCount(OUT_A)<=tacho_min||SensorUS(S3...
Wait(14); //微調整
Off(OUT_AB);Wait(500);
return d_min;
}
超音波センサーで紙コップを見つけてその手前まで行くサブ関数
sub arm(int c)
{
RotateMotor(OUT_C, 40,c);
Off(OUT_C);
}
角度指定でアームを上げる
**本文 [#hb0a8917]
task main ()
{
ResetTachoCount(OUT_C);
SetSensorLight(S1);
SetSensorMode(S1,SENSOR_MODE_RAW);
SetSensorTouch(S4);
SetSensorLowspeed(S3);
int lsw=SENSOR_1;
int lsb=cyari(lsw);
while(SENSOR_4==0) {}
fwdDist(15);
Wait(15000);
少し進んでから15秒間停止
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);
1つ目の紙コップの手前まで行き紙コップをつかむ
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) {}
}
紙コップを回してピンポン玉を枠に入れてから紙コップをY地点...
*結果 [#tec080cb]
本番では片方の機体がうまく紙コップを取れず、取れなかった...
*感想 [#qa0ecf8a]
今回は、今までとは違ってロボットを2台使って課題に取り組ん...
終了行:
目次
#contents
*課題説明 [#y6b26544]
#ref(2017b/Member/Masa/Mission3/2017b-mission3.png,75%,コ...
今回の課題は、ピンポン玉と紙コップを別々に回収し、それぞ...
[[2017b/Mission3]]
*ロボット概要 [#dcdf1a95]
今回ロボットを2台作成した。ロボット本体のつくりはほとんど...
[[2017b/Member/Yoshi/Mission3]]
[[2017b/Member/takeshi/Mission3]]
**ロボット1 [#za3442cb]
#ref(2017b/Member/Masa/Mission3/IMG_2147.jpg,100%,ロボッ...
#ref(2017b/Member/Masa/Mission3/IMG_2148.jpg,100%,ロボッ...
タイヤが付いたモーターが2つとモーター1つで動くアーム、そ...
**ロボット2 [#af5fdf05]
#ref(2017b/Member/Masa/Mission3/IMG_2177.JPG,100%,ロボッ...
#ref(2017b/Member/Masa/Mission3/IMG_2179.JPG,100%,ロボッ...
基本的にロボット1と同じである。違うところとして、写真では...
**紙コップをつかみ、持ち上げる機構 [#z99fb13d]
今回作ったロボットの1番の特徴はモーター1つで紙コップをつ...
#ref(2017b/Member/Masa/Mission3/IMG_2152.jpg,100%,つかん...
アームが開いた状態で紙コップのところまで行く。(アームが...
#ref(2017b/Member/Masa/Mission3/IMG_2153.jpg,100%,つかん...
モーターを回し始めると、アームが紙コップをつかみそれ以上...
#ref(2017b/Member/Masa/Mission3/IMG_2154.jpg,100%,つかん...
そうすると、紙コップと一緒にアームが上がり始める。
#ref(2017b/Member/Masa/Mission3/IMG_2156.jpg,100%,つかん...
このくらいの高さでモーターをとめると、紙コップだけが上が...
#ref(2017b/Member/Masa/Mission3/IMG_2157.jpg,100%,つかん...
ピンポン玉を放したあと、さらにモーターを回すと、構造上部...
#ref(2017b/Member/Masa/Mission3/IMG_2160.jpg,100%,つかん...
しかし、その高さは紙コップを超える高さなので、
#ref(2017b/Member/Masa/Mission3/IMG_2162.jpg,100%,つかん...
モーターを逆にすこし回転させると、、紙コップを重ねること...
*機体を動かす順番 [#m5266be4]
今回ロボットを2つにしたので、2台がぶつからないように経路...
#ref(2017b/Member/Masa/Mission3/IMG_2164.jpg,130%,経路1)
ロボット1が左側、ロボット2が右側から出発する。
#ref(2017b/Member/Masa/Mission3/IMG_2165.jpg,130%,経路2)
まず、ロボット1が超音波センサーで正面の紙コップを探し、手...
#ref(2017b/Member/Masa/Mission3/IMG_2166.jpg,130%,経路3)
ロボット1を右に旋回させピンポン玉を割りばしの枠の中に、入...
#ref(2017b/Member/Masa/Mission3/IMG_2167.jpg,130%,経路4)
ロボット1を上まで移動させ障害物である紙コップを超音波セン...
#ref(2017b/Member/Masa/Mission3/IMG_2168.jpg,130%,経路5)
ロボット2を回転させロボット1と同じようにピンポン玉を枠に...
#ref(2017b/Member/Masa/Mission3/IMG_2169.jpg,130%,経路6)
ロボット2が紙コップをY地点に置き、そのまま邪魔にならない...
#ref(2017b/Member/Masa/Mission3/IMG_2170.jpg,130%,経路7)
信号を受け取ったロボット1は、障害物をよけてからY地点の紙...
#ref(2017b/Member/Masa/Mission3/IMG_2171.jpg,130%,経路8)
少し前に出てから旋回し、最後の紙コップを少し持ち上げる。
#ref(2017b/Member/Masa/Mission3/IMG_2172.jpg,130%,経路9)
その場で旋回して、ピンポン玉を枠の中に入れる。そして、紙...
#ref(2017b/Member/Masa/Mission3/IMG_2173.jpg,130%,経路10)
旋回して少し距離をあけてから、超音波センサーでY地点の紙コ...
*ロボット1のプログラムについて [#f49a1b33]
**定義 [#l8551dde]
#define SPEED_SLOW 25
正確に動いてほ良かったので少し遅めのスピードにした。
**紙コップを探してその手前まで行く関数 [#s404e254]
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 = searchDirection(30)で紙コップの位置をその場を中心...
**紙コップを上げ下げするサブ関数 [#t04652a8]
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);
}
角度指定でモーターがd度回るようにしてある。
**本文 [#z0e6da4d]
task main()
{
SetSensorLowspeed(S1);
int d = searchDirection(30); //紙コップの方向を探し...
if (d > 10){
fwdDist(d-25.0);
}
turnAng(200); //200度時計回りに回転(紙コップを取る...
c_down(640); //アームを下げる
OnFwdSyncEx(OUT_AB,SPEED_SLOW,100,RESET_NONE);
Off(OUT_AB);//この2つを入れないと次のbaDist()がうま...
baDist(12.0); //12cm後進
c_up(260); //紙コップをつかむ
スタート位置から紙コップを探し、手前まで行き反転してから...
ResetTachoCount(OUT_AB); //角度計測をリセット
turnAng(110); //110度時計回りに回転
OnFwdSyncEx(OUT_AB,SPEED_SLOW,100,RESET_NONE);
Off(OUT_AB); //微調整
baDist(11.0); //11cm後進
c_up(330); //ピンポン玉をはなす
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文で信号がきていな...
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); //紙コップの方向を探し...
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); //紙コップを放す
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); //アームを最大まで上げる
ResetTachoCount(OUT_AB); //角度計測をリセット
turnAng(230); //時計回りに230度回転
ResetTachoCount(OUT_AB); //角度計測をリセット
int g = searchDirection(20); //紙コップの方向を探し...
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); //紙コップを少し持ち上げる
ResetTachoCount(OUT_AB); //角度計測をリセット
turnAng(140); //時計回りに140度回転
c_up(340); //紙コップをあげてピンポン玉を放す
最初に、アームを最大まであげて基準とし、次の紙コップを取...
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); //紙コップの方向を探...
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); //紙コップを放す
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前進
}
最初の290度は時計回りしかできなかったため無駄に回っている...
*ロボット2のプログラムについて [#g85500c8]
プログラムについても、別々に作ったので詳細は下のページを...
[[2017b/Member/Yoshi/Mission3]]
[[2017b/Member/takeshi/Mission3]]
**定義 [#j0045168]
#define Apower 37
#define Bpower 34 //直進するのに必要な出力
#define ttime 695 //90度曲がるのに必要な時間
#define SPEED 50
#define SPEED_SLOW 30
**サブ関数 [#xda5ab17]
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)
{
long angle=d/(diameter*pi)*360.0;
RotateMotorEx(OUT_AB,SPEED_SLOW,angle,0,true,true);
}
void turnAng(long ang)
{
long angle=track/diameter*ang;
RotateMotorEx(OUT_AB,SPEED_SLOW,angle,100,true,true);
}
int SearchDirection(long ang) //現在の方向を中心にang度...
{
SetSensorLowspeed(S3);
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(S3)<d_min){ //現在の距離が仮の最小値よ...
d_min = SensorUS(S3); //仮の最小値を更新
tacho_min = MotorTachoCount(OUT_A);//このときのタイ...
}
}
OnFwdSyncEx(OUT_AB,SPEED_SLOW,100,RESET_NONE);
until(MotorTachoCount(OUT_A)<=tacho_min||SensorUS(S3...
Wait(14); //微調整
Off(OUT_AB);Wait(500);
return d_min;
}
超音波センサーで紙コップを見つけてその手前まで行くサブ関数
sub arm(int c)
{
RotateMotor(OUT_C, 40,c);
Off(OUT_C);
}
角度指定でアームを上げる
**本文 [#hb0a8917]
task main ()
{
ResetTachoCount(OUT_C);
SetSensorLight(S1);
SetSensorMode(S1,SENSOR_MODE_RAW);
SetSensorTouch(S4);
SetSensorLowspeed(S3);
int lsw=SENSOR_1;
int lsb=cyari(lsw);
while(SENSOR_4==0) {}
fwdDist(15);
Wait(15000);
少し進んでから15秒間停止
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);
1つ目の紙コップの手前まで行き紙コップをつかむ
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) {}
}
紙コップを回してピンポン玉を枠に入れてから紙コップをY地点...
*結果 [#tec080cb]
本番では片方の機体がうまく紙コップを取れず、取れなかった...
*感想 [#qa0ecf8a]
今回は、今までとは違ってロボットを2台使って課題に取り組ん...
ページ名: