状態カウント

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
C素人

状態カウント

#1

投稿記事 by C素人 » 1年前

ラジコンカーを製作しています。
送信側から送られてくる進行方向を表す信号「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;
		}

アバター
みけCAT
記事: 6003
登録日時: 7年前
住所: 千葉県
連絡を取る:

Re: 状態カウント

#2

投稿記事 by みけCAT » 1年前

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との関係が全くわからないので、私にもわかりません。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

C素人

Re: 状態カウント

#3

投稿記事 by C素人 » 11ヶ月前

みけ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);
}

アバター
みけCAT
記事: 6003
登録日時: 7年前
住所: 千葉県
連絡を取る:

Re: 状態カウント

#4

投稿記事 by みけCAT » 11ヶ月前

C素人 さんが書きました:1回だけ(1秒間を1回)ブザーが鳴った後は、ブザーを止めたいですが、どのようにすれば良いのでしょうか?
1秒後にブザーを止めるコードを追加すればいいと思います。
具体的な方法は、ブザーの制御の仕様がわからないのでわかりません。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

C素人

Re: 状態カウント

#5

投稿記事 by C素人 » 11ヶ月前

みけCATさま

解決しました。ありがとうございました。

返信

“C言語何でも質問掲示板” へ戻る