見出し画像

【SALZ製作日誌】2020.07.24 水分計との格闘の末。。。

こんなに事が長引くとは、想像だにしておりませんでした。
結論から先に申しあげますと、水分計の課題は解決しました。
長い長い格闘の末、正常に動作するようになりました。

うまくいかなかった原因は、水分計の故障とチェック方法の甘さです。
仕事でもそうですが、なかなか解決できない問題があるときは、決まって複数の不具合が絡み合っているものです。

前回までのテストで、水分計が正しく値を返さない問題がありました。
SALZ2では、水分計を軽く握るだけで値が変わり、動作チェックができていましたが、今回はどうも怪しいのです。数値はふらふら変動しています。しかし、水分量を示しているようには感じられません。

そこで、水分計のテストをきちんと行うことにしました。テストの計画は以下のとおりです。

1.水分計チェックのためのプログラムを作成し、M5Atom Matrixで試す。
2.M5Atom Liteで試す。
3.M5StickCで試す。
4.Arduino Unoで試す。
5.別の水分計を試す。

今回使う装置を並べてみました。

画像1

左上:M5Atom Matrix
右上:M5Atom Lite
左下:M5StickC
右下:Arduino Uno

画像2

上:新しい部品
下:今まで使用していた部品

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);
}

画像3

うーん。正常に動いているのかどうかもわからない値です。次のテストに移ります。

画像4

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

5.別の水分計を試す。

となると、水分計の故障を疑うべきでしょう。今後の横展開に備えて、水分計を多めに買っていました。

同じように見える水分計ですが、基板上のペイントや、基板のカットは交換品の方がしっかりしている感があります。
ここで、ようやく結果が出始めます。

画像6

水につけたとき、216 あたり、外に出したとき、477 あたりになりました。

VCC:5V
GND:GND
IN:A0

に接続していました。VCCは5Vでも3.3Vでも変わりませんでした。
ということは、こちらの水分計を使えば、M5Atom Matrixでも動作するはずです。

画像7

ここで、少し補足いたします。今回はじめて、ArduinoIDEの機能「シリアルプロッタ」を使用しています。Serial.println(ml); の値をグラフにしてリアルタイムにプロットしてくれます。今回はこの機能に本当に助けられています。いままで、シリアルモニタのみでチェックしていましたので、それらしい数字が変わっているだけで、正常と判断していました。グラフ化して、数字がよく見えます。

1.水分計チェックのためのプログラムを作成し、M5Atom Matrixで試す。

M5Atom Matrixで再試験を行いました。
結果はこちら。

画像8

横軸の数値で水分計を移動させました。
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);
}

画像9

横軸の数値で水分計を移動させました。
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となります。

ようやく、目的の機能を得ることができました。

昨日、壊れたと思った水分計を再度テストしてみると、正しく動作しています。

画像10

画像11

最初の値のふらつきを見て、壊れていると感じたのか。。。

画像12

正しく動いています。
データの読み取りを見誤ったかと思いながら、analogRead(33)で昨日の追試をしてみると、

画像13

こんな感じで、値がぐらつき始め、analogRead(32)に戻しても、正しく動かなくなりました。

画像14

その後、10分ぐらい時間を置いて試してみたところ、湿った時の値が微増するのが気になりますが、なんとか使えるレベルだと思っていましたら、400秒を過ぎたあたりから、挙動がおかしくなりました。

この気まぐれな水分計と、いい加減なテストのおかげで、ずいぶん苦労しました。
キットに付属の水分計の不具合はちょっと困りますが、単価240円のパーツです。今回は部品交換して先へ進みましょう。

これまでのぐだぐだ日誌に
お付き合い下さりありがとうございました。

おまけ〜SALZ2の松の様子

SALZ2は順調に稼働しています。
SALZ2の松はすくすく成長しております。
ザル作りとして多肥多水かと問われれば、厳しい所ですが、自動潅水装置としてはとても優秀です。

画像15

SALZ2のロードテストについてはまた取りまとめてご報告いたします。

#盆栽 #Bonsai #自動潅水装置 #電子工作 #SALZ #M5ATOM #M5Stack #Arduino #水分計 #analogRead


この記事が気に入ったらサポートをしてみませんか?