工作と競馬2

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

リモート水位センサシステム ver4(4) --- 水温センサの追加 ---

概要

水温センサを追加し、動作テストを行った。



背景と目的

以前、センサ部の製作を行った際、スペースの余裕があることに気づき水温センサをつけられるのでは?と思い、案を温めてきた。そこで、今回水温センサを追加してみたい。



詳細

1. 構想

センサ部の製作を行った時の画像だが、最低水位のセンサの横か裏あたりに、水位センサをつけたい。また、水位が低い時にもセンサが水に浸かるようにできるだけ低い位置に配置したい。

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


2. 使用センサ

以下の防水型の温度センサである。

www.amazon.co.jp

2年半くらい前に、いつか防水のセンサを使うことがあるかもと思って買っておき、過去、リモート水位センサ筐体内温度上昇を抑えるための検討で使用したのだが、ついにレギュラー稼働の時が来た。


3. センサ実装

センサ部の最も低い位置にできるだけ近くなるように装着した。この水温センサとの干渉を避けるため、最低水位の水位センサを背面から少し離して前面寄りに配置しなおした。

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


4. メイン基板修正

関連部分だけ抜粋すると、以下。

  • ESP32 f:id:dekuo-03:20220417213036p:plain

  • 水温センサ部 f:id:dekuo-03:20220417213040p:plain


5. ソフトウェア修正

センサの中身の素子はDS18B20なので、1-wireインターフェースで取得すればよく、arduinoの場合

  • DS18B20_RT
  • OneWire

の2つのライブラリを使用することで、簡単に扱うことができる。関連のある部分だけ抜粋すると、以下のような感じ。

#include <OneWire.h>
#include <DS18B20.h>

:

static const int PIN_DS18B20 = 21; // 信号線接続

:

// OneWireの設定
OneWire oneWire1(PIN_DS18B20);

// 水温センサ
DS18B20 water_temp_sensor(&oneWire1);

:

// 水温センサの初期化
water_temp_sensor.begin();
water_temp_sensor.setResolution(12);
water_temp_sensor.requestTemperatures();

:

// 計測して℃の値をもらう
sensor.requestTemperatures();
while (!sensor.isConversionComplete()) {
  delay(10);
}
float temp = sensor.getTempC();


5. 動作確認

温度測定&送信し、無事SORACOMのサーバへデータが到達したことを確認。これで、2022年版の作成作業は完了。



まとめと今後の課題

水温センサを追加できた。田植えまで動作テストを2-3週間くらいやって、実稼働に臨む。


芽ねぎの水耕栽培(1) --- 種まき ---

概要

芽ねぎの種まきを行った。



背景と目的

水耕栽培の成長記録システムの製作が大体終わったので、いよいよ栽培を始める。



詳細

0. 参考

chomily.com


1. 材料の調達

材料は、以下の通り。

  • リビングファーム 水耕栽培用 ウレタン培地 (25ミリ角) 50個 【1シート入り】

Amazon.co.jp: リビングファーム 水耕栽培用 ウレタン培地 (25ミリ角) 50個 【1シート入り】 : DIY・工具・ガーデン

  • 培地ケース

ウレタン培地と水を入れるケース。100均の透明なポリスチレン製小物ケースを利用。

  • タキイ種苗 芽ネギかおり芽ねぎ 野菜種秋まき春まき/1dl

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

  • 洗濯ネット

参考サイトでは、黒皮が残るのを防ぐためのメッシュとして、ステンレスの網を使っていたがなかなか高いので100均の洗濯ネットで代用。

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


2. 種まき

2.1 培地

培地ケースに入るサイズでカット。あらかじめ切れ込みがあるので非常にやりやすい。

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

2.2 種まき

まず、培地に水を含ませる。そして、スポンジにあるH型の切れ込みにたくさん種を蒔く。参考サイトにもあるが、先に種を蒔こうとすると種が飛び散りやすいから水を先に含ませることが重要。

これは、結構地道な作業で疲れる。種は飛び散りやすくめちゃくちゃ無駄になる。ただ、それ以上にたくさんあるので大した問題ではなかった。

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

2.3 メッシュをかぶせる

浮いてしまうと黒皮が先端につくのを防ぐ効果がなくなると言っていたが、洗濯ネットではどうしても浮いてしまう。やはり、参考サイトにあるとおり、ステンレスの網など、ある程度剛性のあるものが良いと思う。

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


2.4 水やり

トレーの半分くらいまで水を入れてみた。スポンジが水に浮き気味だが、ちゃんと水がしみ込めば大丈夫そう。


3. 見守る

発芽まで数日かかる模様なので、適宜水やりをしながら、成長記録システムで監視していく。


まとめと今後の課題

種まきができた。水やりしながら発芽を待つ。


水耕栽培の成長記録システム(3) --- ソフトウェア実装 ---

概要

前回に引き続き、写真データをクラウドに送信して保存するためのソフトウェアを構築する。



背景と目的

前回、ハードウェアの構築ができた。今回は、Unit-CAMのソフトウェアとクラウド側で写真データ受け取り部分を実装する。



詳細

重要部分のみ記載する。

1. 撮影装置

dekuo-03.hatenablog.jp

Unit-CAMで撮影するための基本的なソフトウェアは、arduino-esp32のWiFiCameraServerを基にした上記記事で実験済みなので、これを基本として構築する。

1.1 撮像部

撮像部については、上記記事のピン配置等も同様。カメラの細かい設定は以下とし、それ以外はarduino-esp32WiFiCameraServerのデフォルトとした。SVGA(800*600)は決して解像度が高いとは言えないのだが、PSRAMが載っていないため仕方ないのと今回の用途としては十分なのでとりあえず問題ではない。

  config.pixel_format = PIXFORMAT_JPEG;
  config.frame_size = FRAMESIZE_SVGA;
  config.jpeg_quality = 10;
  config.fb_count = 1;

1.2 送信部

今回は、ESP32側のメモリ使用量が少なくて済むようにjpgバイナリをそのまま送信したい。送信側ではContent-Typeヘッダにapplication/octet-streamを設定して送信する。 また、ESP32の送信用バッファのサイズの制約か、WiFiClientSecureオブジェクトのwriteメソッドで一度に大きなデータを書いてしまうとうまく動かないので、1kbyteに分割して書き込むという工夫をしている。

#include <WiFiClientSecure.h> // Wi-Fiに接続して、HTTPS通信するためのライブラリ

const int TIMEOUT_IN_MSEC = 5000; // タイムアウト[msec]

// POSTリクエストを送信する
// respBody: レスポンス文字列
// respBodyLen: 配列大きさ
void post_request(const char* host, const char* path, const uint8_t* payload, size_t payload_len, const char* machineId, char* respBody, unsigned long respBodyLen) {

  // PSRAM用??
  char * ptr = (char *) malloc(sizeof(WiFiClientSecure));
  WiFiClientSecure* client = new (ptr) WiFiClientSecure;

  // v1.0.6
  client->setInsecure();
  
  if (!client->connect(host, 443)) { // 接続にトライ
    // 接続失敗
    client->stop();
    return;
  } else {
    // 接続成功
    size_t contentLength = payload_len; //strlen(payload);

    // ヘッダ
    client->printf("POST %s HTTP/1.1\n", path); // POSTメソッド
    client->printf("Host: %s\n", host); // HTTP1.1で必須のヘッダ, アクセス先サーバーとしておく(そうしないとクロスドメインアクセスになる)
    client->println("Connection: close");
    client->println("Content-Type: application/octet-stream");
    client->printf("Content-Length: %d\n", contentLength);
    client->println(); // ヘッダの最後は空行
    
    // ボディ
    // 一度に大きなデータをprintfしたりwriteするとうまくいかない
    // mバイトに分割してwriteする
    int m = 1024;
    int i, j = 0;
    uint8_t * p = (uint8_t *) malloc(m);
    while (true) {
      for (i = 0; i < m; i++) {
        p[i] = payload[i + j * m];
        if (i + j * m == contentLength - 1) break;
      }
      client->write(p, m);
      client->flush();
      if (i + j * m == contentLength - 1) break;
      j++;
    }
    client->println(); // 空行を最後に

    // レスポンス待ち
    Serial.printf("Waiting for reponse...");
    unsigned long curtime = millis();
    while (client->available() == 0) {
      if (millis() - curtime > TIMEOUT_IN_MSEC) {
        // タイムアウトのときは終了
        client->stop();
        return;
      }
    }

    // レスポンス受信
    unsigned long ci = 0;
    bool started = false;
    while (client->available()) {
      char c = client->read();
      if (c == '{') started = true;
      if (!started) continue;
      respBody[ci] = c;
      ci++;
      if (ci == respBodyLen) break;
    }
    respBody[ci] = '\0';
    
    // 接続終了
    client->stop();
  }

}


2. クラウド

AWS

  • APIGateway
  • Lambda
  • S3

を組み合わせる。

2.1 APIGateway

APIGatewayを介してLambdaがjpgバイナリを受け取るには、APIGateway側の設定において

  • APIの設定でバイナリメディアタイプとして受け取るContent-Typeを設定
  • マッピングテンプレートでbase64エンコードされた文字列がLambdaに引き渡されるようにとして受け取るように設定

が必要。具体的には、APIの設定は

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

となる。また、マッピングテンプレートでは、$input.bodyという変数にbase64エンコードされた画像データが格納されているので、テンプレートが定義されていないときのテンプレートを基に、body-json内にキー(ここでは、imgDataというもの)を定義し、$input.bodyを入れた。

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

2.2 Lambda

受け取ったbase64文字列をバイナリに戻す。あとは適宜S3等に書き込めばよい。

import base64
import boto3

s3 = boto3.client("s3")

# バイナリに戻す
img_binary = base64.b64decode(event["body-json"]["imgData"])

# バイナリをBodyに入れる
s3.put_object(
    Bucket=バケット名,
    Key=保存先,
    Body=img_binary
)


3. 動作確認

動かしてみたところ、無事クラウド側に保存できた。


まとめと今後の課題

写真を撮って、クラウドに保存する仕組みが構築できた。いよいよ芽ねぎの栽培を始める。


リモート水位センサシステム ver4(3) --- メイン基板のバージョンアップ ---

概要

前回に続き、メイン基板のバージョンアップを行った。



背景と目的

前回、センサ部の製作を行った。今回は、もう一方のバージョンアップ内容であるメイン基板の製作を行う。



詳細

1. 回路

バージョンアップといっても、あくまで実験用にあれこれいじって汚くなった基板を新しくするのが目的なので、回路の基本構成は特に変更点がない。KiCadのバージョンアップによって日本語が使えるようになったので日本語でメモを入れた。また、書き込み失敗対策用プルアップ抵抗をTXD0につけているが、本当は要らないような気がする。。。それと、この回路ではUnaSheildのスリープを電源を遮断する(Q1のON/OFF)ことで強引に行っているのだが、今のUnaSheildのライブラリではソフトウェア的に行えそうな気がするので(試していないが2019年に作ったときから明らかに内容が変わっているので)、本当はここも見直すべきだった気がする。が、ソーラー発電にしたらあまり電力消費の問題がなくなってしまったので、まあいいかという感じ。

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


2. 実装

現行のものは、ESP32が載ったメイン基板とUnaShield基板との間をケーブルで配線していた。今回は、回路構成も固まっていて実験することもないので、基板同士をきっちりスタックできる構造にした。また、端子はXHコネクタとし挿す方向を間違えないで済むようにした。また、上記回路図のJ4、J6にはピンヘッダとジャンパを使う予定ではあったが、手元のあまりがたくさんあったので使いやすいようにタクトスイッチにしている。

↓メイン基板単体 f:id:dekuo-03:20220313210314j:plain

↓UnaSheildをスタックしたとき f:id:dekuo-03:20220313210319j:plain


3. 動作確認

ソフトウェアも、基本的に回路構成が同じなので変える部分はない。ESP32にソフトウェアを書き込み、動作確認を実施。正しくデータが送信されたのを確認できた。 あとは、ケースに収めてソーラー充電基板部と接続してテストを行えばよいのだが、昨年の実績もあるし、5月初旬の田植えまでは少し日数があるので、4月半ばころに始めるのでも十分だろう。



まとめと今後の課題

メイン基板のバージョンアップができた。次回は、4月中旬頃にケースに収めて2週間ほどテストを行いたい。


リモート水位センサシステム ver4(2) --- センサ部の製作 ---

概要

前回に続き、センサ部の製作を行った。



背景と目的

前回、構想検討とセンサ部の構想を固めたため、製作を行う。



詳細

1. 材料調達

材料は、100均で見つけたポリプロピレン製の手ごろなサイズのケースと従来と全く同じ洗濯ネット。

また、固定用の金折れなどは近場のホームセンターで調達。

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


2. 加工

加工は主に、ケースへのネジ穴をあける作業。以下のように、穴を開けた。ポリプロピレンは非常に簡単に加工できてよい。

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


3. 組み立て

金折れで、水位センサをケースに固定したのが以下。また、本体を支える足であるPVCパイプにもつけてみた。まずまず、構想通りの形になったといえる。

※この写真ではケース底面の切り欠きの加工をしていない f:id:dekuo-03:20220306233509j:plain

なお、これをやりながら少し思ったのだが、水温センサを仕込む余裕がありそうなので、設置までに時間があったらそれも仕込んでみようかと思っている。



まとめと今後の課題

センサ部の製作が完了した。次回は、基板のバージョンアップに着手する。


リモート水位センサシステム ver4(1) --- 課題整理、センサ部構想検討 ---

概要

リモート水位センサシステムの2022年版構想についてまとめ、センサ部の設計を行った。



背景と目的

昨年、リモート水位センサシステムのバージョンアップを行い、ソーラー発電対応がうまくいった。今年も、バージョンアップを行いたい。本記事では、今年のバージョンアップ内容について整理する。



詳細

1. 課題整理

ここまでの稼働状況を鑑みて、課題と考えていることは以下。

  • 水位センサ部の構造と傷み
  • 基板周りが少し傷んできた

1.1 水位センサ部の構造

現行の水位センサ部は、通信基板を格納する本体とは別で、プラスチック製のモールにセンサを取り付け、鉢底ネットと洗濯ネットで囲いを作ってごみの侵入を防ぐ構造。別体とした理由は、取付位置を選びやすくするためだったが、田んぼに設置する際は、本体と別に取り付け作業が必要で、取り付け深さの調整機構をあまり考えていないので、都度現物合わせで調整が必要だった。

しかし、3年間の実績から、本体部の足元についていても問題ないこと、一緒のほうが当然設置が楽ということがわかった。

囲いを構成する鉢底ネットは、安さと手軽に手に入ることで選んだが、囲いを構成するほどの剛性があるものではないのでヤワな作りで少し不安だ。

そこで、今年はこのセンサ部をバージョンアップし、

  • 本体の足に取り付け可能で高さ調整もしやすい ‐ 囲いの強度も確保

を達成したいと考えている。

f:id:dekuo-03:20220306163746j:plain f:id:dekuo-03:20220306163751j:plain f:id:dekuo-03:20220306163754j:plain

1.2 基板周りが少し傷んできた

基板は、3年間同じものを使用してきたのだが、昨年本体の筐体内温度上昇を抑えるつもりで少し通気用の穴を確保したせいで、やはり多少のほこりや小さな虫がついたりして、あまりきれいな状態ではなくなった。また、もともと初めてver1を作ったときに実験的に部品をつけたり外したりした部分もあって、信頼性の面でも少し不安だ。

そこで、今年は基板自体を作り変えたい。

↓これはまだきれいな状態2021年の状態(参考) f:id:dekuo-03:20220306165023j:plain


2. センサ部の構想検討、設計

センサ部は、以下のイメージで作ることとした。従来の鉢底ネットによるカバーの代わりに、細長いケースを使用し、内側の側面にフロートセンサを固定する。ケースは、従来と同様のポリプロピレン製を使い、本体を支える足(PVC製の26mmパイプ)に固定することで、本体の設置と一緒に取付できる。また、従来よりだいぶしっかりした構造になることが期待できる。 さらに、このイメージ図には描いていないが、前面には洗濯ネットを設置しゴミの侵入を防ぐ。底面は大部分を切り欠いてオープンとすることで、従来と同じく泥がたまったままにならないように配慮。 大きさは、従来90mm程度の円柱だったのに対し、67mm×40mm程度と二回りくらいコンパクトにできる。 取り付けは、ケース裏側で金折れの穴にネジを通し、蝶ナットで締め付けるので、高さ調整は無段階でできる。

表側 f:id:dekuo-03:20220306175509p:plain

裏側 f:id:dekuo-03:20220306231907p:plain


まとめと今後の課題

2022年版のリモート水位センサシステムバージョンアップ構想をまとめた。次回は、水位センサ部の製作を行う。


水耕栽培の成長記録システム(2) --- 成長記録システムのハード組み立て ---

概要

成長記録システムのハードウェア組み立てを行った。



背景と目的

前回の構想で描いた撮影装置のハードウェア組み立てを行う。

https://cdn-ak.f.st-hatena.com/images/fotolife/d/dekuo-03/20220211/20220211205634.png



詳細

1. 台座とポール

材料は、とりあえずある程度硬い材質であれば何でもいいので、手持ちのシナ合板を使う。 台座は9mm厚、ポール部分は4mm厚合板を細長く切り出して中空の角柱とした。


2. Unit-CAM用筐体

こちらは、ちょうどいい大きさのものがないので、しばらく眠らせていた3Dプリンタを活用した。右の2つはUnit-CAMを収納する筐体。左の2本が、筐体をポールに固定するための棒。ステージをしっかり押さえなかったせいか少し歪んでしまった。

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


3. 完成

製作途中の写真を撮り忘れたので、いきなり完成の写真。まあまあイメージ図通り。温湿度計は、少しカメラに近づけたかったので、段ボールで足を作って少し高さを稼いだ。ここはこだわらない。Unit-CAMへの配線類は、写真では見えないがポールの中を通して根元の裏側から外に出ようにしてある。

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



まとめと今後の課題

ハードウェアの組み立てができた。次は、Unit-CAMがクラウドに写真を送れるようにソフトウェアを書き込む。