私は2つの理由でADC-Piが好きではありませんでした:
- ネットワーク内の交流電流の強さを決定するために必要な測定周波数では、このADCは非常に大きな誤差を与えます(レジスタを完全に理解していなかった可能性が高い)
- LinuxでこのADCをRaspberry Piと組み合わせて使用すると、測定期間に必要な安定性を提供することが困難です。 このタスク専用のRTOS Linuxのインストールと構成は、特にシンプルで実績のあるソリューションがあるため、私には複雑すぎるように思えました。
すべてのArduinoにはすでにADC(8ビット、これで十分)があり、Arduinoのスケッチは必要な安定性で実行されます。RaspberryPiと通信するためのさまざまなオプションがあります。最も簡単なのはUSBケーブルです。 そしてもちろん、魅力的な価格です。
使用したバンドルは写真に示されています。
現在の強度を測定することは、1つの「しかし」ではないにしても、単純なタスクです。物理センサーは「うるさい」です。 この図は、512個の連続測定を行った回路の実際の電流インジケータと計算された電流インジケータの例を示しています。
したがって、交流電流を測定するタスクは、かなりの割合の誤差を含む実際の測定値セットから正弦波の振幅を計算することです。
ナンバーワンを試みる
ACフォーミュラ(忘れた人-wikiを参照)
i = Im sin(ωt+ψ)
ここで:
Im-最大電流値
ωは角周波数
t-変更の時間(シリアル番号)
ψは電流の初期位相です
分析ツールを使用して、必要なパラメーターを見つけようとすることができます。 そして、ここで嬉しい驚きがあります:昨年の秋(2013年)、Wolfram はRaspberry Pi用の素晴らしいMathematicaパッケージのバージョンをリリースしました。 無料(家庭用)。 そして、それを使用して、センサーから読み取ったデータを分析できます。
Raspberry Piで計算パッケージを呼び出す例:
pi@raspi ~ $ wolfram -script calc_current.wl datafile=/tmp/data.csv
コメント付きのcalc_current.wlスクリプト自体:
パラメーターとして渡されたファイルからデータを読み取ります。 ファイルには、<次元番号>、<値>という形式の行が含まれています。
data=Import[$CommandLine[[4]]]
データが読み取られると、高速フーリエ変換を実行して、既存のサンプルのおよその正弦波サイクル数を決定できます。 現在の強度の時間依存性は非線形であり、FFTによって計算され、初期値として送信されるおおよその角速度は、適切な正弦波パラメーターを選択する機会を大幅に増やします。
fourier=Take[Abs[Fourier[data[[All,2]]]],{2,256}]
最大FFT値がサンプルの平均と大きく異ならない場合、顕著な正弦波はなく、すべてのインジケータは「ノイズ」であり、実際の電流強度はゼロであると結論付けることができます。
topcycle=Ordering[fourier,-1]
avg=Mean[fourier]
top=fourier[[topcycle[[1]]]]
If[top < 10 * avg, Print["No AC"]; Exit[]]
顕著な正弦波が見つかった場合、最も顕著なサイクルを使用して関数のパラメーターを選択し、角速度の初期値を計算することができます。
nlm=NonlinearModelFit[data, a Sin[bx + c]+d, {a,{b, 2 Pi * topcycle[[1]] / 512}, c, d},x]
ADC(寸法1024、ベース電圧5V)とセンサー(私のバージョン0.185V / A)の物理的特性がわかっている場合、実効電流を計算できます。
imax=Abs[nlm["BestFitParameters"][[1]][[2]]] / (1024 / 5 * 0.185)
Print["Imax=", imax]
iefc=imax / Sqrt[2]
Print["Iefc=", iefc]
Print["Power=", iefc * 230]
提案された方法はほとんどの場合に機能します。 NonlinearModelFitが正弦波のパラメーターを正しく選択できなかったときの測定数は、約5パーセントでした。 ただし、wolframアプリケーションを実行するには、各測定に多くの時間がかかります(平均で5秒あります)。 したがって...
試行番号2
ネットワーク内の交流電流の周波数は安定しており(ロシアでは)50 Hzであるため、角速度は事前に計算でき、非線形回帰の代わりに線形回帰を取得できます。 実際に
または
XとYに関して微分すると、線形方程式系が得られます。
Kramerに従ってシステムを解いて、係数の値を取得します。
次に、ピタゴラスの定理によれば、最大電流値は次のようになります。
このアルゴリズムを実装するArduinoスケッチは、 Githubにあります。 この方法は良好な測定精度を提供します。図の回路では、測定された電流値は安定して0.13Aであり、これは230Vの電圧で29.9 Wの消費に相当します。 負荷として機能した電球の定格は30ワットです。
ところで、Arduinoにはリレー付きのシールドもあり、負荷のすべての制御および監視機能をこのプラットフォームに実装できます。 この場合、Raspberry Piは、たとえばWebサーバーを介して、シェダーとして、便利なユーザーインターフェイスを整理するためにのみ使用されます。