質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Arduino

Arduinoは、AVRマイコン、単純なI/O(入出力)ポートを備えた基板、C言語を元としたArduinoのプログラム言語と、それを実装した統合開発環境から構成されたシステムです。

Q&A

解決済

3回答

11220閲覧

arduinoの割り込みを活用したいです

takero-

総合スコア7

Arduino

Arduinoは、AVRマイコン、単純なI/O(入出力)ポートを備えた基板、C言語を元としたArduinoのプログラム言語と、それを実装した統合開発環境から構成されたシステムです。

0グッド

1クリップ

投稿2016/10/25 06:36

###前提・実現したいこと

arduinoで1分おきにリレー1を動かすことと、スイッチが入ったらリレー2を動かすことがしたいです。

1分おきにリレー1を動かすことのスケッチと、スイッチが入ったらリレー2を動かすことのスケッチを別々に作った時には、それぞれ稼働できました。

###発生している問題・エラーメッセージ

しかし、この2つのスケッチを合体させると稼働できません。

###該当のソースコード

arduino

1//プルアップ回路につなげたら目的達成!! 2//その後、#1はセーフ、#2を加えるとアウト! 3 4volatile int TOGGLE = LOW;//並行して動作するコード用変数にLEDをトグルする値を格納 5 6void setup() { //一回だけ実行 7 pinMode(12, OUTPUT); //半押しピンは出力にする。#1 8 digitalWrite(12, LOW);//半押しピンはLOWにする。#1 9 10 pinMode(11, OUTPUT); //レリーズが接続された11番ピンを出力に設定 11 12 pinMode(2, INPUT_PULLUP); 13 //外部割込みを監視する2番ピンをプルアップし入力に設定 14 attachInterrupt(digitalPinToInterrupt(2), shoot, CHANGE); 15 //2番ピン(割り込み番号0)の電圧に変化があったらshoot関数を実行 16} 17 18void loop() { //{}内を無限ループで実行 19 digitalWrite(12, HIGH);//#2 20 delay(1000); //#2 21 digitalWrite(12, LOW); //#2 22 delay(60000); //#2 23 24 digitalWrite(11, TOGGLE);//LEDが接続された11番ピンをトグルする 25} 26 27void shoot(void) { //割り込み番号0(2番ピン)の電圧に変化があった時のみ実行される 28 if (digitalRead(2) == LOW) { //もし2番ピンがLOWなら{}内を実行する 29 TOGGLE = LOW; //LEDトグル変数をLOWにする 30 } 31 32 else { //もし2番ピンがLOWでなかったら(HIGHなら)以下の{}内を実行する 33 TOGGLE = HIGH; //LEDトグル変数をHIGHにする 34 } 35}``` 36

###試したこと
LEDをブレッドボード上に設置し電流の到達を確認しました。
それぞれ単独の時にはリレー1.2に電流が到達しました。

合体させると2番ピンに電流が届いても割り込みが起こりませんでした。

###補足情報(言語/FW/ツール等のバージョンなど)
より詳細な情報

初めての投稿で要領を得ませんが取り急ぎ書き込みました。
書き方も含めて改善すべきは教えてください。
よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

コードを記載したいので新たに回答。
こうすればできるのでは?

//プルアップ回路につなげたら目的達成!! //その後、#1はセーフ、#2を加えるとアウト! volatile int TOGGLE = LOW;//並行して動作するコード用変数にLEDをトグルする値を格納 void setup() { //一回だけ実行 pinMode(12, OUTPUT); //半押しピンは出力にする。#1 digitalWrite(12, LOW);//半押しピンはLOWにする。#1 pinMode(11, OUTPUT); //レリーズが接続された11番ピンを出力に設定 pinMode(2, INPUT_PULLUP); //外部割込みを監視する2番ピンをプルアップし入力に設定 attachInterrupt(digitalPinToInterrupt(2), shoot, CHANGE); //2番ピン(割り込み番号0)の電圧に変化があったらshoot関数を実行 } void loop() { //{}内を無限ループで実行 digitalWrite(12, HIGH);//#2 delay(1000); //#2 digitalWrite(12, LOW); //#2 delay(60000); //#2 // digitalWrite(11, TOGGLE);//LEDが接続された11番ピンをトグルする } void shoot(void) { //割り込み番号0(2番ピン)の電圧に変化があった時のみ実行される if (digitalRead(2) == LOW) { //もし2番ピンがLOWなら{}内を実行する TOGGLE = LOW; //LEDトグル変数をLOWにする } else { //もし2番ピンがLOWでなかったら(HIGHなら)以下の{}内を実行する TOGGLE = HIGH; //LEDトグル変数をHIGHにする } digitalWrite(11, TOGGLE); }

loopの中だとdelay(60000);までリレーの動作ができないので。

投稿2016/11/05 07:15

編集2016/11/05 09:04
MasahikoHirata

総合スコア3747

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

takero-

2016/11/05 08:39

ご回答ありがとうございました。早速試しましたがコンパイルエラーとなってしまいました。 'TOGGLE' was not declared in this scopeとのことでした。
MasahikoHirata

2016/11/05 08:44

あれれ?当然このソースの前にTOGGLEとsetupは記載されていますよね?
takero-

2016/11/05 10:20

失礼しました。急いでコピペしたため setupを忘れていました。 上記のスケッチで問題解消されました。
MasahikoHirata

2016/11/05 10:27

良かった。長期間未解決だったので気にしていました。
guest

0

Arduinocで開発した事が無いため、検討違いならすいません。
delay(60000)としてしまうと1分間そこで処理が止まってしまう為、たとえ割り込みが入ってvolatile変数の値を変えても、実際にリレーを制御するのはloop内にある為、リアルタイムに変わらないのでは、、、、
http://www.musashinodenpa.com/arduino/ref/index.php?f=0&pos=2588
をみるとあまり長いdelayは推奨していないようなのでmillisで時間を取得して、その値を見ながらリレー1を制御した方がよいのかなという印象を受けました。

投稿2016/10/25 06:47

hiim

総合スコア1689

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

takero-

2016/10/25 06:59

ご回答ありがとうございます。 実はmillis関数をを使ったスケッチも武蔵野電波さんでで見つけましたが、うまく使いこなせずあきらめました。お恥ずかしい・・・。 その後Metoro関数を使ったものを自作しましたがこちらも単体では稼働しましたが、合体すると稼働しませんでした。 そこで、複雑ですと私がわかりにくいためdelay関数で作ってみたのですがご指摘のようなことがおこっているのでしょうか?検討させていただきたいと思います。
hiim

2016/10/25 07:07

昔組み込み系の仕事はしていたので、Arduino未経験者がしゃしゃりでて回答してしまいましたが、動作確認に毎回1分待たなければ確認できないのでは大変なので delay(60000); を delay(100);とかにし、for分等でカウンタを持ってインクリメントしていき、600回転目で60秒と判断してリレー1を制御するなどして、プログラムが長時間止まらないようにするか 。 Aruduinoでやっていいのかどうかわかりませんが、割り込みのISRの中でpin制御はしたらいけないのでしょうjか?
takero-

2016/10/26 23:10

ご回答ありがとうございました。 delay(60000UL)としてみました。が状況は変わりませんでした。引続き検討したいと思います。
hiim

2016/10/26 23:26

いちど1分ではなくdelay(30000)で動作するか確認できますか? 2016/10/25 17:07のコメントでも引用した http://forum.arduino.cc/index.php?topic=46540.0 によると 32767以上の数値を指定指定するとハングするようですので。
takero-

2016/10/27 12:12

幾度もありがとうございます。delay(30000)を試してみましたが、リレー1は30秒ごとに稼動し、リレー2はスイッチが入っても稼動しませんでした。残念です。もう少し検討します。
guest

0

タイマー割り込みを使うと簡単にできるのでは?

投稿2016/10/25 06:39

MasahikoHirata

総合スコア3747

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

takero-

2016/10/25 06:46

ご回答ありがとうございます。 予め決められたタイミングで割り込むにはタイマー割り込みがいいと思うのですが、 不定期に突然のタイミングで割り込まなければならない場合を想定しております。
takero-

2016/11/05 06:46

ご回答ありがとうございました。 先にも申しましたように、タイマー割り込みではなく、インタラプトの割り込みを想定しています。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問