Raspberry pi + インバータでBLモータを回転させる（実験機製作と動作確認）

# 1. はじめに
私を含め、Raspberry piを買ったはいいものの、何をやったらいいかわからず、持て余している方は多いのではないでしょうか。
特に私の感覚では、「ハードウェアを動かすこと」に困っている方が多いように思います。
それに加え、私は仕事でBLモータを使ってはいるものの、BLモータが回転するメカニズムがわかっていなかったので、Raspberry piでBLモータを回転させる実験機を作ることにしました。

実験機を作りにあたり、ESCではなくインバータ（本記事ではIHM07M1）を使うことで、
より正確にBLモータが回転するメカニズムを理解できるように努めました。

# 2. 本記事で参考にしたサイト
本記事は以下サイトを参考にしております。作成者の方にはこの場を借りて、お礼を申し上げます。
- [BLモータのベクトル制御を実装する手順](https://qiita.com/fumiya_sato/items/ecc9f22c6f137f9dc0ac#6%E3%83%99%E3%82%AF%E3%83%88%E3%83%AB%E5%88%B6%E5%BE%A1)
- [Raspberry PiでBLDCモータを120°通電制御する]( https://negligible.hatenablog.com/entry/2021/03/26/035001)

# 3. 本記事のゴールと注意点
BLモータの回転に最もよく使われる方法は「ベクトル制御」だと思われ、私も当初はベクトル制御実装を目指していましたが、
Raspberry piはPWMチャンネルが2つしかなく、BLモータの3相を独立で制御することができません。
よって本記事では「センサード120°制御+電流計測」までを解説します。

# 4. 本記事の構成
前述の「センサード120°制御+電流計測」を全て解説するとなると本文が膨大となるため、タスクとに、下記のように記事を分けます。

1. [BLモータの絶対角計測](https://qiita.com/hiyo_control/items/66affbccbd3b8dbe3892)
2. [インバータ（IHM07M1）からのPWM出力](https://qiita.com/hiyo_control/items/12f9591ebb9531184250)
3. [BLモータの3相電流のAD変換と読み取り](https://qiita.com/hiyo_control/items/dc1b8c25310a649aa647)
4. 実験機製作と動作確認（本記事の範囲）

前半1章～3章で必要な機能の実装方法を述べ、最後の4章では「どのように実験機を作ったか」と「動作確認結果」を述べます。

# 5. 実験機製作と動作確認
## 5.1. 使用する機器と配線図
本記事で使用する機器を以下に示します。

|機器名|型番
|---|---|
|角度センサ     |[AS5048A](https://www.switch-science.com/products/3140)
|電流センサ     |[ACS712](https://akizukidenshi.com/catalog/g/g114533/)
|ADコンバータ   |[MCP3208](https://akizukidenshi.com/catalog/g/g100238)
|インバータ     |[IHM07M1](https://jp.rs-online.com/web/p/power-motor-robotics-development-tools/1438877?msockid=1e660b96eaaf6bc435eb1f5eeb8d6a61)
|BLモータ       |[A2212 KV1000](https://www.amazon.co.jp/dp/B01DBGY6OA?ref=ppx_yo2ov_dt_b_fed_asin_title)
|DCDCコンバータ |[AE-LTC3111](https://akizukidenshi.com/catalog/g/g111212/)
|DCジャック     |[AE-DC-POWER-JACK-DIP](https://akizukidenshi.com/catalog/g/g105148/)
|ACアダプタ     |[M050200-A010JP](https://akizukidenshi.com/catalog/g/g118205/)
|抵抗           | 220Ω
|コンデンサ     | 2.2μF
|コンピュータ   | Raspberry pi 4 Model B

上表で示した機器を、過去記事で紹介した図のように接続します。
1. [BLモータの絶対角計測](https://qiita.com/hiyo_control/items/66affbccbd3b8dbe3892)
2. [インバータ（IHM07M1）からのPWM出力](https://qiita.com/hiyo_control/items/12f9591ebb9531184250)
3. [BLモータの3相電流のAD変換と読み取り](https://qiita.com/hiyo_control/items/dc1b8c25310a649aa647)

実際に作った実験機の外観は下図となります。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/839547/cf737f0f-8b68-4147-91ab-795f1d8e3a25.jpeg" width=80%>

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/839547/9f6065d5-efa3-4fbb-9c76-ccaf14d35e1a.jpeg" width=80%>

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/839547/db7de2c7-cc84-44ae-b0ed-0b086ba2e197.jpeg" width=80%>

## 5.2 センサード120deg制御の実装
[IHM07M1の記事]()でも紹介したように、BLモータはNo1～No6を順に遷移させるだけ（センサレス120deg制御と呼びます）でも回転します。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/839547/189ad7e0-b004-4ef7-8088-b56f5508503c.png" width=90%>

※ 図は[こちら](https://www.renesas.com/ja/support/engineer-school/brushless-dc-motor-02-inverter-pmw)のサイトから利用させていただきました。

ですがより滑らかに回転させるためには、BLモータの角度を計測し、その計測値に応じてNo1～No6を適用させた方が良いです（この方法はセンサード120deg制御と呼びます）。

よってこれより、下記サイトを参考に、センサード120deg制御を実装します。
- [BLモータのベクトル制御を実装する手順](https://qiita.com/fumiya_sato/items/ecc9f22c6f137f9dc0ac#6%E3%83%99%E3%82%AF%E3%83%88%E3%83%AB%E5%88%B6%E5%BE%A1)

センサード120deg制御実装を、下表を使って考えます。

|No|PWMの向き|モータ変数|
|---|---|---|
|1  |U相 → V相|?
|2  |U相 → W相|?
|3  |V相 → W相|?
|4  |V相 → U相|?
|5  |W相 → U相|?
|6  |W相 → V相|?

この表の「?」を埋める、つまり「モータ変数がいくつの時、PWMをどの相からどの相に流すか（=どのNoを適用するか）」を決めれば、センサード120deg制御を実装できます。

この表の「?」を埋めるためには、モータ変数は以下の2条件を満たすことが好ましいです。

- モータ変数の原点とU相が一致する
- 上表のNo6からNo1に移り変わるとき、モータ変数はリセットする

以下より、上記2条件を満たすモータ変数を求めましょう。

### 5.2.1 モータ変数の原点とU相が一致させる
まずはNo1～No6の移り変わりとモータ角度（センサ生値）の変化を見てみましょう。
変化を見るには、センサレス120deg制御でモータを動かします。[このリンク](https://github.com/hiyo-control/02_BL_motor/tree/main/Chapter4-1_Sensorless_120degControl)にあるexeファイルを使っていただければ、No1～No6の移り変わりとモータ角度（センサ生値）の変化をcsvファイルで出力してくれます。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/839547/96f761ce-28cd-46ae-a825-4d952177fb45.png" width=80%>

グラフより、この場合はモータ角度（センサ生値）はNo1とNo2の間でリセットすることがわかります。
「モータ変数の原点がU相と一致する」とは、「No4とNo5の間でモータ変数がリセットする」ということなので、下記の処理より「補正後モータ角度」を求めます。

1. No4時点とNo5時点のモータ角度（センサ生値）の平均を計算する
2. 平均値を差し引いた後の値と、角度センサの最大値とのmodを計算する

先ほどのグラフからNo4とNo5の平均値を計算しましょう。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/839547/c2be130b-1356-402b-9785-9c289a4f8df5.png" width=80%>

その結果は下記となります。
$$
\frac{1445+1886}{2} = 1665.5
$$

次に角度センサの最大値も合わせてmodを計算します。[AS5048A]()は14bitなので、計算式は下記となります。
$$
\text{補正後モータ角度} = \text{mod}(モータ角度(センサ生値)-1665.5, 2^{14})
$$

補正後モータ角度が計算できたので、先ほどのグラフに重ねてみます。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/839547/6bdb56ab-330f-4db8-abaf-fe6829215d85.png" width=80%>

グラフより、補正後モータ角度の原点がNo4とNo5の間、つまりU相と一致したことが確認できました。

### 5.2.2 No6からNo1に移り変わるときにリセットするモータ変数

直前のグラフを見ると、補正後モータ角度が1周する間に、No1～No6の移り変わりが7周※していることがわかります。

※ これはBLモータの極対数と一致します。今回使用するBLモータの[A2212 KV1000]()の極数は14。極対数はその半分なので7となります。

前述の表を埋めるモータ変数は、No6→No1となるときにリセットされてほしいです。そのような変数は、「補正後モータ角度」と「角度センサ最大値を7で割った値」とのmodをとることで計算できます。
$$
\text{モータ変数} = \text{mod}(補正後モータ角度,\frac{2^{14}}{6})
$$

この計算により得られるモータ変数を、グラフに重ねてみます。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/839547/ea67edba-ae4b-4fb5-9cb2-d2a5a949c03a.png" width=80%>

グラフより、モータ変数がNo6→No1でリセットされることを確認できました。

### 5.2.3 モータ変数とPWMを掛ける向きの決定
下記の条件を満たすモータ変数が求められたので、そのモータ変数とPWMを掛ける向きの対応を決定します。
- モータ変数の原点とU相が一致する
- 上表のNo6からNo1に移り変わるとき、モータ変数はリセットする

まずはモータ変数が0と最大値（$2340.6=\frac{2^{14}}{7}$）の時、どの向きにPWMを掛けるべきかを考えましょう。
下図より、モータ変数が原点と最大値を通過するのはNo5のPWMを掛けたときなので、「0と最大値（$2340.6=2^{14}/7$）の時はNo5の向きにPWMをにゅうりょくする」ということがわかります。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/839547/9fe8e35c-556e-4ed6-abd6-5b648990db6f.png" width=80%>

※ 上図は[こちら](https://qiita.com/fumiya_sato/items/ecc9f22c6f137f9dc0ac#6%E3%83%99%E3%82%AF%E3%83%88%E3%83%AB%E5%88%B6%E5%BE%A1)から使用させていただきました。

|No|PWMの向き|モータ変数|
|---|---|---|
|1  |U相 → V相|?
|2  |U相 → W相|?
|3  |V相 → W相|?
|4  |V相 → U相|?
|5  |W相 → U相|0, 2340.6
|6  |W相 → V相|?

後はNo1～No6それぞれのモータ変数のレンジが
$$
(\frac{2^{14}}{6})*\frac{1}{6}=390.1
$$
であるので、

|No|PWMの向き|モータ変数|
|---|---|---|
|1  |U相 → V相|585.1～975.2
|2  |U相 → W相|975.2～1365.3
|3  |V相 → W相|1365.3～1755.4
|4  |V相 → U相|1755.4～2145.5
|5  |W相 → U相|2145.5～2340.6、0～195.0
|6  |W相 → V相|195.0～585.1

となります。この表通りにPWMを掛ければ、より滑らかにBLモータを回転させることができます。

これはセンサーを使った120deg制御なので、「センサード120deg制御」と呼ばれます。

## 5.3 本記事で使用したプログラム
本記事で使用したプログラムは以下Githubリンクにて公開しております。
- [センサレス120deg制御プログラム](https://github.com/hiyo-control/02_BL_motor/tree/main/Chapter4-1_Sensorless_120degControl)
- [センサード120deg制御プログラム](https://github.com/hiyo-control/02_BL_motor/tree/main/Chapter4-2_Sensored_120degControl)