2017年9月22日金曜日

[Rpi]PlantUMLServerをインストールする。

PlantUML公式ページにWEBで出力してくれるけど、やっぱ自前サーバーでやりたいって人向けの情報です。
設定は簡単だけど、どこにも載ってないので備忘録を残しておきます。

$ sudo apt-get install -y graphviz maven
$ git clone https://github.com/plantuml/plantuml-server
$ vim ~/.bashrc
---
$GRAPHVIZ_DOT="/usr/bin/dot"
---
最後の行に挿入

$ source ~/.bashrc
$ mvn jetty:run -Djetty.port=1001

http://address:1001/

最初エラー画面が出るけど、下のURLをクリックすると表示する。

2017年9月11日月曜日

[UWP]2017年版UWPアプリを作る時に覚えておくこと

.Net Core 2.0や .Net standard 2.0が登場して間もない時期ですが、
ようやく下位互換になった!
というか
ようやく置いてけぼり感を食らっていたユーザーに光が差し込まれました。

UWPアプリで書くTaskや新しいインターフェイスを書かずとも

今まで通りの感覚でプログラムが書けます!

( ˘ω˘ )

2017年秋から本格的にUWPアプリを書き始めてみようかなと思いました。

まず今までと違うところが1つあって、
無い!って思ったライブラリ関係は
全部Nugetで追加していかないといけません。

その代名詞になるのが、シリアルポートでしょうか。

それにUWPのUIって全部XAMLで書かないといけないのかって
悩ましい問題も実はテンプレート関係が揃ってるライブラリもNugetにあります。

今までモノシックに出来上がったライブラリが
分割できる特殊パーツはNugetにしようって流れですね。

Nugetに何があるか分からないけど 視点を変えて、

無いものはまずWEBでNugetライブラリ検索しよう

という新しいスタイルをもって開発した方がよさそうです。

まずは簡単に必要最小限に必要な知識としては、
プログラムを全部ライブラリ化して、
UI部分をXamarinやWinform、UWPなどいろんなプラットフォームに合わせて作成する感じですね。

ということで、

ライブラリは.Net Standard 2.0で作る
 これ重要。



ついでにプライベートレポジトリを作っておくと便利なので、

Nugetパッケージを作る
・コマンドラインを開き、.slnファイルのある場所でdotnet pack



ハード制御したいよっという場合は、

シリアルポートを使う
・nugetで Ststem.IO.Portsをインストール



UWPアプリってXAMLタグ打つの大変、、ハンバーガーメニューを一発で使いたい場合は

UWPの画面回りテンプレートを使う
・nuggetで Microsoft.Toolkit.Uwpをインストール  
 サンプルがWEBストアにあって、
 UWP Community Toolkit Sample Appをインストール。
 Microsoft.Toolkit、Microsoft.Toolkit.Servicesこの辺りも使えそう。


ひとまずはこれを知っておけとなんとかなりそうです。

2017年8月8日火曜日

Windows版Tensorflowを使う

以前、RaspberryPi3でTensorflow、Kerasをインストールして機械学習を楽しんでいました。
が、学習には相当量なCPUパワーが必要で、Rpi3で開発は現実的ではない事が判明しました。最初から分かっていた事なのですが、Rpi3より圧倒的に高性能なWindowsPCで行う事にしました。

〇Bash on Windowsにインストール始める前にパスワードを忘れてしまったら、、、
> lxrun.exe /setdefaultuser root
> bash
$ passwd ユーザー名
パスワードを入力してから
$ exit
> lxrun.exe /setdefaultuser ユーザー名
> bash
でOKです。

ここからスタート
$ git clone https://github.com/yyuu/pyenv ~/.pyenv
$ echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bashrc
$ echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bashrc
$ echo 'eval "$(pyenv init -)"' >> ~/.bashrc
$ exit
> bash

一回入りなおしてから、

$ pyenv install --list
anaconda3の最新バージョンを探してインストール
$ pyenv install anaconda3-4.4.0
$ pyenv global anaconda3-4.4.0
$ pyenv refresh
ここからは思いのままに欲しいパッケージを入れる。
$ conda install -c conda-forge tensorflow
$ conda install -c conda-forge keras
$ conda install -c conda-forge jupyter
$ conda install -c conda-forge scikit-learn
$ conda install -c conda-forge pandas
$ conda install -c conda-forge numpy
$ conda install -c conda-forge scipy
$ conda install -c conda-forge ipython


〇Windowsのローカルにインストール
https://repo.continuum.io/archive/.winzip/Anaconda2-4.4.0-Windows-x86_64.zip
をダウンロードしてインストール。
スタートメニューからAnaconda Promptを起動する。
$ pip install tensorflow
$ pip install keras

雑記:
 pipやconda、pyenvと統一感があまりないですが、目的は達成しているのでよしとします。

参考URL:
http://qiita.com/toyolab/items/bccd03d4cb7795112ab6
http://qiita.com/samacoba/items/207f2650ee60fe1de25a
http://qiita.com/y__sama/items/5b62d31cb7e6ed50f02c

2017年8月6日日曜日

Kerasサンプルを実行して動きを眺めてみる。


1.とりあえずサンプルをダウンロードする。

$ wget https://github.com/fchollet/keras/archive/master.zip
$ mv master.zip keras.zip
$ unzip keras.zip
$ cd keras/example

2.サンプルの内容を確認する。

Google翻訳をそのままコピペ。

数えてみると31個もサンプルがあるので、意味はわからないけどまずは機械学習を触ってみてサンプルをいじって遊ぶ程度なら沢山あればなんでもOKですね。
中身なんも分かってないですけど片っ端から動かしてみます。



 Implementation of sequence to sequence learning for performing addition of two numbers (as strings).
 2つの数値の加算を行うためのシーケンス学習へのシーケンスの実装(文字列として)。
 →実行すると、Q,T,赤い□の右隣に数字が出てくる。
  Qが足し算、Tが計算結果、赤い□はなんだろうか。
  正解率は52%あたりで中止した。

 Demonstrates how to write custom layers for Keras.
 Kerasのカスタムレイヤーを作成する方法を示します。
 →6万サンプル、1万テスト、エポック40、正解率は96%
  カスタムレイヤーの作成例らしいのであとで中身を見ようと思います。  

 Trains a memory network on the bAbI dataset for reading comprehension.
 読解のために、bAbIデータセット上のメモリネットワークを訓練する。
 →サンプルデータをダウンロードしてきて何やら解析を始める。
  エポック120あるけどかなり高速で1万サンプルをやっつけていく。
  ラズパイ3だとエポック1つ処理するのに30秒、つまり1時間かかるので中止。

 Trains a two-branch recurrent network on the bAbI dataset for reading comprehension.
 読解のために、bAbIデータセット上の2つの分岐の反復的なネットワークを育成する。
 →サンプルデータをダウンロードしてきて解析を始める。
  エピック40あってラズパイ3ではつらいので中止。
  認識率は20%くらいと低いようだ。

 Trains a simple deep CNN on the CIFAR10 small images dataset.
 CIFAR10の小さな画像データセットでシンプルな深いCNNを学習します。
 →サンプルデータをダウンロードして解析を始める。
  Using real-time argumantation.というのが表示される。
  中止もすんなり受け付けてくらないので他と何か違うらしい。

 Visualization of the filters of VGG16, via gradient ascent in input space.
 VGG16のフィルタのビジュアライゼーション。
 →レイヤーの数がかなりある。進行状況の表示も他のと異なっていてCurrent Loss valueが逐一表示されて、Processingを200回繰り返しやるみたいです。1つくらい最後までやってみようと

 Demonstrates the use of a convolutional LSTM network.
 畳み込みLSTMネットワークの使用を示します。

 Deep Dreams in Keras.
 ケラスの深い夢。

 Trains a convolutional stack followed by a recurrent stack and a CTC logloss function to perform optical character recognition (OCR).
 畳み込みスタックとそれに続く反復スタックとCTCログ損失機能をトレーニングし、光学式文字認識(OCR)を実行します。

 Trains a Bidirectional LSTM on the IMDB sentiment classification task.
 IMDBセンチメント分類タスクで双方向LSTMを訓練する。

 Demonstrates the use of Convolution1D for text classification.
 テキスト分類のためのConvolution1Dの使用を示す。

 Trains a convolutional stack followed by a recurrent stack network on the IMDB sentiment classification task.
 IMDBセンチメント分類タスクで反復スタックネットワークが後に続く畳み込みスタックを訓練する。

 Trains a FastText model on the IMDB sentiment classification task.
 IMDBセンチメント分類タスクでFastTextモデルをトレーニングします。

 Trains a LSTM on the IMDB sentiment classification task.
 IMDBセンチメント分類タスクでLSTMを訓練する。

 Compares different LSTM implementations on the IMDB sentiment classification task.
 異なるLSTM実装をIMDBセンチメント分類タスクで比較します。

 Generates text from Nietzsche's writings.
 ニーチェの著作からテキストを生成する。

 Implementation of AC-GAN ( Auxiliary Classifier GAN ) on the MNIST dataset
 MNISTデータセットにおけるAC-GAN(Auxiliary Classifier GAN)の実装

 Trains a simple convnet on the MNIST dataset.
 MNISTデータセットで単純なconvnetを学習します。

 Trains a Hierarchical RNN (HRNN) to classify MNIST digits.
 階層型RNN(HRNN)をトレーニングして、MNISTディジットを分類します。

 Reproduction of the IRNN experiment with pixel-by-pixel sequential MNIST in "A Simple Way to Initialize Recurrent Networks of Rectified Linear Units" by Le et al.
 Leらによる "整流された線形単位の再帰的ネットワークを初期化する簡単な方法"における画素単位の連続的なMNISTによるIRNN実験の再現

 Trains a simple deep multi-layer perceptron on the MNIST dataset.
 MNISTデータセットで単純な深層マルチレイヤパーセプトロンを学習します。

 Reproduction of the Net2Net experiment with MNIST in "Net2Net: Accelerating Learning via Knowledge Transfer".
「Net2Net:知識移転による加速学習」におけるMNISTによるNet2Net実験の再現

 Trains a Siamese multi-layer perceptron on pairs of digits from the MNIST dataset.
 MNISTデータセットの数字の対にシャーマンの多層パーセプトロンを訓練する。

 Demonstrates how to use the sklearn wrapper.
 sklearnラッパーの使用方法を示します。

 Trains a Stacked What-Where AutoEncoder built on residual blocks on the MNIST dataset.
 スタックされたWhat-WhereをトレインするAutoEncoderは、MNISTデータセットの残りのブロックに基づいて構築されました。

 Transfer learning toy example.
 転送学習のおもちゃの例。

 Neural doodle.
 神経の落書き。

 Neural style transfer.
 ニューラルスタイルの転送。

 Loads pre-trained word embeddings (GloVe embeddings) into a frozen Keras Embedding layer, and uses it to train a text classification model on the 20 Newsgroup dataset.
 訓練された単語埋め込み(GloVe埋め込み)をフリーズしたKeras埋め込みレイヤーに読み込み、これを使用して20 Newsgroupデータセットのテキスト分類モデルをトレーニングします。

 Trains and evaluate a simple MLP on the Reuters newswire topic classification task.
 ロイターのニュースワイヤトピック分類タスクで簡単なMLPをトレーニングし、評価します。

 Demonstrates how to use stateful RNNs to model long sequences efficiently.
 ステートフルなRNNを使用して長いシーケンスを効率的にモデル化する方法を示します。

 Demonstrates how to build a variational autoencoder.
 バリアントオートエンコーダの構築方法を示します。

 Demonstrates how to build a variational autoencoder with Keras using deconvolution layers.

 デコンボリューションレイヤを使用してKerasを使用してバリアントオートエンコーダを構築する方法を示します。


総論:
 全部のサンプルを動かして率直な印象。
 大量のデータセットがあって、
 学習用途に合わせたレイヤー構成があって、
 学習させるのに大量の処理時間が必要で、
 正解率は学習毎に変わって正解率100%はありえない。

という結論です。
あとディープラーニング自体は画像解析に特化している


詳しく理解してないですが、何を解析するかでどういう解析手法にするか選択するようです。
上記サンプルからわかることは、

 LSTM、GRU :自然言語解析
 CNN    :画像解析
 RNN    :自然言語、画像解析でも利用。亜種が色々。

のようです。

何が効果的か本来は試行錯誤しながら見つけなければいけないと思うのですが、インターネット上で研究成果も色々乗っているわけで、利用者側からすれば詳しいモデル構造を知らなくてもモデルのテンプレを集めておけば、データセット収集で目的の半分は達成できそうな気もする。


参考URL
https://keras.io/ja/



2017年8月5日土曜日

特化型人工知能について

AIには汎用型と特化型で2種類あるうち特化型についてまとめてみた。

特化型最高峰は最近の流行りである深層学習であるディープラーニングである。

ディープラーニングをざっくり説明すると、データから自ら特徴を見つけ出し、カテゴリ分けを行い、それに人間がラベリングを行い、実社会と人工知能の結果を結びつけるというものである。
今までと違うのが自ら特徴を見つけ出すという部分で、人が分かってない特徴も見つけ出す事も可能ということです。

学習手順を大まかに書くと、

 大量のデータセット→AIエンジニアが作った機械学習プログラム→結果

1.あるデータセット(動画・音声・テキスト・センサ情報など)を入力する。
2.AIが学習を行う。
  AIエンジニアがデータに最適な手法を組み合わせたり、評価関数を作り、求めるパラメータを明確化する。
3.それなりに結果得られるようになったら完成。


人工知能と人と同じく最初は判別しやすいデータを与えて勉強させることが必要です。
ベースを作ってから徐々に判定が難しいデータを与えて調節していく感じがいいように思えます。


AIエンジニアのお仕事
 ディープラーニングが登場してから毎週のように進化していっているので、対象のデータをどういったアルゴリズムを使えば最善であるか設計する作業があります。それと人工知能が出した結果が評価する評価関数の導出も必要だったりするので人工知能だからって手放しで全自動というわけではないのが現状である。


人工知能のやるにあたっていきなりディープラーニングをやるよりも、用語や機械学習の扱い方を覚えるためにまずSVMやニューラルネットワークから導入したほうがいいかも。


以下、完全にまとめきれてないのですが、用語集。


特化型AIの種類
ファジィ集合
・SVM(サポートベクトルマシン)
(NN)ニューラルネットワーク
NNを更に特化したものたち
 CNN、ResNet
 RNN
 LSTM

オートエンコーダ
・VAE(Variational Autoencoder)

アプリ
・OpenPose 動画で人の関節の動きを可視化する
・Merlin 深層学習ベースの音声合成ツールキットMerlin
・Eliza チャットボット


ライブラリ
・Tensorflow
・Chainer



・その他参考用語集
generative model...生成モデル
maximum likelihood learning...最尤学習
weights...重み
bias...バイアス(偏差)
meta-parameter...超パラメータ
stochastic...確率的
Robust...頑健
binary...2値
deterministic...決定論的
training data...訓練データ
validation data...検証データ
test data...テストデータ
GD(Gradient Descent)...勾配法
SGD(Stochastic Gradient Descent)...確率的勾配法
overfitting...過学習
approximate...近似
standard deviation...標準偏差
momentum...はずみ、運動量、今回の場合はGD中に振動の抑制項として使われる
ravine...峡谷、谷
brute-force...力ずく
weight decay...荷重減衰
mixing rate...混合率(理想分布への収束スピード)
coefficient...係数
partition function...分配関数
sparsity target...スパース化目標
sparsity cost...スパース化コスト
stability...安定性
discriminative...識別の
order of magnitude...10の累乗
eigenvalue...固有値
eigenvector...固有ベクトル
natural image...自然イメージ、多様性のあるイメージ
rectified...修正された
exponential family...指数型分布族
integrate out...積分消去


参考URL
http://machinelearningmastery.com/get-help-with-keras/
http://www.iryounomirai.com/news/study/1078/


2017年8月1日火曜日

[RaspberryPi]Tensorflowをインストールする

WindowsでTensorflowの環境構築がうまくいかなかったので、持て余しているラズパイにディープラーニング用フレームワークTensorflowをインストールすることにした。

ビルド済みのをインストールする方法もあるのですが、バージョンが古いのでソースからビルドします。

ちなみに2017年8月時点でJessie版RasbianのG++-4.9でビルドはできません。
参考URLにのっているのですが、threadpool.ccをビルドする時にエラーになります。

捕捉:試しにStretch版へアップグレードしてGCC-6、G++-6でビルドしてみたらこっちはOKでした。(スワップメモリを大きめに取っておく必要はありますが。)


以下を打ちこめばOK。
---
$ git clone https://github.com/tensorflow/tensorflow
$ sudo apt-get install -y autoconf automake libtool gcc-4.8 g++-4.8 libjpeg-dev
$ tensorflow/contrib/makefile/download_dependencies.sh
$ cd tensorflow/contrib/makefile/downloads/protobuf/
$ ./autogen.sh
$ ./configure
$ make
$ sudo make install
$ sudo ldconfig  # refresh shared library cache
$ cd ../../../../..

raspberry pi zero or 1ならこっち
$ make -f tensorflow/contrib/makefile/Makefile HOST_OS=PI TARGET=PI OPTFLAGS="-Os" CXX=g++-4.8

raspberry pi 2 or 3ならこっち(neon有効化?)
$ make -f tensorflow/contrib/makefile/Makefile HOST_OS=PI TARGET=PI \
OPTFLAGS="-Os -mfpu=neon-vfpv4 -funsafe-math-optimizations -ftree-vectorize" CXX=g++-4.8
---

追記:Bazelを使う場合、
ビルドにbazelを使用すると「configure」が使えるので、調整が色々できるようになります。
Bazelはv0.4.5を使います。

$ wget https://github.com/bazelbuild/bazel/releases/download/0.4.5/bazel-0.4.5-dist.zip
$ unzip -d bazel bazel-0.4.5-dist.zip
$ cd bazel

ソースコードで編集2か所あります。

nano scripts/bootstrap/compile.sh
117行目 末尾に「-J-Xmx500M」を追加。


nano tools/cpp/cc_configure.bzl
133行目 関数の頭にreturn "arm" を追加。

$ sudo ./compile.sh
$ sudo cp output/bazel /usr/local/bin/bazel

これでBazelインストール完了。
次にTensorflowのビルド
$ cd ~/tensorflow
$ ./configure
$ bazel build -c opt --copt="-mfpu=neon-vfpv4" --copt="-funsafe-math-optimizations" --copt="-ftree-vectorize" --copt="-fomit-frame-pointer" --local_resources 1024,1.0,1.0 --verbose_failures tensorflow/tools/pip_package:build_pip_package

これでOK。

★ビルドエラーが出て先に進めない、手っ取り早くインストールしたい場合
ビルド済みのwhlがあるので活用する方法があります。

$ wget https://github.com/samjabrahams/tensorflow-on-raspberry-pi/blob/master/archive/tensorflow-0.8.0rc0-cp27-none-linux_armv7l.whl
$ sudo pip install tensorflow-0.8.0rc0-cp27-none-linux_armv7l.whl

これでOK。

-----------
〇動作チェック

動作確認で画像認識をやってみる場合、
---
curl https://storage.googleapis.com/download.tensorflow.org/models/inception_dec_2015_stripped.zip \
-o /tmp/inception_dec_2015_stripped.zip
unzip /tmp/inception_dec_2015_stripped.zip \
-d tensorflow/contrib/pi_examples/label_image/data/
make -f tensorflow/contrib/pi_examples/label_image/Makefile
tensorflow/contrib/pi_examples/label_image/gen/bin/label_image
---

動作確認でカメラを使った動画認識をやってみる場合、
---
make -f tensorflow/contrib/pi_examples/camera/Makefile
tensorflow/contrib/pi_examples/camera/gen/bin/camera
---

ビルド時間がとても長いので気長にまちましょう。

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変換したりいろんな研究は手法があるので
色々とやってみるといいと思います。


Androider