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

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

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

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

Q&A

2回答

150閲覧

Arduino M5Stack 割り込み処理で電圧を取得したい

riyunosuke

総合スコア1

Arduino

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

0グッド

0クリップ

投稿2024/10/15 07:46

実現したいこと

M5 Stackにて、ADCアダプタを用いて電圧を取得している。
この電圧の取得タイミングを割り込み処理をして10㎜/sec間隔で取得したい。

発生している問題・分からないこと

現在、割り込みをするコード内に電圧を取得するコードを書いても
うまく測定できない。シリアルモニターで見ると65535と16ビットの最大値を出力してしまっている。
Loop内に電圧を測定するコードを書けば正常に取得できるが、取得タイミングを指定したい為
割り込み内で電圧取得したいができない。

該当のソースコード

Arduino

1#include <M5Stack.h> 2#include <Wire.h> 3#include "ADS1100.h" 4 5ADS1100 ads; 6 7float value1 = 0; // アナログ値1を格納 8uint16_t voltage1 = 0; // 電圧値CH1を格納 9int voltage2 = 0; 10const int CH1_PIN = 35; // アナログピン35格納 11const float MAX_VOLTAGE = 3.3; // 3.3Vを電源とした場合 12const float ANALOG_MAX = 4095; // ESP32の場合 13unsigned long StartTime = 1; // 14unsigned long currTime = 0; 15unsigned long prevTime = 0; 16unsigned long EndTime = 1; 17 18char selectedItem = 0; 19int t1 = 0; 20int t2 = 0; 21int T1 = 5; 22int T2 = 40; 23int selectedNum = 0; 24int sta = 0; 25float slope = 0; 26 27hw_timer_t * timer = NULL; 28volatile uint32_t counter = 0; 29volatile uint32_t current_time = 0; 30 31void onTimer() { 32 33 34 ads.begin(); 35 voltage1 = ads.Measure_Differential() ; 36 voltage2 = voltage1 / 2.471; 37 38 39 StartTime = millis(); 40 Serial.println(voltage2); 41 Serial.println(StartTime); 42} 43 44 45 46 47 48void setup() 49{ 50 51 ads.begin(); 52 ads.getAddr_ADS1100(ADS1100_DEFAULT_ADDRESS); // 0x48, 1001 000 (ADDR = GND) 53 ads.setGain(GAIN_ONE); // 1x gain(default) 54 ads.setMode(MODE_CONTIN); // Continuous conversion mode (default) 55 ads.setRate(RATE_8); // 8SPS (default) 56 ads.setOSMode(OSMODE_SINGLE); // Set to start a single-conversion 57 58 M5.begin(); 59 Serial.begin(115200); 60 61 // タイマ作成 62 timer = timerBegin(0, 80, true); 63 64 // タイマ割り込みサービス・ルーチン onTimer を登録 65 timerAttachInterrupt(timer, &onTimer, true); 66 67 // 割り込みタイミング(ms)の設定 68 timerAlarmWrite(timer, 10000, true); 69 70 // タイマ有効化 71 timerAlarmEnable(timer); 72 73 74 75 76} 77 78 79 80void loop() 81{ 82 M5.update(); 83 M5.Lcd.setCursor(10, 10); // 文字表示の左上位置を設定 84 M5.Lcd.setTextColor(RED); // 文字色設定(背景は透明) 85 M5.Lcd.setTextSize(2); // 文字の大きさを設定(1~7) 86 M5.Lcd.print("mesurement"); 87}

試したこと・調べたこと

  • teratailやGoogle等で検索した
  • ソースコードを自分なりに変更した
  • 知人に聞いた
  • その他
上記の詳細・結果

特に得られなかった。

補足

特になし

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

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

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

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

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

guest

回答2

0

そもそも、

ads.setRate(RATE_8); // 8SPS (default)

とデバイスを8SPSに設定しているのに、10ms毎に値を取得しようとするのがおかしいのでは?

投稿2024/10/18 05:57

nac_tnk

総合スコア494

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

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

0

10㎜/sec間隔

ちょっとなんのことだかわかりませんが。10msと混同している? ミリは、ミリメートルの略称ではなくて1/1000を意味する接頭語です。

割り込みルーチン中では他の割り込みは使えないのが普通です。
で、I2Cの通信とかSerialとか、そこそこ割り込みを使います。
割り込みハンドラではフラグを立てるだけにして、通常コンテキストで値の取得や表示を行うか、
多重割り込みを研究するか、というところでしょう。

前者ではこんなことになるでしょうか。

bool trigger=false; void onTimer() { trigger=true; } void loop(){ M5.update(); M5.Lcd.setCursor(10, 10); // 文字表示の左上位置を設定 M5.Lcd.setTextColor(RED); // 文字色設定(背景は透明) M5.Lcd.setTextSize(2); // 文字の大きさを設定(1~7) M5.Lcd.print("mesurement"); if(trigger){ ads.begin(); voltage1 = ads.Measure_Differential() ; voltage2 = voltage1 / 2.471; StartTime = millis(); Serial.println(voltage2); Serial.println(StartTime); trigger=false; } }

投稿2024/10/15 15:59

thkana

総合スコア7703

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.37%

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

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

質問する

関連した質問