2017b/Member/n1sh1/Mission3
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
検索
|
最終更新
|
ヘルプ
|
ログイン
]
開始行:
[[2017b/Member]]
目次
#contents
*課題について [#d8b0a9a6]
今回の課題は、課題2と同様のコースを用いて紙コップとその...
&ref(2017b/Member/n1sh1/Mission3/コース.png,60%,コース);
*ロボットについて [#y8f0d603]
**構想 [#i4ab5e31]
まずロボットの作成において、用いる本体は1台か2台か、また...
?紙コップを掴む動作と上げる動作1台だけで行うロボット
?各動作を別々のロボットで行うもの
?本体を2台用いて各動作を1つロボットで行うもの
**製作 [#uc43d767]
?,?,?をもとにロボットの製作にあたった。
?:これは先生が提示してくださった機構を用いるものだが、こ...
?:紙コップを掴むロボットとピンポン球を集めるロボットを別...
?:最終的にこのロボットの製作に当たり次のロボットが完成し...
&ref(2017b/Member/n1sh1/Mission3/全体.jpg,60%,全体);
**各部の説明 [#x9d72d6e]
***アーム部分 [#e663e3eb]
このようにギヤを用いたのだが、しっかりとかみ合っていなか...
&ref(2017b/Member/n1sh1/Mission3/アーム裏側.jpg,60%,アー...
実際に掴む動作は次のようになる。4か所にタイヤを用いること...
&ref(2017b/Member/n1sh1/Mission3/掴む1.jpg,30%,掴む1);
&ref(2017b/Member/n1sh1/Mission3/掴む2.jpg,30%,掴む2);
&ref(2017b/Member/n1sh1/Mission3/掴む3.jpg,30%,掴む3);
***上げる機構 [#w66089be]
このように掴む機構をそのまま持ち上げるようになっている。...
&ref(2017b/Member/n1sh1/Mission3/上げる機構1.jpg,55%,上...
掴む機構は2本の部品で支えているがそれらは矢印の部品を用い...
&ref(2017b/Member/n1sh1/Mission3/上げる機構2.png,70%,上...
***センサー等 [#t8a1b232]
課題2と同様に光センサーとタイヤの間を遠すぎず近すぎない...
&ref(2017b/Member/n1sh1/Mission3/光センサー.jpg,50%,セン...
&ref(2017b/Member/n1sh1/Mission3/センサー.jpg,50%,センサ...
***その他について [#a27eae0b]
本体を2台用いたためにモーターに大きな負荷がかかってしまっ...
&ref(2017b/Member/n1sh1/Mission3/前から.jpg,50%,前から);
しかし、次のように私たちのロボットは分解することができる...
&ref(2017b/Member/n1sh1/Mission3/ロボットの開き.jpg,55%,...
*プログラムについて [#ff752ebe]
上側の本体をマスター、下側の本体をスレーブとしている。ま...
マスター側出力:A→右側車輪、B→左側車輪
マスター側入力:1→距離センサー、2→光センサー
スレーブ側出力:A→掴む機構、B→上げる機構
**順路 [#hfa0c79b]
&ref(2017b/Member/n1sh1/Mission3/順路.png,35%,順路);
ロボットの順路は図のようにしている。Q-S間へ行った後はほと...
1,点Sを認識する。
2,下の方に向き、紙コップを持ち直す。
3,Xの方へ向き、ピンポン球を置く。
4,反転してYの手前まで行き、紙コップを置く。(実際はここで...
5,下の方に向き、紙コップの手前まで行き掴む。
6,3,4と同様。
7、上の方に向き、紙コップの手前まで行き掴む。
8,3,4と同様。
**マスター側定義,サブルーチン [#p8047709]
***安定のために [#k780ea8b]
これまでは安定のためにWait():をその都度書いてたのだが、今...
#define adjust Off(OUT_AB);Wait(50); //微調整
***ライントレースの定義 [#bc3d901f]
私たちはA-B間やQ-S間など直進するところはライントレースさ...
[[比例制御とは:http://yakushi.shinshu-u.ac.jp/robotics/?2...
#define sensor SENSOR_2 //センサーの値
#define black 30 //黒の値
#define white 60 //白の値
#define threshold (black+white)*0.5 //閾値(前述の明るさ...
#define deflection (sensor-threshold) //センサーの値と閾...
***ライントレースのサブルーチン [#bf6661b3]
この2つは課題2と同様にトレースするためのサブルーチンであ...
sub linetrase_right(int x) //ライントレース(進行方向右...
{
OnFwd(OUT_A,40+deflection*x);
OnFwd(OUT_B,40-deflection*x);
}
sub linetrase_left(int x) //ライントレース(進行方向左側)
{
OnFwd(OUT_A,40-deflection*x);
OnFwd(OUT_B,40+deflection*x);
}
この2つも同様に交差点認識するためのサブルーチンである。進...
黒線を認識する時間が一定以上の時に交差点認識するようにな...
sub intertify_right() //交差点識別(進行方向右側)
{
long t = CurrentTick();
while(CurrentTick()-t<100){
if(sensor_light>white-5){
linetrase_right(1.5);
t = CurrentTick();
}else if(sensor_light>black+5){
linetrase_right(1.5);
t = CurrentTick();
}else{
linetrase_right(1.5);
}
}
adjust;
}
sub intertify_left() //交差点識別(進行方向左側)
{
long t = CurrentTick();
while(CurrentTick()-t<100){
if(sensor_light>white-5){
linetrase_left(1.5);
t = CurrentTick();
}else if(sensor_light>black+5){
linetrase_left(1.5);
t = CurrentTick();
}else{
linetrase_left(1.5);
}
}
adjust;
}
これは開始点からライントレースできるようにするサブルーチ...
sub escape_A() //点A脱出
{
while(sensor_light<white-5){
OnFwd(OUT_B,50);
OnFwd(OUT_A,30);
}
adjust;
}
***紙コップ認識の定義 [#v7d1b0c6]
参考資料を元に定義した。
#define ultrasonic SensorUS(S1) //超音波センサー
const float diameter = 5.45; //タイヤの直径(cm)
const float track = 17.5; //タイヤのトレッド幅(cm)
const float pi = 3.1415; //円周率
***紙コップ認識のサブルーチン [#c829c346]
安定のためにすべてに adjust を入れている。
紙コップのところまで行き、その距離だけ戻す動作もさせたか...
void approach(float d) //dcm進む
{
long angle = d/(diameter*pi)*360.0; //必要なタイヤ...
RotateMotorEx(OUT_AB,50,angle,0,true,true);
adjust;
}
void back(float d) //dcm後退する
{
long angle = d/(diameter*pi)*360.0; //必要なタイヤ...
RotateMotorEx(OUT_AB,-50,angle,0,true,true);
adjust;
}
同様に反時計回りもさせたかったので2つめのサブルーチンを作...
void spinAng(long ang) //今の方向を中心にang度旋回(反時...
{
long angle = track/diameter*ang; //必要なタイヤの回...
RotateMotorEx(OUT_AB,50,angle,100,true,true);
adjust;
}
void spinAng_opposite(long ang) //今の方向を中心にang度...
{
long angle = track/diameter*ang; //必要なタイヤの回...
RotateMotorEx(OUT_AB,-50,angle,100,true,true);
adjust;
}
はじめ、【返す】という意味が分からなかったが、使っていく...
int search_distance(long ang) //現在の方向を中心にang度...
{
long tacho_min; //最も近い距離を実現するタイヤの回...
int d_min = 300; //最も近い距離の仮の最小値
long angle = (track/diameter)*ang; //旋回角度からタ...
spinAng(ang/2); //指定された角度の半分旋回
ResetTachoCount(OUT_AB); //角度計算をリセット
OnFwdSync(OUT_AB,50,-100); //反時計回りに旋回
while(MotorTachoCount(OUT_A)<=angle){
if(ultrasonic<d_min){ //現在の距離...
d_min = ultrasonic; //仮の最小値...
tacho_min = MotorTachoCount(OUT_A); //タイヤの回...
}
}
//タイヤの回転数、または距離センサーが仮の最小値以下...
OnFwdSyncEx(OUT_AB,50,100,RESET_NONE); //時計回りに...
until(MotorTachoCount(OUT_A)<=tacho_min || ultrasoni...
adjust;
Wait(500);
return d_min;
}
***各移動のサブルーチン [#qe5114cd]
これは参考資料を応用して作った黒線の中心を向くようなサブ...
// 現在の方向を中心にang度の範囲で黒線の中心を向く
sub search_light_center(long ang)
{
long tacho_min; //最も近い距離を実現するタイヤの回...
int light_min = 300; //最も暗い明るさの仮の最小値
long angle = (track/diameter)*ang; //旋回角度からタ...
spinAng(ang/2); //指定した角度の半分旋回
ResetTachoCount(OUT_AB); //角度計算をリセット
OnFwdSync(OUT_AB,50,-100);
while(MotorTachoCount(OUT_A)<=angle){
if(sensor_light<light_min){
light_min = sensor_light;
tacho_min = MotorTachoCount(OUT_A);
}
}
OnFwdSyncEx(OUT_AB,50,100,RESET_NONE); //時計回りに...
until(MotorTachoCount(OUT_A)<=tacho_min || sensor_li...
adjust;
Wait(500);
}
これらは各地点まで移動するサブルーチンである。センサーが...
sub go_P() //左上の紙コップからPまで
{
while(sensor_light>black+5){
OnFwdSync(OUT_AB,50,-100);
}
adjust;
while(sensor_light<white-5){
OnFwd(OUT_A,50);
}
adjust;
while(sensor_light>black+5){
OnFwdSync(OUT_AB,50,0);
}
adjust;
while(sensor_light<white-5){
OnFwdSync(OUT_AB,50,0);
}
adjust;
while(sensor_light>black+5){
OnFwd(OUT_A,50);
}
adjust;
}
sub go_P_Q() //PからQまで
{
while(sensor_light<white-5){
OnFwdSync(OUT_AB,50,0);
}
adjust;
while(sensor_light>black+5){
OnFwdSync(OUT_AB,50,0);
}
adjust;
long t1 = CurrentTick();
while(CurrentTick()-t1<1500){
OnFwdSync(OUT_AB,50,0);
}
}
sub go_S_C() //SからCまで
{
while(sensor_light<white-5){
OnFwdSync(OUT_AB,50,0);
}
adjust;
while(sensor_light>black+5){
OnFwdSync(OUT_AB,50,0);
}
adjust;
}
***通信のための定義 [#lf762737]
通信ための定義は次のように定義した。
#define ultrasonic SensorUS(S1) //超音波センサー
#define master 0
#define slave 1
#define mail MAILBOX1
#define cup_age_little 20 //紙コップちょっと上げる
#define cup_age 30 //紙コップ上げる
#define cup_sage 40 //紙コップ下げる
#define cup_re 50 //紙コップ持ち直す
#define fin 9 //終わり
**スレーブ側定義,サブルーチン [#l4fc8aec]
***通信のための定義 [#f34e189e]
マスター側と同様である。
#define master 0
#define slave 1
#define mail MAILBOX1
#define cup_age_little 20 //紙コップちょっと上げる
#define cup_age 30 //紙コップ上げる
#define cup_sage 40 //紙コップ下げる
#define cup_re 50 //紙コップ持ち直す
#define fin 9 //終わり
***サブルーチン [#n0590ac4]
スレーブ側は掴むモーターと上げ下げするモーターをつけてい...
sub tukamu() //掴む
{
RotateMotor(OUT_A,50,440);
adjust;
}
sub hanasu() //離す
{
RotateMotor(OUT_A,50,-440);
adjust;
}
sub up_little() //少し上げる
{
RotateMotor(OUT_B,60,-180);
adjust;
}
sub ageru() //上げる
{
RotateMotor(OUT_B,60,-720);
adjust;
}
sub down_little() //少し下げる
{
RotateMotor(OUT_B,60,180);
adjust;
}
sub sageru() //下げる
{
RotateMotor(OUT_B,60,720);
adjust;
}
**マスター側本文 [#acdf8dd0]
この通りであるが、無駄が多いものになってしまった。通信に...
task main()
{
SetSensorLowspeed(S1);
SetSensorLight(S2);
//AからBまで行く
escape_A();
intertify_right();
//紙コップを探しその5cm手前まで行く
int d1 = search_distance(90);
if(d1>10){
approach(d1-5);
}
//通信(左上の紙コップを少し上げる) //
int msg1;
while(msg1!=fin){
ReceiveRemoteNumber(mail,true,msg1);
SendRemoteNumber(slave,mail,cup_age_little);
}
//通信//
//進んだ分だけ戻る
back(d1-5);
//Bで方向転換してPまで行く//
spinAng(80); //Pの方へ向く
while(sensor_light>black+5){
OnFwdSync(OUT_AB,50,0);
}
adjust;
while(sensor_light<white-5){
OnFwd(OUT_B,50);
}
adjust;
intertify_right();
点Pでは5度だけ旋回させたが、これは、Q-S間で確実に黒線の左...
//PからSまで行く//
spinAng(5); //
approach(26);
while(sensor_light>black+5){
OnFwd(OUT_A,50);
}
adjust;
while(sensor_light<white-5){
OnFwd(OUT_B,50);
}
adjust;
intertify_right();
spinAng(90);
//通信(紙コップ持ち直す)//
int msg2;
while(msg2!=fin){
ReceiveRemoteNumber(mail,true,msg2);
SendRemoteNumber(slave,mail,cup_re);
}
//Xの方に向く//
while(sensor_light>black+5){
OnFwdSync(OUT_AB,50,100);
}
adjust;
while(sensor_light<white-10){
OnFwd(OUT_A,50);
}
adjust;
intertify_left();
intertify_left();
//通信(Xで紙コップ上げる)//
int msg3;
while(msg3!=fin){
ReceiveRemoteNumber(mail,true,msg3);
SendRemoteNumber(slave,mail,cup_age);
}
adjust;
}
//Yの方に向く
spinAng(160);
実際にきれいに動いたのはここまでである。反転して黒線を認...
while(sensor_light>black+5){
OnFwdSync(OUT_AB,50,0);
}
adjust;
//通信(紙コップ置く)//
int msg4;
while(msg4!=fin){
ReceiveRemoteNumber(mail,true,msg4);
SendRemoteNumber(slave,mail,cup_sage);
}
adjust;
//下の紙コップの方に向く
while(sensor_light<white-5){
OnFwdSync(OUT_AB,-50,0);
}
adjust;
while(sensor_light>black+5){
OnRev(OUT_A,50);
}
adjust;
spinAng(90);
int d2 = search_distance(90);
if(d2>10){
approach(d2-5);
}
//通信(紙コップ少し上げる)//
int msg5;
while(msg5!=fin){
ReceiveRemoteNumber(mail,true,msg5);
SendRemoteNumber(slave,mail,cup_age_little);
}
//進んだ分だけ戻る
back(d2-5);
//Xの方に向く
while(sensor_light>black+5){
OnFwdSync(OUT_AB,50,100);
}
adjust;
while(sensor_light<white-5){
OnFwd(OUT_A,50);
}
adjust;
intertify_left();
//通信(紙コップを上げる)//
int msg6;
while(msg6!=fin){
ReceiveRemoteNumber(mail,true,msg6);
SendRemoteNumber(slave,mail,cup_age);
}
adjust;
//Yの手前に行く
spinAng(320);
while(sensor_light>black+5){
OnFwdSync(OUT_AB,50,0);
}
adjust;
//紙コップを置く//
int msg7;
while(msg7!=fin){
ReceiveRemoteNumber(mail,true,msg7);
SendRemoteNumber(slave,mail,cup_sage);
}
//残りの紙コップの手前まで行く
spinAng_opposite(90);
int d3 = search_distance(90);
if(d3>10){
approach(d3-5);
}
//通信(紙コップを少し上げる)//
int msg8;
while(msg8!=fin){
ReceiveRemoteNumber(mail,true,msg8);
SendRemoteNumber(slave,mail,cup_age_little);
}
//進んだ分だけ戻る
back(d3-5);
//Xの方に向く
while(sensor_light>black+5){
OnFwdSync(OUT_AB,-50,100);
}
adjust;
intertify_right();
//通信(紙コップを少し上げる) //
int msg9;
while(msg9!=fin){
ReceiveRemoteNumber(mail,true,msg9);
SendRemoteNumber(slave,mail,cup_age);
}
adjust;
//Yの手前まで行く
spinAng(320);
while(sensor_light>black+5){
OnFwdSync(OUT_AB,50,0);
}
adjust;
//通信(紙コップ置く)//
int msg10;
while(msg10!=fin){
ReceiveRemoteNumber(mail,true,msg10);
SendRemoteNumber(slave,mail,cup_sage);
}
}
**スレーブ側本文 [#sfea136f]
このように同じようにプログラムが続いている。
task main()
{
//紙コップを少し上げる
int msg1;
until(msg1==cup_age_little)
ReceiveRemoteNumber(mail,true,msg1);
while(msg1==cup_age_little){
sageru();
tukamu();
up_little();
SendResponseNumber(mail,fin);
Wait(500);
msg1 = "";
}
//紙コップを持ち直す
int msg2;
until(msg2==cup_re)
ReceiveRemoteNumber(mail,true,msg2);
while(msg2==cup_re){
down_little();
hanasu();
tukamu();
up_little();
SendResponseNumber(mail,fin);
Wait(500);
msg2 = "";
}
//紙コップを上げる
int msg3;
until(msg3==cup_age)
ReceiveRemoteNumber(mail,true,msg3);
while(msg3==cup_age){
down_little();
ageru();
SendResponseNumber(mail,fin);
Wait(500);
msg3 = "";
}
//紙コップを置く
int msg4;
until(msg4==cup_sage)
ReceiveRemoteNumber(mail,true,msg4);
while(msg4==cup_sage){
sageru();
hanasu();
ageru();
SendResponseNumber(mail,fin);
Wait(500);
msg4 = "";
}
実際に動いたのはここまでである。
//下の紙コップを少し上げる
int msg5;
until(msg5==cup_age_little)
ReceiveRemoteNumber(mail,true,msg1);
while(msg5==cup_age_little){
sageru();
tukamu();
up_little();
SendResponseNumber(mail,fin);
Wait(500);
msg5 = "";
}
//紙コップを上げる
int msg6;
until(msg6==cup_age)
ReceiveRemoteNumber(mail,true,msg6);
while(msg6==cup_age){
down_little();
ageru();
SendResponseNumber(mail,fin);
Wait(500);
msg6 = "";
}
//紙コップを置く
int msg7;
until(msg7==cup_sage)
ReceiveRemoteNumber(mail,true,msg7);
while(msg7==cup_sage){
sageru();
hanasu();
ageru();
SendResponseNumber(mail,fin);
Wait(500);
msg7 = "";
}
//残りの紙コップを少し上げる
int msg8;
until(msg8==cup_age_little)
ReceiveRemoteNumber(mail,true,msg1);
while(msg8==cup_age_little){
sageru();
tukamu();
up_little();
SendResponseNumber(mail,fin);
Wait(500);
msg8 = "";
}
//紙コップを少し上げる
int msg9;
until(msg9==cup_age)
ReceiveRemoteNumber(mail,true,msg9);
while(msg9==cup_age){
down_little();
ageru();
SendResponseNumber(mail,fin);
Wait(500);
msg9 = "";
}
//紙コップを置く
int msg10;
until(msg10==cup_sage)
ReceiveRemoteNumber(mail,true,msg10);
while(msg10==cup_sage){
sageru();
hanasu();
ageru();
SendResponseNumber(mail,fin);
Wait(500);
msg10 = "";
}
}
*まとめ [#oa2e9125]
**結果 [#gb7fd656]
プログラムは3つの紙コップを置くところまで作ったのだが、...
**感想 [#c9ae0e59]
まず、今回の課題は私がほとんど一人で作ってきてしまった。...
終了行:
[[2017b/Member]]
目次
#contents
*課題について [#d8b0a9a6]
今回の課題は、課題2と同様のコースを用いて紙コップとその...
&ref(2017b/Member/n1sh1/Mission3/コース.png,60%,コース);
*ロボットについて [#y8f0d603]
**構想 [#i4ab5e31]
まずロボットの作成において、用いる本体は1台か2台か、また...
?紙コップを掴む動作と上げる動作1台だけで行うロボット
?各動作を別々のロボットで行うもの
?本体を2台用いて各動作を1つロボットで行うもの
**製作 [#uc43d767]
?,?,?をもとにロボットの製作にあたった。
?:これは先生が提示してくださった機構を用いるものだが、こ...
?:紙コップを掴むロボットとピンポン球を集めるロボットを別...
?:最終的にこのロボットの製作に当たり次のロボットが完成し...
&ref(2017b/Member/n1sh1/Mission3/全体.jpg,60%,全体);
**各部の説明 [#x9d72d6e]
***アーム部分 [#e663e3eb]
このようにギヤを用いたのだが、しっかりとかみ合っていなか...
&ref(2017b/Member/n1sh1/Mission3/アーム裏側.jpg,60%,アー...
実際に掴む動作は次のようになる。4か所にタイヤを用いること...
&ref(2017b/Member/n1sh1/Mission3/掴む1.jpg,30%,掴む1);
&ref(2017b/Member/n1sh1/Mission3/掴む2.jpg,30%,掴む2);
&ref(2017b/Member/n1sh1/Mission3/掴む3.jpg,30%,掴む3);
***上げる機構 [#w66089be]
このように掴む機構をそのまま持ち上げるようになっている。...
&ref(2017b/Member/n1sh1/Mission3/上げる機構1.jpg,55%,上...
掴む機構は2本の部品で支えているがそれらは矢印の部品を用い...
&ref(2017b/Member/n1sh1/Mission3/上げる機構2.png,70%,上...
***センサー等 [#t8a1b232]
課題2と同様に光センサーとタイヤの間を遠すぎず近すぎない...
&ref(2017b/Member/n1sh1/Mission3/光センサー.jpg,50%,セン...
&ref(2017b/Member/n1sh1/Mission3/センサー.jpg,50%,センサ...
***その他について [#a27eae0b]
本体を2台用いたためにモーターに大きな負荷がかかってしまっ...
&ref(2017b/Member/n1sh1/Mission3/前から.jpg,50%,前から);
しかし、次のように私たちのロボットは分解することができる...
&ref(2017b/Member/n1sh1/Mission3/ロボットの開き.jpg,55%,...
*プログラムについて [#ff752ebe]
上側の本体をマスター、下側の本体をスレーブとしている。ま...
マスター側出力:A→右側車輪、B→左側車輪
マスター側入力:1→距離センサー、2→光センサー
スレーブ側出力:A→掴む機構、B→上げる機構
**順路 [#hfa0c79b]
&ref(2017b/Member/n1sh1/Mission3/順路.png,35%,順路);
ロボットの順路は図のようにしている。Q-S間へ行った後はほと...
1,点Sを認識する。
2,下の方に向き、紙コップを持ち直す。
3,Xの方へ向き、ピンポン球を置く。
4,反転してYの手前まで行き、紙コップを置く。(実際はここで...
5,下の方に向き、紙コップの手前まで行き掴む。
6,3,4と同様。
7、上の方に向き、紙コップの手前まで行き掴む。
8,3,4と同様。
**マスター側定義,サブルーチン [#p8047709]
***安定のために [#k780ea8b]
これまでは安定のためにWait():をその都度書いてたのだが、今...
#define adjust Off(OUT_AB);Wait(50); //微調整
***ライントレースの定義 [#bc3d901f]
私たちはA-B間やQ-S間など直進するところはライントレースさ...
[[比例制御とは:http://yakushi.shinshu-u.ac.jp/robotics/?2...
#define sensor SENSOR_2 //センサーの値
#define black 30 //黒の値
#define white 60 //白の値
#define threshold (black+white)*0.5 //閾値(前述の明るさ...
#define deflection (sensor-threshold) //センサーの値と閾...
***ライントレースのサブルーチン [#bf6661b3]
この2つは課題2と同様にトレースするためのサブルーチンであ...
sub linetrase_right(int x) //ライントレース(進行方向右...
{
OnFwd(OUT_A,40+deflection*x);
OnFwd(OUT_B,40-deflection*x);
}
sub linetrase_left(int x) //ライントレース(進行方向左側)
{
OnFwd(OUT_A,40-deflection*x);
OnFwd(OUT_B,40+deflection*x);
}
この2つも同様に交差点認識するためのサブルーチンである。進...
黒線を認識する時間が一定以上の時に交差点認識するようにな...
sub intertify_right() //交差点識別(進行方向右側)
{
long t = CurrentTick();
while(CurrentTick()-t<100){
if(sensor_light>white-5){
linetrase_right(1.5);
t = CurrentTick();
}else if(sensor_light>black+5){
linetrase_right(1.5);
t = CurrentTick();
}else{
linetrase_right(1.5);
}
}
adjust;
}
sub intertify_left() //交差点識別(進行方向左側)
{
long t = CurrentTick();
while(CurrentTick()-t<100){
if(sensor_light>white-5){
linetrase_left(1.5);
t = CurrentTick();
}else if(sensor_light>black+5){
linetrase_left(1.5);
t = CurrentTick();
}else{
linetrase_left(1.5);
}
}
adjust;
}
これは開始点からライントレースできるようにするサブルーチ...
sub escape_A() //点A脱出
{
while(sensor_light<white-5){
OnFwd(OUT_B,50);
OnFwd(OUT_A,30);
}
adjust;
}
***紙コップ認識の定義 [#v7d1b0c6]
参考資料を元に定義した。
#define ultrasonic SensorUS(S1) //超音波センサー
const float diameter = 5.45; //タイヤの直径(cm)
const float track = 17.5; //タイヤのトレッド幅(cm)
const float pi = 3.1415; //円周率
***紙コップ認識のサブルーチン [#c829c346]
安定のためにすべてに adjust を入れている。
紙コップのところまで行き、その距離だけ戻す動作もさせたか...
void approach(float d) //dcm進む
{
long angle = d/(diameter*pi)*360.0; //必要なタイヤ...
RotateMotorEx(OUT_AB,50,angle,0,true,true);
adjust;
}
void back(float d) //dcm後退する
{
long angle = d/(diameter*pi)*360.0; //必要なタイヤ...
RotateMotorEx(OUT_AB,-50,angle,0,true,true);
adjust;
}
同様に反時計回りもさせたかったので2つめのサブルーチンを作...
void spinAng(long ang) //今の方向を中心にang度旋回(反時...
{
long angle = track/diameter*ang; //必要なタイヤの回...
RotateMotorEx(OUT_AB,50,angle,100,true,true);
adjust;
}
void spinAng_opposite(long ang) //今の方向を中心にang度...
{
long angle = track/diameter*ang; //必要なタイヤの回...
RotateMotorEx(OUT_AB,-50,angle,100,true,true);
adjust;
}
はじめ、【返す】という意味が分からなかったが、使っていく...
int search_distance(long ang) //現在の方向を中心にang度...
{
long tacho_min; //最も近い距離を実現するタイヤの回...
int d_min = 300; //最も近い距離の仮の最小値
long angle = (track/diameter)*ang; //旋回角度からタ...
spinAng(ang/2); //指定された角度の半分旋回
ResetTachoCount(OUT_AB); //角度計算をリセット
OnFwdSync(OUT_AB,50,-100); //反時計回りに旋回
while(MotorTachoCount(OUT_A)<=angle){
if(ultrasonic<d_min){ //現在の距離...
d_min = ultrasonic; //仮の最小値...
tacho_min = MotorTachoCount(OUT_A); //タイヤの回...
}
}
//タイヤの回転数、または距離センサーが仮の最小値以下...
OnFwdSyncEx(OUT_AB,50,100,RESET_NONE); //時計回りに...
until(MotorTachoCount(OUT_A)<=tacho_min || ultrasoni...
adjust;
Wait(500);
return d_min;
}
***各移動のサブルーチン [#qe5114cd]
これは参考資料を応用して作った黒線の中心を向くようなサブ...
// 現在の方向を中心にang度の範囲で黒線の中心を向く
sub search_light_center(long ang)
{
long tacho_min; //最も近い距離を実現するタイヤの回...
int light_min = 300; //最も暗い明るさの仮の最小値
long angle = (track/diameter)*ang; //旋回角度からタ...
spinAng(ang/2); //指定した角度の半分旋回
ResetTachoCount(OUT_AB); //角度計算をリセット
OnFwdSync(OUT_AB,50,-100);
while(MotorTachoCount(OUT_A)<=angle){
if(sensor_light<light_min){
light_min = sensor_light;
tacho_min = MotorTachoCount(OUT_A);
}
}
OnFwdSyncEx(OUT_AB,50,100,RESET_NONE); //時計回りに...
until(MotorTachoCount(OUT_A)<=tacho_min || sensor_li...
adjust;
Wait(500);
}
これらは各地点まで移動するサブルーチンである。センサーが...
sub go_P() //左上の紙コップからPまで
{
while(sensor_light>black+5){
OnFwdSync(OUT_AB,50,-100);
}
adjust;
while(sensor_light<white-5){
OnFwd(OUT_A,50);
}
adjust;
while(sensor_light>black+5){
OnFwdSync(OUT_AB,50,0);
}
adjust;
while(sensor_light<white-5){
OnFwdSync(OUT_AB,50,0);
}
adjust;
while(sensor_light>black+5){
OnFwd(OUT_A,50);
}
adjust;
}
sub go_P_Q() //PからQまで
{
while(sensor_light<white-5){
OnFwdSync(OUT_AB,50,0);
}
adjust;
while(sensor_light>black+5){
OnFwdSync(OUT_AB,50,0);
}
adjust;
long t1 = CurrentTick();
while(CurrentTick()-t1<1500){
OnFwdSync(OUT_AB,50,0);
}
}
sub go_S_C() //SからCまで
{
while(sensor_light<white-5){
OnFwdSync(OUT_AB,50,0);
}
adjust;
while(sensor_light>black+5){
OnFwdSync(OUT_AB,50,0);
}
adjust;
}
***通信のための定義 [#lf762737]
通信ための定義は次のように定義した。
#define ultrasonic SensorUS(S1) //超音波センサー
#define master 0
#define slave 1
#define mail MAILBOX1
#define cup_age_little 20 //紙コップちょっと上げる
#define cup_age 30 //紙コップ上げる
#define cup_sage 40 //紙コップ下げる
#define cup_re 50 //紙コップ持ち直す
#define fin 9 //終わり
**スレーブ側定義,サブルーチン [#l4fc8aec]
***通信のための定義 [#f34e189e]
マスター側と同様である。
#define master 0
#define slave 1
#define mail MAILBOX1
#define cup_age_little 20 //紙コップちょっと上げる
#define cup_age 30 //紙コップ上げる
#define cup_sage 40 //紙コップ下げる
#define cup_re 50 //紙コップ持ち直す
#define fin 9 //終わり
***サブルーチン [#n0590ac4]
スレーブ側は掴むモーターと上げ下げするモーターをつけてい...
sub tukamu() //掴む
{
RotateMotor(OUT_A,50,440);
adjust;
}
sub hanasu() //離す
{
RotateMotor(OUT_A,50,-440);
adjust;
}
sub up_little() //少し上げる
{
RotateMotor(OUT_B,60,-180);
adjust;
}
sub ageru() //上げる
{
RotateMotor(OUT_B,60,-720);
adjust;
}
sub down_little() //少し下げる
{
RotateMotor(OUT_B,60,180);
adjust;
}
sub sageru() //下げる
{
RotateMotor(OUT_B,60,720);
adjust;
}
**マスター側本文 [#acdf8dd0]
この通りであるが、無駄が多いものになってしまった。通信に...
task main()
{
SetSensorLowspeed(S1);
SetSensorLight(S2);
//AからBまで行く
escape_A();
intertify_right();
//紙コップを探しその5cm手前まで行く
int d1 = search_distance(90);
if(d1>10){
approach(d1-5);
}
//通信(左上の紙コップを少し上げる) //
int msg1;
while(msg1!=fin){
ReceiveRemoteNumber(mail,true,msg1);
SendRemoteNumber(slave,mail,cup_age_little);
}
//通信//
//進んだ分だけ戻る
back(d1-5);
//Bで方向転換してPまで行く//
spinAng(80); //Pの方へ向く
while(sensor_light>black+5){
OnFwdSync(OUT_AB,50,0);
}
adjust;
while(sensor_light<white-5){
OnFwd(OUT_B,50);
}
adjust;
intertify_right();
点Pでは5度だけ旋回させたが、これは、Q-S間で確実に黒線の左...
//PからSまで行く//
spinAng(5); //
approach(26);
while(sensor_light>black+5){
OnFwd(OUT_A,50);
}
adjust;
while(sensor_light<white-5){
OnFwd(OUT_B,50);
}
adjust;
intertify_right();
spinAng(90);
//通信(紙コップ持ち直す)//
int msg2;
while(msg2!=fin){
ReceiveRemoteNumber(mail,true,msg2);
SendRemoteNumber(slave,mail,cup_re);
}
//Xの方に向く//
while(sensor_light>black+5){
OnFwdSync(OUT_AB,50,100);
}
adjust;
while(sensor_light<white-10){
OnFwd(OUT_A,50);
}
adjust;
intertify_left();
intertify_left();
//通信(Xで紙コップ上げる)//
int msg3;
while(msg3!=fin){
ReceiveRemoteNumber(mail,true,msg3);
SendRemoteNumber(slave,mail,cup_age);
}
adjust;
}
//Yの方に向く
spinAng(160);
実際にきれいに動いたのはここまでである。反転して黒線を認...
while(sensor_light>black+5){
OnFwdSync(OUT_AB,50,0);
}
adjust;
//通信(紙コップ置く)//
int msg4;
while(msg4!=fin){
ReceiveRemoteNumber(mail,true,msg4);
SendRemoteNumber(slave,mail,cup_sage);
}
adjust;
//下の紙コップの方に向く
while(sensor_light<white-5){
OnFwdSync(OUT_AB,-50,0);
}
adjust;
while(sensor_light>black+5){
OnRev(OUT_A,50);
}
adjust;
spinAng(90);
int d2 = search_distance(90);
if(d2>10){
approach(d2-5);
}
//通信(紙コップ少し上げる)//
int msg5;
while(msg5!=fin){
ReceiveRemoteNumber(mail,true,msg5);
SendRemoteNumber(slave,mail,cup_age_little);
}
//進んだ分だけ戻る
back(d2-5);
//Xの方に向く
while(sensor_light>black+5){
OnFwdSync(OUT_AB,50,100);
}
adjust;
while(sensor_light<white-5){
OnFwd(OUT_A,50);
}
adjust;
intertify_left();
//通信(紙コップを上げる)//
int msg6;
while(msg6!=fin){
ReceiveRemoteNumber(mail,true,msg6);
SendRemoteNumber(slave,mail,cup_age);
}
adjust;
//Yの手前に行く
spinAng(320);
while(sensor_light>black+5){
OnFwdSync(OUT_AB,50,0);
}
adjust;
//紙コップを置く//
int msg7;
while(msg7!=fin){
ReceiveRemoteNumber(mail,true,msg7);
SendRemoteNumber(slave,mail,cup_sage);
}
//残りの紙コップの手前まで行く
spinAng_opposite(90);
int d3 = search_distance(90);
if(d3>10){
approach(d3-5);
}
//通信(紙コップを少し上げる)//
int msg8;
while(msg8!=fin){
ReceiveRemoteNumber(mail,true,msg8);
SendRemoteNumber(slave,mail,cup_age_little);
}
//進んだ分だけ戻る
back(d3-5);
//Xの方に向く
while(sensor_light>black+5){
OnFwdSync(OUT_AB,-50,100);
}
adjust;
intertify_right();
//通信(紙コップを少し上げる) //
int msg9;
while(msg9!=fin){
ReceiveRemoteNumber(mail,true,msg9);
SendRemoteNumber(slave,mail,cup_age);
}
adjust;
//Yの手前まで行く
spinAng(320);
while(sensor_light>black+5){
OnFwdSync(OUT_AB,50,0);
}
adjust;
//通信(紙コップ置く)//
int msg10;
while(msg10!=fin){
ReceiveRemoteNumber(mail,true,msg10);
SendRemoteNumber(slave,mail,cup_sage);
}
}
**スレーブ側本文 [#sfea136f]
このように同じようにプログラムが続いている。
task main()
{
//紙コップを少し上げる
int msg1;
until(msg1==cup_age_little)
ReceiveRemoteNumber(mail,true,msg1);
while(msg1==cup_age_little){
sageru();
tukamu();
up_little();
SendResponseNumber(mail,fin);
Wait(500);
msg1 = "";
}
//紙コップを持ち直す
int msg2;
until(msg2==cup_re)
ReceiveRemoteNumber(mail,true,msg2);
while(msg2==cup_re){
down_little();
hanasu();
tukamu();
up_little();
SendResponseNumber(mail,fin);
Wait(500);
msg2 = "";
}
//紙コップを上げる
int msg3;
until(msg3==cup_age)
ReceiveRemoteNumber(mail,true,msg3);
while(msg3==cup_age){
down_little();
ageru();
SendResponseNumber(mail,fin);
Wait(500);
msg3 = "";
}
//紙コップを置く
int msg4;
until(msg4==cup_sage)
ReceiveRemoteNumber(mail,true,msg4);
while(msg4==cup_sage){
sageru();
hanasu();
ageru();
SendResponseNumber(mail,fin);
Wait(500);
msg4 = "";
}
実際に動いたのはここまでである。
//下の紙コップを少し上げる
int msg5;
until(msg5==cup_age_little)
ReceiveRemoteNumber(mail,true,msg1);
while(msg5==cup_age_little){
sageru();
tukamu();
up_little();
SendResponseNumber(mail,fin);
Wait(500);
msg5 = "";
}
//紙コップを上げる
int msg6;
until(msg6==cup_age)
ReceiveRemoteNumber(mail,true,msg6);
while(msg6==cup_age){
down_little();
ageru();
SendResponseNumber(mail,fin);
Wait(500);
msg6 = "";
}
//紙コップを置く
int msg7;
until(msg7==cup_sage)
ReceiveRemoteNumber(mail,true,msg7);
while(msg7==cup_sage){
sageru();
hanasu();
ageru();
SendResponseNumber(mail,fin);
Wait(500);
msg7 = "";
}
//残りの紙コップを少し上げる
int msg8;
until(msg8==cup_age_little)
ReceiveRemoteNumber(mail,true,msg1);
while(msg8==cup_age_little){
sageru();
tukamu();
up_little();
SendResponseNumber(mail,fin);
Wait(500);
msg8 = "";
}
//紙コップを少し上げる
int msg9;
until(msg9==cup_age)
ReceiveRemoteNumber(mail,true,msg9);
while(msg9==cup_age){
down_little();
ageru();
SendResponseNumber(mail,fin);
Wait(500);
msg9 = "";
}
//紙コップを置く
int msg10;
until(msg10==cup_sage)
ReceiveRemoteNumber(mail,true,msg10);
while(msg10==cup_sage){
sageru();
hanasu();
ageru();
SendResponseNumber(mail,fin);
Wait(500);
msg10 = "";
}
}
*まとめ [#oa2e9125]
**結果 [#gb7fd656]
プログラムは3つの紙コップを置くところまで作ったのだが、...
**感想 [#c9ae0e59]
まず、今回の課題は私がほとんど一人で作ってきてしまった。...
ページ名: