物理学と技術的なこと
多くの方がいじるのが好きだということを知っています。そこで、興味があり、やる気のある学生のために、さらに情報とDIYソフトウェアの内容を提供します。
BLE広告情報
注意: 説明を改善するための提案がある場合は、詳細をお知らせください。
自分自身のデータ収集機器を作成する勇気のある方々のために、BroodMinderが使用するBLE広告プロトコルに関する情報を提供します。実際、私たちのBroodMinder-CELL、WiFi、および-SubHubは、広告を使用してデバイスを傍受し、そのデータを直接MyBroodMinder.comに転送します。
いくつかの優れたBLEエクスプローラープログラムがあります。私たちのお気に入りは以下の通りです:
- Android & iOS – Nordic SemiconductorのnrfConnect。Android版が最も優れていますが、私たちは常に両方を使用しています。良い信号レベルのグラフ機能があります。
- PC – MicrosoftのBluetooth LE Explorer。このプログラムは、広告データを表示しません。
- Mac – BlueSee – このアプリはうまく機能し、広告パケット内の製造業者データを表示します。
デバイスIDの最初の3バイトは常に06:09:16で、その後に特定のデバイスIDが続きます。これは常にModel:ID:IDです。一部のデバイス(iOSおよびMac)は真のIDを隠すため、拡張広告パケットの名前フィールドにもそれを含めています。
BroodMinderの広告パケット構成
BLEから広告パケットを読み取ると、以下を確認することでBroodMinder製品を特定できます。
データは次のようになります。– この例はデバイス43:30:07からのものです。
GAPスキャン応答イベント ------------------------------------------------------------------------------------
ble_evt_gap_scan_response: rssi=-77, packet_type=0, sender=[ 07 30 43 80 07 00 ], address_type=0, bond=255, data=[ 02 01 06 02 0a 03 18 ff 8d 02 2b 15 02 00 02 21 00 d0 62 00 ff 7f 05 80 37 07 30 43 00 00 00 ]
注意: 値は0xで始まらない限り10進数です。
1) "メーカー固有データ"フラグを確認 バイト6,7 = 0x18, 0xff
2) 製造業者としてIF, LLCを確認 バイト8,9 = 0x8d, 0x02
バイト10-29は、以下に示すようにBroodMinderからのデータです。 DeviceModelIFllc_1 = 0x2b (43d = スケール) DeviceVersionMinor_1 = 0x15 (21d) DeviceVersionMajor_1 = 0x02 (FW 2.21) Elapsed_2V2 = 0x21 (33d) Temperature_2V2 = 0x62d0 WeightL_2V2 = 0x7FFF WeightR_2V2 = 0x8005
すべてのモデルのマッピングは次のページにあります。
| PRIMARY | ||||
|---|---|---|---|---|
| バイト | タイプ | 値 | パラメータ | |
| 0 | 広告フィールド長 | 02 | ||
| 1 | フィールドタイプ | 01 | 接続可能 | |
| 2 | 値 | 06 | LE一般発見、接続可能、シングルモードデバイス | |
| 3 | 広告フィールド長 | 02 | ||
| 4 | フィールドタイプ | 0A | 送信電力 | |
| 5 | 値 | 03 | DBでの電力 | |
| 6 | 広告フィールド長 | 24 | ||
| 7 | フィールドタイプ | FF | メーカーデータ | |
| 8 | 値 | 8d | IF, LLC = 0x028d, 653 | |
| 9 | 値 | 02 | IF, LLC = 0x028d, 653 | |
| 10 | 値 | モデル | ||
| 11 | 値 | バージョンマイナー | ||
| 12 | 値 | バージョンメジャー | ||
| 13 | 値 | リアルタイム温度1 | 47/49/56/57/58 (SM&XLR) | |
| 14 | 値 | バッテリー | ||
| 15 | 値 | 経過時間 | ||
| 16 | 値 | 経過時間 | ||
| 17 | 値 | 温度 | 47以上は摂氏+5000 | |
| 18 | 値 | 温度 | ||
| 19 | 値 | リアルタイム温度2 | 47/49/56/57/58 (SM&XLR) | |
| 20 | 値 | 重量L | ||
| 21 | 値 | 重量L | ||
| 22 | 値 | 重量R | ||
| 23 | 値 | 重量R | ||
| 24 | 値 | 湿度 | 41/47/49/52では0になる | |
| 25 | 値 | 重量L2/SM_Time0 | 49/57/58 (XLR) | |
| 26 | 値 | 重量L2/SM_Time1 | 49/57/58 (XLR) | |
| 27 | 値 | 重量R2/SM_Time2 | 49/57/58 (XLR) | |
| 28 | 値 | 重量R2/SM_Time3 | 49/57/58 (XLR) | |
| 29 | 値 | リアルタイム総重量 / スワーム状態 | 47/49/56/57/58 (SM&XLR) | |
| 30 | 値 | リアルタイム合計重量 | 47/49/56/57/58 (SM&XLR) | |
| SECONDARY | 拡張広告パケット | |||
| バイト | タイプ | 値 | パラメータ | |
| 0 | 広告フィールド長 | 09 | ||
| 1 | タイプ | 09 | 完全ローカル名 | |
| 2 | 4' | ascii名 | ||
| 3 | 2' | |||
| 4 | :' | |||
| 5 | 0' | |||
| 6 | 0' | |||
| 7 | :' | |||
| 8 | 0' | |||
| 9 | 0' |
注: BRM52 BroodMinder-SubHubは以下に説明されているように異なります。
ここに方程式があります
if (ModelNumber == 41 | ModelNumber == 42 | ModelNumber == 43)
{
temperatureDegreesF = e.data[byteNumAdvTemperature_2V2] + (e.data[byteNumAdvTemperature_2V2 + 1] << 8);
temperatureDegreesF = (temperatureDegreesF / Math.Pow(2, 16) * 165 - 40) * 9 / 5 + 32;
}
else
{
double temperatureDegreesC = e.data[byteNumAdvTemperature_2V2] + (e.data[byteNumAdvTemperature_2V2 + 1] << 8);
temperatureDegreesC = (temperatureDegreesC - 5000) / 100;
temperatureDegreesF = temperatureDegreesC * 9 / 5 + 32;
}
humidityPercent = e.data[byteNumAdvHumidity_1V2];
if (ModelNumber == 43)
{
weightL = e.data[byteNumAdvWeightL_2V2 + 1] * 256 + e.data[byteNumAdvWeightL_2V2 + 0] - 32767;
weightScaledL = weightL / 100;
weightR = e.data[byteNumAdvWeightR_2V2 + 1] * 256 + e.data[byteNumAdvWeightR_2V2 + 0] - 32767;
weightScaledR = weightR / 100;
}
else if (ModelNumber == 49 | ModelNumber == 57 | ModelNumber == 58)
{
weightR = e.data[byteNumAdvWeightL_2V2 + 1] * 256 + e.data[byteNumAdvWeightL_2V2 + 0] - 32767;
weightScaledR = weightR / 100;
weightL = e.data[byteNumAdvWeightR_2V2 + 1] * 256 + e.data[byteNumAdvWeightR_2V2 + 0] - 32767;
weightScaledL = weightL / 100;
weightR2 = e.data[byteNumAdvWeightL2_2V2 + 1] * 256 + e.data[byteNumAdvWeightL2_2V2 + 0] - 32767;
weightScaledR2 = weightR2 / 100;
weightL2 = e.data[byteNumAdvWeightR2_2V2 + 1] * 256 + e.data[byteNumAdvWeightR2_2V2 + 0] - 32767;
weightScaledL2 = weightL2 / 100;
}
realTimeTemperature = ((float)(e.data[byteNumAdvRealTimeTemperature2] * 256 + e.data[byteNumAdvRealTimeTemperature1] - 5000) / 100) * 9 / 5 + 32;
realTimeWeight = (float)(e.data[byteNumAdvRealTimeWeight2] * 256 + e.data[byteNumAdvRealTimeWeight1] - 32767 ) / 100 ;
SM_Timeは最後の温度イベントのUnix時間です。Time0 = LSB、Time3 = MSB、デバイスがデバイス同期によって時間を設定されていない場合はブートからの時間になります。
BRM-52 BroodMinder-SubHub
-SubHubはトリッキーな広告を行います。広告は5秒ごとに変更され、異なるデバイスを送信します。すべてのデバイス(自分自身を含む)を順番に回り、繰り返します。
これをモック広告と呼びます。使用されているオペレーティングシステムによっては、真のデバイスID(例:06:09:16:52:01:23)を見ることができる場合とできない場合があります(例:iOS)。そのため、拡張広告バイトにデバイスIDを配置します。また、一部のデバイスの拡張広告を読み取るのは難しいですが、それらのデバイスでは通常、真のデバイスIDを読み取ることができます。
モックIDはバイト13、19、30に存在します。プロセスは次のようになります:
- ID(真のIDまたは拡張広告のID)によってこれが-SubHubであるかどうかを確認します。それは常に52:xx:xxです。
- 「52」デバイスであれば、バイト13/19/30を解析します。例:43/01/23は43:01:23になります。
- モデルバイト(バイト10)に基づいてデバイスタイプに従って広告パケットの残りを解析します。
簡単ですね😉
BroodMinder-W物理学
BroodMinderハイブスケールは多くの方法で使用でき、総ハイブ重量の一部しか測定しないため、補助サポートの設計と配置、およびBroodMinderスケールの位置決めが総ハイブ重量測定システムの不可欠な部分となります。一般的に、これに多くの努力を注ぐほど、結果は良くなります。以下に示すハイブサポートシステムは、最も簡単なものから最も洗練されたものまで、不確実性が最も高いものから最も低いものまで始まります。何を実装するかは個々のユーザーに委ねられています。 注意: 最も一般的なエラーの原因は、スケールの下のサポートが不十分であることです。これにより、ハイブが太陽、雨、温度などによって膨張および収縮する際に奇妙な動作が発生する可能性があります。平らなサポートを提供することで、結果が改善されます。簡単な修正は、スケールの下に3/4インチの合板シート(または同等のもの)を置くことです。
追加の注意: もしあなたが見たいのが蜂蜜の流れだけであれば、良好なサポートは必要ありません。日々の変動を無視する必要があります。それでも、全体的な重量の変化を観察することができます。
a) デフォルト配置
これは、ハイブの前面にスケールがあり、背面に2×4を補助サポート(てこの支点)として配置したデフォルトの配置です:
ここにセットアップに関するいくつかの計算があります:
仮定
ハイブの重量Wは均等に分配され、重心はハイブの中央にあります。簡単のために、底板の前方のオーバーハングは考慮されません。ハイブの重量は100%と仮定します。
計算

標準の2×4材を背面サポートとして使用し、ハイブの背面に合わせると、スケールの重量Sからハイブの総重量Wを次のように計算できます:

したがって、このセットアップを使用している場合は、アプリでデフォルトのハイブスケール係数として2.09を使用してください。もちろん、いくつかの重量測定が利用可能になったら微調整できます。
以下のチャートは、異なるスケールとてこの配置に対するスケール補正係数を示しています。X軸はハイブの背面からの支点の位置をインチ単位で示しています。異なる線はハイブの背面からのスケール中心線の位置をインチ単位で示しています。矢印は上記の例を示しています。

b) 代替配置 1
上記に基づいて、補助サポートはハイブの背面から1インチの位置に配置する必要があります。2×4の上にトリムピースを取り付けることをお勧めします。これにより、補助サポートの正確な位置決めが助けられます。

これで、モーメントアームEとFが等しくなり、ハイブスケール補正係数は2.0になり、これはモバイルアプリのデフォルトです。ただし、見逃してはいけない他の影響要因もあります。補助サポートの実際の支点は、サポートシステムの水平度の変動や2×4自体の潜在的な反りのために、ハイブの背面と補助サポートの前面の間のどこかにあります。

c) 代替配置 2
定義された支点を持ち、サポート構造の整列に影響されない異なるサポートシステムを使用できます:
約3/4インチの厚さと2インチの幅の松またはオークの板を取ります。長さはハイブの幅と同じである必要があります。小さな切り込みを入れます。この切り込みは、のこぎりの刃の幅と同じ深さである必要があります。この部品をハイブの底板の裏側に取り付けます。背面と平らに合わせます。次に、木のストリップと同じ長さの1インチ×1/8インチの6061または6063アルミ角材をその下に置いてハイブを支えます。アルミ角材の角は切り込みに収まります。アルミ角材と木の高さの合計は、ハイブが水平であるか、ハイブの入り口から水が排水されるようにわずかに前方に傾くように、スケールの高さと等しいか、わずかに大きくする必要があります。

d) 横方向のバランス
上記のすべてのサポートシステムは、ハイブが3点以上で支えられているため、未定義の横方向の重量移動の影響を受けます。ハイブスケールの内部に前方に2点、ハイブの背面に線状のサポートがあります。これにより、スケールの1つのロードセルに過負荷がかかる可能性があり、そのため、ハイブの下のサポートシステムが連続したプラットフォームでない場合、すなわちハイブの前後に別々のコンクリートブロックがある場合は、通常、横方向のバランスが必要です。
アプリでリアルタイム表示に切り替えて、各ロードセルから個別に重量を読み取ります。このモードでは、スケールの重量が%左、%右として表示されます。スケールの右側はデバイス識別ステッカーのある側です。L/Rの差が10%未満であれば、追加の操作は必要ありません。
そうでない場合は、低い重量読み取りの側でスケールをシムして、重量読み取りが一致するまで調整します。あるいは、低い重量読み取りの反対側の背面サポートの下でもシムを行うことができます。
e) 3点ハイブサポート

横方向のバランスの必要性を軽減する方法として、真の3点サポートシステムを導入することができます。部品は配置2で使用されるものと似ていますが、この配置では1インチの角材の代わりに3/4インチの角材が必要です。板の中央に7/32インチの穴を開け、切り込みを入れる代わりにします。1/4インチ×0.5インチのスロット付き機械用ネジを中心サポートとして使用します。このネジは、自分のスレッドを板に切ります。ネジ頭のスロットは、アルミ角材の端に滑り落ちないように単一の点で休むように整列させます。

アルミ角材と木の板の間には小さな隙間があります。この隙間がハイブ全体で均等な幅であることを確認する必要があります。中央のネジが唯一の接触点であるべきです。これにより、正確な重量が測定されることが保証され、同時に、過度の不均一な荷重が発生した場合にハイブが倒れるのを防ぐ「安全ネット」となります。 f) BroodMinder スケールの位置決め
上記のほとんどは補助サポートに関するものでした。ここではスケールの位置決めに焦点を当てましょう。
前のセクションで示したように、スケールの前面がハイブ本体の前面と一直線になるように配置することが望ましいです。さらに内側に移動させると、ハイブの安定性を犠牲にして精度が向上し、外側に移動させると、ハイブの安定性はわずかに向上しますが、精度は低下します。

このチャートは、スケールの配置がスケール補正係数およびスケールの不正確な位置決めによって導入されるスケール誤差に与える影響を示しています。影響は1インチあたり5.6%です。

スケールの位置をハイブのボトムボードにマークするか、機械的ストップを取り付けることをお勧めします。これにより、バッテリー交換やその他の理由でスケールを引き出した後に、同じ位置に戻すのが容易になります。