電子書籍の厳選無料作品が豊富!

Arduino初心者です。
さいきんArduinoを買ったので断念していた赤外線銃を作ろうと思ってネットの知識を寄せ集めこのようなプログラムを作りました(途中ですが。)

int State=0;

void setup() {
pinMode(2,INPUT) ; //スイッチに接続ピンをデジタル入力に設定
pinMode(8,OUTPUT) ;
pinMode(9,OUTPUT) ;//LEDに接続ピンをデジタル出力に設定
}

void loop() {{
State=digitalRead(6);

if (State==LOW){ //6ピンがLOWなら
unsigned long start = millis(); // 処理B開始時刻
while (millis() < start + 500) { // 0.5秒間=500ミリ秒経過するまで
digitalWrite(8,HIGH);
}
}else{
digitalWrite(8,LOW);
}
} //あたり判定
{
if (digitalRead(2) == HIGH) { //2ピンがhighなら
unsigned long start = millis(); // 処理B開始時刻
while (millis() < start + 100) { // 0.1秒間=100ミリ秒経過するまで
digitalWrite(9, HIGH); // ピンをONにする
delayMicroseconds(13); // 13マイクロ秒待つ
digitalWrite(9, LOW); // ピンをOFFにする
delayMicroseconds(13); // 13マイクロ秒待つ
}
}
}//赤外線LED
}

あたり判定と書いてあるうえの部分が赤外線受光部でしたが送信部です

赤外線銃なので連射を防止するために

if (digitalRead(2) == HIGH) { //2ピンがhighなら
unsigned long start = millis(); // 処理B開始時刻
while (millis() < start + 100) { // 0.1秒間=100ミリ秒経過するまで
digitalWrite(9, HIGH); // ピンをONにする
delayMicroseconds(13); // 13マイクロ秒待つ
digitalWrite(9, LOW); // ピンをOFFにする
delayMicroseconds(13); // 13マイクロ秒待つ
}
delay (1000); }
}//赤外線LED
}

と赤外線と書いた上にdelayを入れました。
すると受光部部分もdelayの影響を受けてしまいました。

解決する方法はないでしょうか?

A 回答 (2件)

delay (1000)だと、その場で1秒間何もせずに止まりますからね。


動作を止めることなく発光後1秒間は発光させないようにしましょう。

最初に待ちフラグと待ち時間を用意します。
int WaitFlag = 0;
unsigned long WaitTime;

そして、赤外線LEDのトリガをウェイト状態であれば発光しないようにします。
if ((WaitFlag == 0) && ((digitalRead(2) == HIGH)) { //Wait状態でなく2ピンがhighなら

LED発光処理が終わればフラグを立てて時間を記録します
delayMicroseconds(13); // 13マイクロ秒待つ
}
WaitFlag = 1;
WaitTime = millis();

そしてloop内に一つの処理を追加します。
フラグが立って1秒以上経過していればフラグをクリアします。
if ((WaitFlag != 0) && (millis() - WaitTime >= 1000){
WaitFlag = 0;
}

--------------------------------------------------------------------
以下は蛇足です。

この1行はバグを含んでいます。
while (millis() < start + 100){

このように書き換えてください。
while (millis() - start < 100){

ま、バグが発生するまでに電源入れっぱなしで最低50日かかるんで実質的に問題ないんでしょうけど、将来的にそのようなアプリケーションを作った時にハマりますから、覚えておいて損は無いかと。
    • good
    • 1
この回答へのお礼

ありがとうございます!
しかし

int State=0;
int WaitFlag = 0;
unsigned long WaitTime;



void setup() {
中略
} //あたり判定
{
if ((WaitFlag == 0) && ((digitalRead(2) == HIGH)) { //Wait状態でなく2ピンがhighなら
unsigned long start = millis(); // 処理B開始時刻
while (millis() - start < 100) { // 0.1秒間=100ミリ秒経過するまで
digitalWrite(9, HIGH); // ピンをONにする
delayMicroseconds(13); // 13マイクロ秒待つ
digitalWrite(9, LOW); // ピンをOFFにする
delayMicroseconds(13); // 13マイクロ秒待つ
}
WaitFlag = 1;
WaitTime = millis();
}
}
if ((WaitFlag != 0) && (millis() - WaitTime >= 1000){
WaitFlag = 0;
}
}//赤外線LED
}

こう書き替えてみると

if ((WaitFlag == 0) && ((digitalRead(2) == HIGH)) { //Wait状態でなく2ピンがhighなら この行と
if ((WaitFlag != 0) && (millis() - WaitTime >= 1000){ この行に

exit status 1
expected ')' before '{' token

というエラーメッセージが出てしまいました。

お礼日時:2017/11/22 17:07

すみません、エラーメッセージの言う通り、丸カッコが一つ足りませんでした。


if ((WaitFlag != 0) && (millis() - WaitTime >= 1000)){
    • good
    • 0
この回答へのお礼

できました!
ご丁寧に教えてくださってありがとうございました!

お礼日時:2017/11/25 22:18

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!