
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の影響を受けてしまいました。
解決する方法はないでしょうか?
No.1ベストアンサー
- 回答日時:
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日かかるんで実質的に問題ないんでしょうけど、将来的にそのようなアプリケーションを作った時にハマりますから、覚えておいて損は無いかと。
ありがとうございます!
しかし
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
というエラーメッセージが出てしまいました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ボウリングでボールじゃなく人...
-
打ち上げで15人でボーリング行...
-
4人でボーリングをする場合、2...
-
首都高の平井大橋出入口って一...
-
自宅にボウリングのレーンを作る。
-
ボウリングのトリックプレイ映像
-
ボウリングはストレートだけで...
-
「ち」に濁点を打ちたいのです...
-
ボウリングを1人で練習したいの...
-
ボウリングシューズ 普通の室...
-
「まじ」と「まぢ」ってどっち...
-
「ぢゅ」のつく単語
-
あなたのお嫁さんを紹介してく...
-
GUNDAM SEEDでキラの生きていた...
-
ボウリングの練習は一度に何ゲ...
-
【ボウリング 3人で1ゲーム...
-
計算方法
-
3人で歌えるアニメソングといえ...
-
ボウリング
-
ボウリング下手な人が、1人ボウ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
打ち上げで15人でボーリング行...
-
首都高の平井大橋出入口って一...
-
4人でボーリングをする場合、2...
-
10人でボウリング2ゲームす...
-
自宅にボウリングのレーンを作る。
-
はくしょん大魔王
-
ボウリングでボールじゃなく人...
-
ボウリング場で 2人でスコア対...
-
ボウリングはストレートだけで...
-
教えて欲しいです ボウリングで...
-
オイルが厚くて曲がらないとき...
-
昔のボーリングマイボールでは...
-
ボウリング。私はこれでうまく...
-
ボウリングで一番端のレーンで...
-
ボウリング場ってスタッフさん...
-
ボウリングのマナーについて詳...
-
タイトルが分かりません
-
AKB48 握手会イベント参加券に...
-
ボウリングの2ゲームの時間
-
delayが干渉する・・
おすすめ情報