![見出し画像](https://assets.st-note.com/production/uploads/images/31058615/rectangle_large_type_2_3b59de4783d37c3cac6edf2c031b76b0.jpeg?width=1200)
【SALZ製作日誌】2020.07.24 水分計との格闘の末。。。
こんなに事が長引くとは、想像だにしておりませんでした。
結論から先に申しあげますと、水分計の課題は解決しました。
長い長い格闘の末、正常に動作するようになりました。
うまくいかなかった原因は、水分計の故障とチェック方法の甘さです。
仕事でもそうですが、なかなか解決できない問題があるときは、決まって複数の不具合が絡み合っているものです。
前回までのテストで、水分計が正しく値を返さない問題がありました。
SALZ2では、水分計を軽く握るだけで値が変わり、動作チェックができていましたが、今回はどうも怪しいのです。数値はふらふら変動しています。しかし、水分量を示しているようには感じられません。
そこで、水分計のテストをきちんと行うことにしました。テストの計画は以下のとおりです。
1.水分計チェックのためのプログラムを作成し、M5Atom Matrixで試す。
2.M5Atom Liteで試す。
3.M5StickCで試す。
4.Arduino Unoで試す。
5.別の水分計を試す。
今回使う装置を並べてみました。
左上:M5Atom Matrix
右上:M5Atom Lite
左下:M5StickC
右下:Arduino Uno
上:新しい部品
下:今まで使用していた部品
1.水分計チェックのためのプログラムを作成し、M5Atom Matrixで試す。
下記のプログラムを書いて試しました。
// WLTest 水分計テスト
#include <M5Atom.h>
void setup() {
M5.begin(true, false, true);
Serial.begin(115200);
}
void loop() {
int ml = analogRead(32);
// Serial.print("ML:");
Serial.println(ml);
delay(1000);
}
うーん。正常に動いているのかどうかもわからない値です。次のテストに移ります。
2.M5Atom Liteで試す。
プログラムは同じものが使えます。
試してみると、残念ながら同じような結果でした。
ということは、M5ATOM Matrixの故障ではないということは分かりました。
ただ、M5ATOM系特有の問題であれば、まだ分かりません。
3.M5StickCで試す。
これで行けるなら、M5StickCに宗旨替えしても良いかと思いました。ただ、扱えるGPIOが少ないので、別の苦労があるのでしょう。
使えるポートは26のみ。こちらで試してみます。
// WLTest 水分計テスト
#include <M5StickC.h>
void setup() {
Serial.begin(115200);
}
void loop() {
int ml = analogRead(26);
// Serial.print("ML:");
Serial.println(ml);
delay(1000);
}
テスト結果は、あまり代わり映えしないものでした。
4.Arduino Unoで試す。
analogRead()で悩んでいます。本家Arduino Unoで試してダメなら、根本的に間違っていることになります。
// WLTest 水分計テスト
#include <Arduino.h>
void setup() {
Serial.begin(9600);
}
void loop() {
int ml = analogRead(A0);
// Serial.print("ML:");
Serial.println(ml);
delay(1000);
}
テスト結果は、同じくパッとしません。
5.別の水分計を試す。
となると、水分計の故障を疑うべきでしょう。今後の横展開に備えて、水分計を多めに買っていました。
同じように見える水分計ですが、基板上のペイントや、基板のカットは交換品の方がしっかりしている感があります。
ここで、ようやく結果が出始めます。
水につけたとき、216 あたり、外に出したとき、477 あたりになりました。
VCC:5V
GND:GND
IN:A0
に接続していました。VCCは5Vでも3.3Vでも変わりませんでした。
ということは、こちらの水分計を使えば、M5Atom Matrixでも動作するはずです。
ここで、少し補足いたします。今回はじめて、ArduinoIDEの機能「シリアルプロッタ」を使用しています。Serial.println(ml); の値をグラフにしてリアルタイムにプロットしてくれます。今回はこの機能に本当に助けられています。いままで、シリアルモニタのみでチェックしていましたので、それらしい数字が変わっているだけで、正常と判断していました。グラフ化して、数字がよく見えます。
1.水分計チェックのためのプログラムを作成し、M5Atom Matrixで試す。
M5Atom Matrixで再試験を行いました。
結果はこちら。
横軸の数値で水分計を移動させました。
0~100:外に出す、水につける
100~200:外に出す
200~300:水につける
300~400:外に出す
400~500:水につける
このような結果でした。
何となく状況は変わっているように見られますが、ノイズが多く、値の振れも大きくて、Arduino Uno との結果が異なります。
これは、SALZ3のソース内で、
//ピン配置
// ■3V3
//G21□ □G22
//G25□ ■G19:排水弁用サーボモータ
// 5V■ ■G23:給水モータ用リレースイッチ
//GND■ ■G33:水分計センサ
const uint8_t WL_PIN = 32; // (G33)水分計センサ
としているためです。五里霧中でネットで情報を求めているなか、「どうもG33のポートを使う場合、32を使うとうまくいった。」という情報があったため、これを拠り所に設定していました。
これを、33に戻してみるとどうだろう。と思い、
int ml = analogRead(33);
にして、再テストしました。
// WLTest 水分計テスト
#include <M5Atom.h>
void setup() {
M5.begin(true, false, true);
Serial.begin(115200);
}
void loop() {
int ml = analogRead(33);
// Serial.print("ML:");
Serial.println(ml);
delay(1000);
}
横軸の数値で水分計を移動させました。
0~100:外に出す
100~200:水につける
200~300:外に出す
300~400:水につける
400~500:外に出す
VCC:3.3V
GND:GND
IN:33
これでOK。
外に出すと、2655あたり、水につけると、1120あたりの数値になります。
analogRead()の戻り値は、Arduino Uno の場合、0-1023の範囲で、M5Atom Matrix の場合、0-4095で戻ってきます。
外に出すと、2655/4096=0.65、
水につけると、1120/4096=0.27となります。
Arduinoの場合は、
外に出すと、477/1024=0.47、
水につけると、216/1024=0.21となります。
ようやく、目的の機能を得ることができました。
昨日、壊れたと思った水分計を再度テストしてみると、正しく動作しています。
最初の値のふらつきを見て、壊れていると感じたのか。。。
正しく動いています。
データの読み取りを見誤ったかと思いながら、analogRead(33)で昨日の追試をしてみると、
こんな感じで、値がぐらつき始め、analogRead(32)に戻しても、正しく動かなくなりました。
その後、10分ぐらい時間を置いて試してみたところ、湿った時の値が微増するのが気になりますが、なんとか使えるレベルだと思っていましたら、400秒を過ぎたあたりから、挙動がおかしくなりました。
この気まぐれな水分計と、いい加減なテストのおかげで、ずいぶん苦労しました。
キットに付属の水分計の不具合はちょっと困りますが、単価240円のパーツです。今回は部品交換して先へ進みましょう。
これまでのぐだぐだ日誌に
お付き合い下さりありがとうございました。
おまけ〜SALZ2の松の様子
SALZ2は順調に稼働しています。
SALZ2の松はすくすく成長しております。
ザル作りとして多肥多水かと問われれば、厳しい所ですが、自動潅水装置としてはとても優秀です。
SALZ2のロードテストについてはまた取りまとめてご報告いたします。
#盆栽 #Bonsai #自動潅水装置 #電子工作 #SALZ #M5ATOM #M5Stack #Arduino #水分計 #analogRead