2013b/Member/pianoman/Mission2
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
検索
|
最終更新
|
ヘルプ
|
ログイン
]
開始行:
[[2013b/MemberOnly/進行状況]]
#contents
*メンバ紹介 [#n3ee21c5]
:pianoman|おのくんです。今回も主にプログラム担当です。遅...
:Redcicudu(Redcicada)|ロボット制作の権威。彼のおかげでプ...
:chikuwa|主にプログラム、時々ロボットの改良。軽快にキーボ...
*課題2の内容 [#h82c71f8]
以下のコース内に配置された缶をゴール内に積み上げる。スイ...
#ref(robocon2013b.png)
**すとらてじぃ [#f79f3cc7]
マシンに比べてコースの間隔や缶の配置間隔が小さい所があり...
以下のようにコース順を決めました。矢印の経路は超音波セン...
#ref(robocon2013b2.png)
*マシンについて [#jc89a7e5]
マシンは2〜3週間かけて制作しました。最初はおのくんとchi...
ロボットの詳細な解説は[[こちら>http://yakushi.shinshu-u.a...
***全体像 [#z7e2fa08]
|#ref(DVC00019 (2).JPG,left)|缶をつかみながら移動するので...
***後輪 [#bd18e886]
#ref(robot2.jpeg,left)
後輪はRedcicudu氏がうまい具合に2つ付けてくれました。走行...
***歯車 [#b764b5b5]
|#ref(robot3.png)|#ref(robot4.png)|
左の写真はアームの歯車です。Redcicudu氏の得意技(?)。こ...
*プログラムの概要 [#aa05aacd]
図の番号順に取っていきます。
|#ref(robocon2013c.png)|??・??|超音波センサで探す→取る |
|#ref(robocon2013d.png)|??・??|ライントレース→缶に接近→取...
*pianomanが担当したプログラム [#aec6c64d]
課題2における自分の役割はつなぎ的なプログラムを組む事で...
**Bluetoothによる通信プログラム [#pf04a566]
~コマンドが長くて煩わしかったので短くなるように試みました...
***プログラムの概要 [#qecb6e52]
+マスター機がメッセージをスレーブ機へ送信し、スレーブ機の...
+スレーブ機はマスター機のメッセージを受信し、プログラムを...
+スレーブ機はプログラムが終わったらマスター機へ返信し、次...
+返信を受け取ったマスター機はプログラムを再開させます。
[master] → 命令 → [slave]
↓ ↓
待機 処理
↓ ↓
[master] ← 応答 ← [slave]
↓ ↓
次の処理へ 待機
***コード [#mdb67030]
~#include "bluetooth.nxc"で他のファイルから呼び出せます。
/* bluetooth.nxc */
/* 送受信と接続確認 */
/* マスター用プログラム */
/* sendmsg(送信メッセージ,受信メッセージ) */
/****スレーブに送信メッセージを送信した後、受信メッセー...
sub sendmsg(string msg,string rps)
{
SendRemoteString(1,0,msg);
string rmsg = "";
while(rmsg == "")
{
ReceiveRemoteString(1,true,rmsg);
TextOut(0,LCD_LINE1,"Wait until slave");
TextOut(0,LCD_LINE2,"completes tasks...");
Wait(1000);
}
ResetScreen();
}
/* 共用プログラム */
/* btcheck(接続ポート番号) */
/* 接続の確認。失敗した場合"Something wrong"を表示。 */
sub btcheck(int conn)
{
while(!BluetoothStatus(conn) == NO_ERR)
{
ResetScreen();
TextOut(0,LCD_LINE1,"Something wrong");
Wait(1000);
}
ResetScreen();
}
/*スレイブ用プログラム*/
/* receive("受信メッセージ") */
/* マスターからメッセージを受け取る。 */
sub receive(string rd)
{
string msg;
while(msg != rd)
{
ReceiveRemoteString(0,true,msg);
ResetScreen();
TextOut(0,LCD_LINE1,"Receiving...");
Wait(1000);
}
ResetScreen();
TextOut(0,LCD_LINE1,"I got it!!");
Wait(1000);
ResetScreen();
}
/* repond("送信メッセージ") */
/* 応答のメッセージをマスターに送信 */
sub respond(string reply)
{
SendResponseString(1,reply);
ResetScreen();
TextOut(0,LCD_LINE1,"Responded");
Wait(1000);
ResetScreen();
}
/*(c) 2014 ONO*/
~#include "bluetooth.nxc"で他のファイルから呼び出せます。
***問題点 [#v29002a3]
~基本的に上記にある3つの命令(sendmsg,receive,respond)を...
-スレーブが受け取ったメッセージに応じてプログラム条件分岐...
~receiveは単に目的のメッセージが来るまで待機する機能しか...
string receive()
{
string msg;
while(msg == "")
{
ReceiveRemoteString(0,true,msg);
ResetScreen();
TextOut(0,LCD_LINE1,"Receiving...");
Wait(1000);
}
return msg;
}
として
task main()
{
while(true)
{
msg = receive();
if(msg == catch){ ~ }
if(msg == put){ ~ }
....
}
}
みたいな感じで使えばもっと汎用性が高まりました。&br;
結局今回は条件分岐がいるところではSendRemoteNumberとRecei...
***苦労した点 [#pf42e6d4]
最初作成したとき、マスター側は送信は成功しましたがスレー...
#ref(bluetooth.png)
***実際の使用 [#a060b626]
[[chikuwa氏のプログラム>http://yakushi.shinshu-u.ac.jp/ro...
缶を検知→スレーブへアームを降ろすように要請(sendmsg)→受信...
といった具合です。
**缶の検知プログラム [#z5568099]
|#ref(sonic.png)|今回の課題ではライン上から外れた場所にも...
/* find_direction.nxc */
#define tr OnFwdSync(OUT_AB,60,100); //右回転
#define tl OnFwdSync(OUT_AB,60,-100); //左回転
#define go OnFwdSync(OUT_AB,75,0) //直進
#define unko 60 //計測回数
#define distance 13 //缶までの接近距離
#define measure_time 10 //計測間隔
sub fd(void)
{
int takatyan; //
int zxc[unko]; //配列
int min; //仮の最小値
/* 準備:左に少し回転。 */
tl;
Wait(1000);
/* マシンと缶との距離を測る。右回転しながら10ms間隔で...
for(int i = 0;i <=unko-1;i ++) //iが1〜60に加算される...
{
tr;
Wait(measure_time);
zxc[i] = SensorUS(S4);
}
/*記録したデータの中から最小値(距離)を求める。*/
min = 60; //仮の最小値
for(int j = 0;j <=unko-1; j++) //j番地におけるzxcの値がm...
{
if(min > zxc[j])
{
min = zxc[j];
takatyan = j;
}
}
/***NXTはViewメニューにてそれぞれのセンサの値をリアルタ...
/***超音波センサは計測範囲外になると”?????”と表示し...
/***込まるのか分からないのですが、もし0でも代入されてし...
/***ます。 ...
for(int j = 0;j <= unko-1; j++)
{
if(zxc[j] == 0){zxc[j] = 100; }
}
Off(OUT_AB);
TextOut(0,LCD_LINE1,"takatyan =");
NumOut(0,LCD_LINE2,zxc[takatyan]);
Wait(1000);
/* 最小値と一致するまで左回転。*/
tl;
until( SensorUS(S4) <= zxc[takatyan] );
PlaySound(SOUND_UP);
Off(OUT_AB);
ResetScreen();
Wait(1000);
/*缶に接近。*/
go;
until(SensorUS(S4) <= distance);
Off(OUT_AB);
}
/* (c) 2014 ONO*/
***以前のプログラム [#l73deeb0]
最初にこのプログラムを作ったときは、ロボットの位置を調整...
-計測後のマシンの左回転量=&br;(最初のマシンの回転量/計...
*まとめ [#a11d439a]
***感想 [#k2408ea6]
-チームの仲間と早い時期から議論と試行錯誤を重ねて本番でと...
-割と仲間にアドヴァイス出来た点も良かったです。(まだまだ...
-自発的にプログラミングについて調べて実際に応用したことは...
***反省点 [#p37e25c5]
-永遠の自宅通の名に甘んじて作業に遅刻した事。
-ロボット制作の重要な部分にあまり携わる事ができなかったこ...
-割と家でコードを書かずに、講義や集まった時にその場で書い...
-コードの記述量と記述に費やした時間の少なさ。多ければ良い...
*おまけ [#ud99fff8]
***現代音楽(?)演奏プログラム [#q210f997]
#define p(a,b) PlayTone(a,b);
task main()
{
while(true)
{
p(Random(800),Random(500));
Wait(Random(500));
}
}
ランダムな数字を周波数と音の継続時間、休止時間に放り込ん...
終了行:
[[2013b/MemberOnly/進行状況]]
#contents
*メンバ紹介 [#n3ee21c5]
:pianoman|おのくんです。今回も主にプログラム担当です。遅...
:Redcicudu(Redcicada)|ロボット制作の権威。彼のおかげでプ...
:chikuwa|主にプログラム、時々ロボットの改良。軽快にキーボ...
*課題2の内容 [#h82c71f8]
以下のコース内に配置された缶をゴール内に積み上げる。スイ...
#ref(robocon2013b.png)
**すとらてじぃ [#f79f3cc7]
マシンに比べてコースの間隔や缶の配置間隔が小さい所があり...
以下のようにコース順を決めました。矢印の経路は超音波セン...
#ref(robocon2013b2.png)
*マシンについて [#jc89a7e5]
マシンは2〜3週間かけて制作しました。最初はおのくんとchi...
ロボットの詳細な解説は[[こちら>http://yakushi.shinshu-u.a...
***全体像 [#z7e2fa08]
|#ref(DVC00019 (2).JPG,left)|缶をつかみながら移動するので...
***後輪 [#bd18e886]
#ref(robot2.jpeg,left)
後輪はRedcicudu氏がうまい具合に2つ付けてくれました。走行...
***歯車 [#b764b5b5]
|#ref(robot3.png)|#ref(robot4.png)|
左の写真はアームの歯車です。Redcicudu氏の得意技(?)。こ...
*プログラムの概要 [#aa05aacd]
図の番号順に取っていきます。
|#ref(robocon2013c.png)|??・??|超音波センサで探す→取る |
|#ref(robocon2013d.png)|??・??|ライントレース→缶に接近→取...
*pianomanが担当したプログラム [#aec6c64d]
課題2における自分の役割はつなぎ的なプログラムを組む事で...
**Bluetoothによる通信プログラム [#pf04a566]
~コマンドが長くて煩わしかったので短くなるように試みました...
***プログラムの概要 [#qecb6e52]
+マスター機がメッセージをスレーブ機へ送信し、スレーブ機の...
+スレーブ機はマスター機のメッセージを受信し、プログラムを...
+スレーブ機はプログラムが終わったらマスター機へ返信し、次...
+返信を受け取ったマスター機はプログラムを再開させます。
[master] → 命令 → [slave]
↓ ↓
待機 処理
↓ ↓
[master] ← 応答 ← [slave]
↓ ↓
次の処理へ 待機
***コード [#mdb67030]
~#include "bluetooth.nxc"で他のファイルから呼び出せます。
/* bluetooth.nxc */
/* 送受信と接続確認 */
/* マスター用プログラム */
/* sendmsg(送信メッセージ,受信メッセージ) */
/****スレーブに送信メッセージを送信した後、受信メッセー...
sub sendmsg(string msg,string rps)
{
SendRemoteString(1,0,msg);
string rmsg = "";
while(rmsg == "")
{
ReceiveRemoteString(1,true,rmsg);
TextOut(0,LCD_LINE1,"Wait until slave");
TextOut(0,LCD_LINE2,"completes tasks...");
Wait(1000);
}
ResetScreen();
}
/* 共用プログラム */
/* btcheck(接続ポート番号) */
/* 接続の確認。失敗した場合"Something wrong"を表示。 */
sub btcheck(int conn)
{
while(!BluetoothStatus(conn) == NO_ERR)
{
ResetScreen();
TextOut(0,LCD_LINE1,"Something wrong");
Wait(1000);
}
ResetScreen();
}
/*スレイブ用プログラム*/
/* receive("受信メッセージ") */
/* マスターからメッセージを受け取る。 */
sub receive(string rd)
{
string msg;
while(msg != rd)
{
ReceiveRemoteString(0,true,msg);
ResetScreen();
TextOut(0,LCD_LINE1,"Receiving...");
Wait(1000);
}
ResetScreen();
TextOut(0,LCD_LINE1,"I got it!!");
Wait(1000);
ResetScreen();
}
/* repond("送信メッセージ") */
/* 応答のメッセージをマスターに送信 */
sub respond(string reply)
{
SendResponseString(1,reply);
ResetScreen();
TextOut(0,LCD_LINE1,"Responded");
Wait(1000);
ResetScreen();
}
/*(c) 2014 ONO*/
~#include "bluetooth.nxc"で他のファイルから呼び出せます。
***問題点 [#v29002a3]
~基本的に上記にある3つの命令(sendmsg,receive,respond)を...
-スレーブが受け取ったメッセージに応じてプログラム条件分岐...
~receiveは単に目的のメッセージが来るまで待機する機能しか...
string receive()
{
string msg;
while(msg == "")
{
ReceiveRemoteString(0,true,msg);
ResetScreen();
TextOut(0,LCD_LINE1,"Receiving...");
Wait(1000);
}
return msg;
}
として
task main()
{
while(true)
{
msg = receive();
if(msg == catch){ ~ }
if(msg == put){ ~ }
....
}
}
みたいな感じで使えばもっと汎用性が高まりました。&br;
結局今回は条件分岐がいるところではSendRemoteNumberとRecei...
***苦労した点 [#pf42e6d4]
最初作成したとき、マスター側は送信は成功しましたがスレー...
#ref(bluetooth.png)
***実際の使用 [#a060b626]
[[chikuwa氏のプログラム>http://yakushi.shinshu-u.ac.jp/ro...
缶を検知→スレーブへアームを降ろすように要請(sendmsg)→受信...
といった具合です。
**缶の検知プログラム [#z5568099]
|#ref(sonic.png)|今回の課題ではライン上から外れた場所にも...
/* find_direction.nxc */
#define tr OnFwdSync(OUT_AB,60,100); //右回転
#define tl OnFwdSync(OUT_AB,60,-100); //左回転
#define go OnFwdSync(OUT_AB,75,0) //直進
#define unko 60 //計測回数
#define distance 13 //缶までの接近距離
#define measure_time 10 //計測間隔
sub fd(void)
{
int takatyan; //
int zxc[unko]; //配列
int min; //仮の最小値
/* 準備:左に少し回転。 */
tl;
Wait(1000);
/* マシンと缶との距離を測る。右回転しながら10ms間隔で...
for(int i = 0;i <=unko-1;i ++) //iが1〜60に加算される...
{
tr;
Wait(measure_time);
zxc[i] = SensorUS(S4);
}
/*記録したデータの中から最小値(距離)を求める。*/
min = 60; //仮の最小値
for(int j = 0;j <=unko-1; j++) //j番地におけるzxcの値がm...
{
if(min > zxc[j])
{
min = zxc[j];
takatyan = j;
}
}
/***NXTはViewメニューにてそれぞれのセンサの値をリアルタ...
/***超音波センサは計測範囲外になると”?????”と表示し...
/***込まるのか分からないのですが、もし0でも代入されてし...
/***ます。 ...
for(int j = 0;j <= unko-1; j++)
{
if(zxc[j] == 0){zxc[j] = 100; }
}
Off(OUT_AB);
TextOut(0,LCD_LINE1,"takatyan =");
NumOut(0,LCD_LINE2,zxc[takatyan]);
Wait(1000);
/* 最小値と一致するまで左回転。*/
tl;
until( SensorUS(S4) <= zxc[takatyan] );
PlaySound(SOUND_UP);
Off(OUT_AB);
ResetScreen();
Wait(1000);
/*缶に接近。*/
go;
until(SensorUS(S4) <= distance);
Off(OUT_AB);
}
/* (c) 2014 ONO*/
***以前のプログラム [#l73deeb0]
最初にこのプログラムを作ったときは、ロボットの位置を調整...
-計測後のマシンの左回転量=&br;(最初のマシンの回転量/計...
*まとめ [#a11d439a]
***感想 [#k2408ea6]
-チームの仲間と早い時期から議論と試行錯誤を重ねて本番でと...
-割と仲間にアドヴァイス出来た点も良かったです。(まだまだ...
-自発的にプログラミングについて調べて実際に応用したことは...
***反省点 [#p37e25c5]
-永遠の自宅通の名に甘んじて作業に遅刻した事。
-ロボット制作の重要な部分にあまり携わる事ができなかったこ...
-割と家でコードを書かずに、講義や集まった時にその場で書い...
-コードの記述量と記述に費やした時間の少なさ。多ければ良い...
*おまけ [#ud99fff8]
***現代音楽(?)演奏プログラム [#q210f997]
#define p(a,b) PlayTone(a,b);
task main()
{
while(true)
{
p(Random(800),Random(500));
Wait(Random(500));
}
}
ランダムな数字を周波数と音の継続時間、休止時間に放り込ん...
ページ名: