ホームページをリニューアルしました。旧HPはこちら
歳時記 Arduino ソフト・ハードウェア Python

2023-09-02 風向風速計の製作

昨年、ホビー向けの超音波式風向風速計を開発している新井さんから購入した風向風速計キット(WM10)をようやく組み立て、飯田の気象観測に使えるようにした。(製作期間:2023/8/23~9/2)

この風向風速計は、機械式(風杯式)と異なり、3つの超音波センサーを正三角形の頂点に配置し、『三角形の各辺にあたる3成分の風向風速を測定して、3成分風速からXY軸成分風速に変換し、さらにXY軸成分風速から風向風速を計算する。』という優れもの。
自作した風杯式の風速計は風速が相対値だったので、この超音波式風向風速計と相関をとることにした。

製作に当たっては以下の記事を参考にした。

■WM10風向風速計の詳細内容(新井さんのHP)

パラウインド 超音波式風向風速計HP
WM10 DIY超音波式風向風速計(製作・組立手順)
wm10-A manual
DIY超音波式風向風速計LCDパネルモニター

■WM10 DIYキットのクラウドファンディングに参加したヨッシーさんの記事
WM10 DIY超音波式風向風速計 を作って ESP32 でクラウドにデータを送ってみた

製作費用:約13,000円
WM10キット 5,000円
UV管、L字金具、USBコンセント、ホールソー等 8,000円
(ES8266開発キット類は在庫品を利用)

製作手順

1、風速風向計の塩ビパイプケースの作成


(ヨッシーさんのHPより)

2、超音波センサの組み込みとプリント基板実装
老眼なので、細かなはんだ付けで目が疲れ、肩が凝った。


(新井さんのHPより)

3、WM10とESP32ボードの作成

USB変換モジュールのFT232RL(RXD出力端子)とESP8266開発ボード(NodeMCU Amica)のRX端子(SoftwareSerial)を配線接続。FT232RLの出力電圧(RXD)は5V(4.1V)、いっぽうESP32の入力は3.3V仕様のため、抵抗分割(2:3)によるレベルシフターを介してESP32のRXに入力した。

FT232RL(RXD) —–2kohm——-> ESP8266(RXD2:GPIO15)
|
4kohm
|
GND

 

4、ESP8266 スケッチ
スケッチは、新井さんのHPとヨッシーさんのHPにあるArduinoのスケッチを参考に作成。ESP8266のTX,RX端子はSoftwareSerialで設定した。


#include 
#define ESP8266_USE_SOFTWARE_SERIAL
#define WM10_RX D7  // GPIO13 (RXD2) <---> conect to  TX pin of WM10
#define WM10_TX D8  // GPIO15 (TXD2) <---> conect to  RX pin of WM10 

//////define wm10 SoftSerial wmSerial //////////////       
SoftwareSerial wmSerial(WM10_RX,WM10_TX);

ESP12-wm10-ver1.ino

5、WM10からの出力データ

・キャリブレーション

キャリブレーションを実施すると出力値がおかしい。WM10の回路図を参考に導通を確認したとこと、トランスデューサのエナメル結線が切れていた。再度はんだ付けをやり直してキャリブレーションしたところ、正常に実行された。


キャリブレーション実行前:
$WIMTA,27.7,C*19
$WIMWV,163,R,3.7,M,A*3E
#-0.0,4.5,-1.6,2.9
$WIMTA,27.7,C*19
$WIMWV,164,R,3.7,M,A*39
#-0.1,4.5,-1.5,2.8
$WIMTA,27.7,C*19
$WIMWV,163,R,3.7,M,A*3E
#-0.1,4.5,-1.5,2.9
$WIMTA,27.7,C*19
$WIMWV,162,R,3.6,M,A*3E
#-0.0,4.5,-1.5,2.8

キャリブレーション実行
$Cを入力
...
................................................................
V220118
Tc:27.7 Tm:27.7
#-0.0,-0.0,0.0,0.0
$WIMTA,27.7,C*19
$WIMWV,69,R,0.0,M,A*01
#-0.0,0.0,0.0,0.0
$WIMTA,27.7,C*19
$WIMWV,107,R,0.0,M,A*38
#-0.0,-0.0,-0.0,0.0
$WIMTA,27.7,C*19
$WIMWV,73,R,0.0,M,A*0A

・ESP8266 sketch: wm10-test-arfaからの出力


temperature: 30.7
No: 1 気温:30.7 ℃  WindAngle(degree): 113
WindSpeed(m/s): 0.4
 風速:0.4 m/s
WindDirection:  ESE
temperature: 30.7
No: 2 気温:30.7 ℃  WindAngle(degree): 73
WindSpeed(m/s): 0.2
 風速:0.2 m/s
WindDirection:  ENE
temperature: 30.7

No:19 気温:30.7 ℃  WindAngle(degree): 164
WindSpeed(m/s): 0.5
 風速:0.5 m/s
WindDirection:  SSE
temperature: 30.7
No:20 気温:30.7 ℃  WindAngle(degree): 76
WindSpeed(m/s): 0.1
 風速:0.1 m/s
WindDirection:  ENE

-------- 60sec --------
aveTemp(degC)= 30.7
aveAngle(degree)= 164.3
aveWind(m/s)= 0.4
Ave_WindDirection: SSE
Max Wind Speed = 1.7
Max Wind Angle = 165.0
Max_WindDirection: SSE
-------- 60sec --------

5、風向、風力の解析プログラム

・データ受信用PHP
~/logdata/wm10/wm10.php

・データ処理シェルプログラム
~/work4/wm10/file-sort.awk
~/work4/wm10/wm10-merge-plot-sakura.sh

・風向、風速トレンドプロット
~/work4/wm10/wm10-plot-beta.py

・風向風速の統計 Windrose
~/work4/wm10/wm10-plot-beta.py

windrose(風配図)について
どちらの方向からどれくらいの強さの風が吹いてくるか、方位と風速の出現頻度を同時に表す。

Pythonのwindroseライブラリを使って作成。windroseをpipでインストールすると、自動的にnumpyの最新版がインストールされてしまうので、最新版をuninstallし、numpy==1.21をinstallした。(最新版のnumpyは”np”というエイリアスが使えないため。)

自作風杯計とWM10の風速データとの相関

使用データ:8月27日~8月31日のデータ
・風杯計は1分間の回転数(rpm)
・WM10は1分間中の最大風速データ(m/s)
このデータを15分間の最大値にリサンプル処理して相関をみた。

確認結果:
相関係数0.924で高い相関にある。近似直線から風杯計の値(rpm)におよそ0.8を掛けると、実際の風速値(m/s)に換算できそうだ。今後定期的に検証してみる。

相関図作成プログラム:

# coding: utf-8
# -*- coding: utf-8 -*-
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.dates as mdates
from matplotlib.dates import DayLocator, HourLocator, DateFormatter
import sys,io
sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8') # Print文字をUTF-8に
import japanize_matplotlib

from datetime import datetime
from datetime import date
from datetime import timedelta

# //// hallセンサー風杯計データ読み込み
# 出力ファイルにフィールド名を追加して読み込
title = ['date','wind'] 
df=pd.read_csv("hall-data.csv",header=None, names=title)
df=df.set_index('date')
df.index=pd.to_datetime(df.index,utc=True)

df_hall_max=df.resample('15T').max()

# //// WM10データ読み込み
inputfile="wm10-data.csv"

title = ['date', 'temp', 'angle', 'wind', 'direction', 'max_angle', 'max_wind','max_direct']
df=pd.read_csv(inputfile,header=None, names=title)

df=df.set_index('date')
df.index=pd.to_datetime(df.index,utc=True)

df_wm10_max = df['max_wind'].resample('15T').max()
df_wm10max = pd.DataFrame(df_wm10_max)		#DataFrame化

#///////////////////////////////////////
dfc = pd.concat([df_hall_max, df_wm10max], axis=1) # OK axis=1とすると横方向に連結される。

# correlation
dfc_corr=dfc.corr()
corr = '{:.3f}'.format(dfc_corr['max_wind'][0])
text = "相関係数=" + str(corr)

# 散布図と近似曲線のPLOT
x=dfc['wind']
y=dfc['max_wind']
# 近似直線の式 y=ax + b の a と b が入ったタプルを得る
p=np.polyfit(x, y, 1)	# 最小二乗法による近似直線
# a,b = np.polyfit(x, y, 1)
f=np.poly1d(p)			# 

fig, ax = plt.subplots()
ax.scatter(dfc['wind'], dfc['max_wind'],s=10, label='最大風速')
ax.plot(x,f(x), color="grey", label="近似直線")
plt.title("風杯計 vs WM10の相関")
plt.grid()
plt.legend()
plt.xlabel('風杯計(rpm)')
plt.ylabel('WM10(m/s)')
plt.text(1,4,text)
filename = "fitting.png"
plt.savefig(filename)
plt.show()
plt.close()
#### program end

 

コメント

タイトルとURLをコピーしました