2017b/Member/arso/Mission3
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
検索
|
最終更新
|
ヘルプ
|
ログイン
]
開始行:
[[2017b/Member]]
&size(24){目次};
#contents
*初めに [#l6e5e22a]
課題3のフィールドと大まかな説明を載せておく。
#ref(2017b/Member/arso/Mission3/2017b-mission3.png,50%,フ...
図1:フィールド
フィールドは図1のように課題2と同じものを使う。図の&color(...
詳しいルールは[[2017年度後期の課題3:http://yakushi.shinsh...
また、班のメンバーは私のほかに[[riko:http://yakushi.shins...
*ロボットについて [#k7c9df8b]
**ロボット全体 [#q4e2f724]
#ref(2017b/Member/arso/Mission3/DSCN1188.jpg,70%,ロボット...
写真1:ロボットの全体
今回の課題に対しては同じロボットを2つ作った。これは、コッ...
**本体(車体) [#eac27e9d]
#ref(2017b/Member/arso/Mission3/DSCN1190.jpg,70%,光センサ...
写真2:光センサー
課題2のときと同様、タイヤ間の中心に取り付けることで移動な...
#ref(2017b/Member/arso/Mission3/DSCN1206.jpg,70%,支え)
写真3:支え
この部分は、アームの重さのために、持ち上げているときと下...
**アーム [#t4c50f54]
***アーム全体 [#b36deda8]
#ref(2017b/Member/arso/Mission3/DSCN1191.jpg,70%,アーム全...
写真4:アーム全体
アーム全体は写真4のようになっている。いくつかの機能を持っ...
***センサー部分 [#aef23ab7]
#ref(2017b/Member/arso/Mission3/DSCN1193.jpg,70%,超音波セ...
写真5:超音波センサー
超音波センサーは、アームの後方の動かない部分から伸ばして...
***スタンド [#s702b520]
&ref(2017b/Member/arso/Mission3/DSCN1201.jpg,70%,スタンド...
&ref(2017b/Member/arso/Mission3/DSCN1200.jpg,78%,スタンド...
写真6:スタンド 写真...
これは、スタート前のルールのためだけのパーツである。スタ...
***コップをつかむ機構 [#fee8441c]
#ref(2017b/Member/arso/Mission3/DSCN1192.jpg,70%,アーム上)
写真8:上から見たアーム
アームを上から見ると写真8のようになっている。使用した部品...
&ref(2017b/Member/arso/Mission3/DSCN1205.jpg,70%,アーム下);
&ref(2017b/Member/arso/Mission3/コップ固定.jpg,70%,コップ...
写真9:下から見たアーム ...
写真9の赤線で囲まれた部分が今回の工夫である。これがあるこ...
#ref(2017b/Member/arso/Mission3/コップつかむ2.jpg,70%,コ...
図3:割りばしの枠越え
本課題では、割り箸で作った枠の中にピンポン玉を入れるには...
#ref(2017b/Member/arso/Mission3/ギア.jpg,70%,回転の仕組み)
写真9:アームの開閉
写真9のように、&color(blue){青矢印};の向きにモーターを動...
&ref(2017b/Member/arso/Mission3/DSCN1198.jpg,70%,コップを...
&ref(2017b/Member/arso/Mission3/コップ.jpg,70%,コップを持...
写真10:コップをつかんだ状態 ...
写真10は腕を閉じてコップをつかんだ状態である。この状態で...
**コップを重ねる方法 [#f9944814]
本番ではここまでたどり着けなかったが、重ねるプログラムだ...
#ref(2017b/Member/arso/Mission3/積み重ね1.jpg,70%,積み重...
図4:コップの重ね方1
次に、図4のように親機はコップを持ち上げたままコップの近く...
#ref(2017b/Member/arso/Mission3/積み重ね2.jpg,70%,積み重...
図5:コップの重ね方2
通信をして子機がメッセージ1を受け取ると、図5のように子機...
#ref(2017b/Member/arso/Mission3/積み重ね4.jpg,70%,積み重...
図6:コップの重ね方3
その後、図6のように親機も前進する。このときの移動距離の制...
#ref(2017b/Member/arso/Mission3/積み重ね5.jpg,70%,積み重...
図7:コップの重ね方4
図7ではわかりにくいが、ここで子機は腕を少し開いて親機が重...
#ref(2017b/Member/arso/Mission3/積み重ね6.jpg,70%,積み重...
図8:コップの重ね方5
親機も腕を下ろしていくと図8のようにコップを重ねられる。3...
*プログラムについて [#gac8807e]
プログラムは、ライントレースなどの移動のプログラムと紙コ...
ここで私たちの班が立てた計画を大まかに示しておく。大まか...
#ref(2017b/Member/arso/Mission3/第3回コース1.jpg,70%,順路1)
図9:順路1
子機はA地点からスタートし、ある程度直進してから超音波セン...
親機はD地点を後ろ向きでスタートし、ある程度進む(&color(r...
#ref(2017b/Member/arso/Mission3/第3回コース2.jpg,65%,順路2)
図10:順路2
順路1の後、子機は何もせずに&color(green){緑色の丸};の地点...
親機はある程度後退した後(&color(red){赤の経路?};)、ライ...
**モーターの対応 [#ced6b9ef]
今回のプログラムでは、アームのある方をロボットの前方とし...
OUT_A //右側のタイヤ
OUT_B //左側のタイヤ
OUT_C //アーム
**親機 [#a54feeb4]
***音楽 [#y202a7a6]
#define SO 392 //ソの音
#define DO 523 //ドの音
#define MI 659 //ミの音
#define SO_H 784 //高いソの音
#define SI 988 //シの音
#define DO_H 1047 //高いドの音
#define MI_H 1318 //高いミの音
#define RE 1175 //高いレの音
#define SO_SH 1568 //おそらく高いソのシャープの音
sub pose_SE()
{
PlayTone(MI_H,90);Wait(100); //ミを0.09秒鳴らし0.1...
PlayTone(DO_H,90);Wait(100); //高いドを0.09秒鳴らし...
PlayTone(MI_H,90);Wait(100); //高いミを0.09秒鳴らし...
PlayTone(DO_H,90);Wait(100); //高いドを0.09秒鳴らし...
}
sub one_UP_SE()
{
PlayTone(MI,110);Wait(120); //ミを0.11秒鳴らし0....
PlayTone(SO_H,110);Wait(120); //高いソを0.11秒鳴ら...
PlayTone(MI_H,110);Wait(120); //高いミを0.11秒鳴ら...
PlayTone(DO_H,110);Wait(120); //高いドを0.11秒鳴ら...
PlayTone(RE,110);Wait(120); //レを0.11秒鳴らし0....
PlayTone(SO_SH,110);Wait(120); //高いソのシャープを...
}
sub coin_SE()
{
PlayTone(SI,90);Wait(100); //シを0.09秒鳴らし0...
PlayTone(MI_H,140);Wait(150); //高いミを0.14秒鳴...
}
sub Start_SE()
{
PlayTone(MI,100);Wait(110); //ミを0.1秒鳴らし0.11...
PlayTone(MI,100);Wait(250); //ミを0.1秒鳴らし0.25...
PlayTone(MI,100);Wait(160); //ミを0.1秒鳴らし0.16...
PlayTone(DO,90);Wait(100); //ドを0.09秒鳴らし0.1...
PlayTone(MI,90);Wait(230); //ミを0.11秒鳴らし0.12...
PlayTone(SO_H,90);Wait(420); //高いソを0.09秒鳴らし...
PlayTone(SO,170);Wait(180); //ソを0.17秒鳴らし0.18...
}
***移動関連 [#td2ff648]
#define average 45 //光センサーの値の基準
#define move1 OnFwd(OUT_A,40);OnFwd(OUT_B,-35); //右の...
#define move2 OnFwd(OUT_A,30);OnFwd(OUT_B,-20); //右の...
#define move3 OnFwd(OUT_A,54);OnFwd(OUT_B,54); //右の...
#define move4 OnFwd(OUT_B,30);OnFwd(OUT_A,-20); //左の...
#define move5 OnFwd(OUT_B,40);OnFwd(OUT_A,-35); //左の...
#define reverse_move1 OnFwd(OUT_A,-10);OnFwd(OUT_B,-30);...
#define reverse_move2 OnFwd(OUT_A,-54);OnFwd(OUT_B,-50);...
#define reverse_move3 OnFwd(OUT_B,-10);OnFwd(OUT_A,-30);...
sub Stop_Motion()
{
Wait(300); //0.3秒待つ
pose_SE(); //サブ関数pose_SE()を呼び出す
Wait(1000); //1秒待つ
}
sub L_Assist_line(int Assist_time)
{
long ta=CurrentTick(); //時間を測定
while(CurrentTick()-ta<=Assist_time){ //測定時間が...
if(SENSOR_2<average-11){ //光センサー...
move1; //move1を...
}else if(SENSOR_2<average-7){ //光センサー...
move2; //move2を...
}else if(SENSOR_2<average+7){ //光センサー...
move3; //move3を...
}else if(SENSOR_2<average+11){ //光センサー...
move4; //move4を...
}else { //光センサー...
move5; //move5を...
}
}
coin_SE(); //サブ関数coin_SE()を呼び出す
}
sub R_Assist_line(int Assist_time)
{
long tb=CurrentTick(); //時間を測定
while(CurrentTick()-tb<=Assist_time){ //測定時間が...
if(SENSOR_2<average-11){ //光センサー...
move5; //move5を...
}else if(SENSOR_2<average-7){ //光センサー...
move4; //move4を...
}else if(SENSOR_2<average+7){ //光センサー...
move3; //move3を...
}else if(SENSOR_2<average+11){ //光センサー...
move2; //move2を...
}else{ //光センサー...
move1; //move1を...
}
}
coin_SE(); //サブ関数coin_SE()を呼び出す
}
sub L_line(int Assist_time,int Stop_time)
{
L_Assist_line(Assist_time); //サブ関数L_Assist_l...
long t1=CurrentTick(); //時間を測定
while(CurrentTick()-t1<=Stop_time){ //測定時間がSt...
if(SENSOR_2<average-11){ //光センサーが...
move1; //move1を呼...
}else if(SENSOR_2<average-7){ //光センサーが...
move2; //move2を呼...
t1=CurrentTick(); //時間を初期化
}else if(SENSOR_2<average+7){ //光センサーが...
move3; //move3を呼...
t1=CurrentTick(); //時間を初期化
}else if(SENSOR_2<average+11){ //光センサーが...
move4; //move4を呼...
t1=CurrentTick(); //時間を初期化
}else { //光センサーが...
move5; //move5を呼...
t1=CurrentTick(); //時間を初期化
}
}
Off(OUT_AB); //停止
coin_SE(); //サブ関数coin_SE()を呼び出す
}
sub R_line(int Assist_time,int Stop_time)
{
R_Assist_line(Assist_time); //サブ関数R_Assist_l...
long t2=CurrentTick(); //時間を測定
while(CurrentTick()-t2<=Stop_time){ //測定時間がSt...
if(SENSOR_2<average-11) { //光センサー...
move5; //move5を呼...
}else if(SENSOR_2<average-8){ //光センサー...
move4; //move4を呼...
t2=CurrentTick(); //時間を初...
}else if(SENSOR_2<average+6){ //光センサー...
move3; //move3を呼...
t2=CurrentTick(); //時間を初...
}else if(SENSOR_2<average+11){ //光センサー...
move2; //move2を呼...
t2=CurrentTick(); //時間を初...
}else{ //光センサー...
move1; //move1を呼...
t2=CurrentTick(); //時間を初...
}
}
Off(OUT_AB); //停止
coin_SE(); サブ関数coin_SE()を呼び出す
}
sub White_to_Black(int blight,int A_speed,int B_speed)
{
while(SENSOR_2>blight)[ //光センサーが得た値がb...
OnFwd(OUT_A,A_speed); //右をA_speedで動かす
OnFwd(OUT_B,B_speed); //左をB_speedで動かす
}
Off(OUT_AB); //停止
}
sub Black_to_White(int blight,int A_speed,int B_speed)
{
while(SENSOR_2<blight){ //光センサーが得た値がbl...
OnFwd(OUT_A,A_speed); //右をA_speedで動かす
OnFwd(OUT_B,B_speed); //左をB_speedで動かす
}
Off(OUT_AB); //停止
}
sub reverse_R_Assist_line(int Assist_time)
{
long tc=CurrentTick(); //時間を測定
while(CurrentTick()-tc<=Assist_time){ //測定時間がA...
if(SENSOR_2<average-7){ //光セ...
reverse_move3; //rever...
}else if(SENSOR_2<average+7){ //光センサー...
reverse_move2; //rever...
}else{ //光センサー...
reverse_move1; //rever...
}
}
}
sub reverse_R_line(int Assist_time,int Stop_time)
{
reverse_R_Assist_line(Assist_time);
long t3=CurrentTick(); //時間を測定
while(CurrentTick()-t3<=Stop_time){ //測定時間がSt...
if(SENSOR_2<average-7){ //光センサーが...
reverse_move3; //reverse_mo...
}else if(SENSOR_2<average+7){ //光センサーが...
reverse_move2; //reverse_mo...
t3=CurrentTick(); //時間を初期化
}else{ //光センサーが...
reverse_move1; //reverse_mo...
}
}
Off(OUT_AB); //停止
}
sub reverse_Start_Set()
{
reverse_move2; //reverse_move2を呼び出す
Start_SE(); //サブ関数Start_SE()を呼び出す
Wait(2000); //2秒間待つ
White_to_Black(48,20,35); //サブ関数White_to_Bla...
}
***コップ関連 [#q1feb784]
#define FAST 50 //モーターの強さの定義(強)
#define SLOW 30 //モーターの強さの定義(弱)
#define CONN 1 //通信の接続番号
#define SIGNALON1 11 //通信用のメッセージ1
#define SIGNALON2 12 //通信用のメッセージ2
int d; //dを整数とする
const float diameter=5.45; //diameterを定数5.45とする...
const float tread=11.3; //treadを定数11.3とする。こ...
const float pi=3.1415; //piを定数3.1415とする。こ...
ここまで定義である。
sub keep_cop() //コップを持ち上げたまま維持する
{
ResetTachoCount(OUT_C); //アームの回転角をリ...
RotateMotor(OUT_C,-SLOW,50); //モーターを強さSLOW...
OnFwd(OUT_C,-20); //アームを強さ20で持...
}
コップを持ち上げたまま維持するためのプログラムである。連...
sub fwdDist(float d) //距離dcm前進させる
{
long angle=d/(diameter*pi)*360.0; //dcm進ませるの...
RotateMotorEx(OUT_AB,SLOW,angle,0,true,true); //ロ...
}
ロボットを任意の距離(cm)だけ進ませるためのプログラムであ...
sub turnAng(long ang) //ang度の時計回りの旋回
{
long angle=tread/diameter*ang; //ang度の旋回に必...
RotateMotorEx(OUT_AB,SLOW,angle,100,true,true); //...
}
ロボットを任意の角度だけ時計回りに旋回させるプログラムで...
int searchDirection(long ang) //ロボットがその時...
{
long tacho_min; //最も近い距離となるタイヤの回転数
int d_min=300; //最も近い距離の仮の最小値。十分...
long angle=(tread/diameter)*ang; //旋回角度からタ...
turnAng(ang/2); //指定された角度の半分を...
ResetTachoCount(OUT_AB); //角度計測を初期化
OnFwdSync(OUT_AB,SLOW,-100); //反時計回りに強さSL...
while(MotorTachoCount(OUT_A)<=angle){ //右のタイヤ...
if(SensorUS(S3)<d_min){ //現在の距離が仮の最...
d_min=SensorUS(S3); //仮の最小値を更新する
tacho_min=MotorTachoCount(OUT_A); //この時の...
}
}
OnFwdSyncEx(OUT_AB,SLOW,100,RESET_NONE);
until(MotorTachoCount(OUT_A)<=tacho_min||SensorUS(S3...
Wait(14); //微調整
Off(OUT_AB);
Wait(500);
return d_min;
}
先生が授業中に配ったプリントを参考にして書いた、ロボット...
sub tag() //コップを重ねる
{
keep_cop(); //コップを持ち上げて維持する。
d=searchDirection(15); //ロボットの向きを中心に角度...
if(d>5.0){ //測定した距離が5cmより遠いとき
SendRemoteNumber(CONN,MAILBOX1,SIGNALON1); //...
Wait(5000); //5秒間待つ(図5)
fwdDist(d-8.0); //測定した距離の8?...
ResetTachoCount(OUT_ABC); //全てのモーターの...
RotateMotorEx(OUT_AB,-SLOW,40,0,true,true); //...
RotateMotor(OUT_C,SLOW,50); //...
SendRemoteNumber(CONN,MAILBOX1,SIGNALON2); //...
Wait(5000); //5秒間待つ(図7)
RotateMotor(OUT_C,SLOW,100); //モータを100度動...
ResetTachoCount(OUT_ABC); //全てのモーター...
RotateMotor(OUT_C,SLOW,720); //モータを720度動...
RotateMotorEx(OUT_AB,-SLOW,120,0,true,true); //...
}
}
コップを重ねるための親機のプログラムである。通信を行って...
sub catch_cop(long ang1) //コップをつかむ
{
ResetTachoCount(OUT_C); //アームのモーターを初期化
RotateMotor(OUT_C,-SLOW,ang1); //強さSLOWで角度a...
}
腕を任意の角度だけ閉じるサブ関数である。ang1はアームのモ...
sub release_cop(long ang2) //コップを放す
{
ResetTachoCount(OUT_C); //アームのモーターを初期化
RotateMotor(OUT_C,SLOW,ang2); //強さSLOWで角度an...
}
腕を任意の角度だけ開くサブ関数である。ang2はアームのモー...
sub release_ball() //ピンポン玉を枠に入れる
{
ResetTachoCount(OUT_ABC); //全てのモーターの回転...
OnFwd(OUT_AB,SLOW);
Wait(700); //0.7秒間強さSLOWで前進
Off(OUT_AB); //停止
ResetTachoCount(OUT_C); //アームのモーターの回...
RotateMotor(OUT_C,-SLOW,50); //モーターを50度回転さ...
OnFwd(OUT_C,-20); //
Wait(1000); //1秒間持ち上げたまま維持する
OnFwd(OUT_AB,-SLOW);
Wait(700); //強さSLOWで0.7秒間後退する
Off(OUT_AB); //停止
}
ピンポン玉を枠に入れるためのプログラムである。実験段階で...
***プログラム全体 [#o46e00ab]
使ったものをそのまま載せたので、コップ関連のプログラムと...
#define SO 392
#define DO 523
#define MI 659
#define SO_H 784
#define SI 988
#define DO_H 1047
#define MI_H 1318
#define RE 1175
#define SO_SH 1568
sub pose_SE()
{
PlayTone(MI_H,90);Wait(100);
PlayTone(DO_H,90);Wait(100);
PlayTone(MI_H,90);Wait(100);
PlayTone(DO_H,90);Wait(100);
}
sub one_UP_SE()
{
PlayTone(MI,110);Wait(120);
PlayTone(SO_H,110);Wait(120);
PlayTone(MI_H,110);Wait(120);
PlayTone(DO_H,110);Wait(120);
PlayTone(RE,110);Wait(120);
PlayTone(SO_SH,110);Wait(120);
}
sub coin_SE()
{
PlayTone(SI,90);Wait(100);
PlayTone(MI_H,140);Wait(150);
}
sub Start_SE()
{
PlayTone(MI,100);Wait(110);
PlayTone(MI,100);Wait(250);
PlayTone(MI,100);Wait(160);
PlayTone(DO,90);Wait(100);
PlayTone(MI,90);Wait(230);
PlayTone(SO_H,90);Wait(420);
PlayTone(SO,170);Wait(180);
}
#define FAST 50
#define SLOW 30
#define CONN 1
#define SIGNALON1 11
#define SIGNALON2 12
int d;
const float diameter=5.45;
const float tread=11.3;
const float pi=3.1415;
sub keep_cop()
{
ResetTachoCount(OUT_C);
RotateMotor(OUT_C,-SLOW,50);
OnFwd(OUT_C,-20);
}
sub fwdDist(float d)
{
long angle=d/(diameter*pi)*360.0;
RotateMotorEx(OUT_AB,SLOW,angle,0,true,true);
}
sub turnAng(long ang)
{
long angle=tread/diameter*ang;
RotateMotorEx(OUT_AB,SLOW,angle,100,true,true);
}
int searchDirection(long ang)
{
long tacho_min;
int d_min=300;
long angle=(tread/diameter)*ang;
turnAng(ang/2);
ResetTachoCount(OUT_AB);
OnFwdSync(OUT_AB,SLOW,-100);
while(MotorTachoCount(OUT_A)<=angle){
if(SensorUS(S3)<d_min){
d_min=SensorUS(S3);
tacho_min=MotorTachoCount(OUT_A);
}
}
OnFwdSyncEx(OUT_AB,SLOW,100,RESET_NONE);
until(MotorTachoCount(OUT_A)<=tacho_min||SensorUS(S3...
Wait(14);
Off(OUT_AB);
Wait(500);
return d_min;
}
sub tag()
{
keep_cop();
d=searchDirection(15);
if(d>5.0){
SendRemoteNumber(CONN,MAILBOX1,SIGNALON1);
Wait(5000);
fwdDist(d-8.0);
ResetTachoCount(OUT_ABC);
RotateMotorEx(OUT_AB,-SLOW,40,0,true,true);
RotateMotor(OUT_C,SLOW,50);
SendRemoteNumber(CONN,MAILBOX1,SIGNALON2);
Wait(5000);
RotateMotor(OUT_C,SLOW,100);
ResetTachoCount(OUT_ABC);
RotateMotor(OUT_C,SLOW,720);
RotateMotorEx(OUT_AB,-SLOW,120,0,true,true);
}
}
sub catch_cop(long ang1)
{
ResetTachoCount(OUT_C);
RotateMotor(OUT_C,-SLOW,ang1);
}
sub release_cop(long ang2)
{
ResetTachoCount(OUT_C);
RotateMotor(OUT_C,SLOW,ang2);
}
sub release_ball()
{
ResetTachoCount(OUT_ABC);
OnFwd(OUT_AB,SLOW);
Wait(700);
Off(OUT_AB);
ResetTachoCount(OUT_C);
RotateMotor(OUT_C,-SLOW,50);
OnFwd(OUT_C,-20);
Wait(1000);
OnFwd(OUT_AB,-SLOW);
Wait(700);
Off(OUT_AB);
}
#define move1 OnFwd(OUT_A,40);OnFwd(OUT_B,-35);
#define move2 OnFwd(OUT_A,30);OnFwd(OUT_B,-20);
#define move3 OnFwd(OUT_A,54);OnFwd(OUT_B,54);
#define move4 OnFwd(OUT_B,30);OnFwd(OUT_A,-20);
#define move5 OnFwd(OUT_B,40);OnFwd(OUT_A,-35);
#define average 45
sub Stop_Motion()
{
Wait(300);
pose_SE();
Wait(1000);
}
sub L_Assist_line(int Assist_time)
{
long ta=CurrentTick();
while (CurrentTick()-ta<=Assist_time){
if (SENSOR_2<average-11) {
move1
}else if (SENSOR_2<average-7){
move2;
}else if (SENSOR_2<average+7){
move3;
}else if (SENSOR_2<average+11){
move4;
}else {
move5;
}
}
coin_SE();
}
sub R_Assist_line(int Assist_time)
{
long tb=CurrentTick();
while (CurrentTick()-tb<=Assist_time){
if (SENSOR_2<average-11) {
move5;
} else if (SENSOR_2<average-7){
move4;
} else if (SENSOR_2<average+7){
move3;
} else if (SENSOR_2<average+11){
move2;
} else {
move1;
}
}
coin_SE();
}
sub L_line(int Assist_time,int Stop_time)
{
L_Assist_line(Assist_time);
long t1=CurrentTick();
while (CurrentTick()-t1<=Stop_time){
if (SENSOR_2<average-11) {
move1;
} else if (SENSOR_2<average-7){
move2;
t1=CurrentTick();
} else if (SENSOR_2<average+7){
move3;
t1=CurrentTick();
} else if (SENSOR_2<average+11){
move4;
t1=CurrentTick();
} else {
move5;
t1=CurrentTick();
}
}
Off(OUT_AB);
coin_SE();
}
sub R_line(int Assist_time,int Stop_time)
{
R_Assist_line(Assist_time);
long t2=CurrentTick();
while (CurrentTick()-t2<=Stop_time){
if (SENSOR_2<average-11) {
move5;
} else if (SENSOR_2<average-8){
move4;
t2=CurrentTick();
} else if (SENSOR_2<average+6){
move3;
t2=CurrentTick();
} else if (SENSOR_2<average+11){
move2;
t2=CurrentTick();
} else {
move1;
t2=CurrentTick();
}
}
Off(OUT_AB);
coin_SE();
}
sub White_to_Black(int blight,int A_speed,int B_speed)
{
while (SENSOR_2>blight){
OnFwd(OUT_A,A_speed);
OnFwd(OUT_B,B_speed);
}
Off(OUT_AB);
}
sub Black_to_White(int blight,int A_speed,int B_speed)
{
while (SENSOR_2<blight){
OnFwd(OUT_A,A_speed);
OnFwd(OUT_B,B_speed);
}
Off(OUT_AB);
}
#define reverse_move1 OnFwd(OUT_A,-10);OnFwd(OUT_B,-30);
#define reverse_move2 OnFwd(OUT_A,-54);OnFwd(OUT_B,-50);
#define reverse_move3 OnFwd(OUT_B,-10);OnFwd(OUT_A,-30);
sub reverse_R_Assist_line(int Assist_time)
{
long tc=CurrentTick();
while (CurrentTick()-tc<=Assist_time){
if (SENSOR_2<average-7){
reverse_move3;
} else if (SENSOR_2<average+7){
reverse_move2;
} else {
reverse_move1;
}
}
}
sub reverse_R_line(int Assist_time,int Stop_time)
{
reverse_R_Assist_line(Assist_time);
long t3=CurrentTick();
while (CurrentTick()-t3<=Stop_time){
if (SENSOR_2<average-7){
reverse_move3;
} else if (SENSOR_2<average+7){
reverse_move2;
t3=CurrentTick();
} else {
reverse_move1;
}
}
Off(OUT_AB);
}
sub reverse_Start_Set()
{
reverse_move2;
Start_SE();
Wait(2000);
White_to_Black(48,20,35);
}
task main()
{
SetSensorLight(S2); //光センサーを設定
SetSensorLowspeed(S3); //超音波センサーを設定
reverse_Start_Set(); //後ろ向きでスタートし赤の?...
L_line(1300,110); //ライントレース(赤の?の経...
OnFwd(OUT_AB,-SLOW);
Wait(500); //交差点で0.5秒間後退
Off(OUT_AB); //停止
White_to_Black(43,20,25); //位置を調整
White_to_Black(33,20,25); //位置を調整
ResetTachoCount(OUT_A); //右側のタイヤの回転...
RotateMotor(OUT_A,-SLOW,150); //右側のタイヤのモー...
d=searchDirection(15); //ロボットを中心に15度の...
if(d>5.0){ //距離が5cmより遠い場合
catch_cop(600); //腕を少し閉じておく(腕の左...
OnFwd(OUT_AB,SLOW);
Wait(1000); //1秒間前進
Off(OUT_AB); //停止
catch_cop(500); //コップをつかむ
OnFwd(OUT_AB,-SLOW);
Wait(400); //0.4秒間後退
Off(OUT_AB); //停止
} //?終了後からここまでが赤の...
ResetTachoCount(OUT_B); //左側のタイヤの回転...
RotateMotor(OUT_B,-SLOW,110); //左側のタイヤのモー...
release_ball(); //ピンポン玉を枠に入れる(赤の...
ResetTachoCount(OUT_A); //右側のタイヤの回転角...
RotateMotor(OUT_A,-SLOW,130);//右側のタイヤのモータ...
tag(); //コップを重ねる(赤の経路?)
OnFwd(OUT_AB,-SLOW);
Wait(1000); //1秒間後退
Off(OUT_AB); //停止(赤の経路?)
White_to_Black(48,35,25); //黒線を探す(赤の...
L_line(300,130); //ライントレース(...
Black_to_White(48,0,-30); //交差点で位置を調整
White_to_Black(33,0,-30); //交差点で位置を調整
d=searchDirection(15); //ロボットを中心に...
if(d>5.0){ //距離が5cmより遠い場合
catch_cop(600); //腕を少し閉じておく(腕の左...
OnFwd(OUT_AB,SLOW);
Wait(1000); //1秒間前進
Off(OUT_AB); //停止
catch_cop(500); //コップをつかむ
OnFwd(OUT_AB,-SLOW);
Wait(400); //0.4秒間後退
Off(OUT_AB); //停止(赤の経路?)
}
White_to_Black(33,-30,-30); //黒線を探す
L_line(150,130); //ライントレース
Black_to_White(48,30,30); //交差点を越える
release_ball(); //ピンポン玉を枠に入...
ResetTachoCount(OUT_A); //右側のタイヤのモー...
RotateMotor(OUT_A,-SLOW,130); //右側のタイヤのモー...
tag(); //コップを重ねる(赤の経路?)
ResetTachoCount(OUT_C); //アームのモーターを...
RotateMotor(OUT_C,-SLOW,1100); //アームのモーターを1...
White_to_Black(33,-30,-30); //位置を調整
Black_to_White(48,-30,-30); //位置を調整
White_to_Black(33,-30,-30); //位置を調整
OnFwd(OUT_AB,SLOW);
Wait(300); //0.3秒間前進
Off(OUT_AB); //停止
ResetTachoCount(OUT_C); //アームのモーターを...
RotateMotor(OUT_C,SLOW,1200); //アームのモーターを11...
}
**子機 [#u3b39ac6]
***音楽 [#q5a855b5]
音楽は親機と一緒である。親機の[[音楽:http://yakushi.shins...
***ライントレース関連 [#o06e647d]
親機と異なるのは定義とサブ関数の一部がないことと、異なる...
sub Start_Set()
{
Start_SE(); //サブ関数Start_SE()を呼び出す
move3; //move3を呼び出す
Wait(600); //0.6秒間待つ
White_to_Black(48,30,5); //黒線を探す
}
***コップ関連 [#mbb4a56f]
こちらも親機と異なるのは通信のプログラムのみなので、それ...
#define SIGNALON 11 //親機ではSIGNALON1になっていたの...
動作には影響しないが、定数名に「1」を書き忘れていたようで...
sub tag() //コップを重ねる
{
int msg,counter; //msg,counterを整数とする
ResetTachoCount(OUT_ABC); //全てのモータ...
RotateMotor(OUT_C,SLOW,1080); //アームのモー...
RotateMotorEx(OUT_AB,-SLOW,360,0,true,true); /...
RotateMotor(OUT_C,-SLOW,1080); //アームのモー...
while(counter==0){ //カウンターが0の間繰り返す...
ReceiveRemoteNumber(MAILBOX1,true,msg); //MA...
if(msg==SIGNALON){ //メッセージSIGNALO...
ResetTachoCount(OUT_ABC); //全てのモータ...
RotateMotor(OUT_C,SLOW,1080); //アームの...
RotateMotorEx(OUT_AB,SLOW,120,0,true,true); ...
RotateMotor(OUT_C,-SLOW,1080); //アームの...
counter++; //counterに1を加え...
}
}
counter=0; //カウンターを0にする
while(counter==0){ //カウンターが0の間繰り返す...
ReceiveRemoteNumber(MAILBOX1,true,msg); //MA...
if(msg==SIGNALON2) { //メッセージSIGNA...
ResetTachoCount(OUT_ABC); //全てのモータ...
RotateMotor(OUT_C,SLOW,360); //アームのモ...
RotateMotorEx(OUT_AB,SLOW,40,0,true,true); ...
counter++; //counterに1を加える
}
}
counter=0; //カウンターを0にする
ResetTachoCount(OUT_ABC); //全てのモーターの回...
RotateMotor(OUT_C,SLOW,720); //アームのモーターを...
RotateMotorEx(OUT_AB,-SLOW,120,0,true,true); //後...
}
msgは受け取ったメッセージを格納する変数である。counterは...
今回、メッセージを受け取るプログラムをメッセージが届くま...
***プログラム全体 [#e743cbf5]
親機同様使ったものをそのまま載せたので、コップ関連のプロ...
#define SO 392
#define DO 523
#define MI 659
#define SO_H 784
#define SI 988
#define DO_H 1047
#define MI_H 1318
#define RE 1175
#define SO_SH 1568
#define SIGNALON 11
#define SIGNALON2 12
#define SLOW 30
const float diameter=5.45;
const float tread=11.3;
const float pi=3.1415;
int d;
sub fwdDist(float d)
{
long angle=d/(diameter*pi)*360.0;
RotateMotorEx(OUT_AB,SLOW,angle,0,true,true);
}
sub turnAng(long ang)
{
long angle=tread/diameter*ang;
RotateMotorEx(OUT_AB,SLOW,angle,100,true,true);
}
int searchDirection(long ang)
{
long tacho_min;
int d_min=300;
long angle=(tread/diameter)*ang;
turnAng(ang/2);
ResetTachoCount(OUT_AB);
OnFwdSync(OUT_AB,SLOW,-100);
while(MotorTachoCount(OUT_A)<=angle){
if(SensorUS(S3)<d_min){
d_min=SensorUS(S3);
tacho_min=MotorTachoCount(OUT_A);
}
}
OnFwdSyncEx(OUT_AB,SLOW,100,RESET_NONE);
until(MotorTachoCount(OUT_A)<=tacho_min||SensorUS(S3...
Wait(14);
Off(OUT_AB);
Wait(500);
return d_min;
}
sub tag()
{
int msg,counter;
ResetTachoCount(OUT_ABC);
RotateMotor(OUT_C,SLOW,1080);
RotateMotorEx(OUT_AB,-SLOW,360,0,true,true);
RotateMotor(OUT_C,-SLOW,1080);
while(counter==0){
ReceiveRemoteNumber(MAILBOX1,true,msg);
if(msg==SIGNALON) {
ResetTachoCount(OUT_ABC);
RotateMotor(OUT_C,SLOW,1080);
RotateMotorEx(OUT_AB,SLOW,120,0,true,true);
RotateMotor(OUT_C,-SLOW,1080);
counter++;
}
}
counter=0;
while(counter==0){
ReceiveRemoteNumber(MAILBOX1,true,msg);
if(msg==SIGNALON2) {
ResetTachoCount(OUT_ABC);
RotateMotor(OUT_C,SLOW,360);
RotateMotorEx(OUT_AB,SLOW,40,0,true,true);
counter++;
}
}
counter=0;
ResetTachoCount(OUT_ABC);
RotateMotor(OUT_C,SLOW,720);
RotateMotorEx(OUT_AB,-SLOW,120,0,true,true);
}
sub pose_SE()
{
PlayTone(MI_H,90);Wait(100);
PlayTone(DO_H,90);Wait(100);
PlayTone(MI_H,90);Wait(100);
PlayTone(DO_H,90);Wait(100);
}
sub one_UP_SE()
{
PlayTone(MI,110);Wait(120);
PlayTone(SO_H,110);Wait(120);
PlayTone(MI_H,110);Wait(120);
PlayTone(DO_H,110);Wait(120);
PlayTone(RE,110);Wait(120);
PlayTone(SO_SH,110);Wait(120);
}
sub coin_SE()
{
PlayTone(SI,90);Wait(100);
PlayTone(MI_H,140);Wait(150);
}
sub Start_SE()
{
PlayTone(MI,100);Wait(110);
PlayTone(MI,100);Wait(250);
PlayTone(MI,100);Wait(160);
PlayTone(DO,90);Wait(100);
PlayTone(MI,90);Wait(230);
PlayTone(SO_H,90);Wait(420);
PlayTone(SO,170);Wait(180);
}
#define move1 OnFwd(OUT_A,40);OnFwd(OUT_B,-35);
#define move2 OnFwd(OUT_A,30);OnFwd(OUT_B,-20);
#define move3 OnFwd(OUT_A,54);OnFwd(OUT_B,54);
#define move4 OnFwd(OUT_B,30);OnFwd(OUT_A,-20);
#define move5 OnFwd(OUT_B,40);OnFwd(OUT_A,-35);
#define average 45
sub Stop_Motion()
{
Wait(300);
pose_SE();
Wait(1000);
}
sub L_Assist_line(int Assist_time)
{
long ta=CurrentTick();
while (CurrentTick()-ta<=Assist_time){
if(SENSOR_2<average-11) {
move1
}else if (SENSOR_2<average-7){
move2;
}else if (SENSOR_2<average+7){
move3;
}else if (SENSOR_2<average+11){
move4;
}else {
move5;
}
}
coin_SE();
}
sub R_Assist_line(int Assist_time)
{
long tb=CurrentTick();
while (CurrentTick()-tb<=Assist_time){
if(SENSOR_2<average-11) {
move5;
}else if(SENSOR_2<average-7){
move4;
}else if(SENSOR_2<average+7){
move3;
}else if(SENSOR_2<average+11){
move2;
}else {
move1;
}
}
coin_SE();
}
sub L_line(int Assist_time,int Stop_time)
{
L_Assist_line(Assist_time);
long t1=CurrentTick();
while (CurrentTick()-t1<=Stop_time){
if (SENSOR_2<average-11) {
move1;
} else if (SENSOR_2<average-7){
move2;
t1=CurrentTick();
} else if (SENSOR_2<average+7){
move3;
t1=CurrentTick();
} else if (SENSOR_2<average+11){
move4;
t1=CurrentTick();
} else {
move5;
t1=CurrentTick();
}
}
Off(OUT_AB);
coin_SE();
}
sub R_line(int Assist_time,int Stop_time)
{
R_Assist_line(Assist_time);
long t2=CurrentTick();
while (CurrentTick()-t2<=Stop_time){
if (SENSOR_2<average-11) {
move5;
} else if (SENSOR_2<average-8){
move4;
t2=CurrentTick();
} else if (SENSOR_2<average+6){
move3;
t2=CurrentTick();
} else if (SENSOR_2<average+11){
move2;
t2=CurrentTick();
} else {
move1;
t2=CurrentTick();
}
}
Off(OUT_AB);
coin_SE();
}
sub White_to_Black(int blight,int A_speed,int B_speed)
{
while (SENSOR_2>blight){
OnFwd(OUT_A,A_speed);
OnFwd(OUT_B,B_speed);
}
Off(OUT_AB);
}
sub Black_to_White(int blight,int A_speed,int B_speed)
{
while (SENSOR_2<blight){
OnFwd(OUT_A,A_speed);
OnFwd(OUT_B,B_speed);
}
Off(OUT_AB);
}
sub Start_Set()
{
Start_SE();
move3;
Wait(600);
White_to_Black(48,30,5);
}
sub catch_cop(long ang1)
{
ResetTachoCount(OUT_C);
RotateMotor(OUT_C,-SLOW,ang1);
}
sub release_cop(long ang2)
{
ResetTachoCount(OUT_C);
RotateMotor(OUT_C,SLOW,ang2);
}
sub release_ball()
{
ResetTachoCount(OUT_ABC);
OnFwd(OUT_AB,SLOW);
Wait(700);
Off(OUT_AB);
ResetTachoCount(OUT_C);
RotateMotor(OUT_C,-SLOW,50);
OnFwd(OUT_C,-20);
Wait(1000);
OnFwd(OUT_AB,-SLOW);
Wait(700);
Off(OUT_AB);
}
sub keep_cop()
{
ResetTachoCount(OUT_C);
RotateMotor(OUT_C,-SLOW,50);
OnFwd(OUT_C,-20);
}
task main()
{
SetSensorLight(S2); //光センサーを設定
SetSensorLowspeed(S3); //超音波センサーを設定
Start_Set();
R_line(300,150); //前進後ライントレース
d=searchDirection(15); //ロボットを中心に15度の...
if(d>5.0){ //距離が5cmより遠い場合
catch_cop(700); //腕を少し閉じておく(腕の左や右...
OnFwd(OUT_AB,SLOW);
Wait(1400); //1.4秒間前進
Off(OUT_AB); //停止
catch_cop(300); //コップをつかむ
OnFwd(OUT_AB,-SLOW);
Wait(100); //0.1秒間後退
Off(OUT_AB); //停止(青の経路?)
}
ResetTachoCount(OUT_A); //右側のタイヤのモータ...
RotateMotor(OUT_A,-SLOW,370); //右側のタイヤのモー...
OnFwd(OUT_AB,SLOW);
Wait(600); //0.6秒間前進
Off(OUT_AB); //停止
catch_cop(40); //アームのモーターを40度回しコ...
OnFwd(OUT_C,-SLOW);
Wait(1000); //持ち上げたまま1秒間維持する
Off(OUT_C); //停止
OnFwd(OUT_AB,-SLOW);
Wait(1000); //1秒間後退
Off(OUT_AB); //停止(青の経路?)
White_to_Black(33,35,15);
Black_to_White(48,35,15);
White_to_Black(33,40,25);
Black_to_White(48,-30,0);
White_to_Black(33,-30,0);
Black_to_White(50,0,-30);
White_to_Black(33,35,30);
Black_to_White(48,35,30); //8つのサブ関数で緑丸の...
release_cop(50);
tag(); //コップを重ねる(青の経路?)
keep_cop(); //コップを持ち上げ維持する
tag(); //コップを重ねる(青の経路?)
OnFwd(OUT_AB,-SLOW);
Wait(1000); //1秒間後退
Off(OUT_AB); //停止
}
*結果 [#j0192476]
発表1回目は、子機が1個ピンポン玉を枠内に入れたが、その後...
技術点は8.8点で、合計12.8点となり、9チーム中6位の結果とな...
*考察 [#i63ecd49]
レポートを作るにあたってロボットの機構やプログラムを見直...
まずロボットについてだが、1つ目は、超音波センサーは左右ど...
2つ目は、アームの自重が大きくなり、コップを持ち上げた状態...
3つ目は、機体が長くなってしまったことだ。これの影響で、障...
まとめると、3つの理由で機体の動きが制限されてしまったとい...
また、プログラムにも問題があったと考えられる。ライントレ...
*感想 [#ha368ba0]
あらゆる状況や問題を考慮した上で、結果を出せるプログラム...
*まとめ [#mdab3f6e]
これまでの3つの課題を通して、プログラミングの基礎をしっか...
終了行:
[[2017b/Member]]
&size(24){目次};
#contents
*初めに [#l6e5e22a]
課題3のフィールドと大まかな説明を載せておく。
#ref(2017b/Member/arso/Mission3/2017b-mission3.png,50%,フ...
図1:フィールド
フィールドは図1のように課題2と同じものを使う。図の&color(...
詳しいルールは[[2017年度後期の課題3:http://yakushi.shinsh...
また、班のメンバーは私のほかに[[riko:http://yakushi.shins...
*ロボットについて [#k7c9df8b]
**ロボット全体 [#q4e2f724]
#ref(2017b/Member/arso/Mission3/DSCN1188.jpg,70%,ロボット...
写真1:ロボットの全体
今回の課題に対しては同じロボットを2つ作った。これは、コッ...
**本体(車体) [#eac27e9d]
#ref(2017b/Member/arso/Mission3/DSCN1190.jpg,70%,光センサ...
写真2:光センサー
課題2のときと同様、タイヤ間の中心に取り付けることで移動な...
#ref(2017b/Member/arso/Mission3/DSCN1206.jpg,70%,支え)
写真3:支え
この部分は、アームの重さのために、持ち上げているときと下...
**アーム [#t4c50f54]
***アーム全体 [#b36deda8]
#ref(2017b/Member/arso/Mission3/DSCN1191.jpg,70%,アーム全...
写真4:アーム全体
アーム全体は写真4のようになっている。いくつかの機能を持っ...
***センサー部分 [#aef23ab7]
#ref(2017b/Member/arso/Mission3/DSCN1193.jpg,70%,超音波セ...
写真5:超音波センサー
超音波センサーは、アームの後方の動かない部分から伸ばして...
***スタンド [#s702b520]
&ref(2017b/Member/arso/Mission3/DSCN1201.jpg,70%,スタンド...
&ref(2017b/Member/arso/Mission3/DSCN1200.jpg,78%,スタンド...
写真6:スタンド 写真...
これは、スタート前のルールのためだけのパーツである。スタ...
***コップをつかむ機構 [#fee8441c]
#ref(2017b/Member/arso/Mission3/DSCN1192.jpg,70%,アーム上)
写真8:上から見たアーム
アームを上から見ると写真8のようになっている。使用した部品...
&ref(2017b/Member/arso/Mission3/DSCN1205.jpg,70%,アーム下);
&ref(2017b/Member/arso/Mission3/コップ固定.jpg,70%,コップ...
写真9:下から見たアーム ...
写真9の赤線で囲まれた部分が今回の工夫である。これがあるこ...
#ref(2017b/Member/arso/Mission3/コップつかむ2.jpg,70%,コ...
図3:割りばしの枠越え
本課題では、割り箸で作った枠の中にピンポン玉を入れるには...
#ref(2017b/Member/arso/Mission3/ギア.jpg,70%,回転の仕組み)
写真9:アームの開閉
写真9のように、&color(blue){青矢印};の向きにモーターを動...
&ref(2017b/Member/arso/Mission3/DSCN1198.jpg,70%,コップを...
&ref(2017b/Member/arso/Mission3/コップ.jpg,70%,コップを持...
写真10:コップをつかんだ状態 ...
写真10は腕を閉じてコップをつかんだ状態である。この状態で...
**コップを重ねる方法 [#f9944814]
本番ではここまでたどり着けなかったが、重ねるプログラムだ...
#ref(2017b/Member/arso/Mission3/積み重ね1.jpg,70%,積み重...
図4:コップの重ね方1
次に、図4のように親機はコップを持ち上げたままコップの近く...
#ref(2017b/Member/arso/Mission3/積み重ね2.jpg,70%,積み重...
図5:コップの重ね方2
通信をして子機がメッセージ1を受け取ると、図5のように子機...
#ref(2017b/Member/arso/Mission3/積み重ね4.jpg,70%,積み重...
図6:コップの重ね方3
その後、図6のように親機も前進する。このときの移動距離の制...
#ref(2017b/Member/arso/Mission3/積み重ね5.jpg,70%,積み重...
図7:コップの重ね方4
図7ではわかりにくいが、ここで子機は腕を少し開いて親機が重...
#ref(2017b/Member/arso/Mission3/積み重ね6.jpg,70%,積み重...
図8:コップの重ね方5
親機も腕を下ろしていくと図8のようにコップを重ねられる。3...
*プログラムについて [#gac8807e]
プログラムは、ライントレースなどの移動のプログラムと紙コ...
ここで私たちの班が立てた計画を大まかに示しておく。大まか...
#ref(2017b/Member/arso/Mission3/第3回コース1.jpg,70%,順路1)
図9:順路1
子機はA地点からスタートし、ある程度直進してから超音波セン...
親機はD地点を後ろ向きでスタートし、ある程度進む(&color(r...
#ref(2017b/Member/arso/Mission3/第3回コース2.jpg,65%,順路2)
図10:順路2
順路1の後、子機は何もせずに&color(green){緑色の丸};の地点...
親機はある程度後退した後(&color(red){赤の経路?};)、ライ...
**モーターの対応 [#ced6b9ef]
今回のプログラムでは、アームのある方をロボットの前方とし...
OUT_A //右側のタイヤ
OUT_B //左側のタイヤ
OUT_C //アーム
**親機 [#a54feeb4]
***音楽 [#y202a7a6]
#define SO 392 //ソの音
#define DO 523 //ドの音
#define MI 659 //ミの音
#define SO_H 784 //高いソの音
#define SI 988 //シの音
#define DO_H 1047 //高いドの音
#define MI_H 1318 //高いミの音
#define RE 1175 //高いレの音
#define SO_SH 1568 //おそらく高いソのシャープの音
sub pose_SE()
{
PlayTone(MI_H,90);Wait(100); //ミを0.09秒鳴らし0.1...
PlayTone(DO_H,90);Wait(100); //高いドを0.09秒鳴らし...
PlayTone(MI_H,90);Wait(100); //高いミを0.09秒鳴らし...
PlayTone(DO_H,90);Wait(100); //高いドを0.09秒鳴らし...
}
sub one_UP_SE()
{
PlayTone(MI,110);Wait(120); //ミを0.11秒鳴らし0....
PlayTone(SO_H,110);Wait(120); //高いソを0.11秒鳴ら...
PlayTone(MI_H,110);Wait(120); //高いミを0.11秒鳴ら...
PlayTone(DO_H,110);Wait(120); //高いドを0.11秒鳴ら...
PlayTone(RE,110);Wait(120); //レを0.11秒鳴らし0....
PlayTone(SO_SH,110);Wait(120); //高いソのシャープを...
}
sub coin_SE()
{
PlayTone(SI,90);Wait(100); //シを0.09秒鳴らし0...
PlayTone(MI_H,140);Wait(150); //高いミを0.14秒鳴...
}
sub Start_SE()
{
PlayTone(MI,100);Wait(110); //ミを0.1秒鳴らし0.11...
PlayTone(MI,100);Wait(250); //ミを0.1秒鳴らし0.25...
PlayTone(MI,100);Wait(160); //ミを0.1秒鳴らし0.16...
PlayTone(DO,90);Wait(100); //ドを0.09秒鳴らし0.1...
PlayTone(MI,90);Wait(230); //ミを0.11秒鳴らし0.12...
PlayTone(SO_H,90);Wait(420); //高いソを0.09秒鳴らし...
PlayTone(SO,170);Wait(180); //ソを0.17秒鳴らし0.18...
}
***移動関連 [#td2ff648]
#define average 45 //光センサーの値の基準
#define move1 OnFwd(OUT_A,40);OnFwd(OUT_B,-35); //右の...
#define move2 OnFwd(OUT_A,30);OnFwd(OUT_B,-20); //右の...
#define move3 OnFwd(OUT_A,54);OnFwd(OUT_B,54); //右の...
#define move4 OnFwd(OUT_B,30);OnFwd(OUT_A,-20); //左の...
#define move5 OnFwd(OUT_B,40);OnFwd(OUT_A,-35); //左の...
#define reverse_move1 OnFwd(OUT_A,-10);OnFwd(OUT_B,-30);...
#define reverse_move2 OnFwd(OUT_A,-54);OnFwd(OUT_B,-50);...
#define reverse_move3 OnFwd(OUT_B,-10);OnFwd(OUT_A,-30);...
sub Stop_Motion()
{
Wait(300); //0.3秒待つ
pose_SE(); //サブ関数pose_SE()を呼び出す
Wait(1000); //1秒待つ
}
sub L_Assist_line(int Assist_time)
{
long ta=CurrentTick(); //時間を測定
while(CurrentTick()-ta<=Assist_time){ //測定時間が...
if(SENSOR_2<average-11){ //光センサー...
move1; //move1を...
}else if(SENSOR_2<average-7){ //光センサー...
move2; //move2を...
}else if(SENSOR_2<average+7){ //光センサー...
move3; //move3を...
}else if(SENSOR_2<average+11){ //光センサー...
move4; //move4を...
}else { //光センサー...
move5; //move5を...
}
}
coin_SE(); //サブ関数coin_SE()を呼び出す
}
sub R_Assist_line(int Assist_time)
{
long tb=CurrentTick(); //時間を測定
while(CurrentTick()-tb<=Assist_time){ //測定時間が...
if(SENSOR_2<average-11){ //光センサー...
move5; //move5を...
}else if(SENSOR_2<average-7){ //光センサー...
move4; //move4を...
}else if(SENSOR_2<average+7){ //光センサー...
move3; //move3を...
}else if(SENSOR_2<average+11){ //光センサー...
move2; //move2を...
}else{ //光センサー...
move1; //move1を...
}
}
coin_SE(); //サブ関数coin_SE()を呼び出す
}
sub L_line(int Assist_time,int Stop_time)
{
L_Assist_line(Assist_time); //サブ関数L_Assist_l...
long t1=CurrentTick(); //時間を測定
while(CurrentTick()-t1<=Stop_time){ //測定時間がSt...
if(SENSOR_2<average-11){ //光センサーが...
move1; //move1を呼...
}else if(SENSOR_2<average-7){ //光センサーが...
move2; //move2を呼...
t1=CurrentTick(); //時間を初期化
}else if(SENSOR_2<average+7){ //光センサーが...
move3; //move3を呼...
t1=CurrentTick(); //時間を初期化
}else if(SENSOR_2<average+11){ //光センサーが...
move4; //move4を呼...
t1=CurrentTick(); //時間を初期化
}else { //光センサーが...
move5; //move5を呼...
t1=CurrentTick(); //時間を初期化
}
}
Off(OUT_AB); //停止
coin_SE(); //サブ関数coin_SE()を呼び出す
}
sub R_line(int Assist_time,int Stop_time)
{
R_Assist_line(Assist_time); //サブ関数R_Assist_l...
long t2=CurrentTick(); //時間を測定
while(CurrentTick()-t2<=Stop_time){ //測定時間がSt...
if(SENSOR_2<average-11) { //光センサー...
move5; //move5を呼...
}else if(SENSOR_2<average-8){ //光センサー...
move4; //move4を呼...
t2=CurrentTick(); //時間を初...
}else if(SENSOR_2<average+6){ //光センサー...
move3; //move3を呼...
t2=CurrentTick(); //時間を初...
}else if(SENSOR_2<average+11){ //光センサー...
move2; //move2を呼...
t2=CurrentTick(); //時間を初...
}else{ //光センサー...
move1; //move1を呼...
t2=CurrentTick(); //時間を初...
}
}
Off(OUT_AB); //停止
coin_SE(); サブ関数coin_SE()を呼び出す
}
sub White_to_Black(int blight,int A_speed,int B_speed)
{
while(SENSOR_2>blight)[ //光センサーが得た値がb...
OnFwd(OUT_A,A_speed); //右をA_speedで動かす
OnFwd(OUT_B,B_speed); //左をB_speedで動かす
}
Off(OUT_AB); //停止
}
sub Black_to_White(int blight,int A_speed,int B_speed)
{
while(SENSOR_2<blight){ //光センサーが得た値がbl...
OnFwd(OUT_A,A_speed); //右をA_speedで動かす
OnFwd(OUT_B,B_speed); //左をB_speedで動かす
}
Off(OUT_AB); //停止
}
sub reverse_R_Assist_line(int Assist_time)
{
long tc=CurrentTick(); //時間を測定
while(CurrentTick()-tc<=Assist_time){ //測定時間がA...
if(SENSOR_2<average-7){ //光セ...
reverse_move3; //rever...
}else if(SENSOR_2<average+7){ //光センサー...
reverse_move2; //rever...
}else{ //光センサー...
reverse_move1; //rever...
}
}
}
sub reverse_R_line(int Assist_time,int Stop_time)
{
reverse_R_Assist_line(Assist_time);
long t3=CurrentTick(); //時間を測定
while(CurrentTick()-t3<=Stop_time){ //測定時間がSt...
if(SENSOR_2<average-7){ //光センサーが...
reverse_move3; //reverse_mo...
}else if(SENSOR_2<average+7){ //光センサーが...
reverse_move2; //reverse_mo...
t3=CurrentTick(); //時間を初期化
}else{ //光センサーが...
reverse_move1; //reverse_mo...
}
}
Off(OUT_AB); //停止
}
sub reverse_Start_Set()
{
reverse_move2; //reverse_move2を呼び出す
Start_SE(); //サブ関数Start_SE()を呼び出す
Wait(2000); //2秒間待つ
White_to_Black(48,20,35); //サブ関数White_to_Bla...
}
***コップ関連 [#q1feb784]
#define FAST 50 //モーターの強さの定義(強)
#define SLOW 30 //モーターの強さの定義(弱)
#define CONN 1 //通信の接続番号
#define SIGNALON1 11 //通信用のメッセージ1
#define SIGNALON2 12 //通信用のメッセージ2
int d; //dを整数とする
const float diameter=5.45; //diameterを定数5.45とする...
const float tread=11.3; //treadを定数11.3とする。こ...
const float pi=3.1415; //piを定数3.1415とする。こ...
ここまで定義である。
sub keep_cop() //コップを持ち上げたまま維持する
{
ResetTachoCount(OUT_C); //アームの回転角をリ...
RotateMotor(OUT_C,-SLOW,50); //モーターを強さSLOW...
OnFwd(OUT_C,-20); //アームを強さ20で持...
}
コップを持ち上げたまま維持するためのプログラムである。連...
sub fwdDist(float d) //距離dcm前進させる
{
long angle=d/(diameter*pi)*360.0; //dcm進ませるの...
RotateMotorEx(OUT_AB,SLOW,angle,0,true,true); //ロ...
}
ロボットを任意の距離(cm)だけ進ませるためのプログラムであ...
sub turnAng(long ang) //ang度の時計回りの旋回
{
long angle=tread/diameter*ang; //ang度の旋回に必...
RotateMotorEx(OUT_AB,SLOW,angle,100,true,true); //...
}
ロボットを任意の角度だけ時計回りに旋回させるプログラムで...
int searchDirection(long ang) //ロボットがその時...
{
long tacho_min; //最も近い距離となるタイヤの回転数
int d_min=300; //最も近い距離の仮の最小値。十分...
long angle=(tread/diameter)*ang; //旋回角度からタ...
turnAng(ang/2); //指定された角度の半分を...
ResetTachoCount(OUT_AB); //角度計測を初期化
OnFwdSync(OUT_AB,SLOW,-100); //反時計回りに強さSL...
while(MotorTachoCount(OUT_A)<=angle){ //右のタイヤ...
if(SensorUS(S3)<d_min){ //現在の距離が仮の最...
d_min=SensorUS(S3); //仮の最小値を更新する
tacho_min=MotorTachoCount(OUT_A); //この時の...
}
}
OnFwdSyncEx(OUT_AB,SLOW,100,RESET_NONE);
until(MotorTachoCount(OUT_A)<=tacho_min||SensorUS(S3...
Wait(14); //微調整
Off(OUT_AB);
Wait(500);
return d_min;
}
先生が授業中に配ったプリントを参考にして書いた、ロボット...
sub tag() //コップを重ねる
{
keep_cop(); //コップを持ち上げて維持する。
d=searchDirection(15); //ロボットの向きを中心に角度...
if(d>5.0){ //測定した距離が5cmより遠いとき
SendRemoteNumber(CONN,MAILBOX1,SIGNALON1); //...
Wait(5000); //5秒間待つ(図5)
fwdDist(d-8.0); //測定した距離の8?...
ResetTachoCount(OUT_ABC); //全てのモーターの...
RotateMotorEx(OUT_AB,-SLOW,40,0,true,true); //...
RotateMotor(OUT_C,SLOW,50); //...
SendRemoteNumber(CONN,MAILBOX1,SIGNALON2); //...
Wait(5000); //5秒間待つ(図7)
RotateMotor(OUT_C,SLOW,100); //モータを100度動...
ResetTachoCount(OUT_ABC); //全てのモーター...
RotateMotor(OUT_C,SLOW,720); //モータを720度動...
RotateMotorEx(OUT_AB,-SLOW,120,0,true,true); //...
}
}
コップを重ねるための親機のプログラムである。通信を行って...
sub catch_cop(long ang1) //コップをつかむ
{
ResetTachoCount(OUT_C); //アームのモーターを初期化
RotateMotor(OUT_C,-SLOW,ang1); //強さSLOWで角度a...
}
腕を任意の角度だけ閉じるサブ関数である。ang1はアームのモ...
sub release_cop(long ang2) //コップを放す
{
ResetTachoCount(OUT_C); //アームのモーターを初期化
RotateMotor(OUT_C,SLOW,ang2); //強さSLOWで角度an...
}
腕を任意の角度だけ開くサブ関数である。ang2はアームのモー...
sub release_ball() //ピンポン玉を枠に入れる
{
ResetTachoCount(OUT_ABC); //全てのモーターの回転...
OnFwd(OUT_AB,SLOW);
Wait(700); //0.7秒間強さSLOWで前進
Off(OUT_AB); //停止
ResetTachoCount(OUT_C); //アームのモーターの回...
RotateMotor(OUT_C,-SLOW,50); //モーターを50度回転さ...
OnFwd(OUT_C,-20); //
Wait(1000); //1秒間持ち上げたまま維持する
OnFwd(OUT_AB,-SLOW);
Wait(700); //強さSLOWで0.7秒間後退する
Off(OUT_AB); //停止
}
ピンポン玉を枠に入れるためのプログラムである。実験段階で...
***プログラム全体 [#o46e00ab]
使ったものをそのまま載せたので、コップ関連のプログラムと...
#define SO 392
#define DO 523
#define MI 659
#define SO_H 784
#define SI 988
#define DO_H 1047
#define MI_H 1318
#define RE 1175
#define SO_SH 1568
sub pose_SE()
{
PlayTone(MI_H,90);Wait(100);
PlayTone(DO_H,90);Wait(100);
PlayTone(MI_H,90);Wait(100);
PlayTone(DO_H,90);Wait(100);
}
sub one_UP_SE()
{
PlayTone(MI,110);Wait(120);
PlayTone(SO_H,110);Wait(120);
PlayTone(MI_H,110);Wait(120);
PlayTone(DO_H,110);Wait(120);
PlayTone(RE,110);Wait(120);
PlayTone(SO_SH,110);Wait(120);
}
sub coin_SE()
{
PlayTone(SI,90);Wait(100);
PlayTone(MI_H,140);Wait(150);
}
sub Start_SE()
{
PlayTone(MI,100);Wait(110);
PlayTone(MI,100);Wait(250);
PlayTone(MI,100);Wait(160);
PlayTone(DO,90);Wait(100);
PlayTone(MI,90);Wait(230);
PlayTone(SO_H,90);Wait(420);
PlayTone(SO,170);Wait(180);
}
#define FAST 50
#define SLOW 30
#define CONN 1
#define SIGNALON1 11
#define SIGNALON2 12
int d;
const float diameter=5.45;
const float tread=11.3;
const float pi=3.1415;
sub keep_cop()
{
ResetTachoCount(OUT_C);
RotateMotor(OUT_C,-SLOW,50);
OnFwd(OUT_C,-20);
}
sub fwdDist(float d)
{
long angle=d/(diameter*pi)*360.0;
RotateMotorEx(OUT_AB,SLOW,angle,0,true,true);
}
sub turnAng(long ang)
{
long angle=tread/diameter*ang;
RotateMotorEx(OUT_AB,SLOW,angle,100,true,true);
}
int searchDirection(long ang)
{
long tacho_min;
int d_min=300;
long angle=(tread/diameter)*ang;
turnAng(ang/2);
ResetTachoCount(OUT_AB);
OnFwdSync(OUT_AB,SLOW,-100);
while(MotorTachoCount(OUT_A)<=angle){
if(SensorUS(S3)<d_min){
d_min=SensorUS(S3);
tacho_min=MotorTachoCount(OUT_A);
}
}
OnFwdSyncEx(OUT_AB,SLOW,100,RESET_NONE);
until(MotorTachoCount(OUT_A)<=tacho_min||SensorUS(S3...
Wait(14);
Off(OUT_AB);
Wait(500);
return d_min;
}
sub tag()
{
keep_cop();
d=searchDirection(15);
if(d>5.0){
SendRemoteNumber(CONN,MAILBOX1,SIGNALON1);
Wait(5000);
fwdDist(d-8.0);
ResetTachoCount(OUT_ABC);
RotateMotorEx(OUT_AB,-SLOW,40,0,true,true);
RotateMotor(OUT_C,SLOW,50);
SendRemoteNumber(CONN,MAILBOX1,SIGNALON2);
Wait(5000);
RotateMotor(OUT_C,SLOW,100);
ResetTachoCount(OUT_ABC);
RotateMotor(OUT_C,SLOW,720);
RotateMotorEx(OUT_AB,-SLOW,120,0,true,true);
}
}
sub catch_cop(long ang1)
{
ResetTachoCount(OUT_C);
RotateMotor(OUT_C,-SLOW,ang1);
}
sub release_cop(long ang2)
{
ResetTachoCount(OUT_C);
RotateMotor(OUT_C,SLOW,ang2);
}
sub release_ball()
{
ResetTachoCount(OUT_ABC);
OnFwd(OUT_AB,SLOW);
Wait(700);
Off(OUT_AB);
ResetTachoCount(OUT_C);
RotateMotor(OUT_C,-SLOW,50);
OnFwd(OUT_C,-20);
Wait(1000);
OnFwd(OUT_AB,-SLOW);
Wait(700);
Off(OUT_AB);
}
#define move1 OnFwd(OUT_A,40);OnFwd(OUT_B,-35);
#define move2 OnFwd(OUT_A,30);OnFwd(OUT_B,-20);
#define move3 OnFwd(OUT_A,54);OnFwd(OUT_B,54);
#define move4 OnFwd(OUT_B,30);OnFwd(OUT_A,-20);
#define move5 OnFwd(OUT_B,40);OnFwd(OUT_A,-35);
#define average 45
sub Stop_Motion()
{
Wait(300);
pose_SE();
Wait(1000);
}
sub L_Assist_line(int Assist_time)
{
long ta=CurrentTick();
while (CurrentTick()-ta<=Assist_time){
if (SENSOR_2<average-11) {
move1
}else if (SENSOR_2<average-7){
move2;
}else if (SENSOR_2<average+7){
move3;
}else if (SENSOR_2<average+11){
move4;
}else {
move5;
}
}
coin_SE();
}
sub R_Assist_line(int Assist_time)
{
long tb=CurrentTick();
while (CurrentTick()-tb<=Assist_time){
if (SENSOR_2<average-11) {
move5;
} else if (SENSOR_2<average-7){
move4;
} else if (SENSOR_2<average+7){
move3;
} else if (SENSOR_2<average+11){
move2;
} else {
move1;
}
}
coin_SE();
}
sub L_line(int Assist_time,int Stop_time)
{
L_Assist_line(Assist_time);
long t1=CurrentTick();
while (CurrentTick()-t1<=Stop_time){
if (SENSOR_2<average-11) {
move1;
} else if (SENSOR_2<average-7){
move2;
t1=CurrentTick();
} else if (SENSOR_2<average+7){
move3;
t1=CurrentTick();
} else if (SENSOR_2<average+11){
move4;
t1=CurrentTick();
} else {
move5;
t1=CurrentTick();
}
}
Off(OUT_AB);
coin_SE();
}
sub R_line(int Assist_time,int Stop_time)
{
R_Assist_line(Assist_time);
long t2=CurrentTick();
while (CurrentTick()-t2<=Stop_time){
if (SENSOR_2<average-11) {
move5;
} else if (SENSOR_2<average-8){
move4;
t2=CurrentTick();
} else if (SENSOR_2<average+6){
move3;
t2=CurrentTick();
} else if (SENSOR_2<average+11){
move2;
t2=CurrentTick();
} else {
move1;
t2=CurrentTick();
}
}
Off(OUT_AB);
coin_SE();
}
sub White_to_Black(int blight,int A_speed,int B_speed)
{
while (SENSOR_2>blight){
OnFwd(OUT_A,A_speed);
OnFwd(OUT_B,B_speed);
}
Off(OUT_AB);
}
sub Black_to_White(int blight,int A_speed,int B_speed)
{
while (SENSOR_2<blight){
OnFwd(OUT_A,A_speed);
OnFwd(OUT_B,B_speed);
}
Off(OUT_AB);
}
#define reverse_move1 OnFwd(OUT_A,-10);OnFwd(OUT_B,-30);
#define reverse_move2 OnFwd(OUT_A,-54);OnFwd(OUT_B,-50);
#define reverse_move3 OnFwd(OUT_B,-10);OnFwd(OUT_A,-30);
sub reverse_R_Assist_line(int Assist_time)
{
long tc=CurrentTick();
while (CurrentTick()-tc<=Assist_time){
if (SENSOR_2<average-7){
reverse_move3;
} else if (SENSOR_2<average+7){
reverse_move2;
} else {
reverse_move1;
}
}
}
sub reverse_R_line(int Assist_time,int Stop_time)
{
reverse_R_Assist_line(Assist_time);
long t3=CurrentTick();
while (CurrentTick()-t3<=Stop_time){
if (SENSOR_2<average-7){
reverse_move3;
} else if (SENSOR_2<average+7){
reverse_move2;
t3=CurrentTick();
} else {
reverse_move1;
}
}
Off(OUT_AB);
}
sub reverse_Start_Set()
{
reverse_move2;
Start_SE();
Wait(2000);
White_to_Black(48,20,35);
}
task main()
{
SetSensorLight(S2); //光センサーを設定
SetSensorLowspeed(S3); //超音波センサーを設定
reverse_Start_Set(); //後ろ向きでスタートし赤の?...
L_line(1300,110); //ライントレース(赤の?の経...
OnFwd(OUT_AB,-SLOW);
Wait(500); //交差点で0.5秒間後退
Off(OUT_AB); //停止
White_to_Black(43,20,25); //位置を調整
White_to_Black(33,20,25); //位置を調整
ResetTachoCount(OUT_A); //右側のタイヤの回転...
RotateMotor(OUT_A,-SLOW,150); //右側のタイヤのモー...
d=searchDirection(15); //ロボットを中心に15度の...
if(d>5.0){ //距離が5cmより遠い場合
catch_cop(600); //腕を少し閉じておく(腕の左...
OnFwd(OUT_AB,SLOW);
Wait(1000); //1秒間前進
Off(OUT_AB); //停止
catch_cop(500); //コップをつかむ
OnFwd(OUT_AB,-SLOW);
Wait(400); //0.4秒間後退
Off(OUT_AB); //停止
} //?終了後からここまでが赤の...
ResetTachoCount(OUT_B); //左側のタイヤの回転...
RotateMotor(OUT_B,-SLOW,110); //左側のタイヤのモー...
release_ball(); //ピンポン玉を枠に入れる(赤の...
ResetTachoCount(OUT_A); //右側のタイヤの回転角...
RotateMotor(OUT_A,-SLOW,130);//右側のタイヤのモータ...
tag(); //コップを重ねる(赤の経路?)
OnFwd(OUT_AB,-SLOW);
Wait(1000); //1秒間後退
Off(OUT_AB); //停止(赤の経路?)
White_to_Black(48,35,25); //黒線を探す(赤の...
L_line(300,130); //ライントレース(...
Black_to_White(48,0,-30); //交差点で位置を調整
White_to_Black(33,0,-30); //交差点で位置を調整
d=searchDirection(15); //ロボットを中心に...
if(d>5.0){ //距離が5cmより遠い場合
catch_cop(600); //腕を少し閉じておく(腕の左...
OnFwd(OUT_AB,SLOW);
Wait(1000); //1秒間前進
Off(OUT_AB); //停止
catch_cop(500); //コップをつかむ
OnFwd(OUT_AB,-SLOW);
Wait(400); //0.4秒間後退
Off(OUT_AB); //停止(赤の経路?)
}
White_to_Black(33,-30,-30); //黒線を探す
L_line(150,130); //ライントレース
Black_to_White(48,30,30); //交差点を越える
release_ball(); //ピンポン玉を枠に入...
ResetTachoCount(OUT_A); //右側のタイヤのモー...
RotateMotor(OUT_A,-SLOW,130); //右側のタイヤのモー...
tag(); //コップを重ねる(赤の経路?)
ResetTachoCount(OUT_C); //アームのモーターを...
RotateMotor(OUT_C,-SLOW,1100); //アームのモーターを1...
White_to_Black(33,-30,-30); //位置を調整
Black_to_White(48,-30,-30); //位置を調整
White_to_Black(33,-30,-30); //位置を調整
OnFwd(OUT_AB,SLOW);
Wait(300); //0.3秒間前進
Off(OUT_AB); //停止
ResetTachoCount(OUT_C); //アームのモーターを...
RotateMotor(OUT_C,SLOW,1200); //アームのモーターを11...
}
**子機 [#u3b39ac6]
***音楽 [#q5a855b5]
音楽は親機と一緒である。親機の[[音楽:http://yakushi.shins...
***ライントレース関連 [#o06e647d]
親機と異なるのは定義とサブ関数の一部がないことと、異なる...
sub Start_Set()
{
Start_SE(); //サブ関数Start_SE()を呼び出す
move3; //move3を呼び出す
Wait(600); //0.6秒間待つ
White_to_Black(48,30,5); //黒線を探す
}
***コップ関連 [#mbb4a56f]
こちらも親機と異なるのは通信のプログラムのみなので、それ...
#define SIGNALON 11 //親機ではSIGNALON1になっていたの...
動作には影響しないが、定数名に「1」を書き忘れていたようで...
sub tag() //コップを重ねる
{
int msg,counter; //msg,counterを整数とする
ResetTachoCount(OUT_ABC); //全てのモータ...
RotateMotor(OUT_C,SLOW,1080); //アームのモー...
RotateMotorEx(OUT_AB,-SLOW,360,0,true,true); /...
RotateMotor(OUT_C,-SLOW,1080); //アームのモー...
while(counter==0){ //カウンターが0の間繰り返す...
ReceiveRemoteNumber(MAILBOX1,true,msg); //MA...
if(msg==SIGNALON){ //メッセージSIGNALO...
ResetTachoCount(OUT_ABC); //全てのモータ...
RotateMotor(OUT_C,SLOW,1080); //アームの...
RotateMotorEx(OUT_AB,SLOW,120,0,true,true); ...
RotateMotor(OUT_C,-SLOW,1080); //アームの...
counter++; //counterに1を加え...
}
}
counter=0; //カウンターを0にする
while(counter==0){ //カウンターが0の間繰り返す...
ReceiveRemoteNumber(MAILBOX1,true,msg); //MA...
if(msg==SIGNALON2) { //メッセージSIGNA...
ResetTachoCount(OUT_ABC); //全てのモータ...
RotateMotor(OUT_C,SLOW,360); //アームのモ...
RotateMotorEx(OUT_AB,SLOW,40,0,true,true); ...
counter++; //counterに1を加える
}
}
counter=0; //カウンターを0にする
ResetTachoCount(OUT_ABC); //全てのモーターの回...
RotateMotor(OUT_C,SLOW,720); //アームのモーターを...
RotateMotorEx(OUT_AB,-SLOW,120,0,true,true); //後...
}
msgは受け取ったメッセージを格納する変数である。counterは...
今回、メッセージを受け取るプログラムをメッセージが届くま...
***プログラム全体 [#e743cbf5]
親機同様使ったものをそのまま載せたので、コップ関連のプロ...
#define SO 392
#define DO 523
#define MI 659
#define SO_H 784
#define SI 988
#define DO_H 1047
#define MI_H 1318
#define RE 1175
#define SO_SH 1568
#define SIGNALON 11
#define SIGNALON2 12
#define SLOW 30
const float diameter=5.45;
const float tread=11.3;
const float pi=3.1415;
int d;
sub fwdDist(float d)
{
long angle=d/(diameter*pi)*360.0;
RotateMotorEx(OUT_AB,SLOW,angle,0,true,true);
}
sub turnAng(long ang)
{
long angle=tread/diameter*ang;
RotateMotorEx(OUT_AB,SLOW,angle,100,true,true);
}
int searchDirection(long ang)
{
long tacho_min;
int d_min=300;
long angle=(tread/diameter)*ang;
turnAng(ang/2);
ResetTachoCount(OUT_AB);
OnFwdSync(OUT_AB,SLOW,-100);
while(MotorTachoCount(OUT_A)<=angle){
if(SensorUS(S3)<d_min){
d_min=SensorUS(S3);
tacho_min=MotorTachoCount(OUT_A);
}
}
OnFwdSyncEx(OUT_AB,SLOW,100,RESET_NONE);
until(MotorTachoCount(OUT_A)<=tacho_min||SensorUS(S3...
Wait(14);
Off(OUT_AB);
Wait(500);
return d_min;
}
sub tag()
{
int msg,counter;
ResetTachoCount(OUT_ABC);
RotateMotor(OUT_C,SLOW,1080);
RotateMotorEx(OUT_AB,-SLOW,360,0,true,true);
RotateMotor(OUT_C,-SLOW,1080);
while(counter==0){
ReceiveRemoteNumber(MAILBOX1,true,msg);
if(msg==SIGNALON) {
ResetTachoCount(OUT_ABC);
RotateMotor(OUT_C,SLOW,1080);
RotateMotorEx(OUT_AB,SLOW,120,0,true,true);
RotateMotor(OUT_C,-SLOW,1080);
counter++;
}
}
counter=0;
while(counter==0){
ReceiveRemoteNumber(MAILBOX1,true,msg);
if(msg==SIGNALON2) {
ResetTachoCount(OUT_ABC);
RotateMotor(OUT_C,SLOW,360);
RotateMotorEx(OUT_AB,SLOW,40,0,true,true);
counter++;
}
}
counter=0;
ResetTachoCount(OUT_ABC);
RotateMotor(OUT_C,SLOW,720);
RotateMotorEx(OUT_AB,-SLOW,120,0,true,true);
}
sub pose_SE()
{
PlayTone(MI_H,90);Wait(100);
PlayTone(DO_H,90);Wait(100);
PlayTone(MI_H,90);Wait(100);
PlayTone(DO_H,90);Wait(100);
}
sub one_UP_SE()
{
PlayTone(MI,110);Wait(120);
PlayTone(SO_H,110);Wait(120);
PlayTone(MI_H,110);Wait(120);
PlayTone(DO_H,110);Wait(120);
PlayTone(RE,110);Wait(120);
PlayTone(SO_SH,110);Wait(120);
}
sub coin_SE()
{
PlayTone(SI,90);Wait(100);
PlayTone(MI_H,140);Wait(150);
}
sub Start_SE()
{
PlayTone(MI,100);Wait(110);
PlayTone(MI,100);Wait(250);
PlayTone(MI,100);Wait(160);
PlayTone(DO,90);Wait(100);
PlayTone(MI,90);Wait(230);
PlayTone(SO_H,90);Wait(420);
PlayTone(SO,170);Wait(180);
}
#define move1 OnFwd(OUT_A,40);OnFwd(OUT_B,-35);
#define move2 OnFwd(OUT_A,30);OnFwd(OUT_B,-20);
#define move3 OnFwd(OUT_A,54);OnFwd(OUT_B,54);
#define move4 OnFwd(OUT_B,30);OnFwd(OUT_A,-20);
#define move5 OnFwd(OUT_B,40);OnFwd(OUT_A,-35);
#define average 45
sub Stop_Motion()
{
Wait(300);
pose_SE();
Wait(1000);
}
sub L_Assist_line(int Assist_time)
{
long ta=CurrentTick();
while (CurrentTick()-ta<=Assist_time){
if(SENSOR_2<average-11) {
move1
}else if (SENSOR_2<average-7){
move2;
}else if (SENSOR_2<average+7){
move3;
}else if (SENSOR_2<average+11){
move4;
}else {
move5;
}
}
coin_SE();
}
sub R_Assist_line(int Assist_time)
{
long tb=CurrentTick();
while (CurrentTick()-tb<=Assist_time){
if(SENSOR_2<average-11) {
move5;
}else if(SENSOR_2<average-7){
move4;
}else if(SENSOR_2<average+7){
move3;
}else if(SENSOR_2<average+11){
move2;
}else {
move1;
}
}
coin_SE();
}
sub L_line(int Assist_time,int Stop_time)
{
L_Assist_line(Assist_time);
long t1=CurrentTick();
while (CurrentTick()-t1<=Stop_time){
if (SENSOR_2<average-11) {
move1;
} else if (SENSOR_2<average-7){
move2;
t1=CurrentTick();
} else if (SENSOR_2<average+7){
move3;
t1=CurrentTick();
} else if (SENSOR_2<average+11){
move4;
t1=CurrentTick();
} else {
move5;
t1=CurrentTick();
}
}
Off(OUT_AB);
coin_SE();
}
sub R_line(int Assist_time,int Stop_time)
{
R_Assist_line(Assist_time);
long t2=CurrentTick();
while (CurrentTick()-t2<=Stop_time){
if (SENSOR_2<average-11) {
move5;
} else if (SENSOR_2<average-8){
move4;
t2=CurrentTick();
} else if (SENSOR_2<average+6){
move3;
t2=CurrentTick();
} else if (SENSOR_2<average+11){
move2;
t2=CurrentTick();
} else {
move1;
t2=CurrentTick();
}
}
Off(OUT_AB);
coin_SE();
}
sub White_to_Black(int blight,int A_speed,int B_speed)
{
while (SENSOR_2>blight){
OnFwd(OUT_A,A_speed);
OnFwd(OUT_B,B_speed);
}
Off(OUT_AB);
}
sub Black_to_White(int blight,int A_speed,int B_speed)
{
while (SENSOR_2<blight){
OnFwd(OUT_A,A_speed);
OnFwd(OUT_B,B_speed);
}
Off(OUT_AB);
}
sub Start_Set()
{
Start_SE();
move3;
Wait(600);
White_to_Black(48,30,5);
}
sub catch_cop(long ang1)
{
ResetTachoCount(OUT_C);
RotateMotor(OUT_C,-SLOW,ang1);
}
sub release_cop(long ang2)
{
ResetTachoCount(OUT_C);
RotateMotor(OUT_C,SLOW,ang2);
}
sub release_ball()
{
ResetTachoCount(OUT_ABC);
OnFwd(OUT_AB,SLOW);
Wait(700);
Off(OUT_AB);
ResetTachoCount(OUT_C);
RotateMotor(OUT_C,-SLOW,50);
OnFwd(OUT_C,-20);
Wait(1000);
OnFwd(OUT_AB,-SLOW);
Wait(700);
Off(OUT_AB);
}
sub keep_cop()
{
ResetTachoCount(OUT_C);
RotateMotor(OUT_C,-SLOW,50);
OnFwd(OUT_C,-20);
}
task main()
{
SetSensorLight(S2); //光センサーを設定
SetSensorLowspeed(S3); //超音波センサーを設定
Start_Set();
R_line(300,150); //前進後ライントレース
d=searchDirection(15); //ロボットを中心に15度の...
if(d>5.0){ //距離が5cmより遠い場合
catch_cop(700); //腕を少し閉じておく(腕の左や右...
OnFwd(OUT_AB,SLOW);
Wait(1400); //1.4秒間前進
Off(OUT_AB); //停止
catch_cop(300); //コップをつかむ
OnFwd(OUT_AB,-SLOW);
Wait(100); //0.1秒間後退
Off(OUT_AB); //停止(青の経路?)
}
ResetTachoCount(OUT_A); //右側のタイヤのモータ...
RotateMotor(OUT_A,-SLOW,370); //右側のタイヤのモー...
OnFwd(OUT_AB,SLOW);
Wait(600); //0.6秒間前進
Off(OUT_AB); //停止
catch_cop(40); //アームのモーターを40度回しコ...
OnFwd(OUT_C,-SLOW);
Wait(1000); //持ち上げたまま1秒間維持する
Off(OUT_C); //停止
OnFwd(OUT_AB,-SLOW);
Wait(1000); //1秒間後退
Off(OUT_AB); //停止(青の経路?)
White_to_Black(33,35,15);
Black_to_White(48,35,15);
White_to_Black(33,40,25);
Black_to_White(48,-30,0);
White_to_Black(33,-30,0);
Black_to_White(50,0,-30);
White_to_Black(33,35,30);
Black_to_White(48,35,30); //8つのサブ関数で緑丸の...
release_cop(50);
tag(); //コップを重ねる(青の経路?)
keep_cop(); //コップを持ち上げ維持する
tag(); //コップを重ねる(青の経路?)
OnFwd(OUT_AB,-SLOW);
Wait(1000); //1秒間後退
Off(OUT_AB); //停止
}
*結果 [#j0192476]
発表1回目は、子機が1個ピンポン玉を枠内に入れたが、その後...
技術点は8.8点で、合計12.8点となり、9チーム中6位の結果とな...
*考察 [#i63ecd49]
レポートを作るにあたってロボットの機構やプログラムを見直...
まずロボットについてだが、1つ目は、超音波センサーは左右ど...
2つ目は、アームの自重が大きくなり、コップを持ち上げた状態...
3つ目は、機体が長くなってしまったことだ。これの影響で、障...
まとめると、3つの理由で機体の動きが制限されてしまったとい...
また、プログラムにも問題があったと考えられる。ライントレ...
*感想 [#ha368ba0]
あらゆる状況や問題を考慮した上で、結果を出せるプログラム...
*まとめ [#mdab3f6e]
これまでの3つの課題を通して、プログラミングの基礎をしっか...
ページ名: