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

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

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

M5Stackは、小型のマイコンモジュールです。拡張モジュールが豊富に用意されており、センサと組み合わせることで測定機能を自由に追加することができます。

Arduino

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

Q&A

解決済

1回答

2736閲覧

M5Stack gray でWi-Fi に接続しながら analogRead でセンサ値を取得する方法

soccer.k.o

総合スコア1

M5Stack

M5Stackは、小型のマイコンモジュールです。拡張モジュールが豊富に用意されており、センサと組み合わせることで測定機能を自由に追加することができます。

Arduino

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

0グッド

0クリップ

投稿2021/09/19 17:44

前提・実現したいこと

M5Stack gray を使用してセンサデータを取得し,そのデータをGoogle Drive にアップロードするというシステムを構築しています.

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

①センサデータを取得する
②Wi-Fiに接続して Google Drive にアップロードする
この2つのタスクを別々のプログラムで実現することはできました. しかし,これらを組み合わせた1つのプログラムを実行するとセンサ値が0固定として出力され,正しい結果を得ることができません.

該当のソースコード

Arduino

1#include <M5Stack.h> 2#include <WiFi.h> // Wifi制御用ライブラリ 3#include <time.h> // 時刻制御用ライブラリ 4 5int i =0; 6int PIN = 2; 7// Wi-FiのSSID 8char *ssid = "..."; 9// Wi-Fiのパスワード 10char *password = "..."; 11 12// NTP接続情報 NTP connection information. 13const char* ntpServer = "ntp.nict.jp"; 14const long gmtOffset_sec = 3600 * 9; 15const int daylightOffset_sec = 0; 16 17void printLocalTime() 18{ 19 struct tm timeinfo; 20 21 if(!getLocalTime(&timeinfo)){ 22 M5.Lcd.println("Failed to obtain time"); 23 return; 24 } 25 M5.Lcd.printf("%04d-%02d-%02d %02d:%02d:%01d" 26 ,timeinfo.tm_year + 1900 27 ,timeinfo.tm_mon 28 ,timeinfo.tm_mday 29 ,timeinfo.tm_hour 30 ,timeinfo.tm_min 31 ,timeinfo.tm_sec 32 ); 33} 34 35void setup_wifi(){ 36 // WiFi開始 37 WiFi.begin(ssid, password); 38 39 // Wi-Fi接続待ち 40 while (WiFi.status() != WL_CONNECTED){ 41 delay(500); 42 M5.Lcd.print("."); 43 } 44 // WiFi接続成功メッセージの表示 45 //Serial.println("\nWiFi Connected."); 46 //M5.Lcd.setCursor(10, 40); 47 //M5.Lcd.setTextColor(WHITE); 48 //M5.Lcd.setTextSize(2); 49 //M5.Lcd.println("WiFi Connected."); 50} 51 52void setup(){ 53 M5.begin(); 54 M5.Lcd.setTextSize(2); 55 setup_wifi(); 56} 57 58void loop(){ 59 int value = analogRead(PIN); 60 M5.Lcd.println(value); 61 delay(500); 62 i=i+1; 63 if(i==10){ 64 M5.Lcd.clear(); 65 M5.Lcd.setCursor(0,0); 66 // 時刻同期関数 67 //configTime(gmtOffset_sec, daylightOffset_sec, ntpServer); 68 //printLocalTime(); 69 i=0; 70 } 71}

試したこと

上記のプログラムを実行したところWi-Fi接続は完了できますがanalogReadの出力が0となります.
setup_wifi()をコメントアウトすれば正しいセンサ値が出力されます.

補足情報(FW/ツールのバージョンなど)

PCの再起動や接続するWi-Fiを変更しましたが,同様の事象が起こります.

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

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

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

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

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

guest

回答1

0

ベストアンサー

M5Stack grayは持っていませんが、ESP32の話ということで。違うかもしれませんので注意してください。

結論から言うと、Wi-Fi利用時には、2番ピンでanalogRead()はできないようです。32, 33, 34, 35, 36, 39の6ピンのどれかを利用する必要がありそうです。

ESP32には、アナログ入力に利用するADCには、ADC1とADC2とがありますが、https://www.espressif.com/sites/default/files/documentation/esp32_hardware_design_guidelines_en.pdf の "2.6 ADC"には、

• ADC1 is recommended over ADC2 as the latter cannot be used when Wi-Fi function is enabled.

とあり、ADC2に接続されているピンは、Wi-Fi機能とは共存できないようです。

https://www.espressif.com/sites/default/files/documentation/esp32_technical_reference_manual_en.pdf の、"30.4.11 ADC – Take Measurement with ADC"に、ADC1とADC2に接続されているピンが載っています。以下に概略を示します。

ADCピン
ADC1GPIO36, 37, 38, 39, 33, 32, 34, 35, Hall Phase 1, Hall Phase 0
ADC2GPIO4, 0, 2, 15, 13, 12, 14, 27, 25, 26

さらに、https://trac.switch-science.com/wiki/esp32_tips#ADC%E3%82%A2%E3%83%8A%E3%83%AD%E3%82%B0%E5%85%A5%E5%8A%9B には、

※A1,A2は定義されていません。本来ならGPIO37、38ピンで利用できますが、後述するLow-Noise Amplifier回路を利用するためにすでに部品が配線されています。

とあるので、Wi-Fi接続時に利用可能なADCピンは、32, 33, 34, 35, 36, 39の6ピンではないかと思われます。

投稿2021/09/19 21:44

編集2021/09/19 21:58
mkgt00

総合スコア165

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

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

soccer.k.o

2021/09/21 03:59

ありがとうございます. とても丁寧な回答で助かりました. ご指摘の通り動作させると期待通りの挙動を示しました. 今後も何かあればよろしくお願いいたします.
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.31%

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

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

質問する

関連した質問