Arduinoのプログラムでボタンが押されたときにLEDを点灯させる方法

このQ&Aのポイント
  • Arduinoのプログラムで2番ピンに信号が入ると割り込みで13番ピンのLEDが設定時間点灯しますが、設定時間になると信号が入っていてもLEDは消灯してしまいます。
  • ボタンが押されている間はLEDに点灯してもらいたいです。2番ピンに入る信号が不安定ですが、LEDをずっと点灯させたいです。
  • Delayは使いたくありません。
回答を見る
  • ベストアンサー

Arduinoのプログラムで質問です。

お世話になります。 Arduinoのプログラムで質問が有ります。 下記のプログラムは2番ピンに信号が入ると割り込みで13番ピンのLEDが設定時間点灯します。 ただ、設定時間になると信号が入っていてもLEDは消灯してしまいます。 そこで、信号が入っている間(ボタンが押されている時)はLEDに点灯してもらいたいのです。 2番ピンに入る信号が不安定なのですが、LEDはずーっと点灯してもらいたいのです。 ちなみにDelayは使いたくありません。(わがままスミマセン) 皆様、よろしくお願い致します。 int PinFlag ; long TimeCount ; void InterPin() { PinFlag = 1 ; // 割込み有ればON } void setup() { pinMode(13,OUTPUT) ; // 13番ピン付属LED出力 attachInterrupt(0,InterPin, RISING) ; // 2番ピンの割込みを指定(立上がりで割込み) PinFlag = 0 ; TimeCount = 0 ; } void loop() { // 割込み有ればその時点の時刻を保存してLEDを点灯する while(PinFlag) { PinFlag = 0 ; TimeCount = millis() ; // 現在の時刻を保存 digitalWrite(13,HIGH) ; // LEDを点灯 } // 設定秒間カウントしたらLEDを消灯する if (TimeCount != 0) { if ((millis() - TimeCount) >= 1010) { TimeCount = 0 ; digitalWrite(13,LOW) ; // LEDを消灯 } } }

noname#198426
noname#198426

質問者が選んだベストアンサー

  • ベストアンサー
  • chie65535
  • ベストアンサー率43% (8516/19358)
回答No.7

>このプログラムをLEONARDOで4系統で制御したいのですが上手くいきません。 すべて4つ必要。 volatile int PinFlag1 ; //1系統目INPUT2/OUTOUT13用 volatile int PinFlag2 ; //2系統目INPUT3/OUTOUT12用 volatile int PinFlag3 ; //3系統目INPUT0/OUTOUT11用 volatile int PinFlag4 ; //4系統目INPUT1/OUTOUT10用 long TimeCount1 ; //1系統目INPUT2/OUTOUT13用 long TimeCount2 ; //2系統目INPUT3/OUTOUT12用 long TimeCount3 ; //3系統目INPUT0/OUTOUT11用 long TimeCount4 ; //4系統目INPUT1/OUTOUT10用 //1系統目INPUT2割り込み void InterPin1() { PinFlag1 = 1 ; // 割込み有ればON } //2系統目INPUT3割り込み void InterPin2() { PinFlag2 = 1 ; // 割込み有ればON } //3系統目INPUT0割り込み void InterPin3() { PinFlag3 = 1 ; // 割込み有ればON } //4系統目INPUT1割り込み void InterPin4() { PinFlag4 = 1 ; // 割込み有ればON } void setup() { pinMode(2,INPUT) ; // 1系統目2番ピン付属ボタン入力 pinMode(3,INPUT) ; // 2系統目3番ピン付属ボタン入力 pinMode(0,INPUT) ; // 3系統目0番ピン付属ボタン入力 pinMode(1,INPUT) ; // 4系統目1番ピン付属ボタン入力 pinMode(13,OUTPUT) ; // 1系統目13番ピン付属LED出力 pinMode(12,OUTPUT) ; // 2系統目12番ピン付属LED出力 pinMode(11,OUTPUT) ; // 3系統目11番ピン付属LED出力 pinMode(10,OUTPUT) ; // 4系統目10番ピン付属LED出力 attachInterrupt(2,InterPin1, CHANGE) ; // 1系統目2番ピンの割込みを指定(変化したら割り込み) attachInterrupt(3,InterPin2, CHANGE) ; // 2系統目3番ピンの割込みを指定(変化したら割り込み) attachInterrupt(0,InterPin3, CHANGE) ; // 3系統目0番ピンの割込みを指定(変化したら割り込み) attachInterrupt(1,InterPin4, CHANGE) ; // 4系統目1番ピンの割込みを指定(変化したら割り込み) PinFlag1 = 0 ; // 1系統目 PinFlag2 = 0 ; // 2系統目 PinFlag3 = 0 ; // 3系統目 PinFlag4 = 0 ; // 4系統目 TimeCount1 = 0 ; // 1系統目 TimeCount2 = 0 ; // 2系統目 TimeCount3 = 0 ; // 3系統目 TimeCount4 = 0 ; // 4系統目 } void loop(){ { // 1系統目 // 割込み有ればその時点の時刻を保存する while(PinFlag1) { PinFlag1 = 0 ; // 立ち上がりか立ち下がりか調べて if (digitalRead(2)==HIGH) { // 立ち上がりなのであれば TimeCount1 = 0 ; // タイマー停止 digitalWrite(13,HIGH) ; // LEDを点灯 } else { // 立ち下がりなのであれば TimeCount1 = millis() ; // 現在の時刻を保存 } // 設定秒間カウントしたらLEDを消灯する if (TimeCount1 != 0) { if ((millis() - TimeCount1) >= 1010) { TimeCount1 = 0 ; digitalWrite(13,LOW) ; // LEDを消灯 } } } // 2系統目 // 割込み有ればその時点の時刻を保存する while(PinFlag2) { PinFlag2 = 0 ; // 立ち上がりか立ち下がりか調べて if (digitalRead(3)==HIGH) { // 立ち上がりなのであれば TimeCount2 = 0 ; // タイマー停止 digitalWrite(12,HIGH) ; // LEDを点灯 } else { // 立ち下がりなのであれば TimeCount2 = millis() ; // 現在の時刻を保存 } // 設定秒間カウントしたらLEDを消灯する if (TimeCount2 != 0) { if ((millis() - TimeCount2) >= 1010) { TimeCount2 = 0 ; digitalWrite(12,LOW) ; // LEDを消灯 } } } // 3系統目 // 割込み有ればその時点の時刻を保存する while(PinFlag3) { PinFlag3 = 0 ; // 立ち上がりか立ち下がりか調べて if (digitalRead(0)==HIGH) { // 立ち上がりなのであれば TimeCount3 = 0 ; // タイマー停止 digitalWrite(11,HIGH) ; // LEDを点灯 } else { // 立ち下がりなのであれば TimeCount3 = millis() ; // 現在の時刻を保存 } // 設定秒間カウントしたらLEDを消灯する if (TimeCount3 != 0) { if ((millis() - TimeCount3) >= 1010) { TimeCount3 = 0 ; digitalWrite(11,LOW) ; // LEDを消灯 } } } // 4系統目 // 割込み有ればその時点の時刻を保存する while(PinFlag4) { PinFlag4 = 0 ; // 立ち上がりか立ち下がりか調べて if (digitalRead(1)==HIGH) { // 立ち上がりなのであれば TimeCount4 = 0 ; // タイマー停止 digitalWrite(10,HIGH) ; // LEDを点灯 } else { // 立ち下がりなのであれば TimeCount4 = millis() ; // 現在の時刻を保存 } // 設定秒間カウントしたらLEDを消灯する if (TimeCount4 != 0) { if ((millis() - TimeCount4) >= 1010) { TimeCount4 = 0 ; digitalWrite(10,LOW) ; // LEDを消灯 } } } } 系統番号とINPUTピン番号、OUTPUTピン番号が順番通りになってない場合は、以下のような対応一覧表を作って、ミスを防ぎましょう。 系統番号 INPUT OUTPUT InterPin TimeCount PinFlag 1       2    13      1     1       1 2       3    12      2     2       2 3       0    11      3     3       3 4       1    10      4     4       4

noname#198426
質問者

お礼

chie65535様 ありがとうございます。 {と}を追加したら動作しました。 ありがとうございました。 本当に勉強になりました。 これから、もっと勉強しますので、よろしくお願い致します。

noname#198426
質問者

補足

chie65535様 早速のご回答ありがとうございます。 スケッチをコピーしてIDE(ライティングソフト)に張り付けましたがエラーに void loop(){の{ を削除したら書き込めたのですがLEDは点灯せず。 スケッチとにらめっこしていますが、修正するところが見つかりません。 全て、4系統必要なのですね・・・・勉強になります。 一覧表は必要ですね。作成します。 本当に、ありがとうございます。差し上げるお礼ポイントが足りないです。

その他の回答 (6)

  • chie65535
  • ベストアンサー率43% (8516/19358)
回答No.6

重要な追記。 割り込みルーチンの中で変化する変数には「volatile」を付けないといけません。 int PinFlag ; は volatile int PinFlag ; と書かないといけません。 「volatile」は「割り込みの中で値が変化するから、毎回、ちゃんと値を調べないといけない」と言う修飾です。 例えば int Flag ; void loop() { Flag=0 ; while(Flag) { // Flagを一切使わない処理 } } と書いたら、最適化されて int Flag ; void loop() { Flag=0 ; while(0) { // Flagを一切使わない処理 } } になり、「while(0)の部分は絶対に実行されないから」と更に最適化されて int Flag ; void loop() { Flag=0 ; } になり、Flagに値を代入したあと使ってないので更に最適化され int Flag ; void loop() { } になってしまう可能性があります。 もし、こうなってしまったら「ボタンもLEDも何も動かない。実行しても何もしない」と悩む事になります。 なので、割り込み内で値が変化する変数は「最適化するな」と指示しないといけません。 そのため、割り込みの中で値が変化する変数は volatile int Flag ; のように書かないといけません。 これを忘れると、思わぬ落とし穴にハマります。

noname#198426
質問者

お礼

重ね重ね、ありがとうございます。 volatile int Flag ; の事を丁寧にありがとうございます。 本当に勉強になります。もう少し調べてみます。 今回のスケッチにもvolatile int PinFlag ;に変えました。 今の所、変える前でも変えても希望通りに動作しています。 変えておいた方が、忘れないのと勉強になるのでvolatile int PinFlag ;で行きます。 感謝します。 ありがとうございました。

noname#198426
質問者

補足

chie65535 すみません、その後ハマってしまっています。 このプログラムをLEONARDOで4系統で制御したいのですが上手くいきません。 入力は分割できたのですが出力が1個光っていると他のLEDが消えません。 で4個同時に消えるプログラムになってしまいました。 その後、LEDを消灯するプログラムも4分割したのですが全く動作しません。 TimeCountが4個有ると指定して各チャンネルに設定しないといけないのでしょうか? 大変申し訳ありません。 よろしければ、教えて下さい。 volatile int PinFlag ; long TimeCount ; void InterPin() { PinFlag = 1 ; // 割込み有ればON } void setup() { pinMode(2,INPUT) ; // 2番ピン付属ボタン入力 pinMode(3,INPUT) ; // 3番ピン付属ボタン入力 pinMode(0,INPUT) ; // 0番ピン付属ボタン入力 pinMode(1,INPUT) ; // 1番ピン付属ボタン入力 pinMode(13,OUTPUT) ; // 13番ピン付属LED出力 pinMode(12,OUTPUT) ; // 12番ピン付属LED出力 pinMode(11,OUTPUT) ; // 11番ピン付属LED出力 pinMode(10,OUTPUT) ; // 10番ピン付属LED出力 attachInterrupt(0,InterPin, CHANGE) ; // 2番ピンの割込みを指定(変化したら割り込み) attachInterrupt(1,InterPin, CHANGE) ; // 3番ピンの割込みを指定(変化したら割り込み) attachInterrupt(2,InterPin, CHANGE) ; // 0番ピンの割込みを指定(変化したら割り込み) attachInterrupt(3,InterPin, CHANGE) ; // 1番ピンの割込みを指定(変化したら割り込み) PinFlag = 0 ; TimeCount = 0 ; } void loop(){ { // 割込み有ればその時点の時刻を保存する while(PinFlag) { PinFlag = 0 ; // 立ち上がりか立ち下がりか調べて if (digitalRead(2)==HIGH) { // 立ち上がりなのであれば TimeCount = 0 ; // タイマー停止 digitalWrite(13,HIGH) ; // LEDを点灯 } else { // 立ち下がりなのであれば TimeCount = millis() ; // 現在の時刻を保存 } } // 設定秒間カウントしたらLEDを消灯する if (TimeCount != 0) { if ((millis() - TimeCount) >= 1010) { TimeCount = 0 ; digitalWrite(13,LOW) ; // LEDを消灯 } } } { // 割込み有ればその時点の時刻を保存する while(PinFlag) { PinFlag = 0 ; // 立ち上がりか立ち下がりか調べて if (digitalRead(3)==HIGH) { // 立ち上がりなのであれば TimeCount = 0 ; // タイマー停止 digitalWrite(12,HIGH) ; // LEDを点灯 } else { // 立ち下がりなのであれば TimeCount = millis() ; // 現在の時刻を保存 } } // 設定秒間カウントしたらLEDを消灯する if (TimeCount != 0) { if ((millis() - TimeCount) >= 1010) { TimeCount = 0 ; digitalWrite(12,LOW) ; // LEDを消灯 } } } { // 割込み有ればその時点の時刻を保存する while(PinFlag) { PinFlag = 0 ; // 立ち上がりか立ち下がりか調べて if (digitalRead(0)==HIGH) { // 立ち上がりなのであれば TimeCount = 0 ; // タイマー停止 digitalWrite(11,HIGH) ; // LEDを点灯 } else { // 立ち下がりなのであれば TimeCount = millis() ; // 現在の時刻を保存 } } // 設定秒間カウントしたらLEDを消灯する if (TimeCount != 0) { if ((millis() - TimeCount) >= 1010) { TimeCount = 0 ; digitalWrite(11,LOW) ; // LEDを消灯 } } } { // 割込み有ればその時点の時刻を保存する while(PinFlag) { PinFlag = 0 ; // 立ち上がりか立ち下がりか調べて if (digitalRead(1)==HIGH) { // 立ち上がりなのであれば TimeCount = 0 ; // タイマー停止 digitalWrite(10,HIGH) ; // LEDを点灯 } else { // 立ち下がりなのであれば TimeCount = millis() ; // 現在の時刻を保存 } } // 設定秒間カウントしたらLEDを消灯する if (TimeCount != 0) { if ((millis() - TimeCount) >= 1010) { TimeCount = 0 ; digitalWrite(10,LOW) ; // LEDを消灯 } } } }

  • chie65535
  • ベストアンサー率43% (8516/19358)
回答No.5

>すみません、問題が発覚しました。 >割り込みで設定した時間(1010ms)以上、ボタンを押しているとLEDが消えずに点灯したままになってしまいました。 >時間設定を長くする以外に方法有りますか int PinFlag ; long TimeCount ; void InterPin() { PinFlag = 1 ; // 割込み有ればON } void setup() { pinMode(2,INPUT) ; // 2番ピン付属ボタン入力 pinMode(13,OUTPUT) ; // 13番ピン付属LED出力 attachInterrupt(0,InterPin, CHANGE) ; // 2番ピンの割込みを指定(変化したら割り込み) PinFlag = 0 ; TimeCount = 0 ; } void loop() { // 割込み有ればその時点の時刻を保存する while(PinFlag) { PinFlag = 0 ; // 立ち上がりか立ち下がりか調べて if (digitalRead(2)==HIGH) { // 立ち上がりなのであれば TimeCount = 0 ; // タイマー停止 digitalWrite(13,HIGH) ; // LEDを点灯 } else { // 立ち下がりなのであれば TimeCount = millis() ; // 現在の時刻を保存 } } // 設定秒間カウントしたらLEDを消灯する if (TimeCount != 0) { if ((millis() - TimeCount) >= 1010) { TimeCount = 0 ; digitalWrite(13,LOW) ; // LEDを消灯 } } }

noname#198426
質問者

お礼

ありがとうござます。 スケッチしていただき申し訳ありません。 勉強させていただきました。 実際に書き込んで長時間ボタンを押して話しても1010ms後に消えました。 本当にありがとうございました。 さらに勉強します。

  • chie65535
  • ベストアンサー率43% (8516/19358)
回答No.4

追記。 立ち上がりと立ち下りの両方を割り込みさせる(attachInterruptの3番目にCHANGEを指定すると)、割り込みは、同じルーチンに飛んで来るので、PinFlagで割り込みの有無を調べるだけでは足りません。 「割り込みの有無を表すPinFlag変数」の他に「立ち上がり、立ち下り、どっちの割り込みかを表す変数」が必要になるでしょう。 変数を使わない場合は、setupにpinMode(2,INPUT)を追加して、割り込みあったと判定した後で、digitalRead(2)の戻り値がLOWかHIGHか判定して、立ち上がり、立ち下りを区別して下さい。

  • tsunji
  • ベストアンサー率20% (196/958)
回答No.3

割込みを使う必要はないです。 ループの中で2番ピンがHIGHならPinFlagを1にするプログラムを追加するだけ。

noname#198426
質問者

お礼

ありがとうございます。 難しく考えすぎました。 { if (digitalRead(2) == HIGH) { //スイッチの状態を調べる digitalWrite(13,HIGH) ; //スイッチが押されているならLEDを点灯 Loopの下に、これを入れたら思い通りの動作しました。 本当にありがとうございました。

noname#198426
質問者

補足

すみません、問題が発覚しました。 割り込みで設定した時間(1010ms)以上、ボタンを押しているとLEDが消えずに点灯したままになってしまいました。 時間設定を長くする以外に方法有りますか

  • kngj1740
  • ベストアンサー率18% (197/1052)
回答No.2

Arduinoのハードウェアに詳しくないですが、ボタンが押されている状態を検出する手段がないと出来ません。普通はポートの状態を読み取れる筈ですが。タイマールーチンにより定期的にボタンが押されている状態をチェックします。押されている限りLEDを点灯します。ボタン押下の割り込みで起動する必要はないように思います。キーボードのキースキャンなどと同じやり方です。

noname#198426
質問者

お礼

説明不足、申し訳ありませんでした。 信号が連続ONの時とパルスに時が有るのです。 ありがとうございました。

  • chie65535
  • ベストアンサー率43% (8516/19358)
回答No.1

プログラムを ・2番ピンの立ち上がり割り込み時 LEDの点灯と、TimeCountを0にする処理を行う ・2番ピンの立ち下がり割り込み時 現在時刻の保存だけを行う(TimeCountを0以外の値にする) ・メインループ TimeCountが0でないなら、現在時刻とTimeCountを比較し、指定秒間に達したら、LEDを消灯してTimeCountを0にする処理を行う と言う形にすれば良いです。 LEDが消灯されるのは「立下りのあと、指定した時間、何も割り込みが起きない時だけ」なので、2番ピンが不安定でチャタリングを起こしても、つまり、立ち上がりと立下りの割り込みが短時間に連続で入ってきても、点灯しっ放しになります。

noname#198426
質問者

お礼

ご丁寧に、ありがとうございます。 ただ、私は初心者でして「なんとなく」分かるのですがどうしたらいいのか・・・・ さらに、勉強してchie65535様のプログラムもスケッチしてみたいです。 本当に、ありがとうございました。

関連するQ&A

  • arduinoについて

    7セグledとボタンを使って、エレベーターの階数表示をさせる回路とプログラムを作っていてプログラムはある程度かけているのですがうまくいきません。何が足りないのでしょうか? プログラムは以下の通りです。 {#define LED_A 6 #define LED_B 7 #define LED_C 8 #define LED_D 9 #define LED_E 10 #define LED_F 11 #define LED_G 12 #define LED_DP 13 #include <Servo.h> Servo servo; int button1 = 5; int button2 = 4; unsigned long buttonGap ; void setup() { pinMode(LED_A, OUTPUT); pinMode(LED_B, OUTPUT); pinMode(LED_C, OUTPUT); pinMode(LED_D, OUTPUT); pinMode(LED_E, OUTPUT); pinMode(LED_F, OUTPUT); pinMode(LED_G, OUTPUT); pinMode(LED_DP, OUTPUT); pinMode(5, OUTPUT); pinMode(4, OUTPUT); servo.attach(11); } void loop() { digitalWrite(LED_A, HIGH); digitalWrite(LED_B, LOW); digitalWrite(LED_C, LOW); digitalWrite(LED_D, HIGH); digitalWrite(LED_E, HIGH); digitalWrite(LED_F, HIGH); digitalWrite(LED_G, HIGH); digitalWrite(LED_DP, HIGH); digitalWrite(LED_A, LOW); digitalWrite(LED_B, LOW); digitalWrite(LED_C, HIGH); digitalWrite(LED_D, LOW); digitalWrite(LED_E, LOW); digitalWrite(LED_F, HIGH); digitalWrite(LED_G, LOW); digitalWrite(LED_DP, HIGH); servo.write(180); delay(2000); servo.write(0); delay(2000); } void switchLights() { digitalWrite(LED_A, HIGH); digitalWrite(LED_B, LOW); digitalWrite(LED_C, LOW); digitalWrite(LED_D, HIGH); digitalWrite(LED_E, HIGH); digitalWrite(LED_F, HIGH); digitalWrite(LED_G, HIGH); digitalWrite(LED_DP, HIGH); delay(4000); digitalWrite(LED_A, LOW); digitalWrite(LED_B, LOW); digitalWrite(LED_C, HIGH); digitalWrite(LED_D, LOW); digitalWrite(LED_E, LOW); digitalWrite(LED_F, HIGH); digitalWrite(LED_G, LOW); digitalWrite(LED_DP, HIGH); delay(5000); }

  • Arduinoでランダムにモーターを回したい

    【電子工作関連】Arduinoでボタンを押すたびに、ランダムに3つのモーターのうち一つが回転するというスケッチを書きたいのですが、ランダムになりません。どうすればランダムになるでしょう? 下がそのスケッチです。 今のところ、3つ全てのモーターが回ってしまいます。 なお、モータードライバにはTA7291Pを使用。 信号ピンである5番6番ピンをArduino5~10番ピンに振り分けて、それぞれにモーターを接続、 電源やGNDは共有してます。 なお、ボタンを使わず、単純に3つのモーターのうち一つが回転するというというスケッチは出来ていて、実際にその通り動いています。 ------------------------------ //3つのモーターをランダムに動かす int val = 0; //入力ピンの状態がこの変数に記憶される void setup(){ pinMode(2,INPUT); //ボタンを入力に設定 pinMode(5,OUTPUT); //モーター(1)のドライバー5番ピンを出力に設定 pinMode(6,OUTPUT); //モーター(2)のドライバー5番ピンを出力に設定 pinMode(7,OUTPUT); //モーター(3)のドライバー5番ピンを出力に設定 pinMode(8,OUTPUT); //モーター(1)のドライバー6番ピンを出力に設定 pinMode(9,OUTPUT); //モーター(2)のドライバー6番ピンを出力に設定 pinMode(10,OUTPUT); //モーター(3)のドライバー6番ピンを出力に設定 } void loop(){ val = digitalRead(2); //入力を読み取りvalに格納 if (val == HIGH){ digitalWrite(random(5,8),HIGH);//ランダムにモーターを正回転させる } else { digitalWrite(5,LOW); digitalWrite(6,LOW); digitalWrite(7,LOW);//モータを止める } }

  • Arduinoのスケッチでエラーがでてしまいます。

    【電子工作関連】Arduinoでボタンを押すとランダムに3つのモーターのうち一つが回転するというスケッチを書きたいのですが、エラーが出てしまいます。どこが間違っているのでしょう? Arduinoで、ボタンを押すとランダムに3つのモーターのうち一つが回転するというスケッチを書きたいのですが、コンパイル使用とすると、 「error: expected unqualified-id before numeric constant」 というエラーが出てしまいます。 どこが間違っているのでしょう? 下がそのスケッチです。 なお、モータードライバにはTA7291Pを使用。 信号ピンである5番6番ピンをArduino5~10番ピンに振り分けて、それぞれにモーターを接続、 電源やGNDは共有してます。 なお、ボタンを使わず、単純に3つのモーターのうち一つが回転するというというスケッチは出来ていて、実際にその通り動いています。 ------------------------------ //3つのモーターをランダムに動かす int val = 0 //入力ピンの状態がこの変数に記憶される void setup(){ pinMode(2,INPUT); //ボタンを入力に設定 pinMode(5,OUTPUT); //モーター(1)のドライバー5番ピンを出力に設定 pinMode(6,OUTPUT); //モーター(2)のドライバー5番ピンを出力に設定 pinMode(7,OUTPUT); //モーター(3)のドライバー5番ピンを出力に設定 pinMode(8,OUTPUT); //モーター(1)のドライバー6番ピンを出力に設定 pinMode(9,OUTPUT); //モーター(2)のドライバー6番ピンを出力に設定 pinMode(10,OUTPUT); //モーター(3)のドライバー6番ピンを出力に設定 } void loop(){ val = digitalRead(2); //入力を読み取りvalに格納 if (val == HIGH){ digitalWrite(random(5,8),HIGH);//ランダムにモーターを正回転させる } else { digitalWrite(5,LOW); digitalWrite(6,LOW); digitalWrite(7,LOW);//モータを止める } }

  • アルディーノのプログラムについて

    アルディーノで現在、スイッチを押すとLEDが点灯し、センサーが、5回反応をするとLEDが消えると言うプログラムを作りました。 このプログラムにセンサーが10秒間一度も反応しなかったら、LEDが消灯すると言うプログラムを追加したいです。ご教授お願いします。 現在のプログラム #define sensor_ON 1 byte sw=2; byte sensor=3; byte led=13; byte val,last_val=!sensor_ON,num; void setup(){ pinMode(sw,INPUT_PULLUP); pinMode(led,OUTPUT); } void loop(){ if(digitalRead(sw)==LOW)digitalWrite(led,HIGH);//スイッチを押したらLED点灯 if(digitalRead(led)==HIGH){//計測状態なら val=digitalRead(sensor); if(val!=sensor_ON && last_val==sensor_ON){//通過(前回検知&今回非検知)なら num++; if(num==5){//5回通過したら digitalWrite(led,LOW);//LEDを消す num=0;//リセット } } last_val=val; } delay(20); }

  • ARDUINOで5つのLEDをそれぞれ点滅させたり、フェードインさせた

    ARDUINOで5つのLEDをそれぞれ点滅させたり、フェードインさせたりしたい!! ARDUINO初心者です。5つのLEDをそれぞれ上記の様に制御したいと思っています。点滅は点灯、消灯が一定の点滅ではない効果を持たせたく、5つのLEDのうち、2つはフェードインフェードアウトで蛍のような効果にしたいと思っております。 以下、途中まで3つのLEDで試行錯誤してスケッチを構築したのですが、なかなかこれ以上、前へすすみません。 まず、このスケッチでの第一関門はプログラムの並列処理ができない、ということでした。 int ledPina = 9; int ledPinb = 10; int ledPinc = 11; void setup(){ pinMode(ledPina, OUTPUT); pinMode(ledPinb, OUTPUT); pinMode(ledPinc, OUTPUT); //LedPin a b cを出力に設定。 } void loop() { digitalWrite(ledPina, HIGH); // aのLEDをオン delay(500); //待機 digitalWrite(ledPina, LOW); //aをオフ delay(500); digitalWrite(ledPinb, HIGH); // bのLEDをオン delay(800); // 待機 digitalWrite(ledPinb, LOW); //bをオフ delay(300); digitalWrite(ledPinc, HIGH); // cのLEDをオン delay(100); // 待機 digitalWrite(ledPinc, LOW); //cをオフ delay(50); } おわかりの方、いらっしゃいましたら、お教え願えますでしょうか? よろしくお願い致します!!

  • アルディーノのプログラムについて

    アルディーノのプログラムについてです。 アルディーノのプログラムについてです。 現在はトグルスイッチをON、センサーOFFでモーターが動きだし、センサーがONになるとそこからプラスで3.2秒モーターが動きその後停止し、またセンサーがOFFになるとモーターが動き出すと言うプログラムの動作を確認出来ています。この動作にモーターとセンサーをもう一つ加え、同じ動作をさせたいです。トグルスイッチは共通で、モーターの動きは対応しているセンサーによって独立させたいです。そこでプログラムを作ったのですが、このプログラムだと片方ずつしかモーターが動きません uint32_t time=3201; byte dir=2; byte pul=3; byte dir2=8; byte pul2=9; byte tgl_sw=6; byte sensor=7; byte sensor2=10; word wait_us=2500 ;//2500us*2*200→フルステップで約1RPS void setup() { pinMode(dir,OUTPUT); pinMode(pul,OUTPUT); digitalWrite(dir,HIGH); pinMode(dir2,OUTPUT); pinMode(pul2,OUTPUT);// digitalWrite(dir2,HIGH); pinMode(tgl_sw,INPUT_PULLUP);//※LOWでON pinMode(sensor,INPUT); pinMode(sensor2,INPUT);//※ } } void loop() { if(digitalRead(tgl_sw)==LOW && digitalRead(sensor)==HIGH) delay(2000); time=millis(); while(millis()-time<3200) {//センサがオンになってから1500msまで if(digitalRead(tgl_sw))return; digitalWrite(pul,HIGH);//回す delayMicroseconds(wait_us); digitalWrite(pul,LOW); delayMicroseconds(wait_us); if(digitalRead(sensor)==HIGH)time=millis();//センサがオフなら更新 } {if(digitalRead(tgl_sw)==LOW && digitalRead(sensor2)==HIGH) delay(2000); time=millis(); while(millis()-time<3200) {//センサがオンになってから1500msまで if(digitalRead(tgl_sw))return; digitalWrite(pul2,HIGH);//回す delayMicroseconds(wait_us); digitalWrite(pul2,LOW); delayMicroseconds(wait_us); if(digitalRead(sensor2)==HIGH)time=millis();//センサがオフなら更新 //停止 } } } 修正点を教えていただけるとありがたいです。よろしくお願いします。

  • arduinoで7セグメントを使いたい

    arduinoで下記のスケッチを使って7セグメントledを動かしているのですが、 /////////////////////////////////////////////////////////////////////////////////////////////////////// //LED表示関数を定義 void NumPrint(int Number){ for (int w=0; w<=7; w++){ digitalWrite(w+1,Num_Array[Number][w]); } } /////////////////////////////////////////////////////////////////////////////////////////////////////// (1)この部分がどのような動作をしているのかわかりません。 (2)また、arduinoMEGAを使用して22~29番ピンを出力にして動かそうとしても上手くいきません。 (1)についての説明と(2)の解決法を知りたいです。 よろしくお願いしますm(._.)m ↓使っているスケッチ(1~8番ピンが出力のもので上手く動作します) void setup(){ //1~8番ピン デジタル出力へセット for (int i=1; i<=8; i++){ pinMode(i,OUTPUT); } } //LEDレイアウトを定義 //0,1,2,3,4,5,6,7,8,9,0,. の順。 boolean Num_Array[11][8]={ {0,0,0,1,0,0,0,1},{1,1,0,1,0,1,1,1},{0,0,1,1,0,0,1,0},{1,0,0,1,0,0,1,0}, {1,1,0,1,0,1,0,0},{1,0,0,1,1,0,0,0},{0,0,0,1,1,0,0,0},{1,1,0,1,0,0,0,1}, {0,0,0,1,0,0,0,0},{1,0,0,1,0,0,0,0},{1,1,1,0,1,1,1,1} }; //LED表示関数を定義 void NumPrint(int Number){ for (int w=0; w<=7; w++){ digitalWrite(w+1,Num_Array[Number][w]); } } void loop(){ for(int t=0;t<=10;t++){ NumPrint(t); delay(500); } }

  • arduinoのプログラムの書き方について

    aruduinoのプログラムの書き方として1つのプログラム内に下記のように複数のセットアップとvoid loopを書き込むのは可能なのでしょうか? void setup(led) { ledを点灯させる為の初期設定 } void setup(buzzer) { ブザーを鳴動させる為の初期設定 } void loop(led) { ledを点灯させる処理 } void loop(buzzer) { ブザーを鳴動させる処理 } どうか宜しく御回答の程お願いいたします。

  • Arduino のプログラムについて

    下のプログラムはArduinoで、4個のバッテリーの電圧を取得して、あるバッテリー電圧が14.5V以上だったら、充電を停止し、14.5Vよりも低いバッテリーには充電をするようにしたいのです。例えば、4個のバッテリーの取得電圧が下の図の様な状況の時、それぞれのバッテリーに充電、充電停止を行いたいのです。 AnalogPin 0 → 14.8V → digitalPin 10 を充電停止(LOWにする) AnalogPin 1 → 12.8V → digitalPin 11 を充電(HIGHにする) AnalogPin 2 → 13.7V → digitalPin 12 を充電(HIGHにする) AnalogPin 3 → 13.0V → digitalPin 13 を充電(HIGHにする) 質問:下のプログラムでArduinoに書き込んで動作させてみると、バッテリーの電圧は読み取っているのですが、digitalPin10~13のHIGH、LOWがうまくいきません。良い方法を教えてください。 void setup() { Serial.begin(9600); pinMode(10,OUTPUT); pinMode(11,OUTPUT); pinMode(12,OUTPUT); pinMode(13,OUTPUT); } void loop() { float battery_v[4];            for(int i=0;i<4;i++){ float convert_v=analogRead(i)*5./1024; battery_v[i]=convert_v/30*130; delay(100); Serial.print(i); Serial.print(" is "); Serial.println(battery_v[i]); delay(100); for(int r=9;r<14;r++){  // ここから下の命令がうまく動作しません。 if(battery_v[i]>14.5){ // digitalPin は10~13です。 digitalWrite(r,LOW); // すべてのdigitalWriteが }else { // LOWのままか、HIGHのままになってしまいます。 digitalWrite(r,HIGH); // } }   } delay(1000); } 以上、宜しくお願い致します。

  • Arduino unoでLED点滅周期が乱れる

      Arduino unoでLED点滅周期が乱れる理由は? スケッチ例のblinkプログラムでLED(13ピン)の点滅時間を1マイクロ秒ON・1マイクロ秒offとしデジタルオシロで観測すると、通常は50%dutyでON・OFFをくりかえしている。  しかし数十パルスかそれ以上経過後の1パルスのON時間が約2倍になったり、別のタイミングのOFF時間が同様に約2倍になったりする理由はどうしてか?  もちろん周期は2マイクロ秒にはならず、プログラムのdigitalWrite()の命令時間分は長く約10マイクロ秒となっています。 実験したプログラムを記載します。 int led = 13; void setup() { pinMode(led, OUTPUT); } void loop() { digitalWrite(led, HIGH); delayMicroseconds(1); digitalWrite(led, LOW); delayMicroseconds(1); }

専門家に質問してみよう