物理とテック関連のもの
多くの人がいじくり回すのが好きだということを知っています。だから興味を持っているやる気のある学生のために、さらなる情報や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が続くことに気付くでしょう。一部のデバイス(iOS&Mac)は本当のIDを隠していますので、拡張広告パケットの名前フィールドにも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 ]
注意: 値は10進数です(0xが前に付いていない場合)。
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
以下のページで全モデルのマッピングを確認してください
主要 | ||||
---|---|---|---|---|
バイト | タイプ | 値 | パラメータ | |
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 | 値 | 左重量 | ||
21 | 値 | 左重量 | ||
22 | 値 | 右重量 | ||
23 | 値 | 右重量 | ||
24 | 値 | 湿度 | 41/47/49/52の場合は0 | |
25 | 値 | 左重量2/SM_Time0 | 49/57/58 (XLR) | |
26 | 値 | 左重量2/SM_Time1 | 49/57/58 (XLR) | |
27 | 値 | 右重量2/SM_Time2 | 49/57/58 (XLR) | |
28 | 値 | 右重量2/SM_Time3 | 49/57/58 (XLR) | |
29 | 値 | リアルタイム総重量 / 群れの状態 | 47/49/56/57/58 (SM&XLR) | |
30 | 値 | リアルタイム総重量 | 47/49/56/57/58 (SM&XLR) | |
SECONDARY | 拡張広告パケット | |||
Byte | 種類 | 値 | パラメータ | |
0 | 広告フィールドの長さ | 09 | ||
1 | 種類 | 09 | 端末のローカル名 | |
2 | 4' | ASCII名 | ||
3 | 2' | |||
4 | :' | |||
5 | 0' | |||
6 | 0' | |||
7 | :' | |||
8 | 0' | |||
9 | 0' |
注: BRM52 ブルードマインダー・サブハブは以下のように異なる方法で異なります。
以下は方程式です
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;
}
湿度パーセント = 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-サブハブ
-サブハブはトリッキーな広告を行います。広告は5秒ごとに変更されて、異なるデバイスを送信します。すべてのデバイス(自身を含む)を巡回し、繰り返します。
これらをモック広告と呼びます。使用しているオペレーティングシステムによっては、真のデバイスID(たとえば、06:09:16:52:01:23)を表示できない場合(例:iOS)、拡張広告バイトにデバイスIDを配置する理由となります。また、一部のデバイスでは拡張広告を読み取るのが難しいことに注意しますが、それらのデバイスの場合、通常は真のデバイスIDを読み取ることができます。
モックIDはバイト13、19、および30に存在します。したがって、プロセスは次のようになります。
- このデバイスが-サブハブであるかどうかをID(真のIDまたは拡張広告のID)で確認します。常に52:xx:xxになります。
- “52”のデバイスの場合、バイト13/19/30を解析します。例:43/01/23は43:01:23になります。
- モデルバイト(バイト10)に基づいて、広告パケットの残りをデバイスタイプに従って解析します。
簡単そう😉
ブルードマインダー-W物理
ブルードマインダーのハイブスケールは多くの方法で使用でき、ハイブの総重量の一部しか測定しないため、補助サポートのデザインと配置、およびブルードマインダースケールの配置は、総ハイブ重量測定システムの一部となります。一般的に、これに多くの努力を傾ければ、結果は良くなります。以下に示されているハイブサポートシステムは、不確実性が最も高くて最も洗練された、低いものから開始しています。何を実装するかは個々のユーザーが決定します。
注意:最も一般的なエラー原因は、スケールの下に適切なサポートがないことです。これによって、ハイブが太陽、雨、温度などによって膨張および収縮する際にハイブが屈曲する珍しい振る舞いが生じる可能性があります。平らなサポートを提供すると結果が改善されます。簡単な修正策は、スケールの下に3/4インチの合板シート(または同等)を置くことです。
追加情報:蜂蜜の流れだけを見たい場合、良好なサポートは必要ありません。日々の変動を無視する必要がありますが、全体的な重量変化を観察することはできます。
a) デフォルト配列
これは、ハイブの前部にスケールを配置し、背面に2×4を補助サポート(支点)として配置したデフォルト配置です:
以下は、この設定に関連するいくつかの計算です。
仮定
ハイブの重量Wは均等に分布し、重心はハイブの中央にあると仮定されます。単純化のため、底板の前方のオーバーハングは考慮されません。ハイブの重量は100%と仮定されます。
計算
標準の2×4材を補助サポートとして使用し、ハイブの背面と一致させる場合、スケールSの重量から合計ハイブの重量Wを次のように計算できます:
したがって、このセットアップを使用する場合、アプリのデフォルトのハイブスケールファクターとして2.09を使用します。もちろん、利用可能な一部の重量測定が利用可能になると、これを微調整できます。
次のチャートには、異なるスケールと支点配置のスケール補正係数が示されています。X軸はハイブの背面からのインチ単位の支点位置を示し、異なる線はハイブの背面からのインチ単位のスケール中心線位置を示します。矢印は上記の例を示しています。
b) 代替配置1
上記に基づき、補助サポートはハイブの背面から1インチの位置に配置する必要があります。2×4の上にトリムピースを取り付けることをお勧めします。これにより、補助サポートの正確な位置決めが容易になります。
以上 moment arm E とF が等しい場合、ハイブスケールの補正係数は2.0となりますが、これはモバイルアプリのデフォルト値です。しかし、他の影響要因も見落としてはいけません。補助サポートの実際の支点は、ハイブの後ろと補助サポートの前の間のどこかにあります。これは、サポートシステムの水平さや 2×4 の反りなどの変動によるものです。
c) 代替配置 2
サポートシステムの配置を変更し、定義された支点を持ち、サポート構造の整列に影響を受けないものを使用できます。
パインまたはオークの板を取り、約¾インチ厚、2インチ幅のものを使用します。長さはハイブの幅にする必要があります。この板に小さな切り込みを入れます。切り込みの深さは、ノコギリの刃の幅と同じである必要があります。この部品をハイブの底板の裏側に取り付けます。後方とフラッシュで整列させます。次に、同じ長さの 1 インチ x 1/8 インチの 6061 または 6063 アルミ角を配置し、ハイブを支えます。アルミ角の角が切り込みに乗るようになっています。アルミ角と板の合計高さは、ハイブが水平であるか、ハイブの入り口から離れて水が流れやすいようにわずかに前に傾いていることを確保するために、スケールの高さ以上であるか等しい必要があります。
d) 横方向のバランス
上記のすべてのサポートシステムは、ハイブが3つ以上のポイントで支えられているため、未定義の横方向の重量シフトに影響を受けます。ハイブスケール内部の前部には 2 つのポイントがあり、ハイブの後部には線形サポートがあります。これは、スケール内のロードセルの 1 つに過度の負荷がかかり、したがって、ハイブの下にあるサポートシステムが連続したプラットフォームではない場合には通常、横方向のバランスが必要です。
アプリでリアルタイム表示に切り替えて各ロードセルからの重量を読み取ります。このモードでは、スケール上の重量は%Left、%Right として表示されます。スケールの右側にはデバイス識別ステッカーが付いています。L/R の差が 10% 未満の場合、追加のアクションは必要ありません。
そうでない場合は、重量が小さい側の読み取り値の下にスケールをシムして、重量の読み取り値が一致するようにします。また、シムを低い重量の読み取り値の反対側でハイブの後部の下にも行うことができます。
e) 3 ポイントのハイブサポート
横方向のバランシングは必要ありませんが、真の 3 ポイントサポートシステムを導入することで、横方向のバランシングの必要性を軽減する方法があります。部品は、配置 2 で使用されるものと同様ですが、ここでは 1 インチ角ではなく 3/4 インチ角が必要です。板の中央に 7/32 インチの穴をあけ、中央サポートとして 1/4 インチ x 0.5 インチのスロット付きマシンスクリューを使用します。このスクリューは板に自分のスレッドを切ります。スクリューの頭部のスロットを、アルミ角の縁に乗せて滑り落ちないように整列させます。
アルミ角と木板の間にはわずかな隙間があります。この隙間がハイブ全体で均等な幅であることを確認する必要があります。中央のスクリューが唯一の接点であるべきです。これにより、正確な重量が計測され、同時に極端な負荷がかかった場合にハイブが倒れるのを防止する「安全ネット」になります。たとえば、ハイブの検査中など。
f) ブルームマインダースケールの位置決め
これまでほとんどが補助サポートに関するものでした。では、スケールの配置に焦点を当てましょう。
前のセクションで示されているように、スケールの前面をハイブ本体の前面に配置することが望ましいです。前に配置すると、ハイブの安定性が向上し、精度が向上しますが、スケールをより外側に配置すると、精度が低下し、ハイブの安定性も犠牲となります。
このチャートは、スケールの配置がスケール補正係数およびスケール位置の不正確さによって導入されたスケール誤差に与える影響を示しています。影響度は、1 インチあたり 5.6% です。
スケールの位置をハイブの底板にマーキングしたり、機械的なストップを取り付けることをお勧めします。これにより、バッテリーの交換やその他の理由でスケールを引き出した後でも、スケールを同じ位置に戻すのに役立ちます。