[40] 制御できんす! 投稿者:まさ 投稿日:1999/12/27(Mon) 13:57:55こんにちは、まさです。
RCXccを使っています。そこで質問なのですが
if(light sensor > threshold){
action1; Wait(20);
}else if(light sensor < threshold){
action2; Wait(20);
}
とするとうまく制御できないので
if(light sensor > threshold){
action1; Wait(20);
until(light sensor < threshold);
action2; Wait(20);
}
としますよね。これを応用して
if(touch sensor == 1){
if(light sensor > threshold) action1; Wait(20);
if(light sensor < threshold) action2; Wait(20);
}else if(touch sensor == 0){
if(light sensor > threshold) action3; Wait(20);
if(light sensor < threshold) action4; Wait(20);
}
を制御したいと思ったのですが
if(touch sensor == 1){
if(light sensor > threshold){
action1; Wait(20);
until(light sensor < threshold);
action2; Wait(20);
}
until(touch sensor == 0);
if(light sensor > threshold){
action1; Wait(20);
until(light sensor < threshold);
action2; Wait(20);
}
}
としたのですがうまくいきません!
当然touch sensor がそれぞれの状態の時に
light sensor の判定をし続けないといけないのですが
どうしたらプログラムを書けるでしょうか??
[40へのレス] Re: 制御できんす! 投稿者:まさ 投稿日:1999/12/27(Mon) 14:01:51もう少し補足をしますと
untilを使うとそこで制御が止まってしまいますよね。
その間に light sensor の値が変化してしまっても
このプログラムだと対応できないのです。
これを解決するにはどうしたらいいのでしょう??
until を使わずにプログラムを組むことはできるので
しょうか??
と聞きたかったのです。
説明が下手ですいませんです。
[40へのレス] Re: 制御できんす! 投稿者:JinSato 投稿日:1999/12/27(Mon) 15:24:28Jin です。
はじめにですが
| if(light sensor > threshold){
| action1; Wait(20);
| }else if(light sensor < threshold){
| action2; Wait(20);
| }
| とするとうまく制御できないので
との事ですが、この「うまく制御」と言う部分の説明が無いので、なにが
どううまく行かないかわからないんです。
自分がどのように動いて欲しいかという点と、実際はどう動いたかと言うのを
箇条書きのように纏めてみてはいかがでしょうか?。
上手くいかなかったから、
| if(light sensor > threshold){
| action1; Wait(20);
| until(light sensor < threshold);
| action2; Wait(20);
| }
> としますよね。
との事ですが、なぜ、そのように変更したかという理由も書いていただけない
と読むほうは理解するのが困難だと思うんです。
|としますよね。これを応用して
| if(touch sensor == 1){
この IF 文の中で、センサーの値を比較していますか?
それとも、IF文に入る前に、センサーの値を何かの変数に入れているので
しょうか?
| if(light sensor > threshold) action1; Wait(20);
| if(light sensor < threshold) action2; Wait(20);
この部分の "light sensor" の部分も、センサーの値を
読んでいるようにも見えるし、それともセンサーの値を入れた
変数にも読めなくないし。....
| }else if(touch sensor == 0){
| if(light sensor > threshold) action3; Wait(20);
| if(light sensor < threshold) action4; Wait(20);
| }
>これを解決するにはどうしたらいいのでしょう??
> until を使わずにプログラムを組むことはできるので
> しょうか??
質問の内容がいまいち把握していないんですが、下記のような
コードじゃだめなのかな〜?
int nTouchSensorVar;
int nLightSensorVar;
// センサータイプの定義
SetSensor(SENSOR_1, SENSOR_TOUCH );
SetSensor(SENSOR_2, SENSOR_LIGHT );
// タッチセンサーの値をひとまず変数に入れておく
nTouchSensorVar = SENSOR_1;
if ( nTouchSensorVar == 1 ) {
// タッチセンサーが押されたら、光センサーの値を
// 変数に入れておく。
nLightSensorVar = SENSOR_2;
if ( nLightSensorVar > threshold ) {
action1(); Wait(20);
} else {
action2(); Wait(20);
}
} else {
nLightSensorVar = SENSOR_2;
if ( nLightSensorVar > threshold ) {
action3(); Wait(20);
} else {
action4(); Wait(20);
}
}
センサーの値を一度変数に入れておいて、そして、IF分のなかで
比較するようにする。
http://www.mi-ra-i.com/JinSato/
[40へのレス] Re: 制御できんす! 投稿者:JinSato 投稿日:1999/12/27(Mon) 15:31:33●まさ さんへ
1つ書き忘れました。
ご存知かもしれませんが、 お気軽コンテスト#4のページに各ロボットのページ
があります。
その中で、NQC を使われたプログラムが何点か公開されていますので、
他の皆さんがどのようなプログラムを書かれているか、一度読んでみるの
はいかがでしょうか?。
直接の答えになるような例は無いかもしれませんが、ヒントになるような
事が見つかるかもしれませんよ〜。http://www.mi-ra-i.com/JinSato/
[40へのレス] Re: 制御できんす! 投稿者:>mac 投稿日:1999/12/28(Tue) 14:08:00> この「うまく制御」と言う部分の説明が無いので、なにがどうう> まく行かないかわからないんです。
ご本人が説明していないのに、すごくおせっかいな気もしますが、
多分、タッチセンサートライとセンサーの状態によって、4通りの動作をしたいのだが、それぞれのセンサーが、どのようなタイミングで変化しても、すぐにその変化が反映されるようにしたい。でも、どうやって書けばよいのか分からないというのじゃないのかなあ。
失礼ながら、マルチタスクの概念を、よく理解できていないので、概略をシーケンスとして表現しようとしても、うまく伝わらないんだと思います。
「マルチタスク」は、それほど難しいわけじゃないけど、普通のアプリケーションプログラムしか書いたことがない人には、パラダイムの変更をしないと使いこなせない壁があったりします。
http://www.cc.toin.ac.jp/EI/NQCj.html
から、NQCチュートリアルの日本語訳をdownloadし、
VI.タスクとサブルーチン、X. 並列タスク
を読むとよいと思います。http://www.line.to/mac/MindStorms/
[40へのレス] Re: 制御できんす! 投稿者:まさ 投稿日:1999/12/28(Tue) 14:19:03すいません。説明不足でみなさんを悩ませてしまいました。
うまく制御できないというのは
if(light sensor > threshold){
action1; Wait(20);
}else if(light sensor < threshold){
action2; Wait(20);
}
とするとセンサの変化を読みとることができないのです。
これはおそらくWait状態の時にセンサの値が変化して
Wait状態を出た時には値が戻ってしまっているからだと
考えられます。
これを解決するためにNQCのチュートリアルに書いてあった
ように
if(light sensor > threshold){
action1; Wait(20);
until(light sensor < threshold);
action2; Wait(20);
}
として常にセンサの変化を待っているようにしました。
当然このようにするとうまく制御ができます。
で、これを応用して上記のプログラムを作成したという
わけです。
自分本位に投稿を書いてしまってすいませんでした。
[40へのレス] Re: 制御できんす! 投稿者:まさ 投稿日:1999/12/28(Tue) 14:20:33つまりWait(20)ってのが曲者ってことです。
[40へのレス] Re: 制御できんす! 投稿者:JinSato 投稿日:1999/12/28(Tue) 14:47:15● mac さんへ
こんにちは、macさん、年末はお忙しいですか〜。
● まさ さんへ
やはり、行いたいことを箇条書きのように纏めていただいて
説明をしてもらったほうがわかりやすいです。
|if(light sensor > threshold){
| action1; Wait(20);
|}else if(light sensor < threshold){
| action2; Wait(20);
| }
> とするとセンサの変化を読みとることができないのです。
読み取ることが出来ないとお書きですが、それは、
action1 や Wait(20) を実行中には読み取ることが出来ないという
意味なんでしょうか?
もしも、そのような意味ならばやはり、上記のようなシーケンシャルに
処理しようとするのではなくて、マルチタスにしてプログラムを作る方が
自然だと思います。
mac さんにも、書いていただきましたが、
NQCチュートリアルの日本語訳をdownloadして VI.タスクとサブルーチン、
X. 並列タスクを読んだりし、小さなプログラムを作って1つ1つ作って
力をつけていくのが良いのではないでしょうか〜。
ところで、どのような目的で、プログラムを作られているのかな〜?
今度良かったら教えてください。http://www.mi-ra-i.com/JinSato/
[40へのレス] Re: 制御できんす! 投稿者:>mac 投稿日:1999/12/28(Tue) 15:56:52> こんにちは、macさん、年末はお忙しいですか〜。
もう、「制御不能」状態で、思わず逃避行動に走っています (x_x)
| つまりWait(20)ってのが曲者ってことです。
そうです。それが曲者。
NQCチュートリアルのそれと思しき例文には、Wait()はないようですし、
if(light sensor > threshold){
action1; Wait(20);
until(light sensor < threshold);
action2; Wait(20);
}
ならうまくいくとおっしゃったので、Jinさんも混乱しているのだと思います。少しはましだけど、これもうまくいかないよね。
まささんに、というわけではありませんが、マルチタスクな例題を出します。
Sensor_1, Sensor_2にタッチセンサーがついています。
何も押されていないときは、ドミソの分散和音を鳴らしてください。
たとえば、ドを0.5秒、ミを0.5秒、ソを0.5秒、そしてまたド...と繰り返します。
Sensor_1だけが押されたら、直ちにドファラに変えます。必ずドからなりはじめます。
Sensor_2だけが押されたら、直ちにシレソに変えます。同様にシからです。
そしてSensor_1,Sensor_2が同時に押されたら、ラドミに変えます。
Stopが押されるまで、この動作を続けます。当然センサーが押される順序タイミングに制限はつけられません。
いかがですか?http://www.line.to/mac/MindStorms/
[40へのレス] Re: 制御できんす! 投稿者:あかいし 投稿日:1999/12/28(Tue) 23:43:15macさんへ
>まささんに、というわけではありませんが、マルチタスクな例題を出します。
私が答えて良いものでしょうか?
こないになりました。(*^。^*)
#define __NOTETIME 10
#define __WAITTIME 12
task main()
{
SetSensor(SENSOR_1,SENSOR_TOUCH);
SetSensor(SENSOR_2,SENSOR_TOUCH);
start check_sensors;
start music;
}
task check_sensors()
{
while (true)
{
if (SENSOR_1 == 1 && SENSOR_2 == 0)
{
stop music;
sound_dofara();
Wait(5);
start music;
}
if (SENSOR_1 == 0 && SENSOR_2 == 1)
{
stop music;
sound_sireso();
Wait(5);
start music;
}
if (SENSOR_1 == 1 && SENSOR_2 == 1)
{
stop music;
sound_radomi();
Wait(5);
start music;
}
}
}
task music()
{
while (true)
{
Wait(5);
PlayTone(262,4*__NOTETIME); Wait(4*__WAITTIME);
PlayTone(330,4*__NOTETIME); Wait(4*__WAITTIME);
PlayTone(392,4*__NOTETIME); Wait(4*__WAITTIME);
}
}
void sound_dofara()
{
PlayTone(262,4*__NOTETIME); Wait(4*__WAITTIME);
PlayTone(349,4*__NOTETIME); Wait(4*__WAITTIME);
PlayTone(440,4*__NOTETIME); Wait(4*__WAITTIME);
}
void sound_sireso()
{
PlayTone(494,4*__NOTETIME); Wait(4*__WAITTIME);
PlayTone(294,4*__NOTETIME); Wait(4*__WAITTIME);
PlayTone(392,4*__NOTETIME); Wait(4*__WAITTIME);
}
void sound_radomi()
{
PlayTone(440,4*__NOTETIME); Wait(4*__WAITTIME);
PlayTone(262,4*__NOTETIME); Wait(4*__WAITTIME);
PlayTone(330,4*__NOTETIME); Wait(4*__WAITTIME);
}
[40へのレス] Re: 制御できんす! 投稿者:あかいし 投稿日:1999/12/28(Tue) 23:48:26あれーー。
これ、タブキーが飛びますね。(~_~;)
[40へのレス] Re: 制御できんす! 投稿者:>mac 投稿日:1999/12/29(Wed) 09:19:46あかいし さんへ
マルチタスクokですね。でも、ちょっと「仕様」と違うというか、出題に不明確な点がありました。
Sensor_1が押された直後、離されて、直ちにSensor_2が押された場合、「直ちにシレソに変えます。」になりません。またSensorが押されつづけた場合の処理があまり合理的でありません。Sensor_1だけが、押されつづけている間は、ドファラを繰り返してください。(結果的にはそうなってますが)
でも、あかいしさんは、多分直せますね。すみませんちょっとお待ちを。
まささん、まえにSprit.ocxでご質問のえのもさん、並びに、他の方いかがでしょう?http://www.line.to/mac/MindStorms/
[40へのレス] Re: 制御できんす! 投稿者:JinSato 投稿日:1999/12/29(Wed) 12:15:06●mac さんへ
お〜〜、すごい、いい例題ですね〜。
このまま、「mac さんのプログラミング道場」とかにさせていただいて
まとめて行けたら面白そう〜。
いかがですか mac さん
[40へのレス] Re: 制御できんす! 投稿者:あかいし 投稿日:1999/12/29(Wed) 14:11:59ああ、そっか・・。どうも、macさん。添削をありがとうございます。
頭の中で、ドミソが鳴り響いていて、他の音は割り込みにするものと勝手に決めてしまいました。あはは。(~_~;)
どの音も、均等に扱うのですね。
では、私は控えさせていただきます。
皆さん正解を、考えてくださいね。