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

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

新規登録して質問してみよう
ただいま回答率
85.49%
C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Arduino

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

Q&A

解決済

2回答

3656閲覧

割り込み後,2秒毎に出力をONOFFできるプログラムを作りたいです.

yangMEN

総合スコア11

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Arduino

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

0グッド

0クリップ

投稿2017/01/18 08:34

###前提・実現したいこと
ロータリーエンコーダの値がHIGHになり,割り込みが発生すると,2秒毎に出力ピンのONOFFが切り替わるプログラムを作成したいです.
現状だと,出力がONになったままです(millis()が増加していない・・・?)

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

出力がONになったままで,出力が切り替わらない.

エラーメッセージ
特にないです.

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

c++

1//何秒ごとの出力か 2#define MILLISECONDS_TO_WAIT 2000 3volatile unsigned long time_zero = millis(); 4volatile boolean button_is_high = true; 5 6 7// ロータリーエンコーダーの配線に合わせる 8int dRotAPin = 3; 9int dRotBPin = 2; 10 11//出力ピン 12int EPin = 8; 13 14volatile int Flag = 0; 15 16 17void setup() 18{ 19 20// ピンの設定 21// INPUTモードにします。 22pinMode(dRotAPin, INPUT); 23pinMode(dRotBPin, INPUT); 24pinMode(EPin, OUTPUT); 25 26// プルアップを有効にします 27digitalWrite(dRotAPin, HIGH); 28digitalWrite(dRotBPin, HIGH); 29 30 31 32} 33 34 35void loop() 36{ 37// 外部割り込みを設定します 38// ピンが LOW → HIGH 時にrotRotEnd()を呼び出します 39attachInterrupt(0, rotRotEnc1, HIGH); 40attachInterrupt(1, rotRotEnc2, HIGH); 41 42} 43 44// 外部割り込みから呼び出される変数 45void rotRotEnc1(void) 46{ 47 48if(Flag == 1) 49{ 50int i =0; 51for (i = 0; i < 5; i++){ 52digitalWrite(EPin, HIGH); 53button_is_high = true; 54time_zero = millis(); 55while(button_is_high) { 56if (millis() - time_zero > MILLISECONDS_TO_WAIT) 57button_is_high = false; } 58digitalWrite(EPin, LOW); 59button_is_high = true; 60time_zero = millis(); 61while(button_is_high) { 62if (millis() - time_zero > MILLISECONDS_TO_WAIT) 63button_is_high = false; } 64 65} 66} 67 68else Flag = 1; 69 70} 71 72 73void rotRotEnc2(void) 74{ 75 76if(Flag == -1) 77{ 78int i =0; 79for (i = 0; i < 5; i++){ 80digitalWrite(EPin, HIGH); 81button_is_high = true; 82time_zero = millis(); 83while(button_is_high) { 84if (millis() - time_zero > MILLISECONDS_TO_WAIT) 85button_is_high = false; } 86digitalWrite(EPin, LOW); 87button_is_high = true; 88time_zero = millis(); 89while(button_is_high) { 90if (millis() - time_zero > MILLISECONDS_TO_WAIT) 91button_is_high = false; } 92 93} 94} 95 96else Flag = -1; 97 98}

###試したこと
millis()の関数を割り込み中でも変わるようにvolatileにすればよいのかと思いましたが,
うまく行きませんでした.

###補足情報(言語/FW/ツール等のバージョンなど)
今回使用するのはarduino UNO R3です.

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

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

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

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

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

guest

回答2

0

ベストアンサー

arduino の一般的な割り込みとして回答したします。
まず気になるのが

void loop() { // 外部割り込みを設定します // ピンが LOW → HIGH 時にrotRotEnd()を呼び出します attachInterrupt(0, rotRotEnc1, HIGH); attachInterrupt(1, rotRotEnc2, HIGH); }

割り込みの定義はvoid setup()の中で。
void loop()は繰り返し処理を書くところです。
続いて
attachInterruptの引数HIGH。引数はLOWCAHNGERISINGFALLING。貴殿のHIGHはどれを指すかと仮定すると恐らくRISING
まずはこの修正から。

投稿2017/01/18 11:21

編集2017/01/18 11:21
MasahikoHirata

総合スコア3747

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

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

yangMEN

2017/01/19 03:58

なるほど.割り込み処理が終わったら,また割り込み待ち状態に戻そうと考えていたのですが,Loop内に書く必要性はなさそうですね. 修正してみます,ありがとうございます.
guest

0

直接的な回答では、ありません。

Arduinoの分類だけで、
1.カード名、又は、型式が不明
2.ファームウェアの状態が不明
3.IDEのバージョン、開発ホスト:Windows/Linux/Macの別が不明

標準的なArduino であれば、
検索ワード:arduino Lチカ
で、検索して、IDE付属アプリを一通り遊んでみて、下さい。
1.Lチカでは、無限ループと、LEDのON/OFFの方法が学べます、
2.標準サポートのUSB通信を使った、デバック方法を学習してください。
3.標準サポートのLCDを使った、時計などを学習してください。
4.ファームウェアのアップデート方法や、AVR-ISPの使い方、
Ardino-ISP化の方法を学習してください。
5.秋月電子の、AVR規格表サイトを探してください。
6.どのみち必要になるので、Atmel Studio(AVR Studio)を
手に入れてください。
7.懐具合に余裕がある方は、Atmel-ICE/AVRISP mk-II/AVR Dragon等を
手に入れて下さい。

Arduinoのランゲージリファレンス、チートシートは、探して手に入れて下さい。

投稿2017/01/18 09:30

daive

総合スコア2028

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問