2018年12月9日日曜日

超音波風向風速計

 追記も伸びすぎたので新規エントリ。


 10Hzで計測し、起動後の5秒(50サンプル)の平均をオフセットしたのが上の図。
 計測部を上下に動かして、上下方向の風速をシミュレートした。

 ch1risは打ち下ろし方向、ch1fallは打ち上げ方向を示す(risとfall逆だ。。。)

 下の図はris-fallのグラフ。
 上下方向の動きはrisとfallが逆になるから、差を求めると上下方向の成分が得られる。逆に、和を求めると左右方向の成分が得られる。

 また、下の図の紫のall aveは全chの平均を表す。
 本来、all aveは真っ直ぐな線になるはずなのだが、若干上下しているのが謎い。もしかしたら天井部と床付近の室温の変化が見えているのかも。
 人間の吐息の温度で有意に値が触れるくらいだから、天井と床での室温の違いも見えるのかもしれない。普通に温度センサを上下に動かすだけじゃ時定数が長くてわからないだろうが、超音波風向風速計の時定数は事実上ゼロだから、あとは分解能次第。

 位相が22.5度動くと、約1.5usecの差になる。15cm/441usecで340.136m/s、15cm/442.4usecで338.983m/sになる。340.136m/sだと14.5℃、338.983m/sだと12.6℃になる。いろいろ定数をてきとーに入れているが、まぁ当たらずとも遠からずな数値になってるはず。
 ということは、気温1°Kの差で位相10度程度の差として検出できるわけか。
 たかが1.5m程度の高さの差で2℃も変わるもんかな? 換気吹き込む古い住宅ならあり得るかも。


 とりあえず、風速とか気温の変化をちゃんと計測できているようなので、あとは生データから欲しい情報(風速ベクトル、温度スカラ)に変換するモデルを作らなければ。
 恒温槽とか風洞があれば、いろいろパラメータを変えて「こういうモデルにすると現実に即した値になる」って調整ができるんだが、どうやろうかねぇ。

 とりあえず6chの生データ(サイクル追尾をしたあとの位相情報)はCOMポート経由で取り出せるから、その後のデータ変換はPCで処理したほうがやりやすいかもしれないな。プログラムサイズも大きくなってきて書き込みに時間がかかるようになってきたし、PCソフトなら直接グラフとか表示できるし。


追記:2018/12/10

 部屋のドアを開けてサーキュレーターで換気してみた。思ったほど下がらない。
 横軸は秒、縦軸はtempが℃、ch1-ch6がusec。usecは位相(rev)を周期(41.015625kHz)で割った値。 途中でノイズが多い区間は、おそらくサーキュレーターの気流が影響してるんだと思う。
 ガッツリΔtemp稼いでΔtimeを比較すれば、素子間の相対的な距離の差が得られるはず。ただ、数度変化させたくらいじゃねぇ。逆に言えば、数度の変化程度ならそのあたりは無視できるってことか。結局、各変数はてきとーに決め打ちしてやるしかないかな。

 あと、温度センサ(ADT7420)の信頼性がちょっと悪い。時々ACKが帰らなくなる。基板を触ると治るんで、パターンが切れてるかな? 0.1mmのリジット基板なので、かなり嫌な感じ。遊びで使う程度なら、裏にスルーホールのユニ基板入れて補強してやったほうが良さそう。いまさら遅いんで、次買うときにでも。


追記

 キャリブレーションモードで5秒間の50サンプルの平均を求め、その際の気温からオフセット量を計算するようにした。距離を15.8cmとして計算しているが、15cmがセンサ表面の距離、4mmが表面から圧電素子までの距離。
 そのグラフが左上で、縦軸はマイクロ秒。
 左下のグラフは距離を時間で割ったもの。計測した音速に相当する。
 右のグラフは音速から温度を求めたもの。

 ch1とch4がちょっと高めに出てるのが気になる。ch1とch4はA組、ch2とch5はB組、という組み合わせなので、A組が大きく振れてる、ということになる。息の速度成分なら、ch1は上がってch4は下がる、みたいな差動成分が出てくるはず。腑に落ちない。センサ感距離がA組だけ大きく違うのかな? 一晩じっくりΔtを取ってみたらわかるかな。


 風速を求めるには、chXはコモン+ディファレンシャル、chYはコモンーディファレンシャル、が計測されるので、まずコモンとディファレンシャルに分離する。
 3組のコモンの平均から温度を求めると、それが媒質の温度になる。
 ディファレンシャルを垂直からの角度で補正して平均を取ると、風速の上下成分が得られる。
 ディファレンシャルを垂直からの角度で補正し、さらに水平方向を補正すると、風速の水平成分が得られる。これはxy平面のベクトルだから、方位もわかる。もちろん、垂直成分のzを加えて3次元の風速ベクトルにもできる。


 超音波風向風速計の生データはドリフトがなくていいねぇ。ジャイロセンサじゃこうはいかない。もっとも、強烈に温度ドリフトが乗ってる、とも言えるけど。

 一旦キャリブレ値を決定してしまえば、しばらくはドリフトしないはず。おそらくシステムをリセットしてもこの値は有効なはずだから、STM32のバックアップメモリに突っ込んでおけば、いちいちキャリブレモードに入らなくてもいい。


 息で温度差を作るには、雰囲気の温度を下げておく必要がある。ただ、普段はヌクヌクした部屋でヌルく生きてる人間だから、20℃を下回るとだいぶ寒い。耐えられないほどじゃないけど、指が思うように動かなくなる。プログラミングとかしてると結構致命的。
 体は厚着すればどうにでもなるけど、指はどうにもならない。まさか防寒手袋してキーボード打つわけにも行かないし。


追記
 キャリブレをRAM/ROMに保存すると、キャリブレ時と大きく温度が違うところで開始した際に、サイクルスリップが発生してしまうという欠点がある。
 位相の絶対値がわからないのは、1つの周波数の位相だけを見ているのが原因だと思う。いくつかの周波数の位相を使えば、計算で位相の絶対位置を決定できる気がする。
 風速の計測とかの計算が落ち着いたら、絶対位置の決定も試してみよう。


追記
 ADT7420を注文した。ついでにTSYS01というセンサも注文してみた。
 ADTは1200円でσ3が0.15℃、TSYSは980円でmini/maxが0.1℃。TSYSのほうが高精度っぽいし、安価。そしてTSYSは分厚いリジット基板なので、パターン割れの影響も少ないはず。
 ただし、ストリナのサムセンスとかいう規格らしくて、固定穴が邪魔くさい。穴1個しかないから角度を固定できないし、M2だからそのへんに転がってるM3を使うこともできないし。最近の米粒みたいなセンサはほとんどがサムセンスになってる気がする。せっかくの小型センサが活かしきれない。企業の試作品に使うのが目的ならこういうのでもいいんだろうが、小さい所に押し込みたいような個人ユーザーにはつらいな。

 TSYSはSPI/I2Cが切り替えられるらしい。
 ストリナの3軸センサとかも切替式だけど、それはCSがHならI2C、LならSPI、みたいなややこしい動作モードになってる。ネゲートされたSPIはどうなるんじゃ!という感じ。
 TSYSのほうはProtocol Selectというピンがあって、これがLならSPI、HならI2Cで、Chip Selectは別にある。

 また、ADTはレジスタを128で割れば℃で直読みができるが、TSYSは4次関数で校正する必要があるらしい。センサ個体の補正値がセンサごとに焼かれてるんだそうだ。国土地理院の地磁気の近似式みたいな感じ。

 ま、とりあえず、今週中には届くだろうから、届き次第動作確認。駄目なら新しいADTを使おう。

 ADTがACKを返さなくなったあとに読めた温度は、小数点以下2桁表示で0.06度の分解能になってる。16bitモードは分解能0.0078125度、13bitモードは分解能0.0625度なので、明らかに13bitモードになってる。リセット値が13bitだから、電源パターンが割れてるんだろうな。

0 件のコメント:

コメントを投稿