2017年5月27日土曜日

ブラシレスモータのコギングやトルクリプル抑制について考察(3)

はじめに

(1)がとても人気だったので(2)を書いたのですが、どうも一時的な人気だったようで需要がないと判断して今回が最後の回となります。
(1)と(2)を書いた後に実はハマっていたハンチング問題を解決することができたというのもあって
そのあたりについても少し触れていきたいと思います。

前回のまとめ

位置情報を微分すると速度になり、速度を微分すると加速度になり、加速度を微分すると加加速度になる。
加加速度を積分すると加速度になり、加速度を積分すると速度になり、速度を積分すると位置情報になる。
まず、この仕組みのどこを制御すればよいのかを考えます。
制御対象について
位置制御の場合、当然「位置」ですが、
位置を制御するには速度が必要で、
速度を制御するには加速度が必要で、
加速度を制御するには加加速度が必要、、、

上記の事を考えずにモータに電圧を流せば回るのですが、
一体何を制御しているのでしょうか。
最初に答えを書いてしまうと、
 最終的には加加速度を制御している
という事です。

まずブラシレスモータをコントロールするのにPID制御を使います。
このPID制御は、指示量Pは速度を指していて、Iは加速度の積分なので速度になるので
速度制御だという事が分かります。

では位置制御を行う場合、速度制御なPID制御で行えるかというとうまくいきません。
なぜかというと位置と速度は位相が90度ずれているからです。
PIDのゲインを最適値にすることである程度狙って位置で止まれるようになりますが、
外乱の影響などで条件が変わると最適な結果が得られません。
ではどうするかというと、速度制御の先の加速度を注目します。

加速度はΔt時間に進んだ時間であり、位置と180度位相がずれているパラメータです。
速度とは90度位相がずれています。
速度制御で位置をもとめようとどうしても止めたい位置で止められないというのは
位置と速度は90度位相がずれているからなので、
位置制御は加速度制御を行って速度を求めればよいわけです。

ハンチングを抑制するには

この問題は上の例と同じやり方で考えれます。
ハンチングは目標位置で止めようと頑張った証であり、
目標位置を何度も往復してしまっている状態です。
速度を落とせば収まると思っても加速度があって滑ってしまい
結果ハンチングとなってしまっているとも言えます。
ではどうやって収束させるのかを考えます。

・速度=0、加速度=0になれば完全停止になる。
・目標位置で止めるには速度が必要になる。

つまり、加速度=0な速度を作れれば良い事が見えてきます。
では加速度=0にする方法はどうすればいいんでしょうか。。
もう上の内容をおさらいすると答えが出てきます。
上の方式以外でFFTを用いたりZ変換したりいろんな研究は手法があるので
色々とやってみるといいと思います。


2017年5月24日水曜日

[UWP]VS2017でAdControlを用いて広告を挿入するには

はじめに

SDKをインストールするやり方がありましたが、VisualStudio2015までのやり方で
VisualStudio2017ではインストーラでインストールすることができません。
新しいやり方はNugetからインストールになります。




手順


Step1.Nugetから必要なライブラリをインストール

Nugetを開いたら
「Microsoft.Services.Store.SDK」
を検索して追加する。

Step2.参照の追加

参照マネージャーを開き、「Universal Windows」→「拡張」を開き
「Microsoft.Advertising.SDK fot XAML」にチェックを入れてOKボタンを押します。

これで設定完了です。
後は今まで通りに
XAMLを開き、
最初のPageタグの属性に
xmlns:UI="using:Microsoft.Advertising.WinRT.UI"
を追加する。
広告挿入は、

        

のようにする。

もし「クラスが登録されていません」というエラーが出た場合は
ビルドターゲットを[x86]や[x64]など切り替えると解消されるようです。

思った事

ここまで書いて1つ気づいたのが、ようやくAdControl挿入で広告が表示されるようになった事。
今までエラーしか返ってこなかったのでCreators Update以降になって1つ前進した感じがします。
あとは額面でAdmobよりレートの良いものとなってほしいです。
感覚的には今はAdmobの10分の1くらいなんじゃないだろうかってくらいしょぼいです(´・ω・`)


参考URL

https://docs.microsoft.com/ja-jp/windows/uwp/monetize/microsoft-store-services-sdk#a-nameinstall-the-sdkasdk-のインストール



2017年5月22日月曜日

アニサキスには正露丸が効く(動きを止める)

アニサキスとは、サバなど解鮮魚の中にいる寄生虫である。
普段は胃に入っているが捕まえて魚が死んだとき、胃壁を突き破って身の中に入ってくる事が原因のようだ。
知らずに鮮魚を食べてしまうと人間の胃の中に入ってしまい、胃の中に入ったアニサキスは胃壁を突っついてしまう。
胃には神経がないので痛くないのだが、アレルギー反応を引き起こすことで胃に激痛が走るようだ。
 

この対処方法の1つとして、、
2017年5月22日の羽鳥慎一のモーニングトークショーの特集でやっていたのですが、

正露丸が効果あるようです。



番組の紹介によると、

正露丸の特許を取る時に科学的実証実験を行った効果、
アニサキスの動きを抑制する効果がある

しかし薬事法の関係で明記することはできないようなので、こういった番組で紹介してくれるととても有益な情報だし、いざ自分がなった時にセルフケアができるのはいいですね。




2017年5月20日土曜日

人感センサーHC-SR501を使ってみる



Aliexpressで送料無料で1$切ってる人感センサーHC-SR501を購入してみた。

製品仕様



  • 電源電圧:DC5-20V
  • 待機時消費電流:65μA以下
  • 出力電圧:3.3V
  • 動作モード:L=リピートOFF、HはリピートON(デフォルト)
  • 遅延時間範囲:0.3秒から18秒
  • 待機時間:0.2秒
  • 基板サイズ:32mm*24mm
  • 検知角度:120度
  • 最大検知距離:7m(気温等の環境条件により変化あり)
  • 操作温度:-15~+70℃
  • ネジ穴:2mm、28mm間隔
  • レンズ:直径23mmドーム型

  • 回路図やピンアサインの情報は上記Amazonで並行輸入販売してる人や使い方Q&Aも載っていてぜひ覗いてみてください。

    データシートやサンプルプログラムなどはココにありました。
    上記製品仕様も引用させていただいております。

    簡単な使い方

    この人感センサーはシンプルで入力は5V300mA程度の電源に3.3V出力のピンの3つだけです。感度調整やON維持時間はトリマーで直接調整します。

    これを使って部屋の照明に人感センサーを取り付けてON/OFFさせたり、玄関で人が来た時に照明をつけたり、RaspberryPiを使えばIoTと称して人感センサーの反応をWEB上に通知したりカメラも取り付けて監視カメラにしたりできる事が増えて夢が広がりますね。

    もちろんArduinoでも使えます。
    使う場合は5VとGNDと入力ポート1つ使う程度のものなので、通信処理も書かずに簡単にできます。Lチカの入力ポート版と同じレベルですので是非実験に使ってみてはいかがでしょうか。

    参考サイト

    http://henrysbench.capnfatz.com/henrys-bench/arduino-sensors-and-input/arduino-hc-sr501-motion-sensor-tutorial/



    2017年5月15日月曜日

    ブラシレスモータのコギングやトルクリプル抑制について考察(2)


     意外とブラシレスモータの話にアクセスが多かったので前回の続きをもう少し掘り下げて書きたいと思います。


    まず、ブラシレスモータを3相UVWで回せるようになって位置制御や速度制御をしようとしたとき、ハンチングや速度のムラが生じてきます。


    制御の難しさ



     論理的にはあっているはずなのに、、

    と思っても

     CPUからの回転指令は電圧
     モータの実動作は電流
     ブラシレスモータはコイルで磁界を作る
     コイル特性
     磁界ムラ
     回路誤差
     外乱の影響
     ギアボックス特性
     、、、

    考え出すとものすごくたくさんの要因があって、それをPID制御で動かそうとなると
    Pはすぐ解決するけど、I=全外乱の影響の累積値となり、D=側近の反発力
    それが回転するたびに波打つように値が変化していて
    フィードバック制御で行っているのでどうしても制御遅延が生じてしまう。

    これが意外と致命的な結果となり、ハンチングや速度のムラとなります。

    じゃあフィードフォア―ド制御で解決すればいいじゃん!ってことで
    世の中には色んな論文が出ています。
    主な例としては、過去のデータをフーリエ変換(FFT)して周波数特性でピークとなっている周波数成分を足すことで解決するという技があります。
    実際、電流のムラが2倍近く改善しているので有効手段です。
    が、しかし低スペックマイコンで制御するには若干パワー不足な面もあります。
    そこでより原始的な方法で解決する手段を書いていきたいと思います。

    SIN・COSの性質


     意外とこれが簡単で一番難しい部分です。
    ちなみにSINやCOSを微分するとどうなるでしょうか。
    高校生の数学で習うようですが完全に忘れてました。

     積分すると位相が90度遅れる。
     微分すると位相が90度進む。

    らしいです。

     電気回路では
     90度遅れる=コイル
     90度進む =コンデンサ

    です。

    ここで電気回路と数式が一致しました。
    ここからが本題です。

    ①モータ部

    ブラシレスモータはコイルでできているので、
    CPUからの指示に対して90度遅れる。

    ②制御部

     位置(0度)を微分すると、速度(+90度)になる。
     速度(+90度)を微分すると、加速度(+180度)になる。
     加速度(+180度)を微分すると、加加速度(+270度)になる。

     速度(+90度)を微分すると、位置(0度)になる。
     加速度(+180度)を積分すると、速度(+90度)になる。
     加加速度(+270度)を積分すると、加速度(+180度)になる。


    微分と積分

    基本は速度制御で速度指令を行うと、結果が90度遅れの位置となる。
    この性質を利用することで位置制御が行える。

    ③CPU部

    ・位置制御  ・・・ 位置を基準に速度を調節する。
     ・速度制御  ・・・ 速度を基準に加速度を調節する。
     ・加速度制御 ・・・ 加速度を基準に加加速度を調節する。


    実際は加速度制御まではやらなくて良いので、今回は位置制御と速度制御に焦点をあてていきます。

    モータはコイルなので必ず指令に対して90度ずれます。

    例えば

    速度制御の場合、
    速度指令にCos波を入力します。
    すると加速度は90度遅れるのでSin波となって出力します。

    実動作を見るとどうなっているでしょうか。
    進んだり、戻ったりを繰り返すと思います。

    位置制御の場合、
    指定位置を気にしなければ速度制御と同じになります。

    指定位置を気にすると若干ややこしくなります。
    どういうことかというと速度制御でも示したように
    加速度は90度遅れているのです。


    という事は
    速度指令に0を入力しても、加速度≠0ならば急には止まれず
    必ず90度位相分遅れて止まります。

    位置制御の難しさはここにあります。


    具体的な解決方法としては、この90度位相遅れを加味したSin波を入力してあげればよいのです。(言うのは簡単)

    どういうことかというと、
    ベースのSin波に狙った位置で止まるSin波を合成させてやります。
    するとベースのSin波を0にしたとき、90度遅れで止まるのは変わりないのですが、狙った位置で止まるようになります。

    位置制御はこうやって行います。
    もう少しヒントを書くと速度制御+加速度制御が位置制御になるような感じです。


    今日はここまで。




























    2017年5月10日水曜日

    ブラシレスモータのコギングやトルクリプル抑制について考察

    しばらく悩んだ内容をメモします。

    続編書きました。

    ブラシレスモータのコギングやトルクリプル抑制について考察(2)



    コギングとは

    低速回転でベクトル制御(D=1、Q=0)で回転させたときに発生する回転のひずみ。


    トルクリプルとは

    ベクトル制御(D=0、Q=1)で回転させたときに発生する回転速度のムラ。
     応答遅れなどによる時定数があるので、即応性が得られず遅延を考慮する必要がある。


    コギングの問題

    ・静止時の位置決めの精度に影響を及ぼす。
    ・回転時のトルクリプルに影響を及ぼす。


    コギングの補正案

    ゴール:ベクトル制御(D=1、Q=0)できれいな円を描けるようにする。

    成功案

    ・UVW出力波形に第3高調波成分を付加することで回転の動きが変わる。

    失敗案

    ・ベクトル制御(D=1)は固定してQ成分を付加するとモータが音鳴りする。
    ・ベクトル制御(Q=0)は固定してD成分を変動させても効果がない。


    トルクリプル補正案

    ゴール:ベクトル制御(D=0、Q=1)で速度を一定にする。

    成功案

    ・速度制御、加速度制御の2ブロックで制御する。

    未検証案

    ・フーリエ変換を用いてUVW波形を生成する。




    加減速について

    制御の視点をどこに置くかで変わるし、外乱の影響や遅延時間がとても影響していて何とも言えない部分。


    加速側

    ・タイムチャートの時系列を基準に制御した時、外乱の影響や遅延時間を考慮しなければならないので現実的ではない。
    ・現在速度を基準に制御した時、タイムチャート通りの変化は得られないが外乱の影響や遅延時間を考慮しなくてよくなる。

    減速側

    ・タイムチャートの時系列を基準に制御した時、減速中にもかかわらず加速したり減速したりして波打つ。
    ・現在速度を基準に制御した時、最初の遅延時間が影響して遅れて減速が始まる。
    ・停止位置を考慮する場合も遅延時間が影響して最適な速度が得られない。


    まとめ

    以上の問題1つ1つが悩ましい問題で、モータ固有の特性も考慮しなくてはならないし、すべてが明確な解決方法というのが存在しない。
    こういう自分は画像処理のフィルタ処理を思い浮かべて考えている。
    画像処理にはノイズだらけの画像をきれいに見せるのにメディアンフィルタやソベル、ラプラシアン、ガウシアン、NL-Meanなどいろんなフィルタがあり、これらフィルタリング技術はそのままブラシレスモータにも転用できるからである。
    ブラシレスモータの場合、フィードバック制御内で計算するので、計算処理自体軽くする必要があるので、軽くて一番効果が期待できるメディアンフィルタが一番最有力。本来はガウシアンフィルタにしたいけど、計算量が増えるのでまだ導入はしていない。
    あとオーディオ関係のノイズフィルタでKL法というのがあり、これも試してみたところではある。


    最後に色ぶつかって通ってきた道のりを書いておきます。

    レベル1.モータを動かすまで
     ブラシレスモータを扱うにはまずUVW3波出力する所から始まります。
    その次にFETのターンオン・ターンオフ時間、デッドタイム補間を行わないといけないのが分かってきます。
    それらを攻略してオシロでUVW波形を見てみるといびつな波形をしてて訛っています。
    これが先ほどのデッドタイムの影響+回路上の誤差。
    これが個体ごとに異なっているのです。
    単純にUVW波形を出力するのからPWMのスイッチング周期時間とUVW波形のセクタを考慮してタイミングの調整が始まります。
    調整が終わるとモータの出力トルクの改善が実感できます。

    レベル2 回転を制御する。
     ここでベクトル制御の実装が始まります。
    ベクトル制御はD,Qの値で回転指令するものなので、そんな難しく考える必要はないです。
    まずは現在の電気角、これをDベクトル、電気角を基準に進角方向をQベクトルとします。
    これをDQ変換とか、AB変換など単語が出てきますがレベル1で作ったUVWテーブルがあれば、角度とDQ値さえ分かればなんとかなります。

    レベル3 速度制御する。
     ベクトル制御ができるようになったので、D=0、Q=1指令すると回転します。
    もちろんQの値を弱めれば遅い回転になっていると思います。
    しかしよく見ると回転ムラがあることに気が付きます。
    ようこそ、ここが樹海の入り口です。
    そのムラはトルクリプルといいます。詳細は上へ。。


    レベル3 位置制御する。
     モーターを回すだけじゃもの足りなくて、電気角で現在角度が分かるならモータで位置制御ができるだろうという考えで進みます。
    位置制御というのは、目的地点まで移動させ停止させるものですが、これが意外と厄介。モータの遅延時間というのが存在するという事に気が付く。
    目的地でD=1、Q=0にすればすぐ解決するのだが、モーターが発熱するのでD=0、Q=1で目的地で静止させたい。そんな欲望丸出しで突き進むと回転させるベクトルを停止させるにはモータの遅延時間を予測して外乱とモータ出力を均一化する作業となる。
    さらに低出力で低回転させてると途中で止まってしまう問題と出くわすと思います。
    ようこそ、ここが樹海の入り口パート2です。
    その止まってしまうのはコギングといいます。詳細は上へ。。

    レベル4 高効率化へ
     レベル2とレベル3が割とヘビーな問題でレベル1が全部ひっくり返すくらいのインパクトを持つ問題点なので、どの程度までチューニングするかは人によると思います。
    大型モータを扱わなければ特に気にしなくてもいいのですが、世の中にはVVVF制御というものがあります。最近の鉄道関係はこのVVVF制御で音階ドレミを鳴らしたりMIDIを再生したりモータを楽器にして動画にしてる人がいてびっくりします。
    このVVVF制御というのはPWM周期をいじって低回転の時は大電流を流して、高回転の時は小電流にしようという技です。
    具体的には電圧÷周波数を一定になるように変化させていきます。電圧を強くすれば音が強くなるので遊びながらいじってみると楽しいですよ。


    続編書きました。

    ブラシレスモータのコギングやトルクリプル抑制について考察(2)


    Androider