3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

M5cameraに取り付けたGroveセンサーの値がおかしい時の解決策

Last updated at Posted at 2021-02-24
  • M5cameraについて
  • 背景
  • 現象
  • 原因
  • 解決策
  • 参考

解決に時間がかかったため備忘もかねて記事を書きました。

#M5cameraについて

スイッチサイエンス社が販売している、ESP32ベースの小型カメラユニット。
Arduino IDEを使ってプログラム可能。
GROVE互換のインターフェースを持っており、GROVEセンサを利用可能。

#背景
観葉植物の育成でM5cameraを活用しようと思い、
カメラユニットで撮影しGoogleDriveへの保存(タイムラプスへ変換予定)、
+ GROVEの水分センサーにて土の渇きを検知して通知するシステムを考えています。
上記の記事については今後書こうかなと考えています。
GROVE 水分センサー

M5cameraはESP32ベースでWifiユニットが利用できることが決め手でした。

#現象
####■水分センサーを読み取るアプリケーションだけをコンパイルし動作させた場合
analog.read()の初期値:0
※センサーで値変動あり。

####■Wifi接続と水分センサーを読み取るアプリケーションをコンパイルし動作させた場合
analog.read()の値「4095」
※センサーで値変動なし。。

#原因
ESP32でWifi接続時に使用できないピンがあるとのこと。
https://rikoubou.hatenablog.com/entry/2017/07/26/193021

待て待て待て、M5cameraはGROVEユニットが1つなので別のピンを利用しようにも使えないくないか。。
Wifi使ったときはセンサーが利用できないとか正直使えないなぁ。。
と思ったら、Githubのarudino-esp32のIssuesに挙げられていました。
(2016年からある問題のようです。)

#解決策
上記Issueの中で解決されていたのでそのソースを拝借させていただいております。
(本当にありがとう!)

①Wifi接続前にレジスタの値を保存(追記したコード部分①)
②analogRead前にレジスタ値を復元(追記したコード部分②)
③12bitが反転して4095が出力されるらしいので反転(追記したコード部分③)

sample.ino
#include <WiFi.h>
#include "esp32-hal-adc.h" // needed for adc pin reset
#include "soc/sens_reg.h" // needed for adc pin reset
uint64_t reg_b;// Used to store Pin registers

const char* ssid = "*******";
const char* password = "********";

void setup() {
//■■■追記したコード部分①■■■
  reg_b = READ_PERI_REG(SENS_SAR_READ_CTRL2_REG);
//■■■■■■■■■■■■■■■■■■■■■■■
  
  Serial.begin(115200);
  
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }

  Serial.println("");
  Serial.println("WiFi connected");
}

int sensorPin=13;
int sensorValue = 0;

void loop() {

//■■■追記したコード部分②■■■
    WRITE_PERI_REG(SENS_SAR_READ_CTRL2_REG, reg_b);
//■■■■■■■■■■■■■■■■■■■■■■■
//■■■追記したコード部分③■■■
    SET_PERI_REG_MASK(SENS_SAR_READ_CTRL2_REG, SENS_SAR2_DATA_INV); 
//■■■■■■■■■■■■■■■■■■■■■■■

    sensorValue = analogRead(sensorPin);
    Serial.print("Moisture = " );
    Serial.println(sensorValue);
    delay(1000);
}

#参考
【ESP32】Wifi接続時のanalogReadについて
Conflict Between Wifi & analogRead()?

3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?