2020年7月3日金曜日

BME280のオーバーサンプリングを試してみた

どこかのライブラリを基にして、python3で使えるようにしてクラスっぽい実装にしたものを使っているので、データシートを見ながら1ステップづつ確認しているような状態ですが、モード値以外はほぼ問題なさそうというのが現時点での結論となっています。

そんなこんなで、まずはオーバーサンプリングを試してみましたが、結果から言えばほんとに小数点以下の誤差が若干落ち着くかな?といった感じでした。
フィルタリングに関しては、データシートの説明でノーマルモードで使用することが推奨されていて、よくよく読んでみると、設定のレジスタに書き込むと内部のフィルタメモリがクリアされる仕組みになっているので、現状の使い方(毎回初期設定して温度を読み取っている)ではあまり効果が期待できなさそうです。このへんはもう少し手を加えれば変えられそうですが、そこまでの精度の値が欲しいわけではないので踏ん切りがつきません。

データシートにはフィルタを有効にすると、気圧と温度の解像度(分解性能?)が上がると書かれているので、気になりますが、原文とグーグル翻訳を使って読んでいる限りドアの開閉や扇風機などの気流の乱れの誤差を減らすのが目的なようなので現状関係ないかも(笑)

オーバーサンプリングやフィルタ効果を見るために、同じ場所の2つのセンサーのグラフを実際に重ねて比較してみると、
気温

湿度(上部にCPU温度がかぶってます)

気圧
温度、湿度、気圧とものにほぼ同じ形になっているのでやっぱりオーバーサンプリングやフィルタリングの効果は少ないようです。
気圧に関しては、数値もほぼ同じになっていて気持ちがいい反面、温度は0.5℃、湿度は5%程度の差がありました。
やはりキャリブレーションデータの計算が間違っているのか、個体差か、劣化による誤差なのかは謎のままです…





コピー品が出回ってるかも?と検索したら、日本語版のデータシートが存在してました。
細かいスペックは英語の方がわかりやすかったりしますが、製品そのもののイメージを捉えるためには日本語で読めると全体がつかみやすいです。英語力ほとんどないからなぁw

と、いろいろとはっきりしたポイントとして、英語でも「ゲームモード」と書かれていて何に使うのかな?と引っかかっていましたが、気圧と温度で高度の差異を捉えて高精度の高度センサーとして利用するのが目的のようです。そのためにわざわざノーマルモードなるひたすらセンサー値をレジスタに書き込むモードがあるようです。実際に数Hz程度のサイクルで値が更新され続けるので、動態検知だけでなく、ヘッドマウントディスプレイなどに組み込めば加速度センサーとは違った実際の上下移動距離をリアルタイムで取得できそうです。
なるほどねぇといった感じですが、、、実際に使うのはただの温度、湿度、おまけで気圧の観測記録だけなのですw

ちろっと、サンプルを見かけたと思ったんですが、やはり日本語です。はっきりと認識できました。
気象観測用のおすすめ設定は…
オーバーサンプリングは気圧、気温、湿度すべてx1。フィルターはオフ。強制モードで、サイクルは1分間隔とのこと。
理由はよくわかりませんが、一昨日から昨日までノーマルモード(毎回初期化してるので上記の想定からはやや離れているのですが、)1分単位で取得した温度の値が、百均の温度計との差が少なくなりました。


色々とスクリプトを見直していたら今まで使っていたものはどうもdouble型で簡易的に求めるもののようで、基準となる変数が本来は整数なのに対してdoubleのままになっていました。記憶はあまりないですが、BMP180のソースを基に自分で起こしたような気もしてきました。とはいっても、やはり小数点以下の誤差しか出てこないので、温度と湿度の個体差が予想以上に出ているという残念な結果が残りました。

2020年7月2日木曜日

"Direct firmware load for brcm/brcmfmac43430-sdio.raspberrypi,3-model-b.txt failed with error -2"

起動時に電圧不足となっているRaspberry piを再起動して気になったエラーメッセージがありました。


[    7.411836] brcmfmac: brcmf_fw_alloc_request: using brcm/brcmfmac43430-sdio for chip BCM43430/1
[    7.412142] usbcore: registered new interface driver brcmfmac
[    7.436191] brcmfmac mmc1:0001:1: Direct firmware load for brcm/brcmfmac43430-sdio.raspberrypi,3-model-b.txt failed with error -2
[    7.652810] brcmfmac: brcmf_fw_alloc_request: using brcm/brcmfmac43430-sdio for chip BCM43430/1
[    7.652954] brcmfmac: brcmf_c_process_clm_blob: no clm_blob available (err=-2), device may have limited channels available
[    7.655857] brcmfmac: brcmf_c_preinit_dcmds: Firmware: BCM43430/1 wl0: Oct 23 2017 03:55:53 version 7.45.98.38 (r674442 CY) FWID 01-e58d219f

検索してみると
https://askubuntu.com/questions/1252760/how-do-i-activate-the-bluetooth-function-on-my-ubuntu-system-if-theres-no-defa
I finally found a solution that works: sudo hciattach /dev/ttyAMA0 bcm43xx 921600 After running this command everything seemed to be fine.
とのこと
詳細を見る前にアップデートするとファーム更新まで走らないかな?試してみよう

BME280センサーの個体差が気になるので

いままで何回かバラバラで購入しているので結構個体差があります。
百均で温度計も購入して比べてみましたが、予想以上にズレがありました。とはいえ、±2℃程度ではあるので実用的には全く問題はありませんがw
センサーチップにキャリブレーションデータがあるので誤差の原因がその補正計算で問題があるのではないかと気になって仕方がなかったので、使っているソースとデータシートを見比べてみました。

結果としては、データシートの参考ソースから補正計算をさせた結果と、今までの結果の差は

今まで使っているライブラリの値
温度 28.008137599710608
気圧 1004.5331902330901
湿度 68.45038478114147

データシートから起こしたスクリプトの値
温度 28.01
気圧 1004.5329296875
湿度 68.4453125

誤差の根源は内部で使いまわしているt_fineという基礎数の計算時の誤差が由来のようです。

143401.6645105183
143401

データシートに記載されているソースは桁あふれが発生させないように整数で扱っているのに対して、今まで扱っているライブラリの方は誤差は演算処理任せにして演算している感じです。

その結果、今回データシートから起こしたスクリプトは気圧と湿度に関しては算出された値からさらに表示用にそれぞれ256と1024で割り算しているのでその誤差が出てきているだけの格好です。

ついでに細かいところでレジスタから取得している部分も見直してみたのですが、結局は問題ありませんでした。ビットで切り離している値などもあるので、怪しいと思ってアドレス計算とかまでして確認したんですけどね無駄でしたw

とはいえ、根本的なところで、
The “config”register sets therate, filter and interface options of the device. Writes to the “config” register in normal mode may be ignored.In sleep mode writes are not ignored.
「config」レジスタは、デバイスのレート、フィルタ、およびインターフェースオプションを設定します。通常モードでの「config」レジスタへの書き込みは無視される場合があります。スリープモードでは書き込みは無視されません。
という記述を発見。
ライブラリではノーマルモードのままとなっているので、若干心配ではあります。

あと、サンプリングの回数を10分間隔から1分間隔に変更して様子を見ているのですが、1分間隔にしたら温度計の温度との差がかなり少なくなった感じがします。
と、すると、オーバーサンプリングうんたらかんたらでセンサーの値を拾ってあげると結果が変わりそうな気配がしますが…そのうち確認してみましょう。

2020年6月28日日曜日

Raspberry pi 3bのthrottled=0x50000

今までまったく気にしていなかったthrottledのフラグですが、設定を確認しているとRaspberry pi 3bで異常値を示していました。

0x50000
なので
0b 0101 0000 0000 0000 0000
    | 1111 1111 11
bit | 9876 5432 1098 7654 3210
----+-------------------------
    | 0101 0000 0000 0000 0000
       | |
       | +--------------------16: under-voltage has occurred
       +----------------------18: throttling has occurred
これを見ると低電圧状態とスロットリングが発生したということです。
今まで気になってる点といえばI2Cで接続しているBME280センサーが突然アクセスできなくなり、うまく行えてるか微妙なところですが、I2Cのリセットをしても復旧せず、Raspberry piをrebootしても元に戻らない状態に陥ってしまうことがまれに発生しています。
最初はセンサー側を疑っていましたが、別のメーカー製のBME280を使用しているRaspberry pi 2bでも発生したので、Raspberry pi側の問題かな?程度に考えていました。
ただアクセス不能に陥っていた時にログなどを確認すればよかったのですが、何も考えずシャットダウンさせて、電源再投入で再起動させてしまっていて原因がさっぱりわからないままです。
throttledの異常状態になっていても、特に問題は起きていない状態なのですが、とりあえず何か調べてみようかなと、最初にdmesgを見てみることに。
pi@rasp3b:~ $ dmesg
  [    0.000000] Booting Linux on physical CPU 0x0
[    0.000000] Linux version 5.4.35-v7+ (dom@buildbot) (gcc version 4.9.3 (crosstool-NG crosstool-ng-1.22.0-88-g8460611)) #1314 SMP Fri May 1 17:41:46 BST 2020[    0.000000] CPU: ARMv7 Processor [410fd034] revision 4 (ARMv7), cr=10c5383d
[    0.000000] CPU: div instructions available: patching division code
[    0.000000] CPU: PIPT / VIPT nonaliasing data cache, VIPT aliasing instruction cache
[    0.000000] OF: fdt: Machine model: Raspberry Pi 3 Model B Rev 1.2
[    0.000000] Memory policy: Data cache writealloc
[    0.000000] Reserved memory: created CMA memory pool at 0x37000000, size 64 MiB
[    0.000000] OF: reserved mem: initialized node linux,cma, compatible id shared-dma-pool
[    0.000000] On node 0 totalpages: 241664
[    0.000000]   Normal zone: 1888 pages used for memmap
[    0.000000]   Normal zone: 0 pages reserved
[    0.000000]   Normal zone: 241664 pages, LIFO batch:63
:
:
[    8.223547] uart-pl011 3f201000.serial: no DMA platform data
[    8.300452] usb 1-1.4: set resolution quirk: cval->res = 384
[    8.302336] usbcore: registered new interface driver snd-usb-audio
[    8.318097] Under-voltage detected! (0x00050005)
[    9.220251] brcmfmac: brcmf_cfg80211_set_power_mgmt: power save enabled
[    9.891057] smsc95xx 1-1.1:1.0 eth0: hardware isn't capable of remote wakeup
[   11.056763] IPv6: ADDRCONF(NETDEV_CHANGE): wlan0: link becomes ready
[   11.967507] usb 1-1.4: reset high-speed USB device number 4 using dwc_otg
[   12.477611] Voltage normalised (0x00000000)
[   13.378331] Bluetooth: Core ver 2.22
[   13.378515] NET: Registered protocol family 31
起動時にUSB関連の初期化中に低電圧とスロットリングが発生しているようでした。

現時点でほかのRaspberry piでは発生していないので比較はできませんが、今度センサーが止まった時にでも様子を探るようにしてみましょう。

2020年6月27日土曜日

スクリプト作成時に検索していて使い勝手が悪くなってる

私は頭が悪いので、スクリプトなどを書く時に少しでも引っかかったら検索してできる限り予期しないことが起こらないようにしています。
最近は昔と違って結構見やすくて分かりやすいサイトが上位になっていて良かったのですが、広告系と思われるサイトが上位やトップに来てしまい非常に使い勝手が悪くなってきています。
初期のgoogle検索は除外サイトとか検索オプションを保存できたような気がするのですが、現時点では毎回設定する必要があるようで…バカバカ検索をかけるときにわざわざオプション指定をしたりするかといえばしないわけで、この手のアドオンが何かあるかな?と探してみると、Google Chromeなら検索エンジンの編集で細工ができるようです。
FireFoxでもできるんじゃ…と思ったら、検索エンジンがすべてアドオン扱いで微妙な状態に…昔は直接設定できたような気がするんだが…

で、さらにuBlacklistなるものがChromeならアドオンがあるっぽい!
Personal Blocklist の代替になりそうな Chrome 拡張機能を作ってみた
FireFoxのアドオンでもないかな?と検索してみると出てきました。
でも…Google系のサイトの書き換えを許可するとかちょっと怖いのでもう少し辿ってみました。
見る限り作者はChrome版と同じ方のようで、問題なさそう?

機能はgoogle検索特化型のアドオンで、検索結果画面を直接フィルタリングと加工を行っているようです。
実際に使ってみると悪くはないし、ツールボタンで表示中のサイトを直接除外対象に含めることができて使い勝手も悪くはないんです。悪くはない。
でも正直なところ、怖いですねww

仕組みとしてはフィッシングサイトにまっしぐらな感じになっているのを使うべきかどうか…

一つ二つなら-site:オプションで行けるので、検索エンジンでオプション強制形式でいいのないかな?