Avance.Lab

実験

第5回 IoTを活用した社内備品管理システムを作る / 仕様を検討する その2

公開日:2024.08.16 更新日:2024.09.27

tag: IoTクラウド組み込み

こんにちは。Matsuです。
社内備品管理システム、前回はフロー図を作成して全体的な仕様を検討して、機能一覧を書き出しました。
今回は、それを踏まえて仕様を検討しました。

名称とロゴを作成

仕様の前に、今回は社内の備品管理システムを作るということで進めていますが、社内の若手の方から、名称とロゴを作成したらどうか、とのことでみんなで検討してみました。

結局、社内の若手の方が考えてくれたものになりましたが、なかなかいい感じではないでしょうか。
名前やロゴが決まるとなんとなくモチベーションも上がりますね。

おさらい

備品管理システム(以下monotock)の主な機能としては

・組み込み機器にて備品の重量を測定する
・測定した重量をサーバに送信して管理、在庫切れの判断をする
・在庫切れの場合は管理者へメールを送る
・備品の追加、編集、削除

という感じでした。また、実装する箇所は

・組み込み
・サーバ
 > Webアプリ
 > DB
 > API

に大きく分かれます。
今回は、この実装する箇所ごとの仕様を、抜粋してざっと紹介したいと思います。


組み込み機器仕様

重量計とマイコンを備え、実際に備品の重量を計測し、サーバに送信します。
また、マイコン画面に現在の重量を表示します。
0gリセット(風袋引き)機能、初期設定としてキャリブレーション機能を実装します。

仕様機材

【マイコン】:M5Stack Core2
【重量計】:M5Stack用重さI2Cユニット (HX711)
【ロードセル】:ロードセル(5kg) ※ロードセルは別の製品でもOK
【I2Cハブ】(複数の重量計を接続する場合に使用):M5Stack用Port A I2C拡張ハブユニット
【開発環境】:Arduino IDE (C言語)

M5Stackと重量計(画面は開発中のもの)

前回の試作ではArduino Uno R4 WiFiを使いましたが、組み込み側でもいくつかの操作が必要になることが分かったため、画面とボタンを備えているほうがいいな、ということでM5Stackに変更しました。M5Stack Core2にしたのは、たまたま社内に在庫があったからです。
写真では見えないですが、M5Stack Core2は画面の下に3つのタッチボタンがあります。
(写真の画面は開発用のため仮の表示です)

画面には測定重量等、必要な情報を表示します。
ボタンは標準では前述のとおり画面下に3つ備えます。

操作仕様

・起動時、通常モード
 ボタン1:0gにリセット(風袋引き)
 ボタン3:キャリブレーション開始

・キャリブレーションモード
 ボタン1:OK
 ボタン2:キャンセル

キャリブレーションモードについて
重量計には個体差があり、重量計から取得した生値から正しい重量を求めるには、個体差を考慮した係数を最初に決めないといけません。そのため重量計を追加したときにキャリブレーションを実施します。
ボタン3でキャリブレーションモードに入ったあとは、下記のステップでキャリブレーションを実施します。

STEP1:重量計の上からものをどかす
STEP2:重量計の上にキャリブレーション用の重りを置く
STEP3:係数を計算して保存する

それぞれの詳細な動作については省略します。

重量の送信について
後述の「組み込みAPI」を使って重量を一定時間ごとに送信します。送信時には、過去複数回の測定をし、一定の外れ値を除いた平均値を送信します。詳細な仕様については省略します。

Webアプリ仕様

webブラウザでアクセスし、備品の管理、備品の追加、その他設定などができるようにします。

技術要素

【言語】TypeScript, HTML, CSS
【フレームワーク】Next.js(React)

Webデザイン

webアプリ画面例

画面のイメージはこのようなものです。
実際は備品の追加画面等の他の画面もありますが、今回は省略します。

WebDB仕様

重量や備品情報を保存するデータベースです。今回はNoSQLのMongoDBを使用します。

DB仕様

【DB】MongoDB

スキーマ設計

_id:一意を識別する。MongdDBにより自動生成
type:データタイプを示す。データタイプは次の通り
  > 備品
  > 重量計
  > 計量履歴
  > 備品・重量計紐付け履歴
property:typeで指定されたデータ固有の属性

{
  "_id": "116be442-eb3b-4c08-8fcd-a3f32ded8a6e",
  "type": "enum",
  "property": {
    "xxxx": "xxxx",
    "zzzz": "zzzz"
  },
  "entry_at": "2024-06-25-154000",
  "update_at": "2024-06-25-154020"
}

テーブル構成

組み込みAPI仕様

組み込み機器から重量を送信するときに使用するAPIです。

技術要素

【言語】Python
【フレームワーク】FastAPI

API一覧

  • 重量記録
プロトコルPOST
パス/weights/
レスポンス正常:HTTP 204
異常:HTTP 400

リクエストボディ

{
	"scale_id": "String"	// 重量計ID
	"weight": 0.0		// 現在の重量(グラム)
}

重量計IDにより重量計を識別します。
重量計IDには、マイコン側で取得可能な値(今回はM5StackのWiFi MACアドレス)を使用します。

アプリAPI仕様

webアプリでデータベースの情報を表示、追加、削除、編集をするためのAPIです。

技術要素

【言語】Python
【フレームワーク】FastAPI

API一覧

  • 重量計一覧取得
  • 重量計取得
  • 重量計アーカイブ状態変更
  • 備品一覧取得
  • 備品取得
  • 備品追加
  • 備品変更
  • 備品アーカイブ
  • 備品⇔重量計 紐づけ 変更
  • 備品 計量履歴 取得

各APIの詳細については省略します。

さて、駆け足で各仕様を紹介しました。まずは必要な機能を絞り込み、極力シンプルにするようにしています。今後これらの仕様に基づいて実装を進めていきますので、次回は実際に動くところを一部お見せできればいいなと思います。

Matsu

最近ガレージをつくってDIYにハマってしまう。
無限に欲しくなる電動工具が怖い。

関連記事