2018a/Member/Kakki/Mission3
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
検索
|
最終更新
|
ヘルプ
|
ログイン
]
開始行:
[[2018a/Member]]
目次
#contents
*課題3:空き缶運搬ロボット [#ce619be1]
空き缶を分別して所定の場所に運ぶ。
#ref(2018a-mission3.png)
**フィールドの説明 [#o6ac06f1]
・フィールドは課題2で使用した紙を使用する。
・2種類の空き缶(Aタイプ,Bタイプ)をそれぞれ3個ずつ用意し、...
・空き缶には色をつけたり文字や記号を書いてもよい。あるい...
**ミッション [#le3d30ac]
Aタイプの空き缶を円Y内に、Bタイプの空き缶を円X内に運ぶロ...
*ロボットの説明 [#e6433979]
今回は2つのペアでそれぞれロボットを作り、Bluetoothの通信...
**Master側ロボット [#zf0aae67]
Master側ロボットは、二段目の缶を固定して一段目と三段目が...
#ref(図7.jpg)
***動力(タイヤ)部分 [#sba647c6]
移動方法は通常のロボットと同じで、二つのモーターを利用し...
#ref(最終課題 資料写真_6.jpg)
***缶を掴む部分 [#oe1a2a07]
4つの直角に曲がっている部品を用いて、確実に二段目の缶を固...
#ref(最終課題 資料写真_7.jpg)
**Slave側ロボット [#z3451aec]
Slave側ロボットは、一段目と三段目の缶を掴み所定の円の中に...
***動力(タイヤ)部分 [#f87ae6bc]
Master側ロボットと同様の構造をしている。一段目を掴むため...
また、超音波センサーを用いて、Master側が二段目の缶を掴ん...
#ref(最終課題 資料写真_2.jpg)
***缶を掴む部分 [#z8e27c17]
Master側とほぼ同様の方法で缶を掴む構造にした。一段目と三...
また、一段目と三段目の缶を掴む部分をつなぐ十時の棒がかな...
#ref(図6.jpg)
*メインプログラムへの準備 [#s6f57fcd]
今回のプログラムでは、課題3のヒントであった超音波センサー...
**超音波センサーを用いて缶の位置を特定し、缶の手前まで移...
[[2018a/Mission3]]のヒントにあったプログラムの例を少し改...
#define SPEED 50
#define SPEED_SLOW 30
const float diameter = 5.45; // タイヤの直径(cm)
const float track = 10.35; // タイヤのトレッド幅(cm)
const float pi = 3.1415; // 円周率
void fwdDist(float d) // 距離 d cm 前進
{
long angle;
angle = d/(diameter*pi)*360.0; // 角度を計算する
RotateMotorEx(OUT_BC, SPEED_SLOW, angle, 0, true, tru...
}
void turnAng(long ang) // 角度 ang 度の時計回りの旋回
{
long angle;
angle = track/diameter * ang;
RotateMotorEx(OUT_BC, SPEED_SLOW, angle, 100, true, t...
}
int searchDirection(long ang) // 現在の方向を中心にang...
// 障害物までの距離を返す
{
long angle,tacho_min=0, tacho_corr ;
int d, 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){
d = SensorUS(S1); // 現在の距離
if (d < d_min){
d_min = d; // 仮の最小値を更新
tacho_min = MotorTachoCount(OUT_B); // 仮の...
}
}
OnFwdSyncEx(OUT_BC,SPEED_SLOW,100,RESET_NONE);
until(MotorTachoCount(OUT_B) <= tacho_min || SensorUS...
Wait(14); // 微調整
Off(OUT_BC);Wait(500);
return d_min;
OnFwd(OUT_C,30);
OnRev(OUT_B,30);
Wait(200);
}
**Bluetoothでメッセージを送受信し、受信時にプログラムを動...
NXTでは、Bluetoothを用いて複数のロボットを連動させて動か...
***Master側からSlave側にメッセージを送ると、Slave側が動き...
Master側
task main()
{
SendRemoteNumber(1,MAILBOX1,11); //Slave側のMAILBO...
}
Slave側
task main()
{
int msg,frg1=1;
while(frg1){
ReceiveRemoteNumber(MAILBOX1,true,msg); // MA...
if(msg==11){ //も...
(動かしたい命令);
frg1=0;
}
}
}
***Slave側からMaster側にメッセージを送ると、Master側が動...
Slave側
task main()
{
SendResponseNumber(MAILBOX1,12); //Master側のMAILB...
}
Master側
task main()
{
int msg,frg1=1;
while(frg1){
ReceiveRemoteNumber(MAILBOX1,true,msg); // MA...
if(msg==12){ //も...
(動かしたい命令);
frg1=0;
}
}
}
この2つのプログラムを交互に行うことで、片方が動いている間...
**命令の定義 [#hb3fa9fc]
前進、左折、右折、旋回などの命令やスピードの値を定義する...
#define SPEED_H 30
#define SPEED_L 35
#define OnRL(speedR,speedL) OnFwd(OUT_B,speedR);OnFwd(OU...
#define go_forward OnRL(SPEED_H, SPEED_H); // 前進
**ロボットを前進させるためのプログラム [#z3f32300]
サブルーチンや命令の定義を使って前進する命令、時間、電源...
Master側
sub zen(int i)
{
int t;
t=i*50;
OnFwd(OUT_B,50); OnFwd(OUT_C,49);
Wait(t);
Off(OUT_BC);
}
sub zeny(int i)
{
int t;
t=i*100;
OnFwd(OUT_B,25); OnFwd(OUT_C,25);
Wait(t);
Off(OUT_BC);
}
Slave側
#define str(X) go_forward;Wait(X);Off(OUT_BC);
**ロボットを後退させるプログラム [#bf922d59]
上と同様にひとまとめにした。
Master側
sub kou(int i)
{
int t;
t=i*50;
OnRev(OUT_B,50);OnRev(OUT_C,49);
Wait(t);
Off(OUT_BC);
}
Slave側
#define Back(X) OnRev(OUT_BC,30);Wait(X);Off(OUT_BC);
**ロボットを回転させるプログラム [#mde05c3f]
片方のタイヤと同じ速度でもう片方のタイヤを逆に回転させる...
Master側
#define kail OnFwd(OUT_B,50);OnRev(OUT_C,50);Wait(500);O...
#define kair OnFwd(OUT_C,50);OnRev(OUT_B,50);Wait(500);O...
Slave側
#define turn_rt(X) OnRL(SPEED_L, -SPEED_L);Wait(X);Off(...
#define turn_right(X) OnRL(SPEED_L, 0);Wait(X);Off(OUT_...
#define turn_left(X) OnRL(0, SPEED_L);Wait(X);Off(OUT_BC...
#define turn_lt(X) OnRL(-SPEED_L, SPEED_L);Wait(X);Off(O...
**缶をつかむためのプログラム [#x11912a6]
Master側のみ利用していて、Slave側は直接メインプログラムに...
sub armc()
{
OnFwd(OUT_A,30);
}
**缶を離すためのプログラム [#r36eb875]
Master側のみ利用していて、Slave側は直接メインプログラムに...
sub armo()
{
OnRev(OUT_A,30);
}
*メインプログラム [#l753f33d]
Master側
task main()
{
int msg,frg1=1,frg2=1; //?関数frg1,frg2を...
zen(51); //?2.55秒、50%の...
kair; //?0.5秒右旋回
zen(75); //?3.75秒、50%の速...
kair; //?0.5秒右旋回
zeny(20); //?2秒、25%の速さ...
armc(); //?二段目の缶を掴む...
SendRemoteNumber(1,MAILBOX1,11);//送信 //?Slave側...
while(frg1){
ReceiveRemoteNumber(MAILBOX1,true,msg);//?受信
if(msg==12){
armo(); //?缶を離す
kou(20); //?1秒後退
kair; //?0.5秒右旋回
zen(44); //20 2.2秒、50%の速さで前進
kail; //21 0.5秒左旋回
zeny(20); //22 0.5秒、25%の速さで前進
armc(); //23 二段目の缶を掴む Yに移動完了
frg1=0; //関数frg1に0...
SendRemoteNumber(1,MAILBOX1,13); //24 Slave側に13の数...
}
}
while(frg2){
ReceiveRemoteNumber(MAILBOX1,true,msg); //43 受信
if(msg==14){
armo(); //44 缶を離す
frg2=0; //関数frg2に0を代入(完全停止)
}
}
}
Slave側
task main()
{
int msg,frg1=1,frg2=1;
while(frg1){
ReceiveRemoteNumber(MAILBOX1,true,msg); //?MAILBOX1...
if(msg==11){
SetSensorLowspeed(S1); //?缶の方向を探した後、近...
int d = searchDirection(120);
if (d > 10) {
fwdDist(d-10.0);
}
str(500); //?0.5秒前進
Off(OUT_A); //モーターAの電源...
str(400); //?0.4秒前進
OnRev(OUT_A,30); //?一段目と三段目...
Wait(1000); //1秒待つ
Back(1000); //?1秒後退
SendResponseNumber(MAILBOX1,12); //?Master側に12の...
frg1=0; //関数frg1に0を代入
}
}
while(frg2){
ReceiveRemoteNumber(MAILBOX1,true,msg); //25 MAILB...
if(msg==13){
turn_lt(600); //26 0.6秒左旋回
str(4000); //27 4秒前進
turn_rt(1000); //28 1秒右旋回
str(1000); //29 1秒前進
OnFwd(OUT_A,30); //30 缶を離す Y...
Wait(500); //0.5秒待つ
Off(OUT_A); //モーターAの電源...
Back(1000); //31 1秒後退
turn_rt(800); //32 0.8秒右旋回
str(500); //33 0.5秒前進
turn_lt(1000); //34 1秒左旋回
str(2000); //35 2秒前進
turn_left(1000); //36 1秒左折
OnRev(OUT_A,30); //37 一段目と三段...
Wait(1000); //1秒待つ
Back(1000); //38 1秒後退
turn_rt(2000); //39 2秒右旋回
str(4000); //40 4秒前進
OnFwd(OUT_A,30); //41 缶を離す
Wait(1000); //1秒待つ
Off(OUT_A); //モーターAの電源...
SendResponseNumber(MAILBOX1,14); //42 Master側に14...
frg2=0; //関数frg2に0を代...
}
}
}
#ref(図8.jpg)
上のプログラムに説明として書かれている数字は、上の図の数...
*結果 [#hf4c6ded]
一回目は、Master側が缶を掴むことができず、タワーを倒して...
技術点は、平均12.2点となり、全体合計で14.2点であった。順...
*課題3の反省・感想 [#o08e4935]
課題3は、テスト前ということもあってあまり時間がなく点を取...
この授業を通して初めてロボットをプログラミングで操作する...
終了行:
[[2018a/Member]]
目次
#contents
*課題3:空き缶運搬ロボット [#ce619be1]
空き缶を分別して所定の場所に運ぶ。
#ref(2018a-mission3.png)
**フィールドの説明 [#o6ac06f1]
・フィールドは課題2で使用した紙を使用する。
・2種類の空き缶(Aタイプ,Bタイプ)をそれぞれ3個ずつ用意し、...
・空き缶には色をつけたり文字や記号を書いてもよい。あるい...
**ミッション [#le3d30ac]
Aタイプの空き缶を円Y内に、Bタイプの空き缶を円X内に運ぶロ...
*ロボットの説明 [#e6433979]
今回は2つのペアでそれぞれロボットを作り、Bluetoothの通信...
**Master側ロボット [#zf0aae67]
Master側ロボットは、二段目の缶を固定して一段目と三段目が...
#ref(図7.jpg)
***動力(タイヤ)部分 [#sba647c6]
移動方法は通常のロボットと同じで、二つのモーターを利用し...
#ref(最終課題 資料写真_6.jpg)
***缶を掴む部分 [#oe1a2a07]
4つの直角に曲がっている部品を用いて、確実に二段目の缶を固...
#ref(最終課題 資料写真_7.jpg)
**Slave側ロボット [#z3451aec]
Slave側ロボットは、一段目と三段目の缶を掴み所定の円の中に...
***動力(タイヤ)部分 [#f87ae6bc]
Master側ロボットと同様の構造をしている。一段目を掴むため...
また、超音波センサーを用いて、Master側が二段目の缶を掴ん...
#ref(最終課題 資料写真_2.jpg)
***缶を掴む部分 [#z8e27c17]
Master側とほぼ同様の方法で缶を掴む構造にした。一段目と三...
また、一段目と三段目の缶を掴む部分をつなぐ十時の棒がかな...
#ref(図6.jpg)
*メインプログラムへの準備 [#s6f57fcd]
今回のプログラムでは、課題3のヒントであった超音波センサー...
**超音波センサーを用いて缶の位置を特定し、缶の手前まで移...
[[2018a/Mission3]]のヒントにあったプログラムの例を少し改...
#define SPEED 50
#define SPEED_SLOW 30
const float diameter = 5.45; // タイヤの直径(cm)
const float track = 10.35; // タイヤのトレッド幅(cm)
const float pi = 3.1415; // 円周率
void fwdDist(float d) // 距離 d cm 前進
{
long angle;
angle = d/(diameter*pi)*360.0; // 角度を計算する
RotateMotorEx(OUT_BC, SPEED_SLOW, angle, 0, true, tru...
}
void turnAng(long ang) // 角度 ang 度の時計回りの旋回
{
long angle;
angle = track/diameter * ang;
RotateMotorEx(OUT_BC, SPEED_SLOW, angle, 100, true, t...
}
int searchDirection(long ang) // 現在の方向を中心にang...
// 障害物までの距離を返す
{
long angle,tacho_min=0, tacho_corr ;
int d, 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){
d = SensorUS(S1); // 現在の距離
if (d < d_min){
d_min = d; // 仮の最小値を更新
tacho_min = MotorTachoCount(OUT_B); // 仮の...
}
}
OnFwdSyncEx(OUT_BC,SPEED_SLOW,100,RESET_NONE);
until(MotorTachoCount(OUT_B) <= tacho_min || SensorUS...
Wait(14); // 微調整
Off(OUT_BC);Wait(500);
return d_min;
OnFwd(OUT_C,30);
OnRev(OUT_B,30);
Wait(200);
}
**Bluetoothでメッセージを送受信し、受信時にプログラムを動...
NXTでは、Bluetoothを用いて複数のロボットを連動させて動か...
***Master側からSlave側にメッセージを送ると、Slave側が動き...
Master側
task main()
{
SendRemoteNumber(1,MAILBOX1,11); //Slave側のMAILBO...
}
Slave側
task main()
{
int msg,frg1=1;
while(frg1){
ReceiveRemoteNumber(MAILBOX1,true,msg); // MA...
if(msg==11){ //も...
(動かしたい命令);
frg1=0;
}
}
}
***Slave側からMaster側にメッセージを送ると、Master側が動...
Slave側
task main()
{
SendResponseNumber(MAILBOX1,12); //Master側のMAILB...
}
Master側
task main()
{
int msg,frg1=1;
while(frg1){
ReceiveRemoteNumber(MAILBOX1,true,msg); // MA...
if(msg==12){ //も...
(動かしたい命令);
frg1=0;
}
}
}
この2つのプログラムを交互に行うことで、片方が動いている間...
**命令の定義 [#hb3fa9fc]
前進、左折、右折、旋回などの命令やスピードの値を定義する...
#define SPEED_H 30
#define SPEED_L 35
#define OnRL(speedR,speedL) OnFwd(OUT_B,speedR);OnFwd(OU...
#define go_forward OnRL(SPEED_H, SPEED_H); // 前進
**ロボットを前進させるためのプログラム [#z3f32300]
サブルーチンや命令の定義を使って前進する命令、時間、電源...
Master側
sub zen(int i)
{
int t;
t=i*50;
OnFwd(OUT_B,50); OnFwd(OUT_C,49);
Wait(t);
Off(OUT_BC);
}
sub zeny(int i)
{
int t;
t=i*100;
OnFwd(OUT_B,25); OnFwd(OUT_C,25);
Wait(t);
Off(OUT_BC);
}
Slave側
#define str(X) go_forward;Wait(X);Off(OUT_BC);
**ロボットを後退させるプログラム [#bf922d59]
上と同様にひとまとめにした。
Master側
sub kou(int i)
{
int t;
t=i*50;
OnRev(OUT_B,50);OnRev(OUT_C,49);
Wait(t);
Off(OUT_BC);
}
Slave側
#define Back(X) OnRev(OUT_BC,30);Wait(X);Off(OUT_BC);
**ロボットを回転させるプログラム [#mde05c3f]
片方のタイヤと同じ速度でもう片方のタイヤを逆に回転させる...
Master側
#define kail OnFwd(OUT_B,50);OnRev(OUT_C,50);Wait(500);O...
#define kair OnFwd(OUT_C,50);OnRev(OUT_B,50);Wait(500);O...
Slave側
#define turn_rt(X) OnRL(SPEED_L, -SPEED_L);Wait(X);Off(...
#define turn_right(X) OnRL(SPEED_L, 0);Wait(X);Off(OUT_...
#define turn_left(X) OnRL(0, SPEED_L);Wait(X);Off(OUT_BC...
#define turn_lt(X) OnRL(-SPEED_L, SPEED_L);Wait(X);Off(O...
**缶をつかむためのプログラム [#x11912a6]
Master側のみ利用していて、Slave側は直接メインプログラムに...
sub armc()
{
OnFwd(OUT_A,30);
}
**缶を離すためのプログラム [#r36eb875]
Master側のみ利用していて、Slave側は直接メインプログラムに...
sub armo()
{
OnRev(OUT_A,30);
}
*メインプログラム [#l753f33d]
Master側
task main()
{
int msg,frg1=1,frg2=1; //?関数frg1,frg2を...
zen(51); //?2.55秒、50%の...
kair; //?0.5秒右旋回
zen(75); //?3.75秒、50%の速...
kair; //?0.5秒右旋回
zeny(20); //?2秒、25%の速さ...
armc(); //?二段目の缶を掴む...
SendRemoteNumber(1,MAILBOX1,11);//送信 //?Slave側...
while(frg1){
ReceiveRemoteNumber(MAILBOX1,true,msg);//?受信
if(msg==12){
armo(); //?缶を離す
kou(20); //?1秒後退
kair; //?0.5秒右旋回
zen(44); //20 2.2秒、50%の速さで前進
kail; //21 0.5秒左旋回
zeny(20); //22 0.5秒、25%の速さで前進
armc(); //23 二段目の缶を掴む Yに移動完了
frg1=0; //関数frg1に0...
SendRemoteNumber(1,MAILBOX1,13); //24 Slave側に13の数...
}
}
while(frg2){
ReceiveRemoteNumber(MAILBOX1,true,msg); //43 受信
if(msg==14){
armo(); //44 缶を離す
frg2=0; //関数frg2に0を代入(完全停止)
}
}
}
Slave側
task main()
{
int msg,frg1=1,frg2=1;
while(frg1){
ReceiveRemoteNumber(MAILBOX1,true,msg); //?MAILBOX1...
if(msg==11){
SetSensorLowspeed(S1); //?缶の方向を探した後、近...
int d = searchDirection(120);
if (d > 10) {
fwdDist(d-10.0);
}
str(500); //?0.5秒前進
Off(OUT_A); //モーターAの電源...
str(400); //?0.4秒前進
OnRev(OUT_A,30); //?一段目と三段目...
Wait(1000); //1秒待つ
Back(1000); //?1秒後退
SendResponseNumber(MAILBOX1,12); //?Master側に12の...
frg1=0; //関数frg1に0を代入
}
}
while(frg2){
ReceiveRemoteNumber(MAILBOX1,true,msg); //25 MAILB...
if(msg==13){
turn_lt(600); //26 0.6秒左旋回
str(4000); //27 4秒前進
turn_rt(1000); //28 1秒右旋回
str(1000); //29 1秒前進
OnFwd(OUT_A,30); //30 缶を離す Y...
Wait(500); //0.5秒待つ
Off(OUT_A); //モーターAの電源...
Back(1000); //31 1秒後退
turn_rt(800); //32 0.8秒右旋回
str(500); //33 0.5秒前進
turn_lt(1000); //34 1秒左旋回
str(2000); //35 2秒前進
turn_left(1000); //36 1秒左折
OnRev(OUT_A,30); //37 一段目と三段...
Wait(1000); //1秒待つ
Back(1000); //38 1秒後退
turn_rt(2000); //39 2秒右旋回
str(4000); //40 4秒前進
OnFwd(OUT_A,30); //41 缶を離す
Wait(1000); //1秒待つ
Off(OUT_A); //モーターAの電源...
SendResponseNumber(MAILBOX1,14); //42 Master側に14...
frg2=0; //関数frg2に0を代...
}
}
}
#ref(図8.jpg)
上のプログラムに説明として書かれている数字は、上の図の数...
*結果 [#hf4c6ded]
一回目は、Master側が缶を掴むことができず、タワーを倒して...
技術点は、平均12.2点となり、全体合計で14.2点であった。順...
*課題3の反省・感想 [#o08e4935]
課題3は、テスト前ということもあってあまり時間がなく点を取...
この授業を通して初めてロボットをプログラミングで操作する...
ページ名: