カテゴリー
ESP8266+ESP32+RISC-V

照度センサで測定する回転数 RPM計 for M5Stack 製 M5StickC

照度センサ値の時系列データの変化から回転数を推定する方法について説明します。軽量な M5Stack 製 M5StickC Plus を使用するので、レコード盤の重さによる回転数の違いも測定できます。

前回はジャイロセンサを使用

前回は、M5Stack 製 M5StickC に内蔵されたジャイロセンサを使って、レコードの回転数 RPMを測定する機器を製作しました。

今回は照度センサを使用

今回は、M5StickC Plus に、M5Stack製 DLight HAT; Ambient Light Sensor を接続し、照度センサで回転数を測定してみます。

M5StickC Plus に、M5Stack製 DLight HAT; Ambient Light Sensor を接続

レコード盤の重みによる回転数 RPM値 の違いも測定可能

今回も、レコード盤の上にのせて測定することができるので、レコード盤の重みによる回転数の違いも測定することができます。

下図は、レコード盤の中央部に M5StickC Plus を配置したときの様子です。回転中にレコード針にあたらないようにします。

レコード盤の上に乗せることができるので、レコード盤の重みによる回転数の違いも測定できる

なお、測定値は目安値です。

M5StickC Plusと DLIGHT Hatの重さ分が増えた分の誤差をはじめ、センサデバイスのセンサ値とタイミングのずれなど、様々な要因で誤差が生じます。

測定値には誤差が含まれるので目安

実力的な測定精度は33RPM時に±0.1RPM程度だと思います(後述)。

照度変化の周期性を利用する

レコードプレーヤのターンテーブルなど、回転盤上の照度は、回転数と同じ周期で照度が変化します。

下図は照度の変化の一例です。センサが回転し、複数(1以上)の方向からの光の強弱から、回転周期を推測することができます。

複数の方向からの光の強弱から、回転周期を推測することができる

自己相関ピークのラグ値を算出する

複数の光源の情報を利用するために、照度センサから得られた2周期分以上の時系列データを使用し、自己相関が最大となるラグ値を求めました。

自己相関は、時間t、ラグkに対し、以下の式で求めます。

∑ data[t] * data[t + k]

下記は、今回の自己相関ピークのラグ値を算出する関数です。

int calculate_autocorrelation_peak_lag(uint16_t data[], int n) { 
    float max_autocorrelation = -1.0; // 最小の初期値を設定
    int peak_lag = 0; // ピークが現れるラグ値を保存
    for (int k = n/6; k < n/2; k++) { 
        float sum = 0.0; 
        for (int t = 0; t < n/2; t++) {
            sum += (float)data[t] * (float)data[t + k];
        }
        float autocorrelation = sum / (n / 2);
        if (autocorrelation > max_autocorrelation) {
            max_autocorrelation = autocorrelation;
            peak_lag = k;
        }
    }
    return peak_lag;
}

作成したプログラム:
https://github.com/bokunimowakaru/m5/tree/master/stick_cplus/ex52_rpm_lum

実行例

はじめに、上記のプログラムをM5StickC Plusに書き込んでください。起動後、M5ボタンを4回、押下すると、照度センサ測定モードに移行します。この状態で、M5StickC Plusの側面(G39)を押し続けると、下図のように画面左上に[Calb]が表示されます。

照度による回転数測定を始めたときの表示

この状態で、ターンテーブルに置いて、しばらくすると、自動的に平均値を計測し始め、表示値が実際の回転数に近づいてゆきます。

1分ほど待って、下図のように回転数 RPM表示が白色になったら、測定完了です。

回転数 RPM表示が白色になったら、測定完了

測定が終わると、同じ画面を表示し続けます。M5StickC Plusの側面(G39)を押すと、元の状態に戻ります。

平均回数は10回です。また、±1 RPMの変化があると、平均処理をやりなおすようにしました。これにより、自動的に安定するまで待ってから計測できます。

サンプリング間隔の設定時に、誤差が約±0.1 RPMになるように設計し、平均回数10回によって誤差を√10分の1すなわち、±0.03 RPM程度まで減らすようにしました。実際の精度は他の要因などで増加します。

より正確な測定

環境によっては、赤文字のRPM表示が続き、測定が完了しないことがあります。例えば、照明機器の目に見えない点滅の影響を受ける場合や、本機の回転によって照度差が生じない場合などです。

そういった場合は、下図のようにLEDライトなどの光源を用いることで、より正確な測定が可能です。但し、光量を調整できる光源は、調光時に高速に点滅しているので、正しく測れない場合があります。

光源を明確にすることで、より正確な測定が可能(写真の画面は古いバージョン)

電流と応力で回転数が変化するDCモーター

DCモーターの回転数は、主にモーターに流れる直流電流と、回転時の応力すなわち回転に対する負荷によって決まります。このため、工場出荷時に、一般的な使用状態で正しい回転数が得られるようにモーターの電流を調整しています。

33 RPM / 45 RPM切り替え端子付きのDCモーター

上図のモーターの場合は、4つの入力端子があり、右側の2つの端子で33RPMと45RPMに切り替えることができます。また、モーター本体の黒色の2つの穴の中に可変抵抗器が入っています。左側が33RPM用、右側が45RPM用です。それぞれの回転数に適した電流を設定することができます。

回転数の変化要因

一般的なベルトドライブ方式では、ターンテーブルの負荷によって回転数も僅かに変化します。ベルトの伸長によっても回転数が一時的に変動しますが、通常はモーターそのものの回転の変動を抑制する効果の方が大きいです。

実際のターンテーブルのようすを確認してみました。モーターの回転軸には、下図のようなキャプスタンが取り付けられており、このキャプスタンが回転します。

モーター部(ベルト無し)のようす

下図はキャプスタンにベルトをかけたときのようすです。このベルトを経由して、ターンテーブルを回転させます。

モーターのプーリーにベルトをかけたようす

このような仕組み上、回転数の変化要因には主に以下のようなものがあります。

  • モーターの電流
    • 設定値(回転数の調整用)
    • モーターの電源電圧
  • モーターの負荷
    • ターンテーブルやレコード盤の重さ
    • ベルトの張力
    • 各回転軸(モーター含む)の負荷、摩耗、構造的劣化

レコードプレーヤは、電気的な特性だけでなく、構造的な特性もアナログです。レコード針が繊細であることは容易に理解できると思いますが、ターンテーブルも同様に緻密で繊細なバランスで特性が保たれています。ターンテーブルを手で強く押したり、重量物を置いたりしてスピンドルが劣化してしまった場合は、修理すらできなくなります。

レコード盤の重量よる回転数 RPM値の変化

本稿の目的であるレコード盤の重みによる回転数の違いを測定してみたところ、変化を確認できました。詳細は、下図をクリック(またはタッチ)ください。

ご注意

本ページで紹介した製作品は計測機器ではありません。性能表示などに使用することはできません。センサ個体のばらつきなどによる誤差もあります。

実験を行うときは、必ず保護メガネを着用してください

回転の開始時や停止時には M5StickC Plus に加速度がかかります。また、回転の中心からの位置によって M5StickC Plus に遠心力がかかります。こういった応力によって、M5StickC Plus の位置がずれて、レコード針などを破損させてしまうことや、場合によっては飛び出して人体や目に接触する可能性なども考えられます。十分に注意してください。

by bokunimo.net

「照度センサで測定する回転数 RPM計 for M5Stack 製 M5StickC」への2件の返信

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください

 - 
Chinese (Simplified)
 - 
zh-CN
Chinese (Traditional)
 - 
zh-TW
English
 - 
en
French
 - 
fr
German
 - 
de
Italian
 - 
it
Japanese
 - 
ja
Korean
 - 
ko
Russian
 - 
ru
Spanish
 - 
es