2017年7月22日土曜日

tiny 10-DOF GY-91 sensor module

GY-91とは

10軸ものセンサーが小さな基板に実装されていて1000円未満。めっちゃ安いし扱いやすい。
10軸といっても一体何が入っているのか仕様を見てみると、

Technical Specifications

  • Model / Part Number: GY-91
  • Sensor Chips: MPU-9250 + BMP280
  • Interface: standard IIC / SPI communications protocol
  • Operating Voltage range: 3.0V – 5.0V (on-board low dropout regulator)
  • Module size 14.3mm * 20.5mm
  • Resolution: 16bit AD converter, 16-bit data output
  • Gyroscopes range: ± 250, 500, 1000, 2000 ° / s
  • Acceleration range: ± 2 ± 4 ± 8 ± 16g
  • Field range: ± 4800uT
  • Pressure range: 300-1100hPa
  • Using Immersion Gold PCB, machine welding process to ensure quality
  • 2.54mm pitch

Pinouts

  1. VIN: Voltage Supply Pin
  2. 3V3: 3.3v Regulator output
  3. GND: 0V Power Supply
  4. SCL: I2C Clock / SPI Clock
  5. SDA: I2C Data or SPI Data Input
  6. SDO/SAO: SPI Data output / I2C Slave Address configuration pin
  7. NCS: Chip Select for SPI mode only for MPU-9250
  8. CSB: Chip Select for BMP280

ジャイロ、加速度、磁気、気圧があるようです。

他に湿度センサー、GPSセンサー、光度センサー、赤外線センサーなどが必要であれば別途追加すればいいですね。


このセンサーモジュールはArduino用ライブラリが存在してます。

Documents and Downloads





2017年7月16日日曜日

[C#]BingMAPの使い方

もう手っ取り早くざっくりと。

Step1.アカウント作ってKeyを取得する。
 https://www.bingmapsportal.com/

Step2.UWPアプリのプロジェクトを新規作成する。
XAMLタグで

       

を追加して
maps:MapControlの所にカーソル合わせて CTRL+「.」を押してusing参照を自動挿入してもらう。

これでOK

他、

現在位置を設定する場合、
Geopoint情報を作って
new CreateFromLocationAndRadius(geopoint, zoom)インスタンスを
TrySetSceneAsyncする。

ストリートビューにするには、
map.Center = geopointして
panorama = StreetsidePanorama.FindNearbyAsync(myMap.Center)インスタンスを
map.CustomExperience = StreetsideExperience(panorama)する。

現在位置に移動するには、
マニフェストにlocationにチェックを入れて
Geolocator.RequestAccessAsync();でまずGPSアクセス許可を求める。
Geolocatorインスタンスから現在位置情報を引っ張ってくるのだけど
定期的に位置情報を取得する場合はReportIntervalに更新間隔msをセットすると
PositionChangedイベントが発行される。


参考URL





2017年7月15日土曜日

ブラシレスモータのセンサレス制御について考察

ペア数の違いからセンサレス制御が必要になった理由

 今までセンサありのベクトル制御を行っていたのだが、他のブラシレスモータでペア数が多いブラシレスモータに出くわしてしまった。

ペア数が少ないものだと、

 6P4N?なら正弦波4回転で実際は1回転
 24P22N?正弦波88回転で実際は1回転

となる。

ペア数が少ないものならエンコーダ12bitなら1回転4096分解能なので

 4096/360*4 = 2.84分解能/度

これならエンコーダ基準にして問題なかったのだが、

 4095/360*88 = 0.129分解能/度

となるとエンコーダの分解能が最低でも15bit必要だという事になる。

エンコーダ分解能が足りない場合は、

 ホールICが必要

という結果になった。

でもペア数が多いものだとホールIC搭載モデルって見た事ない気がするので

 センサレス制御が必要

という結論になった。


戦略1:内部位置カウンタを用意する。

エンコーダ基準で制御していた場合は、エンコーダ値から単純に次のUVW波形を計算すればよかったけど、それができないので
エンコーダはあくまで脱調してないかのチェック用。
(もし位置ずれしていたとしても分解能が足りてないので正確な位置に戻せないが、、)

やり方として
 Step1.移動量を算出して、回転させる。
 Step2.予想現在位置とエンコーダ値を比較して脱調してないかチェック
 Step3.脱調した時点、もしくは目標位置到達で停止

回転させるときは、VVVF制御ならセンサなしでも回せるけど
ベクトル制御にするなら現在の電流角を把握する必要があり、センサレス制御が登場してくる。

戦略2:センサレス制御を導入するかについて考える

ゼロクロス点は電気角360度中に6点存在する。
1回転するのに電気角で88回転必要なら6*88=528点ある事になる。
このタイミングで位置ずれを検知してすべり角を補正することが可能となるけども、
これが必要かどうか。

今回の場合、
 出力角360度=エンコーダ4096分解能=ゼロクロス点528個

エンコーダ基準にした場合
 4096<31680 p="">
ゼロクロス点(60度)を最小単位にした場合、
 4096>528=多少粗いけどOK

電気角45度を最小単位にした場合、
 4096>704=多少粗いけどOK

電気角8度を最小単位にした場合、
 4096>3960=OK

となる。

電気角8度でエンコーダ角1分解能取れるなら誤魔化してしまえばいいのかななんて思ってみたり。

ちなみに電気角1度は1/360/88度に相当するので問題ない範疇だったりするので。

結果
エンコーダがあるなら電気角最小単位を1だったのを8などに増やしてしまえば何ら問題ない。





2017年7月10日月曜日

ブラシレスモータ(brushless motor, BLDC)のベクトル制御について

日本語・英語共にまとまった情報がないので、RCラジコンやドローン、ジンバルなどで遊ぶ人が増えてほしいとお思いつつ備忘録として残しておきます。

ブラシレスモータって?
 ミニ四駆とかに使われてるDCモータは電源入れれば回ります。
中にブラシと呼ばれるものがあってそれで磁石のNS方向を自動で変えて回転します。
ブラシレスモータはそのブラシがないモータで、電源入れても回転しないし、線が±2極ではなく、UVW3線になっています。

ブラシレスモータのメリットは?
 ブラシがない事がメリット。このブラシがスイッチの切替するたびにバチバチ火花や逆起電力が発生してノイズがでまくります。そのブラシが内のでノイズは少なくなるのでDCのファンはすべてブラシレスが用いられているようです。

ブラシレスモータのデメリットは?
 電源入れただけじゃ回らないことでしょう。これが敷居を高くしてます。有識者しか回せない、1つ上のモータでしょうか。この辺りはステッピングモータも同じですが、ブラシレスモータの利用者が少ないせいかネット上に豊富な情報はなく断片的だったりします。

どうやって動かすの?
UVWと呼ばれる3線に3相交流を流します。
制御方式は、VVVF制御、ベクトル制御(センサあり、センサなし)の3種類くらいでしょうか。

VVVF制御
 スカラー制御と呼ばれていて、通常のACモータと同じで実際の回転を考慮せず3相交流の周波数を変えて3相交流を供給します。この時、電圧と周波数の比率が一定になるように回転させるのが特徴で、電車の発信音のように低音から高音に変化していく音が聞けます。
回転時にでる高音は、インバータ音。音量は電圧に比例します。
それともう1つ、モータの回転する低音です。モータの回転数=周波数となって出てきて、音量はメカや取り付け方で変わってくるようです。


ベクトル制御
 ブラシの役割と同じ事をエンコーダなどを使ってフィードバック制御でやろうというものです。ブラシの代わりとしてホールセンサを使ったり、エンコーダを使ったり、電流値で観測させる逆起電力を観測してりやり方は色々あります。

 ブラシモータと同じやり方で回すなら、矩形波駆動で十分と思われます。
PC用のDCファンはこのやり方だと思います。
(マブチモータにも言えるのですが、電気を流している状態でモータの回転が止まってるとコイルに大電力が流れて焼けて燃えたりするので注意です。)

 ブラシレスモータは3相交流なので、一般的には正弦波で電源を供給します。
ただ正弦波を供給するだけならスカラーであるVVVF制御になります。
ベクトル制御はエンコーダで現在位置を基準に正弦波を供給します。
ここで新たに進角という概念が出てきます。
 現在位置を基準ベクトル0度とした場合、
  進角が0度ならブレーキ
  進角が±90度なら回転 CW/CCW

となります。
この辺りでDQ変換、クラーク変換、パーク変換と呼ばれてる部分ですが、
平たく説明すればモータの現在位置を知ってから進角を足した3相交流を出力するというものです。
実際に実装する時は3相交流のテーブル作ってベクトルなんて計算せずにやってしまうのですが、原理原則は知って損はないと思います。

センサレス(逆起電力検知)は、ゼロクロス点といわれるちょうどサイン波でゼロになる位置で逆起電力が発生するという事実に基づいて実装されるのですが、
得られる角度はホールICと同じで分解能が低いです。


まとめると、

モータの回転位置を
 気にせず3相交流を流す=VVVF制御
 気にして3相交流を流す=ベクトル制御
  正確な位置が
   必要ならエンコーダ、
   不要ならホールIC、センサレス

という分類に分かれます。


今日はここまで。

2017年7月8日土曜日

ドローンを使って受粉作業する



下記URLを見てびっくりした。

http://www.gizmodo.jp/2017/02/drone-pollinate-like-bee.html


世界中でハチが激変してる中、受粉作業というが重要
超小型ドローンを使って受粉させようという試みである。

この受信作業をどのようにやるのか。
綿棒とかでぐりぐりするのしたり専用ジェルを塗ったり色々思いつくことはあるんだけど、答えは意外と原始的。
ドローンを花びらに向かって落下させるというもの。。

これで成功したと書かれてるけど実用レベルに達していないのは一目瞭然だし
小型ドローンでも1万くらいするので、

・ハチを増やす環境を作る
・ドローン大量稼働して受粉作業の自動化を構築する


さてどっちがコスパが良いのだろうという話になる。


ドローンも基本構成部品で思いつく部品って
コアレスモータ4つ
本体1つ
通信・制御基板1つ
カメラ1つ
バッテリー1つ

くらいなので
これ全部込みで3000円で全自動で30分くらい動いてくれると面白い事になりそう。


2017年6月4日日曜日

ESP8266マイコンを安定させる方法

ESPマイコンって不安定?

ESP8266が出た当時Wifi搭載マイコンで爆発的に有名になったマイコンを購入してそのままにしてたのですが、Bluetooth搭載になったESP32マイコンが最初から技適対応して秋月で入手可能という事でぼちぼち遊び初めてみたのですが、意外にマイコンが安定してないのなんの。。
ファーム書込み後mシリアルコンソールから出てきたものはException(0)を繰り返していたり、全く微動だにしなかったりパターンは様々ありました。

これ使い物になるのか?って思いつつ試行錯誤して出た結果があるので、メモを残しておきます。


ESP8266マイコンについて

まず不具合でたマイコン使い物ならないって高飛車にならず、まずは扱い方を知るべきでしょう。
新参者なのでたまたま仕様書と実装が一致していない、一般的な使い方ではないなど色々あると思います。
製品として出荷され数も出て次のバージョンも出たりしてるところを見るとちゃんと動かせる方法があるんだという視点で正解を探していくのがこのマイコンを使うためのデバッグ手法だと思っています。

ということでインターネットで同じ不具合に悩まされた言葉を見てみたところ、

・仕様書に書かれている回路になっていない。
・Wifiモジュール起動時の突入電流が1Aくらい出る。

この2点に尽きるようです。

Note: If the power management IC is connected with the power-on enable pin CHIP_EN,
it can control the power on-and-off of ESP8266EX by output high and low voltage through its GPIOs.
However, pulsed current might be produced at the same time.
In order to delay the transmission of pulsed signal and avoid unstable current of CHIP_EN,
a RC time-delay circuit (R=1kΩ, C=100nF) is needed.
There is an internal pull-up in the CHIP_EN pin, so no external pull-up is needed.



CHIP_ENにプルアップ抵抗1kΩと0.1uFのコンデンサ入れとけよって内容ですが、実際プルアップはされてるようなのでコンデンサを追加するくらいで良いようです。

でもこの記事ってESP8266EXなんですよね。。

1つ前のESP8266はどうしたらいいんだって思ったのですが、根本的な理由は2つ目のWifiモジュールが起動したときの突入電流が原因で、CHIP_ENで起動を遅らせようって趣旨のようです。
つまり突入電流を抑えられればいいわけで、、
USBポートは5V0.5A(2.5W)出力なので3.3Vに落としても1A出ないという事から
Exceptionエラーが出るのを繰り返す理由は突入電流分パワーが出せないので
電圧降下してリセットしてしまっているようです。

では対策をどうしようかと思えば、一番簡単な方法で瞬間的な電圧降下さえ防げればいいので、3.3V-GND間にコンデンサを突っ込んでおけば回避できるのではないかっていう事です。

っていうことで家にあったタンタルコンデンサ0.1uFを早速入れてみたところ、見事解決しました。

電気屋さんにきけばもっといい解決策はあると思うのですが、小手先のテクニックで解決するには電源を安定化させるのに尽きそうです。

結論

電源を安定化させろ

でした。

ではでは


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)


    2017年4月17日月曜日

    [UWP]RaspberryPi3にインストールしたWin10IoT Coreのスタートアップを変える

    RaspberryPi に Windows10 IoT Core を入れてみた。


    Windows10 IoT Coreのインストールまで


     前回は、OSのインストールからUWPアプリの開発Helloworldまで行いました。

      [UWP]RaspberryPi3にWindows10IoTをインストールする 

    今回はその続き、作ったアプリのスタートアップさせるにはをやっていきたいと思います。
    スタートアップするにはPCからWin10IoTCoreへリモートログインする必要があります。
    まずはリモートログインの仕方から進めたいと思います。


    リモートログインの仕方


     Win+Xキーを押して、Powershell(管理者)を起動します。

    Win10IoTをインストールした時のPC名をminwinpc として話を進めていきます。

    Pingチェック

    まずは、Pingをやってみて返事が返ってくるかチェックします。

    ping minwinpc

    返事あれば次へ進みます。
    返事がない時はネットワークの設定をチェックしてみてください。


    信頼するPCに登録

    これは一回やれば問題ないです。しなかった場合、接続拒否になります。

    net start winrm
    Set-Item WSMan:\localhost\Client\TrustedHosts -Value minwinpc


    リモート接続開始


    Enter-PSSession -ComputerName minwinpc -Credential minwinpc\Administrator

    上記コマンドを入力してパスワード入力画面が出てきます。
    ログイン成功すると、

    [minwinpc]: PS C:\Data\Users\administrator\Documents>


    コンソール画面に上記メッセージが表示します。

    スタートアップの登録と戻し方
     試しに最初から入っているHelloworldをスタートアップに登録してみます。

      iotstartup add headed Hello

     最初に表示してたダッシュボードに戻す場合は、

      iotstartup add headed IoTCoreDefaultApp

     このコマンドで元に戻せます。


    これでもうWindows10 IoT Coreの開発~専用端末化までできるようになりました。


    最後にリモートログインした時に使うコマンド一覧を載せておきます。

    コマンド一覧


    デバイス名変更 setcomputername 新しい名前

    アプリ一覧表示 iotstartup list

    スタートアップアプリの登録 iotstartup add headed Hello

    スタートアップアプリを戻す

     iotstartup add headed IoTCoreDefaultApp

    再起動 shutdown /r /t 0

    参照URL






    Androider