メカトロ講座05 モーターの技術

# 概要
カメラやLidarなどのセンサー類はUSBで簡単につながるものが市販されていますが、モーターはそういうものはほとんどありません。モーター単体やモータードライバなどのパーツは多く販売されていますが、USBでつなぐだけで使えるなどというものは皆無です。
ここでは主に移動用のタイヤを駆動するモーターを例にモーター制御を紹介します。

今回紹介するモーターシステムは以下のような図になります。
![モーターシステム全体.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254442/ee21115d-53d0-801c-bfb7-f26eeb542ca5.png)

## 今回の要求事項
これらのことを目指して設計していきます。

* 全方向移動用ができる台車のためのモーターである（ロボットアーム用ではない）
* 3輪のオムニホイールで移動する
* 移動するのは平らなフローリングの上のみ、段差などは越えられなくてもよい
* ロボットサイズは直径200mm程度を想定
* タイヤは直径40mm程度
* ロボット本体の重さは最大2kg
* ロボットの最大速度は0.5m/s程度
* 電源は5VのUSBモバイルバッテリーを使う
* モーターにはエンコーダーがついていて速度制御ができる
* あまり高価でないこと

# 負荷の種類
小型のロボットでモーターで駆動する対象としてはタイヤとベルトがあります。ここではタイヤについて説明します。

## タイヤの選定
今回は全方向移動をするのでオムニホイールを探します。[ヴィストン](https://www.vstone.co.jp/robotshop/index.php?main_page=index&cPath=72_336_836)が一番種類が豊富なのでそこで選びます。またオムニホイールで大事なのはモーターとの接続性です。大型のタイヤなら接続する機構を作って当然ですが、小型だとできればモーターの軸に直結させたいです。そのために対応するハブがちゃんとあるかも大事です。
[38mmオムニホイール](https://www.vstone.co.jp/robotshop/index.php?main_page=product_info&cPath=72_336_836&products_id=4568)だと3mmと4mmのシャフトにつながるハブがあるのでモーターともつなぎやすいです。

## 制御目標について
モーターの制御目標としては主に以下の3つがあります。

* 位置制御：モーターの回転位置が指定した位置になるような制御方式です。ロボットアームの関節や、いわるゆ「RCサーボモーター」はこれに含まれます。
* 速度制御：モーターの回転速度が指定した速度になるような制御方式です。移動用の車輪の制御がこれに当たります。
* 力制御：一定の力を出すような制御方式です。柔らかいものをつかむためのロボットハンドなどに必要な方式です。

ロボットで使われるたいていの制御は位置制御か速度制御です。力制御では電流センサーや高周期での処理が必要になるためハードウェアが高価にになります。ここでは車輪の制御なので速度制御を行います。

# モーターについて
モーターは本当は奥深いものですが、ここでは手に入りやすい小型のモーターを前提に説明します。

## モーターの種類
ロボットに使うものは主に以下の3つの種類です。

* ブラシ付きDCモーター  
ミニ四駆などでも使われている、ただ電圧をかければ回るモーターです。手ごろで安価に売っていてバリエーションも多いです。流れる電流とトルクが比例するために制御回路が簡単というメリットがあります。整流にブラシを使っているために、これが消耗品であるためにメンテナンスが必要（ただし工作のロボット程度の稼働であれば不要）、ブラシによるノイズが発生するといった欠点があります。また一般に出力は高回転数なのでギアを使って回転数を落とす必要があります。
* ブラシレスDCモーター  
DCモーターからブラシを除き整流を外部で電子的に行うモーターです。構造が簡単なために丈夫で大出力の物があるというメリットがあります。しかし制御回路が複雑でプログラムを自作しようとすると大変です。
* ステッピングモーター  
これは上記の2つとは構造が大きく違い、モーターから延びる数対（多くは2対4本）の線を使ってステッピングモーター内部の複数のコイルに順番に電流を流すと一定の角度だけ回るモーターです。仕組み的に正確な角度で回るので工作機械のテーブルやプリンタヘッドなどの正確に動かしたい部分で用いられます。原理的にフィードバック制御をしなくても位置や速度で制御することができますが、出力軸に過大な力がかかると「脱調」が起こりずれが発生します。

## モーターの選定
今回は入手性と安価、制御が楽であることからではブラシ付きDCモーターを使用します。またギアは別に買って取り付けることもできるのですが、今回は小型化のためにギヤードモーターを使います。また速度制御をするためにはエンコーダーが必要ですが、小型化のためにエンコーダー一体型のモーターを探します。ギヤとエンコーダーの両方が一体になっているモーターはMaxonでオーダーすればいくらでも選び放題なのですが、安いモーターではなかなかありません。今回はAliexpressで売っている[GA370](https://ja.aliexpress.com/item/25GA370-dc/32839617639.html)というモーターから選定します。今回はここから6V, 170rpmというものを選択しました。

## モーターのスペック
ブラシ付きDCモーター自体のスペックは以下のようなトルクカーブとしてあらわされます。トルクカーブ自体を見る前に大事な指標としてモーターの電圧と消費電力です。電圧はそのモーターにかけることを想定している電圧です。これよりもモータードライバの出す電圧が小さいとモーター本来のパワーが出せませんし、大きすぎるとモーターを壊してしまいます。
消費電力はモーターの出せるトルクや回転速度と関係します。トルクと回転速度はギアによってある程度変更できますがざっくりと以下の関係式があります。

```math
(消費電流) \times (効率) = (トルク) \times (回転速度)
```

効率はロボット用の小型モーターなら0.2～0.5程度を考えるとよいでしょう。
例えば12V 1Aのモーター（12W）で効率0.4のモーターを60rpm(=6.28rad/s)で回すと$0.76[Nm] = \frac{12[w] \times 0.4}{6.28[rad/s]}$のトルクを出すことができます。わかりやすい単位に変えると0.76[Nm]=7.8[kg-cm]です。

では詳しくトルクカーブを見てみましょう。
![トルクカーブ.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254442/eaae9402-70cb-c470-1a62-eaf9fbb70043.gif)
[タミヤギアードモーター](https://www.tamiya.com/japan/robocon/topics/gearedmotor170928.html)より

横軸は回転にかかるトルクで、縦軸が回転数、電流、出力、効率の4つの曲線ができます。なおこのグラフはモーターには理想的な電源で一定の電圧(このグラフでは7.2V)がかけられているという前提があります。

* 電流のグラフは$(トルク)=(モーター定数)\times(電流)-(機械的抵抗)$という式が成り立つために直線になります。
* 回転数のグラフは$(モーターの電圧)=(電流)\times(モーターの抵抗値)+(モーター定数)\times(回転数)$という式が成り立つために上記のように右下がりの直線になります。
* 出力はトルクと回転数の積になります。両方とも直線なので図のように上に凸の2次曲線になります。最大トルクの半分、最大回転数の半分で最大出力となります。
* 効率は電気的に書けたエネルギー（電圧x電流）に対しての出力の割合を示します。上記のグラフのように最大出力よりも低いトルクでMaxとなります。

一般的に**効率最大～出力最大のあたり**でモーターを使えるようにモーターやギヤを選ぶ必要があります。

またモーターの主な電気的スペックとして抵抗値、インダクタンス、モーター定数がありますが、そのうち抵抗値とモーター定数が分かります。
$(抵抗値)=\frac{(電圧)}{(ストール電流)}=\frac{7.2[v]}{12[A]}=0.6[Ω]$
$(モーター定数)=\frac{(ストールトルク)}{(ストール電流)}=\frac{2.7[Nm]}{12[A]}=0.23[Nm/A] ※(2.7[Nm]=27[kg・cm])$
またインダクタンスはモーターに交流をかけないと値はわかりません。スペックシートでも明言されていないことが多いです。一般的な小型モーターなら大体数mHあたりになります。

# エンコーダー
エンコーダーはモーターの回転を計測する装置です。

## エンコーダーの種類
エンコーダーには読み取りセンサの種類から磁気式と光学式があります。

![encoder_06.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254442/bb5a57ac-0484-e771-1c1b-f97688a0e763.gif)
[タイホープロダクト](http://www.tohgoku.or.jp/~taihopro/encoder.html)より

* 磁気式ではモーターの軸に円形にNSが交互に並んだ磁石の周囲に2対のホールセンサを設置してそのホールセンサーの値を読む。一般的に光学式よりも安価である。
* 光学式ではモーターの軸に放射状にスリットの入った円盤を取り付けそれをフォトインタラプタで読み取る。磁気式に比べて分解能を高くできるために精密な用途に向く、しかし光を使用するために正確な測定のためにはエンコーダー一式を密閉したケースで覆う必要がある。

また光学式でスリットの形状によりはアブソリュート式とインクリメンタル式がある。流通しているものは大体はインクリメンタル式です。

![encoder_timing.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254442/67986ae3-383b-90a0-408b-28987dfa56bc.png)

* アブソリュート式では放射状のスリットにバイナリー値（多くはグレイ符号）で絶対位置が入っていて、その値を読み取ることで軸の角度を検出することができる。一般的にコストが高い。
* インクリメンタル式はスリットは単純なスリットでカウントを累積することで相対的な軸の角度を読み取ることができる。絶対位置を取るためにZ信号を付加することがある。一般的にアブソリュート式よりも分解能が高くなる。カウントは以下のような遷移表による。

| A相 | B相 | カウント |
|:-:|:-:|:-:|
| ↑ | H | +1 |
| ↑ | L | -1 |
| ↓ | H | -1 |
| ↓ | L | +1 |
| H | ↑ | +1 |
| H | ↓ | -1 |
| L | ↑ | -1 |
| L | ↓ | +1 |
 
# モータードライバ
ここまでモーターの話をしてきました。モーターに任意の電圧をかけることができればモーターを自由に扱うことができます。トランジスタを使って任意の電圧を生成する回路を使うとトランジスタでの熱的ロスが大きいためにスイッチングでPWM信号を使ってモーターを駆動します。

## 片方向のみに駆動する回路

![単方向ドライブ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254442/99c58236-9f53-de76-401f-f5df109925f2.png)

この回路ではinputピンにHighをかけることでモーターに電流が流れて、Lowにするとモーターが遮断されます。真理値表は以下になります。

| input | モーターの状態 |
|:-:|:-:|
| High | ON |
| Low | OFF |

高速にON/OFFを繰り返すとそのデューティー比の分の電圧がかかっているのと同じ効果になります。
Lowの時はトランジスタがOFFになるので、GND側のモーターのピンが電気的に浮いてしまいます。そうするとトランジスタのコレクタにモーターの逆起電力がかかりトランジスタを破壊することがあります。これを防ぐのが**回生ダイオード**です。これがあるとOFFの時もモーターに電流が流れます。回生ダイオードはリカバリー時間が短いファーストリカバリーダイオードである必要があります。大型のFETではFET自体にこの回生ダイオードが入っているものもあります。

## 両方向に駆動する回路
Hブリッジと呼ばれる両方向に駆動する回路です。

![Hブリッジ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254442/781cf666-d081-6074-3ed6-73990710a7a4.png)

真理値表は以下になります。input1Hとinput1LはLowの時にONになる、input1Lとinput2LはHighの時にONになることに注意です。

| input1H | input1L | input2H | input2L | モーターの状態 |
|:-:|:-:|:-:|:-:|:-:|
| Low | Low | High | High | 正転 |
| High | High | Low | Low | 逆転 |
| Low | Low | Low | Low | ブレーキ(12V側で回生) |
| High | High | High | High | ブレーキ(GND側で回生) |
| High | Low | High | Low | 空転 |
| Low | High | - | - | 禁止(1側が貫通) |
| - | - | Low | High | 禁止(2側が貫通) |

## デッドタイム
実はFETのゲートに電圧をかけてもON・OFFに移行するまでにわずかにじかんがかかります。大電流のモータードライバで高周波数で駆動するには、このデッドタイムを見越して早めにゲートの操作をする必要があります。

## 電流継続モードと非継続モード
モーターは電気的には以下のような抵抗、コイル、電源が直列に接続されたものと等価な回路として考えられます。

* 抵抗：$rI$の電圧が発生する(I：モーターに流れる電流、r：モーターの抵抗値)。
* コイル：$-L\frac{dI}{dt}$の電圧が発生する（L：モーターのインダクタンス）。
* 電源：$-kw$の電圧が発生する（k：モーター定数、w：モーターの回転速度）。

このうちr、LとPWMの周波数（キャリア周波数）によってモーターに流れる電流のモードが以下のように変わります。
以下はモーターを模したRL直列回路にPWMをかけた時の抵抗に流れる電流のプロットです。この回路のカットオフ周波数は$\frac{10[Ω]}{2 \pi \times 1m[H]} = 1.6[KHz]$になります。よってこれより低い500Hzで駆動すると、電流がめいっぱいまで流れる時間と、まったく流れない時間が発生します。この方式を電流非継続モードと呼びます。一方カットオフ周波数より高い5kHzで駆動するとそのような時間は無くなります。この方式を電流継続モードと呼びます。

![電流継続_不継続.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254442/4c88a0c5-2b7c-b36e-9527-6dd5be5f4f86.png)

高度な制御をするには電流継続モードである必要がありますが、ノイズの問題が起きないなら非継続モードでも構いません。

|  | メリット | デメリット |
|:-:|:-:|:-:|
| 電流非継続モード | トルクが出る | 素子へのダメージが大きい、電源へのノイズが大きい |
| 電流非継続モード | 電流制御には必須 | モータードライバが高いキャリア周波数に対応している必要がある |

# 電源
モーターをまわすためには電源にも気を付ける必要があります。モーターでは回転開始時などに大電流を消費します。定常時の電流だけでなくこの最大電流に耐えれるものを使いましょう。

# 参考
[ステッピングモーター](https://ja.wikipedia.org/wiki/%E3%82%B9%E3%83%86%E3%83%83%E3%83%94%E3%83%B3%E3%82%B0%E3%83%A2%E3%83%BC%E3%82%BF%E3%83%BC)

# 目次ページへのリンク
[ROS講座の目次へのリンク](https://qiita.com/srs/items/5f44440afea0eb616b4a)