中国製マニュアル無しブラックボックス風速計
0-3.8V風速計について調べて見たら一番手間がかかった話
こうなったら別にほしくも無いが、風速計全部調べてやる!!という気になって勢いで0-3.8Vタイプも調達してみた。

ブランド MUNDFE
購入先 アマゾン 購入価格 ¥2,746
風速計では最安な商品なので全く期待はしていませんが、どんなもの?という好奇心からの注文でし
した。
届いた第一印象は、何これ という感じ
本体から2本のリードが出ているだけのシンプルな構造、プラスチック製のカップも別のプラ機種と
比べても若干分厚く重そうな感じがする。
想像した感じでは、
・2本のリードしか無い->電源が不要
・もしかしてブラシレスモーターか?
そこで試しに2本のリードに電源電圧を徐々に掛けてみる、すると羽がくるくると時計方向に回転を
始めた逆に電圧を加えると今度は半時計方向に回り出した。
確信->ブラシレスモーターが入っている(回路は無いと見た)
しかし、最初から気になったのは本体に無造作についているねじの事

よく見るとねじが締まっていることにより、プロペラが微妙に偏芯しているような
これはモーターを無理やり固定しているねじに違いないと思い、緩めてみたらそのとうりでプロペラが
上方に引き抜くことが出来ました。
そうしたら案の定ご本尊のブラシモーターが現れました。


モーターに刻印は見つからないが、外見と形状から検索してみると260という型式のモーターが一番近いことが分かった。
という事で中身が判明致しました。
今度は、さてこれをどう料理するか?という事になりました。
1,カップは時計方向しか回らないという事では無いので出力は直流でマイナスにも振れるということを
考慮する。
2,ある程度のスパーク的な高電圧も発生するだろうし、ノイズも相当な筈、ADコンバーターに入れる
前の段階のノイズ処理が重要事項。
3,低回転付近で信号がノイズに勝たないと回転を検出できない可能性がある、そもそも検出出来る
のか?。
結構回路的は難しい事案だ、安い割に面倒くさい商品だ。
それに完成したとしてもブラシレスモーター事態の寿命は最大でも約3000時間と聞いているので半年位で壊れるのでは?という不安はぬぐい切れない。
風速計としては安価だが価値もそれなりに薄い商品という感じです。
羽の形は違えど子供の工作用の発電風車と全く同じ商品ですね。

風力発電のおもちゃと同じ構造だった

この回路の場合、実測して見ると最大でも2Vを超えないので0-3.8Vでは無くなった。(0-2.0V仕様)
OP AMPのゲインを上げれば0-3.8V風速計になるが、0-2.0Vの方がADコンバーターの処理がやり易い
構造上0回転付近がノイズに埋もれて認識し辛いので、全波整流器で処理しても低回転域の信号が
検出出来ない、大掛かりになったが、整流ダイオードの順電圧の影響を除去出来る回路(絶対値回路)
を採用する方法で解決した。
LM358Nは1パッケージにOP AMPが2個入っているので部品点数は2個で済む。
最終的に1段20倍程度増幅して約0-2V程度でADコンバーターに入力する。
ノイズが多いので、アマゾンで見つけた中国製の車用と思われる強力なノイズフィルターを入れて
います。

AN-358N
購入先 秋月電子 ¥40

16Bit ADC I2C 基準電圧内蔵
購入先 秋月電子 ¥600

購入先 アマゾン ¥999(5個)
テストスクリプト
#include <Wire.h>
#define MCP3425_ADDR 0x68
// MCP3425 Config
// PGA=1, 15SPS, Continuous
#define MCP3425_CONFIG 0b10011000
#define LSB_VOLTAGE 0.0000625 // 2.048/32767.0 = 0.0000625(PGA=1)
void setup() {
Serial.begin(115200);
Wire.begin(4, 5);
Wire.setClock(100000);
// 設定書き込み
Wire.beginTransmission(MCP3425_ADDR);
Wire.write(MCP3425_CONFIG);
Wire.endTransmission();
}
float readVoltage() {
// 2バイト(高バイト、低バイト)を読み出す
Wire.requestFrom(MCP3425_ADDR, (uint8_t)2);
if (Wire.available() < 2) return -1;
int16_t raw = (Wire.read() << 8) | Wire.read();
float adc_voltage = raw * LSB_VOLTAGE;
return adc_voltage;
}
void loop() {
float voltage = readVoltage();
Serial.print("Voltage = ");
Serial.print(voltage, 5);
Serial.println(" V");
delay(1000);
}
説明書もWeb上でのデーターも全く見つからない代物なのでこれを風速計に仕上げるには、実際に風
を当てて既知の風速計データーと比較決定するしか方法が無い。
そこで調べて見た
中国製のブラシモーター(またはDCモーター)を利用した風速計の回転数は、基本的には風速に比例(直線的な比例関係)する。
これは、風によってプロペラやカップが回る力が風速に比例するためです。しかし、厳密には様々な要因で比例関係からズレが生じるため、実用上の注意点がある。
1. 比例する理由
・回転式(風杯・プロペラ)の原理: 風速計の羽(カップ)は、風が強くなるほど速く回る構造にな
っている。
・DCモーターの特性: ブラシモーターを発電機として利用する場合、その回転数(RPM)に比例した
出力電圧が得られるため、電圧を測定することで風速を計算できる。
2. 比例関係からズレる要因
・「理論上は比例」しますが、実機では以下の要因で非線形になることがある。
・機械的摩擦(フリクション): モーター内部のブラシや軸受(ベアリング)の摩擦が、特に微風時
に抵抗となり、低い風速域では正確に比例しなくなる(回転数が低くなる)傾向がある。
・始動風速の限界: 風が非常に弱い場合、摩擦に負けてモーターが回転せず、0m/sと表示されてしま
いまう。
・慣性(応答性): 風が急激に変化した場合、プロペラの重さにより、実際の風速の変化に回転数が
追いつかない(応答が遅れる)ことがあります。
・空気抵抗: 風が極めて速い場合、空気抵抗が増大し、直線的な比例関係から誤差(負の偏差)が生
じやすくなる。
3. 中国製製品における注意点
・中国製の安価な風速計(特にDIY向けや低価格な産業用センサ)は、構造が単純なため、上記の
「摩擦」の影響を受けやすい場合がある。
校正: 低価格品は個体ごとの摩擦の差が大きく、出荷時の校正が不十分な場合、低風速で誤差が大き
い可能性があります。
高精度が必要な場合: 1m/s以下の低風速や、常に変動する気象観測などの高精度な用途には、プロ
ペラ式ではなく「超音波式」や「熱線式(ホットワイヤー)」が推奨されている。
結論:
目安として風速を計測する用途(送風機や換気扇の風速チェックなど)には問題なく使えるが、
±1m/s以下の精密な数値が必要な場合は、定期的な校正または信頼性の高い機器の選択が必要。
以上の事からカップの回転数が糸口と考え回転数と検出電圧の関係を調べる事とした。
回転数と電圧測定


CSA-UR42D3-PS 購入先 Plexmotionオンラインショップ
購入価格 ¥34,650

購入先 アマゾン ¥2,869
こんなことをしなくてもモーターと直結しても良いが、別の風速計でもこの装置を使ってみたいので
こうゆう形にした。
少しだけデーターを取ってみたが、数字の羅列を見ても線形なのかどうかはさっぱり分からない。
そこで次の手だが、測定値から近似曲線の方程式を求める方法で行ってみたい。
この方法は、最小二乗法を用いて、測定値と近似曲線の誤差(残差)の二乗和が最小になるような式を自動的に算出する方法です。
しかし、回転数の入力は手動のみなので例えば1000rpmまでデーターを取るには大変な手間と時間が
かかりそうです、このシナノケンシ製の発振器がPythonで制御出来れば、すべて自動で行けるのです
が、そうゆうの作ってよメーカーさん、生きている内に終われば良いですが不安です。
。。。という事で1000回転迄約1カ月掛かって休み休みデーターを取りました。
この休み休みでデーターを取ると、モーターを放置状態からと計測する場合と、モーターが暫く回転
したあとにデーターを取る場合に若干連続性が失われるのでその点が大変でした。
休まないで一気にやれば良いのでしょうが、血圧が上がるので無理です。
近似2次方程式を求める(Jupyter note book上で行う作業)
!python3 -m pip install --upgrade pip
!pip install -U scikit-learn
!pip install matplotlib
from sklearn.linear_model import LinearRegression
import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression
from sklearn.preprocessing import PolynomialFeatures
from sklearn.pipeline import make_pipeline
from sklearn.metrics import r2_score
# 1. データの準備
# 回転数(RPM) - 0-1000
rpm = np.array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10,
11, 12, 13, 14, 15, 16, 17, 18, 19, 20,
21, 22, 23, 24, 25, 26, 27, 28, 29, 30,
31, 32, 33, 34, 35, 36, 37, 38, 39, 40,
41, 42, 43, 44, 45, 46, 47, 48, 49, 50,
#途中省略
971, 972, 973, 974, 975, 976, 977, 978, 979, 980,
981, 982, 983, 984, 985, 986, 987, 988, 989, 990,
991, 992, 993, 994, 995, 996, 997, 998, 999, 1000])
# 電圧(V) - 0-2.024V
voltage = np.array([0.04969,0.04980, 0.05006, 0.05419, 0.06181, 0.06200, 0.06394, 0.06419, 0.06494, 0.07313, 0.07756,
0.07988, 0.08038, 0.08664, 0.09116, 0.09275, 0.09540, 0.09923, 0.10057, 0.10123, 0.11024,
#途中省略
1.97232, 1.97325, 1.97391, 1.97590, 1.97709, 1.98027, 1.98173, 1.98292, 1.98491, 1.98610,1.98769, 1.99034, 1.99171, 1.99364, 1.99445, 1.99498, 1.99697, 1.99988, 2.01487 , 2.0480])
# 重要:電圧→RPM の式を作る
X = voltage.reshape(-1, 1)
y = rpm
# 2次式でフィッティング
model = make_pipeline(PolynomialFeatures(degree=2), LinearRegression())
model.fit(X, y)
# 係数取得
lin_reg = model.named_steps['linearregression']
coef = lin_reg.coef_
intercept = lin_reg.intercept_
print("----- 変換式 -----")
print(f"RPM = {coef[2]:.8f} * V^2 + {coef[1]:.8f} * V + {intercept:.8f}")
# 精度
rpm_pred = model.predict(X)
r2 = r2_score(y, rpm_pred)
print("R2 =", r2)
# グラフ
v_range = np.linspace(min(voltage), max(voltage), 200).reshape(-1, 1)
rpm_range = model.predict(v_range)
plt.scatter(voltage, rpm, color='red', s=5)
plt.plot(v_range, rpm_range, color='blue')
plt.xlabel("Voltage (V)")
plt.ylabel("RPM")
plt.grid(True)
plt.show()
実行結果
—– 変換式 —– RPM = 93.90772448 * V^2 + 330.10926145 * V + -26.44968412 R2 = 0.9996412223284775

結果の精度R2 = 0.9996412223284775で良好です。
この2次式さえ得ればあとは既知の風速を与えて係数Kを求めれば良いです。(風速(m/s) = RPM × K)
とは言っても風洞装置が無いと簡単に既知の風速は得られません。
車にこの風速計を取り付けて一定の速度で走ればある程度正確な風速が得られる筈ですが、田舎で
それをやると基地外と思われるのでやめときます。
とりあえずやり方までたどり着けば私としては満足なので、その内自作の風洞装置を作ってゆっくり
実験するつもりです。
0-2Vタイプ風速計完成スクリプト
K値は仮の値なので実際に実験して求める必要があります。
身近な方法では車で一定速度で走行してその時の風速計の回転数(RPM)から K = 風速/RPM
で求める方法です。
運転速度と風速の関係は、例: 時速40km -> 11.11m/s なので この場合 K = 11.11/RPMで求めます。
この部分に設置する。 #define K_WIND 0.018
風速計停止の状態で風速が0になるようここを設定して下さい -> #define ZERO_OFFSET 0.013
onst char* mqtt_server = “192.168.1.200”;では自身のMQTT Serverのアドレスを入れて下さい。
WiFi.config(IPAddress(192, 168, 1, 100), IPAddress(192, 168, 1, 1), IPAddress(255, 255, 255, 0));
でこのセンサーシステム自身のIPアドレスを指定しています。
自身の環境に合わせて指定してください。
自分の家の空いているIPアドレスを調べるには以下のソフト「Advanced IP Scanner」を使用すると
便利。
https://forest.watch.impress.co.jp/library/software/advipscanner/
#include <ESP8266WiFi.h>
#include <PubSubClient.h>
#include <Wire.h>
#define MCP3425_ADDR 0x68
#define MCP3425_CONFIG 0b10011000 // 16bit, Continuous, PGA=1
#define LSB_VOLTAGE 0.0000625
#define ZERO_OFFSET 0.013 // 無風オフセット(要調整)
// ----------- 0-2V風速計コア部分 -----------
// RPM = a*V^2 + b*V + c
#define A_COEF 93.90772448
#define B_COEF 330.10926145
#define C_COEF -26.44968412
#define K_WIND 0.018 // RPM → m/s 現在は仮の値です
// -----------------------------------------
#define WIFI_SSID "your_ssid"
#define WIFI_PWD "your_passwd"
const char* mqtt_server = "192.168.1.200";
#define LED 16
WiFiClient espClient;
PubSubClient client(espClient);
unsigned long lastSample = 0;
uint8_t count = 0;
// ---------------- MQTT ----------------
void reconnect() {
while (!client.connected()) {
String clientId = "ESP8266-";
clientId += String(random(0xffff), HEX);
client.connect(clientId.c_str());
}
}
// ---------------- ADC ----------------
float readVoltageRaw() {
Wire.requestFrom(MCP3425_ADDR, (uint8_t)2);
if (Wire.available() < 2) return -1;
int16_t raw = (Wire.read() << 8) | Wire.read();
if (raw < 0) raw = 0;
return raw * LSB_VOLTAGE;
}
// 平均化(ノイズ対策)
float readVoltage() {
float sum = 0;
int n = 10;
for (int i = 0; i < n; i++) {
sum += readVoltageRaw();
delay(50);
}
float v = sum / n;
// オフセット補正
v -= ZERO_OFFSET;
if (v < 0) v = 0;
return v;
}
// ---------------- SETUP ----------------
void setup() {
Serial.begin(115200);
Wire.begin(4, 5);
Wire.setClock(100000);
// MCP3425設定
Wire.beginTransmission(MCP3425_ADDR);
Wire.write(MCP3425_CONFIG);
Wire.endTransmission();
WiFi.config(IPAddress(192,168,1,100),
IPAddress(192,168,1,1),
IPAddress(255,255,255,0));
WiFi.begin(WIFI_SSID, WIFI_PWD);
while (WiFi.status() != WL_CONNECTED) delay(500);
client.setServer(mqtt_server, 1883);
pinMode(LED, OUTPUT);
}
// ---------------- LOOP ----------------
void loop() {
if (!client.connected()) reconnect();
client.loop();
if (millis() - lastSample >= 1000) {
float voltage = readVoltage();
// ---------- 変換 ----------
float rpm = A_COEF * voltage * voltage
+ B_COEF * voltage
+ C_COEF;
if (rpm < 0) rpm = 0;
float wind_speed = rpm * K_WIND;
if (wind_speed < 0.05) wind_speed = 0;
// ------------------------------------
count++;
if (count > 3) {
char msg[16];
dtostrf(wind_speed, 6, 2, msg);
client.publish("wind_speed", msg);
Serial.print("V=");
Serial.print(voltage, 4);
Serial.print(" RPM=");
Serial.print(rpm, 1);
Serial.print(" Wind=");
Serial.println(msg);
count = 0;
}
digitalWrite(LED, !digitalRead(LED));
lastSample = millis();
}
}NODE-RED
ダッシュボード2

0-2V式風力計フロー

[{"id":"c31a01828a7d6717","type":"tab","label":"0-2V 式風速計","disabled":false,"info":"","env":[]},{"id":"74c02f018504dd99","type":"mqtt in","z":"c31a01828a7d6717","name":"","topic":"wind_speed","qos":"2","datatype":"auto-detect","broker":"61e45e3515b67f80","nl":false,"rap":true,"rh":0,"inputs":0,"x":190,"y":200,"wires":[["0f0fe984d5cf198c","32d1e716c05ef4f4"]]},{"id":"32d1e716c05ef4f4","type":"ui-text","z":"c31a01828a7d6717","group":"a2862a7d5d758378","order":1,"width":0,"height":0,"name":"風速","label":"風速","format":"{{msg.payload}}","layout":"row-spread","style":true,"font":"Arial,Arial,Helvetica,sans-serif","fontSize":"24","color":"#fafafa","wrapText":false,"className":"","value":"payload","valueType":"msg","x":410,"y":200,"wires":[]},{"id":"0f0fe984d5cf198c","type":"debug","z":"c31a01828a7d6717","name":"debug 1","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","statusVal":"","statusType":"auto","x":440,"y":340,"wires":[]},{"id":"61e45e3515b67f80","type":"mqtt-broker","name":"","broker":"192.168.1.200","port":"1883","clientid":"","autoConnect":true,"usetls":false,"protocolVersion":4,"keepalive":60,"cleansession":true,"autoUnsubscribe":true,"birthTopic":"","birthQos":"0","birthRetain":"false","birthPayload":"","birthMsg":{},"closeTopic":"","closeQos":"0","closeRetain":"false","closePayload":"","closeMsg":{},"willTopic":"","willQos":"0","willRetain":"false","willPayload":"","willMsg":{},"userProps":"","sessionExpiry":""},{"id":"a2862a7d5d758378","type":"ui-group","name":"風速","page":"cef20d4917f1c9a7","width":6,"height":1,"order":1,"showTitle":false,"className":"","visible":"true","disabled":"false","groupType":"default"},{"id":"cef20d4917f1c9a7","type":"ui-page","name":"気象","ui":"debf650e7f1343d3","path":"/page1","icon":"home","layout":"grid","theme":"a45c7f2adf09be21","breakpoints":[{"name":"Default","px":"0","cols":"3"},{"name":"Tablet","px":"576","cols":"6"},{"name":"Small Desktop","px":"768","cols":"9"},{"name":"Desktop","px":"1024","cols":"12"}],"order":1,"className":"","visible":"true","disabled":"false"},{"id":"debf650e7f1343d3","type":"ui-base","name":"画面名","path":"/dashboard","appIcon":"","includeClientData":true,"acceptsClientConfig":["ui-notification","ui-control"],"showPathInSidebar":false,"headerContent":"page","navigationStyle":"default","titleBarStyle":"default","showReconnectNotification":true,"notificationDisplayTime":1,"showDisconnectNotification":true,"allowInstall":true},{"id":"a45c7f2adf09be21","type":"ui-theme","name":"気象","colors":{"surface":"#505050","primary":"#505050","bgPage":"#505050","groupBg":"#5f5f5f","groupOutline":"#cccccc"},"sizes":{"density":"default","pagePadding":"12px","groupGap":"12px","groupBorderRadius":"4px","widgetGap":"12px"}},{"id":"eca696f485e63a7b","type":"global-config","env":[],"modules":{"@flowfuse/node-red-dashboard":"1.30.2"}}]
3秒平均・10分平均・最大瞬間風速+ JSON
更に機能を増やしたタイプ
送信JSON例
{
“wind_now”: 3.21,
“wind_3s”: 3.05,
“wind_10m”: 2.88,
“gust_10m”: 6.42
}
#include <ESP8266WiFi.h>
#include <PubSubClient.h>
#include <Wire.h>
#define MCP3425_ADDR 0x68
#define MCP3425_CONFIG 0b10011000
#define LSB_VOLTAGE 0.0000625
#define ZERO_OFFSET 0.013
// RPM変換式
#define A_COEF 93.90772448
#define B_COEF 330.10926145
#define C_COEF -26.44968412
#define K_WIND 0.018
#define WIFI_SSID "your_ssid"
#define WIFI_PWD "your_passwd"
const char* mqtt_server = "192.168.1.200";
#define LED 16
WiFiClient espClient;
PubSubClient client(espClient);
unsigned long lastSample = 0;
// 平均用
float wind_3s_buf[3];
float wind_10m_buf[600];
int idx3 = 0;
int idx10 = 0;
float gust_max = 0;
// ---------------- MQTT ----------------
void reconnect() {
while (!client.connected()) {
String clientId = "ESP8266-";
clientId += String(random(0xffff), HEX);
client.connect(clientId.c_str());
}
}
// ---------------- ADC ----------------
float readVoltageRaw() {
Wire.requestFrom(MCP3425_ADDR, (uint8_t)2);
if (Wire.available() < 2) return -1;
int16_t raw = (Wire.read() << 8) | Wire.read();
if (raw < 0) raw = 0;
return raw * LSB_VOLTAGE;
}
float readVoltage() {
float sum = 0;
for (int i = 0; i < 10; i++) {
sum += readVoltageRaw();
delay(50);
}
float v = sum / 10;
v -= ZERO_OFFSET;
if (v < 0) v = 0;
return v;
}
// ---------------- 風速計算 ----------------
float calcWind(float voltage) {
float rpm = A_COEF * voltage * voltage
+ B_COEF * voltage
+ C_COEF;
if (rpm < 0) rpm = 0;
return rpm * K_WIND;
}
// ---------------- 平均計算 ----------------
float average(float *buf, int size) {
float sum = 0;
for (int i = 0; i < size; i++) sum += buf[i];
return sum / size;
}
// ---------------- SETUP ----------------
void setup() {
Serial.begin(115200);
Wire.begin(4, 5);
Wire.setClock(100000);
Wire.beginTransmission(MCP3425_ADDR);
Wire.write(MCP3425_CONFIG);
Wire.endTransmission();
WiFi.config(IPAddress(192,168,1,100),
IPAddress(192,168,1,1),
IPAddress(255,255,255,0));
WiFi.begin(WIFI_SSID, WIFI_PWD);
while (WiFi.status() != WL_CONNECTED) delay(500);
client.setServer(mqtt_server, 1883);
pinMode(LED, OUTPUT);
// バッファ初期化
for(int i=0;i<3;i++) wind_3s_buf[i]=0;
for(int i=0;i<600;i++) wind_10m_buf[i]=0;
}
// ---------------- LOOP ----------------
void loop() {
if (!client.connected()) reconnect();
client.loop();
if (millis() - lastSample >= 1000) {
float voltage = readVoltage();
float wind_now = calcWind(voltage);
// 最大瞬間風速
if (wind_now > gust_max) gust_max = wind_now;
// バッファ保存
wind_3s_buf[idx3] = wind_now;
wind_10m_buf[idx10] = wind_now;
idx3 = (idx3 + 1) % 3;
idx10 = (idx10 + 1) % 600;
float wind_3s = average(wind_3s_buf, 3);
float wind_10m = average(wind_10m_buf, 600);
// JSON作成
char json[128];
snprintf(json, sizeof(json),
"{\"wind_now\":%.2f,\"wind_3s\":%.2f,\"wind_10m\":%.2f,\"gust_10m\":%.2f}",
wind_now, wind_3s, wind_10m, gust_max);
client.publish("weather/wind", json);
Serial.println(json);
digitalWrite(LED, !digitalRead(LED));
lastSample = millis();
}
}NODE-RED
ダッシュボード2

0-2V 方式風力計 フロー

[{"id":"c31a01828a7d6717","type":"tab","label":"0-2V 式風速計","disabled":false,"info":"","env":[]},{"id":"74c02f018504dd99","type":"mqtt in","z":"c31a01828a7d6717","name":"","topic":"weather/wind","qos":"2","datatype":"auto-detect","broker":"61e45e3515b67f80","nl":false,"rap":true,"rh":0,"inputs":0,"x":190,"y":200,"wires":[["ac1a366d1ac2439e","0f0fe984d5cf198c"]]},{"id":"ac1a366d1ac2439e","type":"json","z":"c31a01828a7d6717","name":"","property":"payload","action":"obj","pretty":false,"x":370,"y":200,"wires":[["66da9ef6123e54c9","2f641fe696a56153","0dbc4eba2af4d55b","5f9e09662e85ddd7"]]},{"id":"66da9ef6123e54c9","type":"function","z":"c31a01828a7d6717","name":"wind3s","func":"var temp = msg.payload.wind_3s;\nmsg.payload = temp + \" m/s\";\nreturn msg;\n\n","outputs":1,"timeout":0,"noerr":0,"initialize":"","finalize":"","libs":[],"x":520,"y":200,"wires":[["32d1e716c05ef4f4"]]},{"id":"2f641fe696a56153","type":"function","z":"c31a01828a7d6717","name":"avg10","func":"var temp = msg.payload.wind_10m;\nmsg.payload = temp + \" m/s\";\nreturn msg;","outputs":1,"timeout":0,"noerr":0,"initialize":"","finalize":"","libs":[],"x":510,"y":240,"wires":[["e1861955adadd532"]]},{"id":"0dbc4eba2af4d55b","type":"function","z":"c31a01828a7d6717","name":"max","func":"var temp = msg.payload.gust_10m;\nmsg.payload = temp + \" m/s\";\nreturn msg;\n","outputs":1,"timeout":0,"noerr":0,"initialize":"","finalize":"","libs":[],"x":510,"y":280,"wires":[["abefaff50b0c8deb"]]},{"id":"32d1e716c05ef4f4","type":"ui-text","z":"c31a01828a7d6717","group":"a2862a7d5d758378","order":1,"width":0,"height":0,"name":"3秒平均風速","label":"3秒平均風速","format":"{{msg.payload}}","layout":"row-spread","style":true,"font":"Arial,Arial,Helvetica,sans-serif","fontSize":"24","color":"#fafafa","wrapText":false,"className":"","value":"payload","valueType":"msg","x":690,"y":200,"wires":[]},{"id":"e1861955adadd532","type":"ui-text","z":"c31a01828a7d6717","group":"a2862a7d5d758378","order":2,"width":0,"height":0,"name":"10分平均風速","label":"10分平均風速","format":"{{msg.payload}}","layout":"row-spread","style":true,"font":"Arial,Arial,Helvetica,sans-serif","fontSize":"24","color":"#fafafa","wrapText":false,"className":"","value":"payload","valueType":"msg","x":700,"y":240,"wires":[]},{"id":"abefaff50b0c8deb","type":"ui-text","z":"c31a01828a7d6717","group":"a2862a7d5d758378","order":3,"width":0,"height":0,"name":"10分最大風速","label":"10分最大風速","format":"{{msg.payload}}","layout":"row-spread","style":true,"font":"Arial,Arial,Helvetica,sans-serif","fontSize":"24","color":"#fafafa","wrapText":false,"className":"","value":"payload","valueType":"msg","x":700,"y":280,"wires":[]},{"id":"0f0fe984d5cf198c","type":"debug","z":"c31a01828a7d6717","name":"debug 1","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","statusVal":"","statusType":"auto","x":340,"y":440,"wires":[]},{"id":"5f9e09662e85ddd7","type":"debug","z":"c31a01828a7d6717","name":"debug 2","active":false,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","statusVal":"","statusType":"auto","x":480,"y":360,"wires":[]},{"id":"61e45e3515b67f80","type":"mqtt-broker","name":"","broker":"192.168.1.200","port":"1883","clientid":"","autoConnect":true,"usetls":false,"protocolVersion":4,"keepalive":60,"cleansession":true,"autoUnsubscribe":true,"birthTopic":"","birthQos":"0","birthRetain":"false","birthPayload":"","birthMsg":{},"closeTopic":"","closeQos":"0","closeRetain":"false","closePayload":"","closeMsg":{},"willTopic":"","willQos":"0","willRetain":"false","willPayload":"","willMsg":{},"userProps":"","sessionExpiry":""},{"id":"a2862a7d5d758378","type":"ui-group","name":"風速","page":"cef20d4917f1c9a7","width":6,"height":1,"order":1,"showTitle":false,"className":"","visible":"true","disabled":"false","groupType":"default"},{"id":"cef20d4917f1c9a7","type":"ui-page","name":"気象","ui":"debf650e7f1343d3","path":"/page1","icon":"home","layout":"grid","theme":"a45c7f2adf09be21","breakpoints":[{"name":"Default","px":"0","cols":"3"},{"name":"Tablet","px":"576","cols":"6"},{"name":"Small Desktop","px":"768","cols":"9"},{"name":"Desktop","px":"1024","cols":"12"}],"order":1,"className":"","visible":"true","disabled":"false"},{"id":"debf650e7f1343d3","type":"ui-base","name":"画面名","path":"/dashboard","appIcon":"","includeClientData":true,"acceptsClientConfig":["ui-notification","ui-control"],"showPathInSidebar":false,"headerContent":"page","navigationStyle":"default","titleBarStyle":"default","showReconnectNotification":true,"notificationDisplayTime":1,"showDisconnectNotification":true,"allowInstall":true},{"id":"a45c7f2adf09be21","type":"ui-theme","name":"気象","colors":{"surface":"#505050","primary":"#505050","bgPage":"#505050","groupBg":"#5f5f5f","groupOutline":"#cccccc"},"sizes":{"density":"default","pagePadding":"12px","groupGap":"12px","groupBorderRadius":"4px","widgetGap":"12px"}},{"id":"7d2ef469527e1b9e","type":"global-config","env":[],"modules":{"@flowfuse/node-red-dashboard":"1.30.2"}}]
組み立て

PVK-BOK 購入先 アマゾン ¥703

後ろ面にケーブル用の穴2箇所開ける
前面にLED用の穴あける





購入先 横山テクノ 購入価格 ¥370

皿ねじで固定する

直径20mm 購入先 アマゾン ¥ 1,699 (10個)

x2個をM4ねじで固定する
未来工業のケースを使用します。
防水とは言ってないですが、特に問題は無いでしょう。
上部のねじ穴はパテで塞ぎます。
逆さにしたので底部をシリコンなどで塞ぎます。
風速計からのケーブルは、最短でカット接続します、引っ張りまわすとノイズが乗ります。
天板の風速計固定ねじはM4x10mm x4本 後部ケーブル穴は風速計用5mmφ 電源ケーブル用は
内径7.4mmのコルゲートチューブが入るサイズに。
前面LED穴は3mmφ
固定用に100x100x1.6mmの鉄板を風速計の裏面にM4皿ねじ2本で固定する。
固定台側にはネオジム磁石2個をM4ねじで固定する。
完成品と運用の様子

製作後の感想
手間のかかる子程かわいいとは良く言ったものでこの風速計は単純構造で、使えるものにするには非
常に手間がかかる代物だが、同時に学べる部分も多く、製作前よりも好感を持てるようになった。
ブラシモーターの平均寿命は3000時間程度らしいので半年後位に使えなくなる可能性もあるので換え
用のモーターは存在するのか調べて見た。
外見は「206」というモーターに似ているので本家マブチモーターの206モーターを取り寄せて互換
性の有り無しを確認した。
結果は、全く別物でした。
もし、マブチの206を補修に使用する場合には、物理的サイズは全く同じなので問題は無いが、特性
が異なるのでAMPのゲインから調整する必要がある、マブチモーター206の方が電圧が低いので増幅
度をもう少し上げる必要がある。
特性についても未知なので1から測定して近似方程式を求める必要がある。
そこまでする人は居ないはずなので(私以外は)新しいのを購入した方が早い。
既知の風速によるK値の測定はまだだが、今迄すべての方式の中国製風速計を購入して実際に製作して
来たなかでこの風速計プロジェクトに残る最後の課題は「風洞実験」だ。
まだ生きていれば、「自作の風洞実験装置」も作って見たい。
