工作と競馬2

電子工作、プログラミング、木工といった工作の記録記事、競馬に関する考察記事を掲載するブログ

自動水やり器で使っている土壌水分センサの温度依存性について調べる

概要

土壌水分センサの温度依存性について調べた。



背景と目的

以前作成した自動水やり器の水やりの回数が、ここ最近やけに多くなっている。季節柄、空気も乾燥しているし、植物自体もそれなりに成長しているのでそんなものかなとも思ったのだが、よく見ると、鉢の土は十分湿っているし、鉢の受け皿に水がたまっていて、あきらかに水やりし過ぎある。そこで、この誤動作の原因を探り、対策をしたい。



詳細

1. 水やりが多すぎる原因を推測

土壌水分センサは、スイッチサイエンスで買った以下のもの。DFRobot社Gravityシリーズ。

https://www.switch-science.com/catalog/4024/

水やりをするかどうかは、鉢の土に挿している土壌水分センサから読み取った値だけで判断しているので、土壌水分センサの値がおかしいといえる。いろいろ観察した結果、どうも土壌水分センサのセンサ回路部(写真参照。ここは防水加工されていないので、使用中は水道工事用の自己融着テープを巻いている)に、陽が当たっていて、温度が高くなっていることが原因のように思えてきた。過剰な水やりが発生しやすいのは、よく晴れた日の昼間で、土は湿っているにもかかわらず明らかに計測値が高め=乾燥寄りになっているからだ。

f:id:dekuo-03:20210505150102j:plain


2. 温度を上げる実験

土壌水分センサの温度依存性が疑われるので、実際に温度を上げてセンサ計測値が変化するか確認した。方法は、厳密ではないものの簡易的に

  • 回路部分の近くに、温度センサを張り付けておく
  • センサの回路部分にはんだごてを近づけ、センサ計測値と温度を同時に測定する
  • 約25度→35度の範囲

とした。結果として、

  • 約10℃の上昇に対して、40mV程度のセンサ計測値上昇(約25度のとき、センサ読み取り値は約2.74V、上昇後2.78V)

が見られた。計測値は上昇=乾燥側に変化していて、回路部分に直接陽が当たって乾燥気味の値が出ることと合致する。


3. 回路について考察

この土壌水分センサの回路はどうなっているのかというと、こちらの回路図にあるように、555タイマーICを使った矩形波発振回路の出力を、RCローパスフィルタで鈍らせ、さらに整流・平滑回路でDCに変換して出力しているらしい。センシングは、センサ感応部周辺の水分量によってキャパシタンスが変化して矩形波の鈍り具合が変化し、結果として平滑後のDCレベルが変化する、といった動きを利用しているようだ。

この回路で温度変化がDCレベルに影響を与えそうな要素を考えると、

  • 整流・平滑回路部D1の順方向電圧、R1の抵抗値、C3の容量
  • RCローパスフィルタ部R2の抵抗値

が考えられる。

  • D1は、リンク先の回路図の品種が使われているとすると、約25度→35度あたりでは10℃上昇で約15mVの順方向電圧減少、すなわち平滑回路出力としては上昇する。しかし、40mVをすべて賄うほどではない。
  • R1は、正の温度係数を持つはずで、一般的な100ppm/℃程度とすると10℃で0.1%上昇。C3は、品種不明だがF特性のチップ積層セラミックコンデンサと仮定すると、約25度→35度あたりでは容量が最大10%程度減少しそう。
  • R2もR1と同様の温度依存があり、矩形波がより鈍りDCレベルは下がる方向。

LTSpiceで簡単にシミュレーションしてみる限り、C3の変化の影響が大きく、最大で5-10mV程度の上昇がありそう。先述のダイオードのVFの変化を含めても40mVの変化を引き起こすほどではないが、温度変化に対して正の依存があり、その大きさの見当もついた。


対策

回路部分の温度に応じて補償できれば一番いい。しかし、今のシステム構成では温度センサは自動水やり器本体回路を収納する筐体内にしかない。土壌水分センサ直近に温度センサを張り付けるとなると改造規模が大きくなってしまうので、現実的なところでは、

  • (1)回路部分に陽が当たらないようにする
  • (2)筐体内に温度を参考に、センサ計測値に温度補償分を加える

であり、(1)をひとまずやろうと思う。とはいえ、これから夏場を迎えてさらに温度が高くなる状況では、さらに大きな影響が出ると思われるので、(2)の対策も入れたい。



まとめと今後の課題

土壌水分センサの温度依存性について調べた。ひとまず、できる範囲の対策を施して様子を見て、本格的に暑くなる前に温度補償を入れたいと思う。


水田の水位をリモートで監視するシステムを作る(12) ソーラー発電対応(3)

概要

ソーラー発電対応したリモート水位センサシステムの動作テスト結果をまとめた。



背景と目的

前回作製したソーラー発電対応したリモート水位センサシステムに対して、約1か月間の動作テストを実施した。そこで、動作テスト結果をまとめ、実用課題があれば、対処する。



詳細

1. テスト環境

  • テスト期間: 2021/4/11~2021/5/4
  • 設置位置: ベランダ(田植え前なので)
  • 4時間に1回水位データを送信

f:id:dekuo-03:20210504142800j:plain


2. 降雨等に対する耐性

まず、最初に気になっていたのはソーラーパネル部の降雨に対する耐性。テスト期間中の降雨は6日間だった。そのうち、数回は雷を伴う激しい夕立のような雨ではあったが、内部に雨が入り込んだりすることもなく、問題なかったようだ。事前に水没させて水が浸入しないことは確認済みではあったが、実際に屋外で確認できてよかった。 ただ、ソーラーモジュールを挟みこんでいるアクリルとソーラーモジュールとの間に結露が発生した。(写真は撮り忘れた)今回の期間だけでは、影響はなかったが長い期間だと故障につながるかもしれない。ソーラーモジュールの裏側からケーブルを引き出していて、アクリルとソーラーパネルの間にわずかな隙間ができているせいなのかもしれない。


3. 電池電圧の水位

以下が、電池電圧の推移。使い初めに大きな電圧低下がみられた後、3.7~3.8Vあたりまで回復して、それ以降は夜間に電圧が下がり、昼間に充電して電圧が回復するというサイクルを順調に繰り返しており、数日間の雨があったもののトータルとしては電圧をちゃんと維持できている。 しかも、昨年までの6時間に1回という計測頻度よりも少し多めの4時間に1回としながらも、十分に動作可能な発電量が得られているので、水位の変化を素早く通知できるようになる。

f:id:dekuo-03:20210504141602p:plain


4. 実用課題の整理

ここまでのテストでは、実用課題といえるのは結露の問題。ただ、田植えも数日後に迫っており、あまり構成を変えたくないので、アクリル板を抑えるネジの増し締めをするのみとして、今シーズンは実戦投入したい。



まとめと今後の課題

ソーラー発電対応したリモート水位センサシステムの動作テストが完了し、今シーズンの設置に向けて準備が整った。リモート水位センサシステムを初稼働させた2年前のシーズンの時からソーラー発電の実験を進めてきて、昨年は残念ながら検討不足により実用にこぎつけられなかったが、今年はようやく実用にたどり着けて非常にうれしい。


蛇口の水漏れ修理

概要

風呂の蛇口の水漏れを修理した。



背景と目的

最近、風呂の蛇口の水漏れがひどい。具体的には、ハンドルを締め切っても、シャワーからお湯が漏れてしまう。どうやら、お湯側のハンドル周辺のパッキンが消耗したように思える。そこで、修理してみようと思う。

使用している蛇口の参考写真



詳細

1. 調査

蛇口の修理をしたことがないので、ひとまずWeb上で情報を漁った。 まず、以下のサイトで、蛇口の一般的な修理方法について確認。

www.mizu-rescue.com

蛇口の型番が分かれば、交換部品の型番も追っていけるらしいので、蛇口を調べたところ、

だった。では、この蛇口の修理方法はというと

jagutibuhin.com

に書いてあった。どうやら、今回の症状では、交換部品はどれかというと、

https://www.amazon.co.jp/dp/B007HT7YPQ?tag=jgths-22&linkCode=ogi&th=1&psc=1www.amazon.co.jp

というコマだ。ということで、これを買う。


2. 交換作業

www.com-et.com

まず、自宅の水道の元栓を閉め、水が出なくなったことを確認する。 そして、手順通り蛇口をばらす。

先端のキャップを外す。 f:id:dekuo-03:20210502104942j:plain

ネジを緩めてハンドルを取る。 f:id:dekuo-03:20210502104950j:plain

f:id:dekuo-03:20210502104959j:plain

見えてきたコマをピンセットつまみ出す。 f:id:dekuo-03:20210502105008j:plain

新しいものと交換したのだが、古いコマがどうなっているかというと、黒いゴム部分=パッキンが溝状にへこんでしまっていた。これではいくら閉めても漏れてしまうわけだ。そして、きつく閉めれば閉めるほどどんどん状態が悪化するだろう。

f:id:dekuo-03:20210502105657j:plain

最後に、新しいコマを入れて元通り組み直す。


3. 動作確認

動作を確認したところ、以前より緩く閉めてもちゃんと水が止まった。というわけで、作業完了。これで、やっと家族から水漏れについて文句を言われなくて済む。



まとめと今後の課題

風呂の蛇口の水漏れを修理できた。大して難しい作業でもないので、もしまた同じようなトラブルがあれば自分で直そうと思う。


ESP32-WROVER-B/E(モジュール単体)へのプログラム書き込み失敗に対処する

概要

ESP32-WROVER-B/Eへのプログラム書き込みがうまくいかなかったため、原因を見つけて対処した。



背景と目的

以前、ESP32-WROVER-Eの開発ボードを使ってカメラを動かすことができた。そこで、次はESP32-WROVERの単体を使ってカメラを動かす回路を作ろうとしていたのだが、いつも通りプログラム書き込み用のシリアル通信ラインを接続して書き込もうとしたところ、うまくいかなかった。そこで、原因を探り書き込めるように対処する。



詳細

1. 環境/使用アイテム


2. 状況整理

まず、書き込みに関与するEN端子、IO0端子については、ダウンロードモード(ESP-WROVERの仕様書でいうところのBooting Mode=Download Boot)に入れるように正しく配線されている。シリアルについては、今までESP-WROOM-32のモジュール単体でうまくいっていた方法と同様、USBシリアル変換アダプターの端子と直結している。

この状態で、書き込みを行おうとするとArduino IDE上では以下のような表示になって書き込みができない。つまり、シリアルがうまく通信できていないらしい。

esptool.py v3.0-dev
Serial port COM5
Connecting........_____....._____....._____....._____....._____....._____....._____

A fatal error occurred: Failed to connect to ESP32: Invalid head of packet (0x00)
A fatal error occurred: Failed to connect to ESP32: Invalid head of packet (0x00)


3. 対処方法(いきなり結論)

ESP32-WROVER-B/EのTXD0端子に3.3Vラインへのプルアップ抵抗1kΩをつける

ことで、書き込みがうまくいく。


4. 調査メモ

3.1 調査

  • ESP32-WROVER-E開発ボード
  • ESP-WROOM-32モジュール
  • ESP32-WROVER-B/Eモジュール単体

の間で、シリアル通信ライン上の信号に違いがないかオシロスコープで、TXD0、RXD0端子を観測した。(ESP32-WROVER-Eについても調べたが、Bと同様だったのでBのみ載せる)

  • 赤: TXD0端子
  • 青: RXD0端子
  • TXD0がLOWに落ちたところでキャプチャ(t=0)

3.2.1 ESP32-WROVER-E開発ボード

TXD0、RXD0とも通常3.3Vで、書き込み中に信号に応じてLOWに落ちる動き。

f:id:dekuo-03:20210418144945p:plain

3.2.2 ESP-WROOM-32モジュール単体

手持ちのESP-WROOM-32モジュール単体でも、ESP32-WROVER-E開発ボードと同様。(書き込んだプログラムが異なるので波形は違う)

f:id:dekuo-03:20210418144954p:plain

3.2.3 ESP32-WROVER-Bモジュール単体

TXD0の電圧が1.2V程度となっており、明らかに低い。(※トリガレベルより低くて引っかからないので波形が描けていない)ここで、

  • TXD0はUSBシリアル変換アダプターのRX端子を繋がなければ、HIGH。内部でプルアップされている様子。
  • TXD0の接続相手であるUSBシリアル変換アダプターのRX端子は、TXD0を繋がない状態ではLOW。

だから、TXD0がUSBシリアルのRX端子を引っ張り上げ切れていないようだ。

f:id:dekuo-03:20210418145728p:plain

3.2 TXD0を無理やりプルアップしてみる

TXD0と3.3Vとの間に、1kΩのプルアップ抵抗を入れてみたところ、完全にHIGHになり切れていないが、電圧は少し上がった。この状態で、書き込みをやってみたところ、うまくいった。また、書き込んだプログラムのシリアル出力は、ArduinoIDEのシリアルモニターで見ることができるので通信はできてはいる。つまり、抵抗の付加は効果があったといえる。 とはいうものの、RXのラインがHIGH/LOWでしっかり振れているとは全く言えない状態なので、この方法だと不安ではある。他に方法がないか、後々探ってみたい。

f:id:dekuo-03:20210418150151p:plain

なお、さらに低抵抗(200Ωくらい)を入れてはみたが、電圧としてはあまり変わらないので1kΩでよさそう。



まとめと今後の課題

ESP32-WROVER-B/E(モジュール単体)へのプログラム書き込み失敗に対処し、書き込みできるようになった。ただ、波形が開発ボードとは明らかに違うので、本当はもっと違うやり方があると思う。


Pythonのjsonschemaを試しに使う

Pythonのjsonschemaパッケージを使ってみた。


環境


インストール

pip install jsonschema


試用

汎用的に使える基底クラスを作ってみた。

import json
import jsonschema
import typing

class DefinedJson:

    _SCHEMA = {}

    def __init__(self):
        self._schema = self._SCHEMA

    @property
    def schema(self):
        return self._schema

    @schema.setter
    def schema(self, x: dict):
        self._schema = x

    def read_schema(self, filepath: str):
        """
        filepath: スキーマ定義ファイルパス
        """
        try:
            with open(filepath) as fo:
                self.schema = json.loads(fo)
            return True
        except:
            return False

    def validate(self, data: dict, on_invalid: (callable, typing.Any)=None):
        """
        Parameters
        --------------
        data: 検査対象
        on_invalid: 不正の場合のユーザー定義処理(func(message: str, args: any), args)
            message: エラーメッセージ
            args: ユーザー引数

        Returns
        --------------
        tf: boolean
            成否
        """
        try:
            jsonschema.validate(data, self._schema)
            return True
        except jsonschema.ValidationError as e:
            if on_invalid is not None:
                on_invalid[0](e.message, on_invalid[1])
            return False

スクリプト

サンプルのクラスを作成して、呼び出してみた。

class Sample(DefinedJson):

    _SCHEMA = {
        "required": [
            "name",
            "age"
        ],
        "type": "object",
        "properties": {
            "name": {
                "type": "string"
            },
            "age": {
                "type": "integer",
                "minimum": 0,
                "maximum": 100
                
            },
            "weight": {
                "type": "number",
                "minimum": 0
            },
            "height": {
                "type": "number",
                "minimum": 0
            },
            "country": {
                "type": "string",
                "enum": ["Japan", "America", "Others"]
            }
        }
    }

    def __init__(self):
        super().__init__()


if __name__ == "__main__":

    dj = Sample()

    data = {
        "name": "test",
        "age": 8,
        "weight": 6.7,
        "country": "China"
    }

    def on_invalid(msg, args):
        print("on_invalid", msg, args)

    print(dj.validate(data, (on_invalid, None)))

実行結果は以下。エラーを検出できている。

on_invalid 'China' is not one of ['Japan', 'America', 'Others'] None
False



まとめ

JSONスキーマの仕様を全部把握できていないが、とりあえずすぐに使う必要がありそうなものは試せた。


水田の水位をリモートで監視するシステムを作る(11) ソーラー発電対応(2)

概要

ソーラーパネルと充電回路、リチウムイオン電池をシステムに組み込み、動くことを確認した。



背景と目的

前回、ソーラーモジュールを防水施工したパネルを作成したので、今回はパネルをシステムに組み込む。



詳細

1. 構想

現行のリモート水位センサシステムに対して、

  • 乾電池を、リチウムイオン電池と充電回路に変更する
  • ソーラーモジュールの出力を充電回路に接続する
  • ソーラーモジュールは、本体を支持するフレームに取り付ける

としたい。

f:id:dekuo-03:20210404003129j:plain


2. フレームへの固定

2.1 固定金具の作成

固定にあたり、ホームセンターで売っていた金折れとアングルを使用して、以下のような金具を作成した。屋外で使用するので、耐食性を考慮してステンレス製にしたいが、高かったのでメッキ処理されたものを選んだ。

f:id:dekuo-03:20210404003456j:plain

2.2 固定

まず、フレーム上部の塩ビ管にネジ穴を空け、金具をタッピングネジで固定。

f:id:dekuo-03:20210404003429j:plain

ソーラーパネルをつけて完了。

f:id:dekuo-03:20210404003440j:plain


3. リチウムイオン電池と充電回路

3.1 充電回路の作成

以前作成したものと全く同じ材料を使って作る。

f:id:dekuo-03:20210411125527p:plain ※2021/04/11 間違いがあったので差し替えた

今回は、基板に電池も一緒に取り付けた。

f:id:dekuo-03:20210404002449j:plain

3.2 筐体への取り付け

現状は、電池ボックスが取り付けられている。

dekuo-03.hatenablog.jp

この電池ボックスを取り払って、作成した充電回路を取り付ける。これで、システムへの組み込みは完成。

f:id:dekuo-03:20210404002105j:plain


4. 動作テスト

ひとまず、充電できること、水位センサシステムが動作することを確認できた。田植えまで、約1か月あるので、屋外でしばらくテストを継続したいと思う。



まとめと今後の課題

リモート水位センサシステムのソーラー発電対応ができつつある。5月の現場導入に向けて、動作テストを進めたい。


水田の水位をリモートで監視するシステムを作る(10) ソーラー発電対応(1)

概要

リモート水位センサシステムをソーラー発電対応させるため、ソーラーモジュールの調達と防水加工を行った。



背景と目的

一昨年にから稼働しているリモート水位センサシステムの電源は、今まで電池を使用してきたのだが、いつかソーラー発電を導入したいと考えていた。今年は3シーズン目で、いよいよソーラー発電を導入するための作業時間が確保できたので、取り組むことにした。



詳細

1. 構想と設計

まず、屋外使用可能で、価格、発電容量の条件に見合うソーラーパネルを探したのだが、なかなか見つからなかった。結局、以下のソーラーモジュールを選定し、自前で防水加工をすることにした。

akizukidenshi.com

具体的には、以下のように、ソーラーモジュールの周りに防水用スポンジ(エプトシーラー)を配して、アクリル板で両面から挟み込む構造にした。耐候性に優れ、透明性も高い素材としてアクリルやポリカーボネートがあるが、今回は、たまたま入手しやすかったのでアクリルにした。 周囲の8個のネジで締め上げてエプトシーラーが圧縮されるようにする。配線は、ソーラーモジュールの背面の電極から、横に出す形。なので、あまり厚みが出ないように注意深くはんだ付けが必要。

f:id:dekuo-03:20210321112533p:plain


2. 材料調達

  • アクリル板

一部をカットして使う。

https://www.amazon.co.jp/gp/product/B00E84KFIQ/ref=ppx_yo_dt_b_asin_title_o00_s00?ie=UTF8&psc=1

  • エプトシーラー

https://www.amazon.co.jp/gp/product/B0795CJFBT/ref=ppx_yo_dt_b_asin_title_o00_s00?ie=UTF8&psc=1


3. 組み立て

2.1 配線

ソーラーモジュールの裏面は、こんな感じ。

f:id:dekuo-03:20210321122044j:plain

はんだ付けして、テープで押さえる。

f:id:dekuo-03:20210321122100j:plain

2.2 アクリル板切り出し

所定の寸法にカットし、周囲に穴あけ。

f:id:dekuo-03:20210328233039j:plain

2.3 ソーラーモジュール挟み込み

ソーラーモジュールを挟みこんで、ネジで締め上げる。といってもあまりに締めすぎるのは負担がかかるのでほどほどに。

f:id:dekuo-03:20210328233054j:plain

これで、外観は完成。


3. テスト

2.3に先立って、ソーラーモジュールを挟む前に、エプトシーラーで囲まれた領域に水が入らないか、テストした。ネジの締め付けは、ソーラーモジュール厚み程度にエプトシーラーが圧縮される強さにした。 方法は、約5cm程度の深さの水に、パネルを沈め、1時間ほど放置。

f:id:dekuo-03:20210328233047j:plain

結果、水の侵入がないことを確認できた。したがって、設計した構造で防水は問題なさそう。(日光による劣化の評価は時間がかかるのでまたあとで)



まとめと今後の課題

ソーラーモジュールの防水加工ができた。次回は、システムに組み込む。