ラジコンカーを製作しています。
送信側から送られてくる進行方向を表す信号「Dir」に応じて、後退・前進・停止を行います。
このラジコンカーにオプション機能を追加したいと考えています。
ラジコンカーの底面に白黒を検知できるセンサを配置し、
黒い場所を5回通過したら、送信側にコマンドを送る。という動作を行いたいです。
センサの状態をsという変数で監視して、
s=PORTA &0x06;
if(s==0x00)
{
count++;
}
と考えましたが、これだと黒い場所を通過している間、カウント値が上がり続けてしまいます。
センサの状態が前の状態か変化したときにだけ、カウントしたいのですが、
↓のコードにどのように追加すれば良いのか分かりません。
状態カウント
Re: 状態カウント
素直にセンサの状態が前の状態か(原文ママ:「前の状態から」と解釈する)変化したときにだけ、カウントするプログラムを書けばいい、というわけではないのですか?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;
sとの関係が全くわからないので、私にもわかりません。C素人 さんが書きました:↓のコードにどのように追加すれば良いのか分かりません。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)
Re: 状態カウント
みけCAT様
確認が遅れてすみません。
回答ありがとうございました。
確認してみたところ、意図した動作を行うことができました。
このあとに、カウント数が5以上になったら、ブザーを1秒間だけ鳴らす動作を追加しました。
しかし、次の記述だとブザーが鳴り続けてしまいます。
1回だけ(1秒間を1回)ブザーが鳴った後は、ブザーを止めたいですが、どのようにすれば良いのでしょうか?
確認が遅れてすみません。
回答ありがとうございました。
確認してみたところ、意図した動作を行うことができました。
unsigned char prev_s = 0;
/* ループの中 */
s = PORTA & 0x06;
if(s==0x00 && s != prev_s)
{
count++;
}
prev_s = s;
しかし、次の記述だとブザーが鳴り続けてしまいます。
1回だけ(1秒間を1回)ブザーが鳴った後は、ブザーを止めたいですが、どのようにすれば良いのでしょうか?
Re: 状態カウント
1秒後にブザーを止めるコードを追加すればいいと思います。C素人 さんが書きました:1回だけ(1秒間を1回)ブザーが鳴った後は、ブザーを止めたいですが、どのようにすれば良いのでしょうか?
具体的な方法は、ブザーの制御の仕様がわからないのでわかりません。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)