2019a/Member/Hinata/Mission3
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
検索
|
最終更新
|
ヘルプ
|
ログイン
]
開始行:
[[2019a/Member]]
#contents
*課題3 [#q45ee180]
#ref(2019a/Member/Hinata/Mission3/4.png,100%,4)
ボール回収の後に所定の位置に運ぶ、という課題だ~
前回の課題2にボールを持ち上げる動作を追加したものである
**試み [#d7281911]
プログラムもロボット制作も技量が足りないためボールを一つ...
M'からスタートする。交差点を渡りL'のボールをつかむ。その...
という計画を立てた
*ロボットについて [#gfd050da]
SLAVE側のアームを完全に降ろしたときにアームの先が地面すれ...
アームの上下には多大な負荷がかかると予想されたのでモータ...
**全体 [#rf3c994a]
#ref(2019a/Member/Hinata/Mission3/1.jpg,80%,1)
高さが必要だったためバッテリーボックスを二段重ねて置いて...
ただしディスレイが全く見えなかったので準備に手間取ること...
**ボール回収のアーム [#vb84c272]
&ref(2019a/Member/Hinata/Mission3/2.jpg,80%,1);&ref(2019a...
左:上から見たアーム 右:正面から見たアーム
このアームはモーターの回転をギアで垂直にしてある。これに...
アームの先についているパーツはボールが落ちないように補助...
*マスターのプログラム [#j4f2a559]
基本的にはMission2のものと変わりないため、詳細な説明はMis...
(http://yakushi.shinshu-u.ac.jp/robotics/?2019a%2FMember%...
**定義 [#x5042dcc]
#define Baced 45 //中間となる明るさの定義
#define speed 40
#define OnRL(speedR,speedL) OnFwd(OUT_B,speedR);OnFwd(OU...
#define Deep_turn_R OnRL(-speed,speed); //Deepで両車...
#define turn_R OnRL(0,speed); //片方の車輪...
#define Straight OnRL(speed,speed); //直進
#define Deep_turn_L OnRL(speed,-speed);
#define turn_L OnRL(speed,0);
#define turning_R OnRL(-speed,speeed);; //時計回りに...
#define turning_L OnRL(speed,-speed); //反時計回りに...
#define cross_line OnFwd(OUT_BC,15);Wait(400); //交差...
上記のものはすべて課題2で使用している~
重量の増加に伴い足回りのパワーは40とした
#define CONN 1 //SLAVE (アーム)を表す
#define meireiA 11 //これらは命令の番号を指定する
#define meireiB 12
#define meireiC 13
SLAVEを動かすために追加したもので、これらの命令の内容は受...
**サブルーチン [#me361140]
サブルーチンは完全に課題2の物を使用した。マクロで一括し...
***右側のトレース [#i738c24a]
void R_trace(int Z){ //道の右側をトレースして交差点...
SetSensorLight(S1);
long t0;
t0=CurrentTick(); //タイマーをセット
while (CurrentTick()-t0<Z) { //Z/1000秒以上連続...
if (SENSOR_1 < Baced-15) { //基準の明るさからー...
Deep_turn_R;
}
else if (SENSOR_1 < Baced-5) {turn_R; //基準の明...
t0=CurrentTick();}
else if (SENSOR_1 < Baced+5) {Straight;
t0=CurrentTick();}
else if (SENSOR_1 < Baced+10) {turn_L;
t0=CurrentTick();}
else {Deep_turn_L;
t0=CurrentTick();}
}
turning_L; //左に旋回
Wait(400);
cross_line; //直進して交差点を渡る
}
右側をトレースして交差点をわたるサブ関数~
Z/1000秒以上連続して右に曲がるまで続けると交差点と判断す...
***左側のトレース1 [#a2cabf16]
void L_trace_A(int X){ //上記のR_traceの左バージョン
SetSensorLight(S1);
long t0;
t0=CurrentTick();
while (CurrentTick()-t0<X) {
if (SENSOR_1 < Baced-15) {
Deep_turn_L;
}
else if (SENSOR_1 < Baced-5) {turn_L;
t0=CurrentTick();}
else if (SENSOR_1 < Baced+5) {Straight;
t0=CurrentTick();}
else if (SENSOR_1 < Baced+10) {turn_R;
t0=CurrentTick();}
else {Deep_turn_R;
t0=CurrentTick();}
}
turning_R; //右旋回
Wait(400);
cross_line; //交差点の横断
}
こちらはR_traceと違い左側をトレースしながら移動するように...
連続して左に曲がり続ける(黒が続く)と交差点と判断される~
基本となる左側トレース。
***左側のトレース2 [#e0804cf8]
void L_trace_B(int Y){ //左側トレース第二弾
SetSensorLight(S1);
long t0;
t0=CurrentTick();
while (CurrentTick()-t0<Y) {
if (SENSOR_1 < Baced-15) {Deep_turn_R;
t0=CurrentTick();}
else if (SENSOR_1 < Baced-5) {turn_L;
t0=CurrentTick();}
else if (SENSOR_1 < Baced+5) {Straight;
t0=CurrentTick();}
else if (SENSOR_1 < Baced+10) {turn_R;
t0=CurrentTick();}
else {Deep_turn_R; //上記のものと違い、...
}
}
turning_L; //左旋回
Wait(200);
}
**メインタスク [#g3f101e1]
task main()
{
int msg; //受け取った値を格納する変数とする
L_trace_A(300);
L_trace_B(200);
SendRemorteNumber(CONN,MAILBOX1,meireiA); //トレ...
While(true)
{
ReceiveRemorteNumber(CONN,MAILBOX1,true,msg); //...
//...
if(msg==meireiB) //命令Bがmsgにあれば以下の内容...
{
turning_L;
Wait(1500);
Off(OUT_BC);
SendRemorteNumber(CONN,MAILBOX1,meireiC); ...
}
}
}
*slaveのプログラム [#sc537ae8]
**定義 [#zb9d51e0]
#define speed 15
#define OnE(speed) OnFwd(OUT_B,speedE) //アームの開...
#define OnRL(speedR,speedL) OnFwd(OUT_B,speedR);OnFwd(OU...
#define arm_up OnRev(OUT_B,24); //アームを持ち上げ...
#define arm_down OnRL(speed,speed);
#define arm_open OnE(speed);
#define arm_close OnE(-speed);
#define meireiA 11 //マスターと統一した命令
#define meireiB 12
#define meireiC 13
あまり動くスピードが速すぎてもボールが不安定になるのでア...
**サブルーチン [#r005ae8a]
void catch()
{
arm_down; //モーターACでモーターB(アーム)を...
Wait(950);
arm_close; //モーターBがアーム
Wait(2000);
Off(OUT_B);
arm_up;
Wait(550);
Off(OUT_AC);
}
アームを下ろしてボールをつかんだ後に保持したままアームを...
void hanase()
{
arm_open;
Wait(1200);
Off(OUT_B);
}
単純かつ単調なため説明は省略した
**メインタスク [#y59d0e1c]
アームは開始時に大きく開けて、かつ最大まで上げておく~
これにより走行に影響を与えず行動することが可能となる上に...
task main
{
int msg; //// 受け取った値を格納する変数を作成
while(true)
{
ReceiveRemorteNumber(CONN,MAILBOX,true,msg); ...
if(msg==meireiA) //命令Aを...
{
catch();
SendRemorteNumber(CONN,MAILBOX1,meireiB); /...
}
if(msg==meireiC) //命令Cを受け取ったなら下記の...
{
hanase;
}
}
}
*結果 [#g66c12f2]
実験した教室では非常に正確に軽快に動作した。だが発表する...
図は失敗したK'の交差点である~
色のついたラインはセンサーの位置を表している
理想は青のラインのようにキツく曲がって交差点と判断するこ...
これは黒線が明るく照らされた結果、濃い黒が薄い黒として判...
薄い黒と判断すると片輪のみ動く仕様のため、あっさり線を越...
#ref(2019a/Member/Hinata/Mission3/5.png,100%,5)
*総括 [#i9f2f0bf]
時間との闘いの末にようやく完成したロボットとプログラムだ...
終了行:
[[2019a/Member]]
#contents
*課題3 [#q45ee180]
#ref(2019a/Member/Hinata/Mission3/4.png,100%,4)
ボール回収の後に所定の位置に運ぶ、という課題だ~
前回の課題2にボールを持ち上げる動作を追加したものである
**試み [#d7281911]
プログラムもロボット制作も技量が足りないためボールを一つ...
M'からスタートする。交差点を渡りL'のボールをつかむ。その...
という計画を立てた
*ロボットについて [#gfd050da]
SLAVE側のアームを完全に降ろしたときにアームの先が地面すれ...
アームの上下には多大な負荷がかかると予想されたのでモータ...
**全体 [#rf3c994a]
#ref(2019a/Member/Hinata/Mission3/1.jpg,80%,1)
高さが必要だったためバッテリーボックスを二段重ねて置いて...
ただしディスレイが全く見えなかったので準備に手間取ること...
**ボール回収のアーム [#vb84c272]
&ref(2019a/Member/Hinata/Mission3/2.jpg,80%,1);&ref(2019a...
左:上から見たアーム 右:正面から見たアーム
このアームはモーターの回転をギアで垂直にしてある。これに...
アームの先についているパーツはボールが落ちないように補助...
*マスターのプログラム [#j4f2a559]
基本的にはMission2のものと変わりないため、詳細な説明はMis...
(http://yakushi.shinshu-u.ac.jp/robotics/?2019a%2FMember%...
**定義 [#x5042dcc]
#define Baced 45 //中間となる明るさの定義
#define speed 40
#define OnRL(speedR,speedL) OnFwd(OUT_B,speedR);OnFwd(OU...
#define Deep_turn_R OnRL(-speed,speed); //Deepで両車...
#define turn_R OnRL(0,speed); //片方の車輪...
#define Straight OnRL(speed,speed); //直進
#define Deep_turn_L OnRL(speed,-speed);
#define turn_L OnRL(speed,0);
#define turning_R OnRL(-speed,speeed);; //時計回りに...
#define turning_L OnRL(speed,-speed); //反時計回りに...
#define cross_line OnFwd(OUT_BC,15);Wait(400); //交差...
上記のものはすべて課題2で使用している~
重量の増加に伴い足回りのパワーは40とした
#define CONN 1 //SLAVE (アーム)を表す
#define meireiA 11 //これらは命令の番号を指定する
#define meireiB 12
#define meireiC 13
SLAVEを動かすために追加したもので、これらの命令の内容は受...
**サブルーチン [#me361140]
サブルーチンは完全に課題2の物を使用した。マクロで一括し...
***右側のトレース [#i738c24a]
void R_trace(int Z){ //道の右側をトレースして交差点...
SetSensorLight(S1);
long t0;
t0=CurrentTick(); //タイマーをセット
while (CurrentTick()-t0<Z) { //Z/1000秒以上連続...
if (SENSOR_1 < Baced-15) { //基準の明るさからー...
Deep_turn_R;
}
else if (SENSOR_1 < Baced-5) {turn_R; //基準の明...
t0=CurrentTick();}
else if (SENSOR_1 < Baced+5) {Straight;
t0=CurrentTick();}
else if (SENSOR_1 < Baced+10) {turn_L;
t0=CurrentTick();}
else {Deep_turn_L;
t0=CurrentTick();}
}
turning_L; //左に旋回
Wait(400);
cross_line; //直進して交差点を渡る
}
右側をトレースして交差点をわたるサブ関数~
Z/1000秒以上連続して右に曲がるまで続けると交差点と判断す...
***左側のトレース1 [#a2cabf16]
void L_trace_A(int X){ //上記のR_traceの左バージョン
SetSensorLight(S1);
long t0;
t0=CurrentTick();
while (CurrentTick()-t0<X) {
if (SENSOR_1 < Baced-15) {
Deep_turn_L;
}
else if (SENSOR_1 < Baced-5) {turn_L;
t0=CurrentTick();}
else if (SENSOR_1 < Baced+5) {Straight;
t0=CurrentTick();}
else if (SENSOR_1 < Baced+10) {turn_R;
t0=CurrentTick();}
else {Deep_turn_R;
t0=CurrentTick();}
}
turning_R; //右旋回
Wait(400);
cross_line; //交差点の横断
}
こちらはR_traceと違い左側をトレースしながら移動するように...
連続して左に曲がり続ける(黒が続く)と交差点と判断される~
基本となる左側トレース。
***左側のトレース2 [#e0804cf8]
void L_trace_B(int Y){ //左側トレース第二弾
SetSensorLight(S1);
long t0;
t0=CurrentTick();
while (CurrentTick()-t0<Y) {
if (SENSOR_1 < Baced-15) {Deep_turn_R;
t0=CurrentTick();}
else if (SENSOR_1 < Baced-5) {turn_L;
t0=CurrentTick();}
else if (SENSOR_1 < Baced+5) {Straight;
t0=CurrentTick();}
else if (SENSOR_1 < Baced+10) {turn_R;
t0=CurrentTick();}
else {Deep_turn_R; //上記のものと違い、...
}
}
turning_L; //左旋回
Wait(200);
}
**メインタスク [#g3f101e1]
task main()
{
int msg; //受け取った値を格納する変数とする
L_trace_A(300);
L_trace_B(200);
SendRemorteNumber(CONN,MAILBOX1,meireiA); //トレ...
While(true)
{
ReceiveRemorteNumber(CONN,MAILBOX1,true,msg); //...
//...
if(msg==meireiB) //命令Bがmsgにあれば以下の内容...
{
turning_L;
Wait(1500);
Off(OUT_BC);
SendRemorteNumber(CONN,MAILBOX1,meireiC); ...
}
}
}
*slaveのプログラム [#sc537ae8]
**定義 [#zb9d51e0]
#define speed 15
#define OnE(speed) OnFwd(OUT_B,speedE) //アームの開...
#define OnRL(speedR,speedL) OnFwd(OUT_B,speedR);OnFwd(OU...
#define arm_up OnRev(OUT_B,24); //アームを持ち上げ...
#define arm_down OnRL(speed,speed);
#define arm_open OnE(speed);
#define arm_close OnE(-speed);
#define meireiA 11 //マスターと統一した命令
#define meireiB 12
#define meireiC 13
あまり動くスピードが速すぎてもボールが不安定になるのでア...
**サブルーチン [#r005ae8a]
void catch()
{
arm_down; //モーターACでモーターB(アーム)を...
Wait(950);
arm_close; //モーターBがアーム
Wait(2000);
Off(OUT_B);
arm_up;
Wait(550);
Off(OUT_AC);
}
アームを下ろしてボールをつかんだ後に保持したままアームを...
void hanase()
{
arm_open;
Wait(1200);
Off(OUT_B);
}
単純かつ単調なため説明は省略した
**メインタスク [#y59d0e1c]
アームは開始時に大きく開けて、かつ最大まで上げておく~
これにより走行に影響を与えず行動することが可能となる上に...
task main
{
int msg; //// 受け取った値を格納する変数を作成
while(true)
{
ReceiveRemorteNumber(CONN,MAILBOX,true,msg); ...
if(msg==meireiA) //命令Aを...
{
catch();
SendRemorteNumber(CONN,MAILBOX1,meireiB); /...
}
if(msg==meireiC) //命令Cを受け取ったなら下記の...
{
hanase;
}
}
}
*結果 [#g66c12f2]
実験した教室では非常に正確に軽快に動作した。だが発表する...
図は失敗したK'の交差点である~
色のついたラインはセンサーの位置を表している
理想は青のラインのようにキツく曲がって交差点と判断するこ...
これは黒線が明るく照らされた結果、濃い黒が薄い黒として判...
薄い黒と判断すると片輪のみ動く仕様のため、あっさり線を越...
#ref(2019a/Member/Hinata/Mission3/5.png,100%,5)
*総括 [#i9f2f0bf]
時間との闘いの末にようやく完成したロボットとプログラムだ...
ページ名: