- 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が出力されるらしいので反転(追記したコード部分③)
#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()?