盆栽計測装置「Bonsai Dock」ができるまで ~製作日誌~
はじめに
テックシーカー2024が終わり、余韻に浸る間もなく、気が付けばM5Stack Japan Creativity Contestの応募締め切りが迫っていました。
今年こそは、長年の課題である、ロードセルを使った盆栽計測装置「BonsaiDock」の開発に取り組みたいと思います。
おおよその構想はすでに出来上がっています。
100均ラックで枠組みを組み、M5Dialを用いて、RFIDタグを読み取り、計測する盆栽鉢を特定し、ロードセルを用いて重量を計測し、その結果を盆栽管理DB「盆カン」に登録する。
というものです。
Dockなので、カメラ、スキャナ、温湿度などもっともっと計測項目を増やして、あらゆる角度から分析したい。という野望もあるのですが、それはまだこれからのお楽しみとして、現時点で実現可能なものを作ることをいたします。
また、装置に関しても、工作機械のペンダントコントローラーのようなものを作ってみたいと考えているのですが、今の調子だととても間に合いそうにありません。
まずはM5Dial単独でビルドアップを目指してみます。
おおよそのフローを考えます。
1.電源投入後、初期設定し、待ち受け
2.RFIDタグを読み取ったら、重量を測定し、データベースに転送する。
3.結果を表示する。
4.ボタンを押したら、手動ID入力させる。
5.キャリブレーション用のタグを読み取ったら、あらかじめ計測した重さとしてキャリブレーションする。
このような感じで考えています。
プログラミングはArduino IDE2.0を使って、サンプルを組み合わせて作ります。なんだかできそうな気がしてきました。
ここで、スケジュールを決めます。
今日が7/8(月)、締切が7/31(水)です。
およそ3週間あるので、1週間ずつ区切って、
7/8(月)-7/14(日)スプリント1:サンプルをつなぎ合わせ、モックアップをつくる。
7/15(月)-7/21(日)スプリント2:装置全体の作りこみ
7/22(月)-7/28(日)チェック・ドキュメント作成
7/29(月)提出
これでうまくいきそうです。
7/8(月)Day1:キックオフ、サンプルの確認
M5Dialで今回使えそうなサンプルを集めます。
rfid.ino:ICタグ
display.ino:ディスプレイ
encoder.ino:ロータリーエンコーダー
はかりキット側のサンプルは
https://docs.m5stack.com/en/app/scales_kit
このあたりにあります。
これらを混ぜ合わせ、作っていけそうです。
7/9(火)Day2:とにかく組み合わせてみる
昨日書いたフローでrfidのサンプルにM5Stack用はかりキット(重さユニット付き)のサンプルを組み込めば良いことがわかりました。
はかりキットの商品説明ページには下記のサンプルが用意されています。
Example
Arduino
Examples
ひと通り眺め、相性の良さそうなものを取り込みます。
1.M5Dialのサンプル
これはそのままでコンパイルOK
2.Scales Kitのサンプル
おおお。ここで少しひっかかりました。HX711.hを使うにはどうしたら?
数年前もここで引っかかったような記憶がありますが、何とか対処します。
同じフォルダに「HX711.h」「HX711.cpp」を入れ、ファイルを追加してしまいました。
※後からわかったのですが「スケッチ」>「ライブラリをインクルード」で「HX711 Arduino Library by Bogdan…」を追加すればよかったです。
7/10(水)Day3:多忙で構想のみ
後必要なものは。。。
Googleスプレッドシートへの読み書きができると盆カンとリンクできそう。
数年前やった記憶があるのですが、もう一度調べます。
ラズパイの実さん
【M5Stackでデータ解析】M5Stackで取得したデータを、Google スプレットシートへ書き込む
以前チャレンジしたときは、GASが何者かわからない状態でコピペしていたし、IFTTTサービスも使ったような気がします。
MQTTでもいけるかもと思ってしまいます。
7/11(木)Day4:もやもやしながら
気になったことを調査しました。
megetonさん
カードの識別とメモリの読み書き
はかりのサンプルを試してみました。
はかりのサンプルはM5Dial用ではありません。
以前作ったはかりの試作品とM5Dialをつないでみましたが、当然のことながらうまくは動いてくれませんでした。
M5Stackを用意して、はかりのテストを行うことにしました。
7/12(金)Day5:だいたいこのあたりからぐだぐだになってきます
とにかくできることから進めます。
はかりの部分はM5Stackのサンプルをもとに必要な機能を取り出します。
残りの部分をM5Dialを使って作りこんでいくことにします。
rfid、Googleスプレッドシートへのデータ送信、できれば、ダイアル操作のあたりを進めていきます。
Google スプレッドシートへデータを書き込むテストを行います。
GASのデプロイは久しぶりで、すっかり忘れています。
何度かエラーを出しながら、ようやく出力できるようになりました。
デバッグウインドウにはエラーが表示されていましたが、できているようです。
BonsaiDock0にサンプルをドッキングさせます。
今度は、はかりとつないでのテストを行いました。
これが、うまくいきません。
ひとつずつ巻き戻しながら原因を探ります。
この日はM5Stackとはかりを接続してOKであることまでを確認しています。
7/13(土)Day6 ヨルツド で意見交換
植物系メイカーの方々に会う機会があったので、現時点での構想をお話しし、意見交換を行いました。
少しずつこのような機会が増えてきていることがやっていてよかったと思います。
7/14(日)Day7 粛々と開発を進めます
とはいうものの、なかなか進みません。
M5Dialのサンプルをいじるところから始めてみました。
スマホのテザリングをWifiとして使い、どこでもできるようにし、rfid.ino、ラズパイの実さんさんのサンプルコードを合体させてみました。
そこに、M5Stackでテストした、はかりキットのサンプル、ScaleKitSsampleを合成しました。
ここでいつものPORTマッチングで悩みます。
// Port-A
#define LOADCELL_DOUT_PIN 15
#define LOADCELL_SCK_PIN 13
// Port-B
//#define LOADCELL_DOUT_PIN 2
//#define LOADCELL_SCK_PIN 1
ピン番号のマッチングでいつもグダグダになります。
ArduinoIDEのコンパイルは時間が掛かります。
不毛な時間が過ぎていきます。
ようやく乗り切ることができました。
コンパイルを待つ間に、サンプルコードを読んで、次にすべきことを探していました。
scale.set_scale(27.61f); // set scale
この意味が全く理解できていませんでした。
ロードセル、温湿度計などセンサーにはキャリブレーション(校正)が必要であることは、それなりに認識しておりましたが、要はこの関数を使って、構成してね。という意味だと感じました。(きちんとしたドキュメントにたどり着けていないので、多分そうかなぐらいです。)
と思ったのもつかの間、
この辺りから、少しおかしくなってきました。
装置が正常に作動しなくなってきたのです。
こんな日は作業をあきらめ、寝ることにします。
7/15(月)Day8 なぜかはわかりませんが、復活しました
あれこれ見直しながら、ひとつひとつ再確認しました。
そして今まで使っていたPort-Aではなく、Port-Bを使って再調整することにしました。
// Port-B
#define LOADCELL_DOUT_PIN 1
#define LOADCELL_SCK_PIN 2
また、あれこれいじっているうちにいくつかの発見がありました。
ロードセルの校正について
scale.set_scale(27.61f); // set scale
この関数に入れるべき数値を割り出します。
この値はちょっとしたプログラムですぐに割り出せると思ったのですが、その考えが甘かったです。
ただ一つよかったことは、M5Dialにロードセルチェック用の短いサンプル「HX711_full_example.ino」を入れて値を調整したのですが、ほかのライブラリを用いていないので、ビルドがとても早いのです。
これで、何度も値を調整することができました。
キッチンスケールで計った500gの水を入れたペットボトルをしばらくしたのち置く。というものです。
100gの間を値がふらふらしています。この結果を見て、心が折れそうになりました。きょうはここまで。
7/16(火)Day9 スプリント2:装置全体の作りこみ
このあたりから、装置全体の作りこみを進めてまいります。元の計画を見直します。
1.電源投入後、初期設定し、待ち受け
2.RFIDタグを読み取ったら、重量を測定し、データベースに転送する。
3.結果を表示する。
4.ボタンを押したら、手動ID入力させる。
5.キャリブレーション用のタグを読み取ったら、あらかじめ計測した重さとしてキャリブレーションする。
の4.5.は、置いといて、1-3を作ることに致します。
ほぼ骨子はできていると思いますが、rfidの扱いをまだ作り込んでいません。
rfidと重さをGoogleスプレッドシートに送信し、受け側で日時を付加して格納するようにします。
7/17(水)Day10 出張のため作業できず
ドキュメントの整理をしました。
もう一度、コンテストの要綱を読み提出物を確認します。
今の時点で53点の応募があります。
提出物のイメージをしながら、ドキュメントやイラストを書きました。
7/18(木)Day11 そろそろ結果を出したいと思います
なりふり構わず、動作するものを作った後、ブラッシュアップすることにしました。
まずはなんとかできました。
7/19(金)Day12 少し余裕が出てきてのんびりしてしまいました
ドキュメントや画像を少しいじっただけでこの日は終わりました。
7/20(土)Day13 最終テスト中に問題発生
いよいよ屋外に持ち出し、実際に使ってみることにしました。
作業場を片付け設置してみましたが、表示がありません。
PCと繋いでいるときは使えて、USB給電をするとNG。
全く分かりません。
表示を行うまでの初期化の部分で発生しているのは間違いないと思うのですが、どこで発生しているかわかりません。
デバッグ表示もリスクがあると考えました。
少し考えた後、BEEP音をステップごとに鳴らすことにしました。
4つ鳴るはずが、1つしか鳴りません。
これで場所を特定できました。
Serial.begin(115200);
while (!Serial) continue;
シリアルを初期化する際に、実際に接続するまでループさせていました。ここが原因であることにわかりました。
Serial.begin(115200);
// while (!Serial) continue;
コメントアウトすることで、使えるようになりました。
7/21(日)Day14 最終テスト実施
朝から最終テストを実施し、おおよそ思っている動作が確認できたため、写真、動画を取り、ドキュメントの作成に取り掛かりました。
note.comに説明記事を書き、動画を取りました。
説明動画はcanva!を使って作ります。
Protopediaに記事をアップ。
これで安心。あとは締め切りまで少しずつ点検していきます。
さいごに
夏休みの宿題は、いつも締め切りを少し過ぎてから提出するだめだめ学生だった私も、やればできるんだ。
#BonsaiDock
#製作日誌
#M5Dial
#ScaleKit
#ArduinoIDE
#bonsai
#盆栽
#ロードセル
#勉強記録