2017b/Member/takeshi/Mission3
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
検索
|
最終更新
|
ヘルプ
|
ログイン
]
開始行:
* 課題3 紙コップ&ピンポン球回収ロボットを作って与えられ...
* コースとミッション [#aa33b691]
** フィールドの説明 [#r7d39140]
#ref(2017b/Member/takeshi/Mission3/課題3のコース.png,640x...
・フィールドは課題2で使用した紙を使用する。
・図のマジェンタの円に逆さまにした紙コップを置き、その中...
・図の黄色い円に紙コップを通常の向きに置き、障害物とする...
・紙コップには色をつけたり文字や記号を書いてもよい。
・RISのチームに限り図の緑ラインを引いてもよい。
・割り箸を使って一辺が14cmの正方形を作り、X地点を中心と...
** ミッション [#k0dff7f6]
詳しくはロボティクス入門ゼミ、課題3のページを参照して欲...
http://yakushi.shinshu-u.ac.jp/robotics/?plugin=related&p...
** メンバー [#r3b8a056]
今回は2チームに分かれ、協力してミッションの達成に挑んだ...
機体Aのチーム
・Taka http://yakushi.shinshu-u.ac.jp/robotics/?2017b%2F...
・Masa http://yakushi.shinshu-u.ac.jp/robotics/?2017b%2F...
機体Bのチーム(私のチーム)
・Yoshi http://yakushi.shinshu-u.ac.jp/robotics/?2017b%2...
・takeshi(私)
* 機体の説明 [#f7f7a5f0]
** ピンポン球をどう運ぶか [#q8187c39]
課題2では、紙コップを取って、所定の場所に置くことがミッ...
#ref(2017b/Member/takeshi/Mission3/ピンポン球1.png,640x48...
上の画像には、X地点にある14cm四方の割り箸で作った枠、紙コ...
#ref(2017b/Member/takeshi/Mission3/ピンポン球2.png,640x48...
このような状態になったら、高さを維持したまま紙コップを枠...
#ref(2017b/Member/takeshi/Mission3/ピンポン球3.png,640x48...
これで、ピンポン球を枠の中に入れることが出来た。ここから...
#ref(2017b/Member/takeshi/Mission3/ピンポン球4.png,640x48...
後は、紙コップを枠の外に出し、Y地点まで運ぶ。
#ref(2017b/Member/takeshi/Mission3/ピンポン球5.png,640x48...
Y地点では、紙コップを重ねると得点が加算されるので、紙コッ...
** 紙コップを掴んで持ち上げる機構 [#hc1e65ca]
NXTのセットには、モーターが3つしかない。右タイヤ、左タイ...
#ref(2017b/Member/takeshi/Mission3/紙コップを上げる.png,6...
先ほど、ピンポン球を運ぶ過程の説明で、紙コップを上げる動...
#ref(2017b/Member/takeshi/Mission3/アーム俯瞰図1.PNG,500x...
これは開いている状態のアームの手を上から見た図である。ア...
#ref(2017b/Member/takeshi/Mission3/アーム俯瞰図2.PNG,500x...
すると、このように可動な棒がこれ以上動かなくなる。次に、...
#ref(2017b/Member/takeshi/Mission3/アームの歯車.JPG,500x4...
アームを側面から詳しく見てみると、モーターが一番右にあっ...
#ref(2017b/Member/takeshi/Mission3/アームの歯車の図1.PNG,...
小さな平歯車を黄色で示した。この小さな平歯車が先ほど紫色...
#ref(2017b/Member/takeshi/Mission3/アームの歯車の図2.PNG,...
先ほど説明した通り、可動な棒がこれ以上動かなくなるときが...
#ref(2017b/Member/takeshi/Mission3/アームの歯車の図3.PNG,...
ここまでが、アームを掴んで持ち上げる動作の説明である。逆...
#ref(2017b/Member/takeshi/Mission3/超音波センサー.JPG,500...
これが超音波センサーである。音が出されてから反射して返っ...
** 機体の全体図 [#a2e68f90]
#ref(2017b/Member/takeshi/Mission3/機体を上から見た図.JPG...
機体の全体を上から見る。スタンダードな車のロボットに、先...
* ミッションクリアの為の作戦 [#s5c4dec5]
#ref(2017b/Member/takeshi/Mission3/初期位置.PNG,500x400,...
2台の機体にそれぞれ機体A、機体Bと名付け、取る紙コップを分...
#ref(2017b/Member/takeshi/Mission3/#1.PNG,500x400,手順1)
まず、機体Aが、先ほど説明した超音波センサーによる位置の判...
#ref(2017b/Member/takeshi/Mission3/#2.PNG,500x400,手順2)
次に、機体Aは前進し、アームの手の中に紙コップ1を入れる。...
#ref(2017b/Member/takeshi/Mission3/#3.PNG,500x400,手順3)
先ほどの説明の通り、機体Aは紙コップ1を少し持ち上げて割り...
#ref(2017b/Member/takeshi/Mission3/#4.PNG,500x400,手順4)
機体Aは紙コップ1を持ちながら、フィールドの左上まで移動し...
#ref(2017b/Member/takeshi/Mission3/#5.PNG,500x400,手順5)
機体Bは、紙コップ2を枠まで移動させ、ピンポン球を枠に入れ...
#ref(2017b/Member/takeshi/Mission3/#6.PNG,500x400,手順6)
機体BはY地点まで紙コップを移動させて置く。現在枠の中のピ...
#ref(2017b/Member/takeshi/Mission3/#7.PNG,500x400,手順7)
機体Bはフィールドの右上まで移動して止まり、機体Aにメッセ...
#ref(2017b/Member/takeshi/Mission3/#8.PNG,500x400,手順8)
機体Aは紙コップ3を取りに行く。
#ref(2017b/Member/takeshi/Mission3/#9.PNG,500x400,手順9)
機体Bは紙コップ3を枠まで運び、ピンポン球を枠に入れる。
#ref(2017b/Member/takeshi/Mission3/#10.PNG,500x400,手順10)
機体Bは、紙コップ3をY地点まで運び、紙コップ1に重ねる。...
* プログラム [#u829874d]
作戦を実行するためのプログラムである。
** 機体Aのプログラム [#afd00232]
#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;
}
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);
//紙コップの方向を探した後、近づいて25cm手前で停止
int d = searchDirection(30);
if (d > 10){
fwdDist(d-25.0);
}
turnAng(200);
c_down(640);
OnFwdSyncEx(OUT_AB,SPEED_SLOW,100,RESET_NONE);
Off(OUT_AB);
baDist(12.0);
c_up(260); //紙コップをつかむ
ResetTachoCount(OUT_AB); //角度計測をリセット
turnAng(110);
OnFwdSyncEx(OUT_AB,SPEED_SLOW,100,RESET_NONE);
Off(OUT_AB);
baDist(11.0);
c_up(330); //ピンポン玉をはなす
ResetTachoCount(OUT_AB); //角度計測をリセット
turnAng(90);
OnFwdSyncEx(OUT_AB,SPEED_SLOW,100,RESET_NONE);
Off(OUT_AB);
fwdDist(17.0);
ResetTachoCount(OUT_AB); //角度計測をリセット
turnAng(80);
ResetTachoCount(OUT_AB); //角度計測をリセット
int e = searchDirection(40);
int msg; // 受け取った値を格納する変数
while (true) {
ReceiveRemoteNumber(MAILBOX1,true,msg);
if (msg == 1){
break;
} else {
Off(OUT_AB);
}
Wait(100);
}
Off(OUT_AB);Wait(3000);
ResetTachoCount(OUT_AB); //角度計測をリセット
turnAng(30);
OnFwdSyncEx(OUT_AB,SPEED_SLOW,100,RESET_NONE);
Off(OUT_AB);
fwdDist(15.0);
ResetTachoCount(OUT_AB); //角度計測をリセット
int f = searchDirection(30);
if (f > 10){
fwdDist(f-25.0);
}
ResetTachoCount(OUT_AB); //角度計測をリセット
turnAng(-156);
OnFwdSyncEx(OUT_AB,SPEED_SLOW,100,RESET_NONE);
Off(OUT_AB);
baDist(8.0);
c_down(100);
OnFwdSyncEx(OUT_AB,SPEED_SLOW,100,RESET_NONE);
Off(OUT_AB);
baDist(2.0);
OnFwdSyncEx(OUT_AB,SPEED_SLOW,100,RESET_NONE); //微...
Off(OUT_AB);
fwdDist(12.0);
c_up(100);
ResetTachoCount(OUT_AB); //角度計測をリセット
turnAng(230);
ResetTachoCount(OUT_AB); //角度計測をリセット
int g = searchDirection(20);
if (g > 10){
fwdDist(g-25.0);
}
turnAng(190);
c_down(630);
OnFwdSyncEx(OUT_AB,SPEED_SLOW,100,RESET_NONE);
Off(OUT_AB);
baDist(16.0);
c_up(270);
ResetTachoCount(OUT_AB); //角度計測をリセット
turnAng(140);
c_up(340);
ResetTachoCount(OUT_AB); //角度計測をリセット
turnAng(290);
OnFwdSyncEx(OUT_AB,SPEED_SLOW,100,RESET_NONE);
Off(OUT_AB);
baDist(12.0);
ResetTachoCount(OUT_AB); //角度計測をリセット
int h = searchDirection(20);
if (h > 10){
fwdDist(h-25.0);
}
ResetTachoCount(OUT_AB); //角度計測をリセット
turnAng(156);
OnFwdSyncEx(OUT_AB,SPEED_SLOW,100,RESET_NONE);
Off(OUT_AB);
baDist(8.0);
c_down(100);
OnFwdSyncEx(OUT_AB,SPEED_SLOW,100,RESET_NONE);
Off(OUT_AB);
baDist(2.0);
OnFwdSyncEx(OUT_AB,SPEED_SLOW,100,RESET_NONE);
Off(OUT_AB);
fwdDist(12.0);
}
詳しくは機体A担当チームのページを参考にして欲しい。
** 機体Bのプログラム [#v8b99291]
私たちのチームが担当した、機体Bの動作を行うためのプログラ...
#define Apower 37
#define Bpower 34 //直進するのに必要な出力
#define ttime 695 //90度曲がるのに必要な時間
#define gotime 689 //20cm進むのに必要な時間
#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)//左に曲がる(c×90)度
{
OnFwd(OUT_A,Apower);OnFwd(OUT_B,-Bpower);
Wait(c*ttime);
Float(OUT_AB);
}
sub turnR(float c) //右に曲がる(c×90)度
{
OnFwd(OUT_A,-Apower);OnFwd(OUT_B,Bpower);
Wait(c*ttime);
Float(OUT_AB);
}
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)//d cm進む
{
long angle=d/(diameter*pi)*360.0;
RotateMotorEx(OUT_AB,SPEED_SLOW,angle,0,true,true);
}
孤の長さ=円周率×直径×角度/360度なので、必要なタイヤの...
void turnAng(long ang)// ang 度旋回
{
long angle=track/diameter*ang;
RotateMotorEx(OUT_AB,SPEED_SLOW,angle,100,true,true);
}
円周率×タイヤの直径×タイヤの回転角度/360度=円周率×タイヤ...
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) {}//ボタンを押すとwhileの条件を抜...
fwdDist(15);//15cm前進
Wait(15000);
turnL(1.1);//99度回転
PlaySound(SOUND_UP);//確認用サウンド
Wait(1000);
fwdDist(30);//30cm前進
Wait(1000);
turnAng(40);//40度回転
PlaySound(SOUND_UP);//確認用サウンド
ここまでで、機体Bの正面が、紙コップ2の方を向いた。
turnAng(180);//180度旋回
Wait(1000);
アームはロボットの真後ろについているので、紙コップを掴む...
fwdDist(15);//15cm前進
Wait(1000);
アームが紙コップ2の方を向いたあと、すぐにアームを下げる...
arm(550);//アームを下げる
Wait(1000);
go_back();//後退
Wait(2000);
Off(OUT_AB);
これで、紙コップが手の中に収まった。
arm(-180);//紙コップを掴む
Wait(1000);
紙コップを掴んだことにより、これで先ほど説明した「可動な...
arm(-45);//アームを少し持ち上げる。
Wait(1000);
これは、「ピンポン球をどう運ぶか」の項目で説明した、紙コ...
turnL(1.05);//94.5度左旋回
Wait(1000);
紙コップの高さを維持したまま、ピンポン球を枠の中に入れる...
arm(-200);//アームを上げる
紙コップのみを枠から出すために紙コップを高く上げる動作で...
fwdDist(35);//35cm前進
turnL(0.4);//36度左旋回
Wait(1000);
ここまでで、紙コップ2をY地点まで移動させた。
arm(100);//アームを下ろす
これで紙コップ2をY地点に置くことができた。
PlaySound(SOUND_UP);//確認用サウンド
SendRemoteNumber(1,MAILBOX1,1);//機体Aにメッセージを...
紙コップ2を置くところまで完了したので、フィールドの左上...
fwdDist(20);//20cm前進
機体Aの邪魔にならないようにフィールドの右上に避ける。
while(SENSOR_4==0) {}//ボタンを押すとwhileの条件を抜...
}
結局、機体Bでは超音波センサーを使わなかった。ロボコンの前...
* 反省と感想 [#h63729e1]
今回の課題は、難易度が今までと比べて段違いに高かったのに...
かなり苦労した割にはあまり満足いかない結果に終わってしま...
これから小学校でもプログラミングが必修化されるようであり...
終了行:
* 課題3 紙コップ&ピンポン球回収ロボットを作って与えられ...
* コースとミッション [#aa33b691]
** フィールドの説明 [#r7d39140]
#ref(2017b/Member/takeshi/Mission3/課題3のコース.png,640x...
・フィールドは課題2で使用した紙を使用する。
・図のマジェンタの円に逆さまにした紙コップを置き、その中...
・図の黄色い円に紙コップを通常の向きに置き、障害物とする...
・紙コップには色をつけたり文字や記号を書いてもよい。
・RISのチームに限り図の緑ラインを引いてもよい。
・割り箸を使って一辺が14cmの正方形を作り、X地点を中心と...
** ミッション [#k0dff7f6]
詳しくはロボティクス入門ゼミ、課題3のページを参照して欲...
http://yakushi.shinshu-u.ac.jp/robotics/?plugin=related&p...
** メンバー [#r3b8a056]
今回は2チームに分かれ、協力してミッションの達成に挑んだ...
機体Aのチーム
・Taka http://yakushi.shinshu-u.ac.jp/robotics/?2017b%2F...
・Masa http://yakushi.shinshu-u.ac.jp/robotics/?2017b%2F...
機体Bのチーム(私のチーム)
・Yoshi http://yakushi.shinshu-u.ac.jp/robotics/?2017b%2...
・takeshi(私)
* 機体の説明 [#f7f7a5f0]
** ピンポン球をどう運ぶか [#q8187c39]
課題2では、紙コップを取って、所定の場所に置くことがミッ...
#ref(2017b/Member/takeshi/Mission3/ピンポン球1.png,640x48...
上の画像には、X地点にある14cm四方の割り箸で作った枠、紙コ...
#ref(2017b/Member/takeshi/Mission3/ピンポン球2.png,640x48...
このような状態になったら、高さを維持したまま紙コップを枠...
#ref(2017b/Member/takeshi/Mission3/ピンポン球3.png,640x48...
これで、ピンポン球を枠の中に入れることが出来た。ここから...
#ref(2017b/Member/takeshi/Mission3/ピンポン球4.png,640x48...
後は、紙コップを枠の外に出し、Y地点まで運ぶ。
#ref(2017b/Member/takeshi/Mission3/ピンポン球5.png,640x48...
Y地点では、紙コップを重ねると得点が加算されるので、紙コッ...
** 紙コップを掴んで持ち上げる機構 [#hc1e65ca]
NXTのセットには、モーターが3つしかない。右タイヤ、左タイ...
#ref(2017b/Member/takeshi/Mission3/紙コップを上げる.png,6...
先ほど、ピンポン球を運ぶ過程の説明で、紙コップを上げる動...
#ref(2017b/Member/takeshi/Mission3/アーム俯瞰図1.PNG,500x...
これは開いている状態のアームの手を上から見た図である。ア...
#ref(2017b/Member/takeshi/Mission3/アーム俯瞰図2.PNG,500x...
すると、このように可動な棒がこれ以上動かなくなる。次に、...
#ref(2017b/Member/takeshi/Mission3/アームの歯車.JPG,500x4...
アームを側面から詳しく見てみると、モーターが一番右にあっ...
#ref(2017b/Member/takeshi/Mission3/アームの歯車の図1.PNG,...
小さな平歯車を黄色で示した。この小さな平歯車が先ほど紫色...
#ref(2017b/Member/takeshi/Mission3/アームの歯車の図2.PNG,...
先ほど説明した通り、可動な棒がこれ以上動かなくなるときが...
#ref(2017b/Member/takeshi/Mission3/アームの歯車の図3.PNG,...
ここまでが、アームを掴んで持ち上げる動作の説明である。逆...
#ref(2017b/Member/takeshi/Mission3/超音波センサー.JPG,500...
これが超音波センサーである。音が出されてから反射して返っ...
** 機体の全体図 [#a2e68f90]
#ref(2017b/Member/takeshi/Mission3/機体を上から見た図.JPG...
機体の全体を上から見る。スタンダードな車のロボットに、先...
* ミッションクリアの為の作戦 [#s5c4dec5]
#ref(2017b/Member/takeshi/Mission3/初期位置.PNG,500x400,...
2台の機体にそれぞれ機体A、機体Bと名付け、取る紙コップを分...
#ref(2017b/Member/takeshi/Mission3/#1.PNG,500x400,手順1)
まず、機体Aが、先ほど説明した超音波センサーによる位置の判...
#ref(2017b/Member/takeshi/Mission3/#2.PNG,500x400,手順2)
次に、機体Aは前進し、アームの手の中に紙コップ1を入れる。...
#ref(2017b/Member/takeshi/Mission3/#3.PNG,500x400,手順3)
先ほどの説明の通り、機体Aは紙コップ1を少し持ち上げて割り...
#ref(2017b/Member/takeshi/Mission3/#4.PNG,500x400,手順4)
機体Aは紙コップ1を持ちながら、フィールドの左上まで移動し...
#ref(2017b/Member/takeshi/Mission3/#5.PNG,500x400,手順5)
機体Bは、紙コップ2を枠まで移動させ、ピンポン球を枠に入れ...
#ref(2017b/Member/takeshi/Mission3/#6.PNG,500x400,手順6)
機体BはY地点まで紙コップを移動させて置く。現在枠の中のピ...
#ref(2017b/Member/takeshi/Mission3/#7.PNG,500x400,手順7)
機体Bはフィールドの右上まで移動して止まり、機体Aにメッセ...
#ref(2017b/Member/takeshi/Mission3/#8.PNG,500x400,手順8)
機体Aは紙コップ3を取りに行く。
#ref(2017b/Member/takeshi/Mission3/#9.PNG,500x400,手順9)
機体Bは紙コップ3を枠まで運び、ピンポン球を枠に入れる。
#ref(2017b/Member/takeshi/Mission3/#10.PNG,500x400,手順10)
機体Bは、紙コップ3をY地点まで運び、紙コップ1に重ねる。...
* プログラム [#u829874d]
作戦を実行するためのプログラムである。
** 機体Aのプログラム [#afd00232]
#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;
}
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);
//紙コップの方向を探した後、近づいて25cm手前で停止
int d = searchDirection(30);
if (d > 10){
fwdDist(d-25.0);
}
turnAng(200);
c_down(640);
OnFwdSyncEx(OUT_AB,SPEED_SLOW,100,RESET_NONE);
Off(OUT_AB);
baDist(12.0);
c_up(260); //紙コップをつかむ
ResetTachoCount(OUT_AB); //角度計測をリセット
turnAng(110);
OnFwdSyncEx(OUT_AB,SPEED_SLOW,100,RESET_NONE);
Off(OUT_AB);
baDist(11.0);
c_up(330); //ピンポン玉をはなす
ResetTachoCount(OUT_AB); //角度計測をリセット
turnAng(90);
OnFwdSyncEx(OUT_AB,SPEED_SLOW,100,RESET_NONE);
Off(OUT_AB);
fwdDist(17.0);
ResetTachoCount(OUT_AB); //角度計測をリセット
turnAng(80);
ResetTachoCount(OUT_AB); //角度計測をリセット
int e = searchDirection(40);
int msg; // 受け取った値を格納する変数
while (true) {
ReceiveRemoteNumber(MAILBOX1,true,msg);
if (msg == 1){
break;
} else {
Off(OUT_AB);
}
Wait(100);
}
Off(OUT_AB);Wait(3000);
ResetTachoCount(OUT_AB); //角度計測をリセット
turnAng(30);
OnFwdSyncEx(OUT_AB,SPEED_SLOW,100,RESET_NONE);
Off(OUT_AB);
fwdDist(15.0);
ResetTachoCount(OUT_AB); //角度計測をリセット
int f = searchDirection(30);
if (f > 10){
fwdDist(f-25.0);
}
ResetTachoCount(OUT_AB); //角度計測をリセット
turnAng(-156);
OnFwdSyncEx(OUT_AB,SPEED_SLOW,100,RESET_NONE);
Off(OUT_AB);
baDist(8.0);
c_down(100);
OnFwdSyncEx(OUT_AB,SPEED_SLOW,100,RESET_NONE);
Off(OUT_AB);
baDist(2.0);
OnFwdSyncEx(OUT_AB,SPEED_SLOW,100,RESET_NONE); //微...
Off(OUT_AB);
fwdDist(12.0);
c_up(100);
ResetTachoCount(OUT_AB); //角度計測をリセット
turnAng(230);
ResetTachoCount(OUT_AB); //角度計測をリセット
int g = searchDirection(20);
if (g > 10){
fwdDist(g-25.0);
}
turnAng(190);
c_down(630);
OnFwdSyncEx(OUT_AB,SPEED_SLOW,100,RESET_NONE);
Off(OUT_AB);
baDist(16.0);
c_up(270);
ResetTachoCount(OUT_AB); //角度計測をリセット
turnAng(140);
c_up(340);
ResetTachoCount(OUT_AB); //角度計測をリセット
turnAng(290);
OnFwdSyncEx(OUT_AB,SPEED_SLOW,100,RESET_NONE);
Off(OUT_AB);
baDist(12.0);
ResetTachoCount(OUT_AB); //角度計測をリセット
int h = searchDirection(20);
if (h > 10){
fwdDist(h-25.0);
}
ResetTachoCount(OUT_AB); //角度計測をリセット
turnAng(156);
OnFwdSyncEx(OUT_AB,SPEED_SLOW,100,RESET_NONE);
Off(OUT_AB);
baDist(8.0);
c_down(100);
OnFwdSyncEx(OUT_AB,SPEED_SLOW,100,RESET_NONE);
Off(OUT_AB);
baDist(2.0);
OnFwdSyncEx(OUT_AB,SPEED_SLOW,100,RESET_NONE);
Off(OUT_AB);
fwdDist(12.0);
}
詳しくは機体A担当チームのページを参考にして欲しい。
** 機体Bのプログラム [#v8b99291]
私たちのチームが担当した、機体Bの動作を行うためのプログラ...
#define Apower 37
#define Bpower 34 //直進するのに必要な出力
#define ttime 695 //90度曲がるのに必要な時間
#define gotime 689 //20cm進むのに必要な時間
#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)//左に曲がる(c×90)度
{
OnFwd(OUT_A,Apower);OnFwd(OUT_B,-Bpower);
Wait(c*ttime);
Float(OUT_AB);
}
sub turnR(float c) //右に曲がる(c×90)度
{
OnFwd(OUT_A,-Apower);OnFwd(OUT_B,Bpower);
Wait(c*ttime);
Float(OUT_AB);
}
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)//d cm進む
{
long angle=d/(diameter*pi)*360.0;
RotateMotorEx(OUT_AB,SPEED_SLOW,angle,0,true,true);
}
孤の長さ=円周率×直径×角度/360度なので、必要なタイヤの...
void turnAng(long ang)// ang 度旋回
{
long angle=track/diameter*ang;
RotateMotorEx(OUT_AB,SPEED_SLOW,angle,100,true,true);
}
円周率×タイヤの直径×タイヤの回転角度/360度=円周率×タイヤ...
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) {}//ボタンを押すとwhileの条件を抜...
fwdDist(15);//15cm前進
Wait(15000);
turnL(1.1);//99度回転
PlaySound(SOUND_UP);//確認用サウンド
Wait(1000);
fwdDist(30);//30cm前進
Wait(1000);
turnAng(40);//40度回転
PlaySound(SOUND_UP);//確認用サウンド
ここまでで、機体Bの正面が、紙コップ2の方を向いた。
turnAng(180);//180度旋回
Wait(1000);
アームはロボットの真後ろについているので、紙コップを掴む...
fwdDist(15);//15cm前進
Wait(1000);
アームが紙コップ2の方を向いたあと、すぐにアームを下げる...
arm(550);//アームを下げる
Wait(1000);
go_back();//後退
Wait(2000);
Off(OUT_AB);
これで、紙コップが手の中に収まった。
arm(-180);//紙コップを掴む
Wait(1000);
紙コップを掴んだことにより、これで先ほど説明した「可動な...
arm(-45);//アームを少し持ち上げる。
Wait(1000);
これは、「ピンポン球をどう運ぶか」の項目で説明した、紙コ...
turnL(1.05);//94.5度左旋回
Wait(1000);
紙コップの高さを維持したまま、ピンポン球を枠の中に入れる...
arm(-200);//アームを上げる
紙コップのみを枠から出すために紙コップを高く上げる動作で...
fwdDist(35);//35cm前進
turnL(0.4);//36度左旋回
Wait(1000);
ここまでで、紙コップ2をY地点まで移動させた。
arm(100);//アームを下ろす
これで紙コップ2をY地点に置くことができた。
PlaySound(SOUND_UP);//確認用サウンド
SendRemoteNumber(1,MAILBOX1,1);//機体Aにメッセージを...
紙コップ2を置くところまで完了したので、フィールドの左上...
fwdDist(20);//20cm前進
機体Aの邪魔にならないようにフィールドの右上に避ける。
while(SENSOR_4==0) {}//ボタンを押すとwhileの条件を抜...
}
結局、機体Bでは超音波センサーを使わなかった。ロボコンの前...
* 反省と感想 [#h63729e1]
今回の課題は、難易度が今までと比べて段違いに高かったのに...
かなり苦労した割にはあまり満足いかない結果に終わってしま...
これから小学校でもプログラミングが必修化されるようであり...
ページ名: