ページ 1 / 1
状態カウント
Posted: 2017年4月18日(火) 15:06
by C素人
ラジコンカーを製作しています。
送信側から送られてくる進行方向を表す信号「Dir」に応じて、後退・前進・停止を行います。
このラジコンカーにオプション機能を追加したいと考えています。
ラジコンカーの底面に白黒を検知できるセンサを配置し、
黒い場所を5回通過したら、送信側にコマンドを送る。という動作を行いたいです。
センサの状態をsという変数で監視して、
s=PORTA &0x06;
if(s==0x00)
{
count++;
}
と考えましたが、これだと黒い場所を通過している間、カウント値が上がり続けてしまいます。
センサの状態が前の状態か変化したときにだけ、カウントしたいのですが、
↓のコードにどのように追加すれば良いのか分かりません。
コード:
switch(Dir) //進行方向に応じて後退・前進・停止
{
case 0:
M1Rev(); //後退
M2Rev();
break;
case 1:
M1Feed(); //前進
M2Feed();
break;
case 2:
M1Stop(); //停止制御
M2Stop();
break;
default: break;
}
Re: 状態カウント
Posted: 2017年4月19日(水) 00:55
by みけCAT
C素人 さんが書きました:センサの状態をsという変数で監視して、
s=PORTA &0x06;
if(s==0x00)
{
count++;
}
と考えましたが、これだと黒い場所を通過している間、カウント値が上がり続けてしまいます。
センサの状態が前の状態か変化したときにだけ、カウントしたいのですが、
素直にセンサの状態が前の状態か(原文ママ:「前の状態から」と解釈する)変化したときにだけ、カウントするプログラムを書けばいい、というわけではないのですか?
例えばこんな感じ?
コード:
/* ループの外 */
unsigned char prev_s = 0;
/* ループの中 */
s = PORTA & 0x06;
if(s==0x00 && s != prev_s)
{
count++;
}
prev_s = s;
C素人 さんが書きました:↓のコードにどのように追加すれば良いのか分かりません。
sとの関係が全くわからないので、私にもわかりません。
Re: 状態カウント
Posted: 2017年4月25日(火) 09:40
by C素人
みけCAT様
確認が遅れてすみません。
回答ありがとうございました。
確認してみたところ、意図した動作を行うことができました。
コード:
unsigned char prev_s = 0;
/* ループの中 */
s = PORTA & 0x06;
if(s==0x00 && s != prev_s)
{
count++;
}
prev_s = s;
このあとに、カウント数が5以上になったら、ブザーを1秒間だけ鳴らす動作を追加しました。
しかし、次の記述だとブザーが鳴り続けてしまいます。
1回だけ(1秒間を1回)ブザーが鳴った後は、ブザーを止めたいですが、どのようにすれば良いのでしょうか?
コード:
if(count>=5)
{
Buzzer=1;
delay_ms(1000);
}
Re: 状態カウント
Posted: 2017年4月25日(火) 22:31
by みけCAT
C素人 さんが書きました:1回だけ(1秒間を1回)ブザーが鳴った後は、ブザーを止めたいですが、どのようにすれば良いのでしょうか?
1秒後にブザーを止めるコードを追加すればいいと思います。
具体的な方法は、ブザーの制御の仕様がわからないのでわかりません。
Re: 状態カウント
Posted: 2017年4月28日(金) 07:47
by C素人
みけCATさま
解決しました。ありがとうございました。