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

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

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

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

Arduino

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

Q&A

解決済

3回答

1312閲覧

Arduinoで割り込みを使ったセンサーライブラリを作りたい

sukara

総合スコア11

C++

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

Arduino

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

0グッド

0クリップ

投稿2018/08/17 02:45

ピン番号を設定すると,自動でピン変化割り込みを設定し,
センサーの状態(High/Low)を常に監視できるようにしたいのですがうまくいきません

<LimitSensor.h>

C++

1class clLimitSensor {// 2public: 3 int pin; 4 int HL_On;//リミットセンサに接触している時High/Lowどちらか(NOスイッチ,NCスイッチのどちらか) 5 bool flg_On; 6 7 clLimitSensor(int pin0, int HL_On0) { 8 HL_On = HL_On0; 9 pin = pin0; 10 pinMode(pin, INPUT_PULLUP); 11 12 if (HL_On == digitalRead(pin)) { 13 flg_On = true; 14 }else { 15 flg_On = false; 16 } 17 attachInterrupt(digitalPinToInterrupt(pin), interrupt, CHANGE); 18 } 19 void interrupt() { 20 //if (HL_On == digitalRead(pin)) { 21 // flg_On = true; 22 //}else { 23 // flg_On = false; 24 //} 25 flg_On = !flg_On; 26 } 27 28};

<main側>

C++

1~省略~ 2clLimitSensor LimitSensor[3][2]={ 3 {clLimitSensor(42,LOW),clLimitSensor(48,LOW)}, 4 {clLimitSensor(44,LOW),clLimitSensor(50,LOW)}, 5 {clLimitSensor(46,LOW),clLimitSensor(52,LOW)} 6}; 7~省略~

コンパイルすると
「cannot convert 'clLimitSensor::interrupt' from type 'void (clLimitSensor::)()' to type 'void (*)()'」
と出ます.

関数ポインタに静的でない関数が渡せないという事だと思うのですが,何か解決策はありますか?
よろしくお願いします.


・チャタリング対策などは後々追加する予定です
・使用デバイス:Arduino Due

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

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

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

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

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

guest

回答3

0

arduinoはどれをお使いでしょうか?
品種によって割り込みの使えるピンの違いがあります。
質問の前提として、明示していただければ答えに近づきます。

投稿2018/08/18 10:39

MasahikoHirata

総合スコア3747

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

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

sukara

2018/08/18 11:49

見づらくて申し訳ありません 一番下に書いてありますArduino Dueです
MasahikoHirata

2018/08/18 19:42

arduino DUEであれば、int0~int5の6個の割り込みが可能です。また貴殿のソースでの疑問は複数の割り込みであるが、引数により単一の割り込みルーチンでの処理に見えます。 またbool flg_onの表記は間違えで、正確にはvolatile bool flag_onであり、また複数であれば配列にすべきですね。 DUEの割り込みの定義については過去私の回答の https://teratail.com/questions/59250 などを参考にされてください。
sukara

2018/08/19 13:14 編集

>arduino DUEであれば、int0~int5の6個の割り込みが可能です Dueのピン変化割り込みはすべてのデジタルIOピンでできるはずです. https://garretlab.web.fc2.com/arduino_reference/language/functions/external_interrupts/attachInterrupt.html DueのデジタルIOピンは54本あります. 数本であれば他の回答者様の言うように全ての割り込み関数を用意しても良いのですが... >複数の割り込みであるが、引数により単一の割り込みルーチンでの処理に見えます classを複数作成しているので割り込みルーチンも複数作成されると思います. LimitSensor[0][0]::interrupt() ・・・ LimitSensor[2][1]::interrupt() という複数の割り込みルーチンが作成されていると認識しています >bool flg_onの表記は間違えで、正確にはvolatile bool flag_onであり クラス内では最適化がされないと勝手に思っていました.クラス内でもVolatileが必要なんですね ありがとうございます. >複数であれば配列にすべき クラスのメンバ関数を割り込み関数に設定できなければ,確かにそうするしかなさそうですね 実際には数十本も割り込みすることはないと思いますし,割り込み数を制限して, 他の回答者様も言っているように割り込み間数を複数用意するしかなさそうですね
MasahikoHirata

2018/08/19 13:34

>Dueのピン変化割り込みはすべてのデジタルIOピンでできるはずです. 失礼しました。 MEGA2560の感覚で回答しました。ARMですので貴殿の指摘の通りです。 >実際には数十本も割り込みすることはないと思いますし,割り込み数を制限して, 他の回答者様も言っているように割り込み間数を複数用意するしかなさそうですね コンパイラが期待通りなコードを生成するか?でしょうね。割り込み処理ルーチンを複数動的に配置してくれれば一番なのですが、実機で試す時間が無かったので申し訳ありません。
guest

0

ベストアンサー

パッと見た目難しそうですね。
そもそもattachInterruptでクラスインスタンスを渡せるような仕組みがないので、紐付ける方法が結構面倒になるのではないでしょうか。

interrupt自体をstaticなどにしておいて、それを配列化して、固定的にルーティングするイメージになるかな。

投稿2018/08/17 03:11

t_obara

総合スコア5488

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

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

0

void interrupt(void) {

としてはどうでしょう


考えてみれば、静的でない関数はダメってことなんですね
#命令コードは一つなんで区別がつかない

んじゃ、割り込みハンドラをコンストラクタに渡すというテぐらいしかないですかね

clLimitSensor(int pin0, int HL_On0,INTHANDLER handler) {

それとは別解をひとつ。
IRQ割り込みはせいぜい16個しかないんだから、あらかじめその全てにハンドラを用意/割り当てておいて、そこから実行するコールバックを登録するという形にすればいいでしょ。
この場合、Arduinoの標準関数は使えなくなるけど、それは望むところでしょうし

投稿2018/08/17 02:54

編集2018/08/17 03:30
y_waiwai

総合スコア87774

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問