EV カートで始めるモデルベース開発

12.1K Views

June 15, 22

スライド概要

技術書典9(2020年9月)にて頒布した技術書です。
https://techbookfest.org/product/6581675934875648?productVariantID=5815321967460352

本書はCQ出版社から販売されているCQ EVカートのハードウェア・ソフトウェアを改造し、モデルベース開発でブラシレスモーター制御を行う方法を説明します。
私の自己学習・実験で得た知見を情報共有しています。
「EVカートで始めるモデルベース開発」という書名ですが私はモデルベース開発を業務で担当したことはありません
(補助的な立ち位置で検証業務は経験があります)。私の技術バックボーンはC言語による組込みソフトウェア開発です。
そんな技術バックボーンをもつ私がモデルベース開発の自己学習を所有していたEVカートを利用して始めました。
制御基板はArduino MEGA 2560でモデリングツールにMATLAB、Simulinkを使用します。
MATLABのライセンスは個人用途のMATLAB Homeライセンスです。
自己学習した結果、モデルベース開発でArduinoの周辺機能を制御し、EVカートのブラシレスモーターを回すことができました。
その開発過程で得た知見をまとめたのが本書です。具体的につぎの知見が学べます。

・MATLAB、SimulinkでArduinoのペリフェラルを制御する方法 
 - GPIO入力・出力、AD変換、PWM、タイマー
・C言語の処理をモデルベースで実現する方法

私と同じ「組込みソフトウェアエンジニアでモデルベース開発に興味を持っている方」に有益な情報となると考えています。
Simulinkモデルの説明ではC言語を併記し「C言語の記述はSimulinkではこのように書く」ということがわかりやすくなるよう工夫しました。
本書がモデルベース開発を始めたい方に役立てば嬉しいです。

profile-image

組込みソフトウェアエンジニア。 技術バックボーンはC言語・ベアメタル。 CQ EVカートのオーナーで、ハード・ソフトウェアの改造を通じて自身のスキルアップを日々考え中・・・。 LAPRASポートフォリオ: https://lapras.com/public/k-abe GitHub: http://github.com/grace2riku Qiita: https://qiita.com/juraruming Zenn: https://zenn.dev/k_abe よろしくね。

シェア

またはPlayer版

埋め込む »CMSなどでJSが使えない場合

関連スライド

各ページのテキスト
1.

EV カートで始めるモデルベース 開発 k-abe 編 著 2020-09-08 版 1 k-abe 発行

2.

前書き 本書は CQ 出版社から販売されている CQ EV カートのハードウェア・ソフトウェアを 改造し、モデルベース開発でブラシレスモーター制御を行う方法を説明します。私の自己 学習・実験で得た知見を情報共有しています。 「EV カートで始めるモデルベース開発」という書名ですが私はモデルベース開発を業 務で担当したことはありません(補助的な立ち位置で検証業務は経験があります)。私の 技術バックボーンは C 言語による組込みソフトウェア開発です。そんな技術バックボー ンをもつ私がモデルベース開発の自己学習を所有していた EV カートを利用して始めま した。 制御基板は Arduino MEGA 2560 でモデリングツールに MATLAB、Simulink を使用 します。MATLAB のライセンスは個人用途の MATLAB Home ライセンスです。自己 学習した結果、モデルベース開発で Arduino の周辺機能を制御し、EV カートのブラシレ スモーターを回すことができました。その開発過程で得た知見をまとめたのが本書です。 具体的につぎの知見が学べます。 • MATLAB、Simulink で Arduino のペリフェラルを制御する方法 GPIO 入力・出力、AD 変換、PWM、タイマー • C 言語の処理をモデルベースで実現する方法 私と同じ「組込みソフトウェアエンジニアでモデルベース開発に興味を持っている方」 に有益な情報となると考えています。Simulink モデルの説明では C 言語を併記し「C 言 語の記述は Simulink ではこのように書く」ということがわかりやすくなるよう工夫しま した。本書がモデルベース開発を始めたい方に役立てば嬉しいです。 免責事項 本書に記載された内容は、情報の提供のみを目的としています。したがって、本書を用 いた開発、製作、運用は、必ずご自身の責任と判断によって行ってください。これらの情 報による開発、製作、運用の結果について、著者はいかなる責任も負いません。 2

3.

目次 前書き 2 免責事項 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 第1章 2 EV カートとは何か? 5 構成 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 1.1.1 インバーター基板 . . . . . . . . . . . . . . . . . . . . . . . . . 6 1.1.2 CPU 基板 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8 1.1.3 ブラシレスモーター . . . . . . . . . . . . . . . . . . . . . . . . 9 1.1.4 ホールセンサー . . . . . . . . . . . . . . . . . . . . . . . . . . 11 1.1.5 スロットル . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12 1.2 開発環境 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13 1.3 制御方法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13 モデルベース開発変更点 16 構成 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16 2.1.1 治具基板 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17 2.1.2 CPU . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21 開発環境 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23 2.2.1 MATLAB, Simulink . . . . . . . . . . . . . . . . . . . . . . . 23 2.2.2 Simulink Support Package for Arduino Hardware . . . . . . . 23 1.1 第2章 2.1 2.2 第3章 モデルの説明 25 3.1 モデル全体図 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25 3.2 モーター位置取得機能 . . . . . . . . . . . . . . . . . . . . . . . . . . . 34 3.3 PWM 通電パターン取得機能 . . . . . . . . . . . . . . . . . . . . . . . 35 3.3.1 ホールセンサーパターン取得機能 . . . . . . . . . . . . . . . . . 36 3.3.2 ホールセンサーパターン→通電ステージ変換 . . . . . . . . . . . 38 3

4.

目次 通電ステージ→通電パターン選択機能 . . . . . . . . . . . . . . . 38 3.4 FET 駆動機能 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49 3.5 スロットル開度取得機能 . . . . . . . . . . . . . . . . . . . . . . . . . . 49 3.6 パイロット LED 点滅機能 . . . . . . . . . . . . . . . . . . . . . . . . . 51 動作確認結果 58 3.3.3 第4章 4.1 シミュレーション . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60 4.2 ホールセンサー信号検出と FET 通電パターンの設定 . . . . . . . . . . . 62 4.3 スロットル開度の取得 . . . . . . . . . . . . . . . . . . . . . . . . . . . 71 4.4 スタンドアロン動作確認 . . . . . . . . . . . . . . . . . . . . . . . . . . 75 課題 78 第5章 5.1 デッドタイム対応 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78 5.2 電源 ON でモーターが急回転するリスク . . . . . . . . . . . . . . . . . 78 5.3 ホールセンサーのポーリング . . . . . . . . . . . . . . . . . . . . . . . 79 5.4 スロットル開度に不感帯を設ける . . . . . . . . . . . . . . . . . . . . . 79 5.5 部品の保護 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79 5.6 機能拡張 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80 5.6.1 CAN 通信 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81 5.6.2 Arduino 対応の拡張基板 . . . . . . . . . . . . . . . . . . . . . . 81 第6章 参考書籍 82 著者紹介 84 4

5.

第1章 EV カートとは何か? EV カートは CQ 出版社から発売されている購入者自身で組み立て可能なカートです。 下記リンクのカート本体とモーター・インバーターキットを組み合わせることで走行可能 なカートを製作できます。 • カート本体 - https://shop.cqpub.co.jp/hanbai/books/I/I000255.html • ブラシレス・モーター & インバーター・キットセット - https://shop.cqpub.co.jp/hanbai/books/I/I000055.htm 特徴をいくつかピックアップします。 • モーターを手巻きし、走行目的にあったモーターを自作できる。 • モーター制御 CPU のソフトウェアが開発できる。 1.1 構成 EV カートは以降に示す要素で構成されています。本章で示す構成は EV カート購入時 のデフォルト構成です。図 1.1 はデフォルト構成のブロック図です。 5

6.

第 1 章 EV カートとは何か? ▲図 1.1 デフォルト構成のブロック図 モデルベース開発は第 2 章「モデルベース開発変更点」に記載している内容にハード ウェア、ソフトウェアを変更しています。 1.1.1 インバーター基板 EV カートは 2 枚の基板で構成されています。 インバーター基板はモーターを駆動する 3 相インバーター回路が実装されています。 図 1.2 はインバーター基板の写真です。 6

7.

1.1 構成 ▲図 1.2 インバーター基板 ブラシレスモーターを駆動するためには、3 相インバーター回路の FET をモーターの 位置に合わせて適切に通電する必要があります。この通電制御を行うのが後述する CPU 基板です。 7

8.

第 1 章 EV カートとは何か? 1.1.2 CPU 基板 CPU 基板はインバーター基板のピンヘッダに挿して使います。 図 1.3 は CPU 基板の写真です。 ▲図 1.3 CPU 基板 CPU 基板にはルネサス エレクトロニクス社製 CPU V850ES/FG3 uPD70F3374 が実 装されています。この CPU でモーター制御します。 8

9.

1.1 構成 1.1.3 ブラシレスモーター CQ EV カートのモーターは直流ブラシレスモーターです。モーターは手巻きし、走 行目的に合った特性をもつモーターをつくれます。図 1.4 はブラシレスモーターの写真 です。 ▲図 1.4 ブラシレスモーターの全体 ブラシレスモーターに 3 相の信号線、ホールセンサーが接続されています。 このブラシレスモーターは 12 極 18 スロットのアウタ・ロータタイプです。 「12 極」とは磁石が合計 12 個あることです。図 1.4 の黒い部分が磁石です。N 極・S 極が 交互に並んでいます。 「18 スロット」とはエナメル線が巻かれたコイルが 18 個あることです。図 1.4 の金色部 分がエナメル線を巻いたコイルです。このコイルにエナメル線を手巻きしモーターをつく りあげていきます。 図 1.4 は私が手巻きしたモーターです。巻線の方式は「6 直」で、φ 1.0mm のエナメル 9

10.

第 1 章 EV カートとは何か? 線を 1 スロットあたり 18 回巻いています。この巻線仕様だと他の巻線仕様(2 直 3 並、3 直 2 並)と比べ次の特性となります。 • 最高速度:2 直 3 並 > 3 直 2 並 > 6 直 • トルク:2 直 3 並 < 3 直 2 並 < 6 直 巻線の方式は図 1.5、図 1.6、図 1.6 を参照ください。各相 6 個ずつ U 相・V 相・W 相 の合計 18 スロットを手巻きします。 ▲図 1.5 6 直 10

11.

1.1 構成 ▲図 1.6 2 直 3 並 ▲図 1.7 3 直 2 並 巻線 6 直のモーターは「速度は遅いがトルクは大きい」特性となります。勾配のある コースでは有利ですが、平坦が多いコースでは不利です。以前回転数計で計測したときは スロットルを最大まで開けたときに 1000rpm くらいでした。 「アウタ・ロータ」ですが磁石の付いた「外側のロータ」が回転することからそう呼ば れています。 1.1.4 ホールセンサー ブラシレスモーターの磁極を検出するセンサーです。 11

12.

第 1 章 EV カートとは何か? CPU はホールセンサーでモーターの現在位置を把握し、FET を適切に通電制御しま す。図 1.8 はブラシレスモーターを近くから撮影した写真です。 ▲図 1.8 ブラシレスモーターを近くから撮影 扇形の小さい基板の裏にホールセンサーが 3 つ取り付けられています。このホールセン サー基板は N 極を検出すると Low レベル(0) 、S 極を検出すると High レベル(1)を出 力します。 1.1.5 スロットル EV カートのハンドル右手側にはスロットルが付いています。このスロットルの開閉で カートの速度調整が可能です。アナログ電圧 0〜5V がインバーター基板・CPU 基板に供 給されています。CPU 基板はアナログ電圧を AD 変換し電圧値からスロットル開閉度を 12

13.

1.2 開発環境 決めています。 1.2 開発環境 EV カートのソフトウェア開発環境は次のとおりです。すべてルネサス エレクトロニ クス社製のハードウェア、ツールです。 • 統合開発環境 CS+ - コンパイル、デバッグが行える統合開発環境ツール • Applilet2 for V850ES Fx3 - マイコン周辺機能を GUI で設定しソースコードを自動生成するツール • E1 - エミュレータ。CS+ と組み合わせて使うと CPU のデバッグができる。 • Renesas Flash Programmer - プログラム書き込みツール 1.3 制御方法 図 1.9 はモーター制御のタイミングチャートです。ホールセンサーと FET 通電ステー ジの制御タイミングを書いています。 13

14.

第 1 章 EV カートとは何か? ▲図 1.9 モーター制御のタイミングチャート CPU 基板はこのタイミングで FET を通電・制御します。その結果モーターが回転し ます。図 1.9 の制御を行うとモーターは物理的に「60 度」回転します。別の言い方をする と図 1.9 の制御を 6 回繰り返すとモーターは 360 度回転します。これは「1.1.3 ブラシレ スモーター」、「1.1.4 ホールセンサー」で説明したモータの極数は 12 極、N・S 極検出で 出力信号レベルが切り替わることから説明できます。このブラシレスモーターが物理的に 360 度回転するとき、極数は 12 極のためホールセンサーのエッジは 12 回変化します。図 1.9 は 1 つのホールセンサーに注目すると 2 回エッジが変化しています。 • 12 / 2 = 6 → 図 1.9 は物理的に 360 度回転するうち 1/6 の期間を示している • 360 / 6 = 60 → 図 1.9 は物理的に 60 度回転する期間を示している よって、図 1.9 は 360 度回転するうちの 60 度分の期間を示していることがわかります。 モーターが物理的にどのくらい回転するかは極数でわかります。 通電ステージ 1 → 6 方向に制御するとモーターは時計回り方向(CW 方向)に回りま す。反対に通電ステージ 6 → 1 方向に制御するとモーターは反時計回り方向(CCW 方 向)に回ります。 CPU 基板は図 1.9 の点線ホールセンサーの立上り、立ち下がりエッジを検出したら、 14

15.

1.3 制御方法 通電ステージにより High 側 FET・Low 側 FET に図 1.9 の通電パターンを設定します。 High 側 FET の塗りつぶしの期間で PWM 制御を行います。PWM 制御はパルス波形の ON 幅を長く・短くしたりする制御でモーター制御でよく使われている技術です。PWM 制御の ON 幅はスロットルの開度で決めています。スロットル開度に応じて PWM 制御 の ON 幅を長く・短くすることによりモーター回転数を変更しています。 表 1.1 はホールセンサー信号と FET 通電ステージの設定パターンをまとめた表です。 ▼表 1.1 ホールセンサー信号と FET 通電ステージ設定パターン 通電ステージ 1 2 3 4 5 6 Hall W 1 0 0 0 1 1 Hall V 0 0 1 1 1 0 Hall U 1 1 1 0 0 0 UH PWM PWM 0 0 0 0 VH 0 0 PWM PWM 0 0 WH 0 0 0 0 PWM PWM UL 0 0 0 1 1 0 VL 1 0 0 0 0 1 WL 0 1 1 0 0 0 今回利用しているブラシレスモーターの制御方法は「120 度通電制御」です。 ル ネ サ ス エ レ ク ト ロ ニ ク ス 株 式 会 社 の リ ン ク https://www.renesas.com/jp/ja/ support/technical-resources/engineer-school/brushless-dc-motor-02-inverter-pmw. html はブラシレスモーターの制御がアニメーションでわかりやすく説明されているので お薦めです。本書と同じブラシレスモーター制御はページ中ほどの図 3 です。 15

16.

第2章 モデルベース開発変更点 「1.1 構成」のデフォルト構成からモデルベース開発を行うために変更した点を本章に 書きます。 2.1 構成 図 2.1 の上がモデルベース開発のブロック図です。下はデフォルト構成のブロック図 です。 16

17.

2.1 構成 ▲図 2.1 モデルベース開発(上)とデフォルト構成(下)のブロック図 2.1.1 治具基板 モデルベース開発でもインバーター基板は変更せずに使用します。モデルベース開発で はインバーター基板と CPU 基板の間に治具基板が入ります。次が治具基板が追加となる 理由です。 • モデルベース開発ツールに対応している Arduino は EV カートの CPU 基板とピ ンヘッダの形状が異なるため、インバーター基板に挿せない。 そこで Arduino を治具基板に指し、治具基板をインバーター基板に指す構造を考えま した。図 2.2 は治具基板の写真です。 17

18.

第 2 章 モデルベース開発変更点 ▲図 2.2 治具基板 ちょっとお見せするのが恥ずかしい出来栄えですがこれが治具基板です。Arduino に 合体できるようにオスのピンヘッダ 1 列が 2 個あります。また、インバーター基板と合体 できるようにオスの 50 ピン 2 列のピンヘッダが 2 個あります。図 2.3 はインバーター基 板と治具基板を合体させた時の写真です。 18

19.

2.1 構成 ▲図 2.3 インバーター基板 + 治具基板の合体写真 図 2.4 はインバーター基板 + 治具基板に Arduino を合体させた時の写真です。 19

20.

第 2 章 モデルベース開発変更点 ▲図 2.4 インバーター基板 + 治具基板 +Arduino の合体写真 Arduino 基板表面にあるピンヘッダを治具基板に指す形になるので Arduino 基板裏面 が上になります。これでモデルベース開発をおこなうためのハードウェアの準備が完了 です。 20

21.

2.1 構成 2.1.2 CPU Arduino MEGA デフォルトの EV カート CPU 基板から Arduino MEGA に変更します。 図 2.5 は Arduino MEGA の写真です。 ▲図 2.5 Arduino MEGA なぜ Arduino MEGA を選択したのか、理由は次のとおりです。 • 無償でモデルベース開発に対応しているのが Arduino だったから。他にラズベ リーパイも対応しているが EV カートの制御内容・ボリュームを考えると Arduino の性能がベストと考えた。 • Arduino は安いから。安価な Arduino UNO ではなく、Arduino MEGA を選択し た理由は後述しているシミュレーションができるから。 Arduino MEGA ピン配置 図 2.6 は Arduino MEGA のピン配置です。 21

22.

第 2 章 モデルベース開発変更点 ▲図 2.6 Arduino MEGA ピン配置 モーター制御に使う信号は表 2.1 の Arduino MEGA の各ピンに割り当てています。 ▼表 2.1 Arduino MEGA ピン配置表 信号名称 1 2 3 4 5 6 7 8 9 10 11 ホールセンサ U 相 ホールセンサ V 相 ホールセンサ W 相 U 相 FET High 側 U 相 FET Low 側 V 相 FET High 側 V 相 FET Low 側 W 相 FET High 側 W 相 FET Low 側 スロットル パイロット LED 22 Arduino ピン番号 19 20 21 5 2 3 6 7 8 A0 13

23.

2.2 開発環境 2.2 開発環境 モデルベース開発は次の環境で行っています。 2.2.1 MATLAB, Simulink MATLAB, Simulink は MathWorks 社の開発ツールです。Simulink はブロックと呼 ばれる部品を配置・設定し、ブロック同士をつなげていきモデルをつくります。従来の C/C++ 組込みソフトウェアのプログラミングに比べ、抽象度の高い記法で記述でき ます。 MATLAB は Simulink で開発する際に必須となるツールです。MATLAB、Simulink をベースに多種多様なツールが存在しますが、本書では MATLAB、Simulink のみを使 います。下記は今回使用した MATLAB、Simulink のバージョンです。 >> ver --------------------------------------------------------------------------------------------------MATLAB バージョン: 9.7.0.1319299 (R2019b) Update 5 オペレーティング システム: Mac OS X Version: 10.15.6 Build: 19G73 Java バージョン: Java 1.8.0_202-b08 with Oracle Corporation Java HotSpot(TM) 64-Bit Server VM mixed mod --------------------------------------------------------------------------------------------------MATLAB バージョン 9.7 (R2019b) Simulink バージョン 10.0 (R2019b) 2.2.2 Simulink Support Package for Arduino Hardware バージョン 19.2.3 を使用しました。 「Simulink Support Package for Arduino Hardware」とは Simulink がサポートして いるハードウェアのパッケージソフトウェアです。このサポートパッケージ対応している ハードウェアは Simulink からハードウェア上で実行可能なオブジェクトファイルをつく れます。 また、Arduino のペリフェラルを制御する各種ブロックを提供します。たとえば、GPIO 入力・出力、AD 変換、PWM などです。Arduino のペリフェラルを制御する場合はこの ブロックを使用します。 23

24.

第 2 章 モデルベース開発変更点 ■どうやって開発を進めたか? 今回の開発は次のステップで進めました。 1. Arduino + C 言語でモーターが回ることを確認する。 2. Arduino + Simulink モデルでモーターが回ることを確認する。 1 の目的はハードウェアの確認です。モデルベース開発するために治具基板 と Arduino を組み合わせて使うことに決めました。治具基板は手作りなので Arduino と組み合わせてモーターを回せるのかハードウェアの確認が必要でした。 Simulink モデルを作りモーターが回らなかった場合、ハードウェア要因かソフト ウェア要因か切り分けが難しくなるかもしれないと考えたので前述の 1 → 2 の順 番で開発を進めることにしました。 1 の段階でモーターが回せていればハードウェアの不具合は疑う必要がなくな るのでモデルベース開発に専念できます。 単純にモデルベース開発の経験値がなく何をどうしたらよいかわからなかったこ とも理由です。 24

25.

第3章 モデルの説明 EV カートの Simulink モデルについて説明します。 モデルの説明は C 言語のソースコードと比較することで理解しやすくなるかもしれない と考えました。C 言語のソースコードは筆者の GitHub リポジトリ*1 に置いてありますの で適宜利用してください。 本書にモデルも図で載せていますが GitHub*2 にも置いています。こちらも適宜利用して ください。モデル(拡張子は*.slx)は MATLAB・Simulink がないと見ることができま せん。モデルとはどのようなものかイメージいただくためブラウザで見れるレポートファ イルを用意しました。 • モデルレポートファイルのパス:ModelReport/ev_kart.html レポートファイルを参照すればモデルがどんなものかなんとなく理解できると思い ます。 3.1 モデル全体図 図 3.1 は EV カートのモデル全体図です。 *1 *2 https://github.com/grace2riku/EVKartArduinoIDE.git https://github.com/grace2riku/EVKartArduinoSimulink.git 25

26.

第 3 章 モデルの説明 ▲図 3.1 モデル全体図 図 3.1 に四角がたくさんありますがこれが「ブロック」です。ブロックは機能毎にたく さんあります。ブロックは Simulink のメニュー シミュレーション -> ライブラリブラ ウザー から確認できます。図 3.2 は操作画面です。 26

27.

3.1 モデル全体図 ▲図 3.2 ブロックを確認するためライブラリブラウザーを選択 ライブラリブラウザーを選択すると図 3.3 の画面となります。 27

28.

第 3 章 モデルの説明 ▲図 3.3 Simulink ライブラリ ブラウザー 図 3.3 を見ると「Simulink」 、 「Simulink Support Package for Arduino Hardware」の ツリーがあります。ツリーの下に階層があります。機能毎にブロックが分類されていると 想像できます。Simulink モデルはこれらのブロックを組み合わせて作成していきます。 いくつか Simulink ブロックライブラリーを紹介します。図 3.3 では Simulink/Math Operations が選択されています。名前から想像できるかと思いますが、こちらは数学の ライブラリです。たとえば加算を行う Add、割り算を行う Divide ブロックなどがありま す。図 3.4 は Simulink/Sinks が選択されています。 28

29.

3.1 モデル全体図 ▲図 3.4 Simulink/Sinks Simulink/Sinks ではこの後のモデルの図でも頻繁に登場する Display ブロック、Scope ブロックがあります。どちらのブロックもシミュレーションのときにモデルの状態を確認 する用途で使います。 「Simulink Support Package for Arduino Hardware」もいくつかブロックライブラ リーを紹介します。「Simulink Support Package for Arduino Hardware」は Arduino のペリフェラルを制御するためのブロックです。図 3.4 は Simulink Support Package for Arduino Hardware/Common が選択されています。Common の他にも Ethernet Shield、Sensors、WiFi などのブロックがあります。 29

30.

第 3 章 モデルの説明 ▲図 3.5 Simulink Support Package for Arduino Hardware/Common Simulink Support Package for Arduino Hardware/Common の中には次のブロック があります。 • Analog Input : AD 変換 • Digital Input : GPIO 入力 • Digital Output : GPIO 出力 • PWM : PWM 出力 これらのブロックを Simulink にドラッグ&ドロップし、パラメータの変更が必要であ れば変更します。図 3.6 は Simulink に Analog Input ブロックをドラッグ&ドロップし たときの図です。 30

31.

3.1 モデル全体図 ▲図 3.6 Analog Input を Simulink にドラッグ&ドロップ 図 3.6 は「Pin: 4」と表示されています。今回の EV カートのピン配置は「A0」ピンに スロットルのアナログ電圧を供給する仕様にしたため Analog Input ブロックの設定変更 が必要です。Analog Input ブロックをダブルクリックすると図 3.7 になります。 31

32.

第 3 章 モデルの説明 ▲図 3.7 Analog Input ブロックのデフォルトパラメータ ここの「Pin number」を 4 から 0 に変更します。図 3.8 はピン番号を変更したあと です。 32

33.

3.1 モデル全体図 ▲図 3.8 Analog Input ブロックの Pin 番号の変更 このようにブロックの配置・パラメータ設定を行います。 今回実施したモデルベース開発の作業の流れを簡単に説明します。 • ブロックを配置する • ブロックのパラメータ変更が必要であれば変更する • ブロック同士をつなぐ • 希望する制御をおこなうモデルが完成したらシミュレーションで動作確認する • シミュレーションが問題なければビルドし、オブジェクトモジュールを作成する • CPU にオブジェクトモジュールを書き込み、スタンドアロンで動作確認する 以降から各機能ブロック毎に動作説明します。 33

34.

第 3 章 モデルの説明 3.2 モーター位置取得機能 図 3.9 の枠内部はモーター位置を取得する機能です。 ▲図 3.9 モーター位置取得機能(枠内部) Digital Input ブロックを使用し、ポーリングで 3 つのホールセンサのレベルを読み込 みます。リスト 3.1 は C 言語のソースコードです。 ▼リスト 3.1 ホールセンサーレベル読み込み処理部分 1: void setFETDrivePattern() 2: { 3: byte hallSensorPosition; // ホールセンサー位置 4: 5: hallSensorPosition = digitalRead(HALL_W_PORT) << 2 | 6: digitalRead(HALL_V_PORT) << 1 | 7: digitalRead(HALL_U_PORT); 8: Simulink のブロック名は Digital Input で C 言語の関数名は digitalRead となってい ます。若干名称が違いますがモデルのブロックの方も機能を想像できる名称となってい 34

35.

3.3 PWM 通電パターン取得機能 ます。 3.3 PWM 通電パターン取得機能 図 3.10 の枠内部は PWM 通電パターン取得機能のトップ階層です。 ▲図 3.10 PWM 通電パターン機能(トップ階層) PWM 通電パターン取得の制御ロジックは Subsystem ブロック内部で実現していま す。Subsystem ブロックは C 言語の関数と似ています。Subsystem ブロックを使わなく てもモデルは書けますが、図 3.11 のブロックが図 3.10 と同じ階層に配置されることにな り、モデルが煩雑になる・見にくくなることから Subsystem ブロック内部に機能を集約 します。 図 3.11 は PWM 通電パターン取得機能の Subsystem ブロック内部です。 35

36.

第 3 章 モデルの説明 ▲図 3.11 PWM 通電パターン取得 この階層でモーター位置から通電パターンを取得しています。 3.3.1 ホールセンサーパターン取得機能 図 3.12 はホールセンサーパターン取得機能です。 36

37.

3.3 PWM 通電パターン取得機能 ▲図 3.12 ホールセンサーパターン取得機能 U 相、V 相、W 相ホールセンサーのレベルからホールセンサーパターンを取得します。 ホールセンサー信号と FET 通電ステージの設定パターンをまとめた表 3.1 を再掲し ます。 ▼表 3.1 ホールセンサー信号と FET 通電ステージ設定パターン 通電ステージ 1 2 3 4 5 6 Hall W 1 0 0 0 1 1 Hall V 0 0 1 1 1 0 Hall U 1 1 1 0 0 0 UH PWM PWM 0 0 0 0 VH 0 0 PWM PWM 0 0 WH 0 0 0 0 PWM PWM UL 0 0 0 1 1 0 VL 1 0 0 0 0 1 WL 0 1 1 0 0 0 たとえば Hall W が 1、Hall V が 0、Hall U が 1 だった場合、 「5(2 進数で表現すると 101)」がホールセンサーのパターンになります。このホールセンサーパターンからモー 37

38.

第 3 章 モデルの説明 ターの現在位置を知ることができ、どう制御すればモーターが回るのか設定すべき通電 パターンもわかります。モデルでは Hall W を左に 2bit、Hall V を左に 1bit シフトし、 ホールセンサーのパターンとしています。リスト 3.1 ではホールセンサ U 相を 0bit 目、 V 相を 1bit 目、W 相を 2bit 目に割り当てています。モデルと同様の処理をしていること がわかります。 3.3.2 ホールセンサーパターン→通電ステージ変換 図 3.13 はホールセンサーパターン→通電ステージ変換機能です。 ▲図 3.13 ホールセンサーパターン→通電ステージ変換 ホールセンサーパターンがどの通電ステージに該当するのか変換します。具体的には表 3.1 の Hall W、Hall V、Hall U から通電ステージを求めます。モデルでは Index Vector ブロックを使用し実現しています。Index Vector は C 言語でいう配列です。1 つ目の入 力に 0 始まりのインデックスを入力すると 2 つ目のテーブルから該当するインデックス の要素を取得できます。ホールセンサーパターン W、V、U が 5(2 進数で 101)の場合 は定数 HallPatternTable の 5 番目の要素「1」が取得できます。Index Vector の 1 つ目 の入力に異常なホールセンサーパターンが入力された場合は 0 を返します。 3.3.3 通電ステージ→通電パターン選択機能 図 3.14 は通電ステージ→通電パターン選択機能です。 38

39.

3.3 PWM 通電パターン取得機能 ▲図 3.14 通電ステージ→通電パターン選択機能 通電ステージによりどの FET を PWM 制御するか、ON・OFF するか通電パターンを 選択します。Switch Case ブロックで通電ステージに合わせた通電パターンの case 条件 が選択されます。異常な通電ステージ(0)の場合、default ケースの通電パターンが選択 となります。default ケースではすべての FET を OFF し通電しません。 通電ステージ 1 図 3.15 は通電ステージ 1 の制御ブロックです。 39

40.

第 3 章 モデルの説明 ▲図 3.15 通電ステージ 1 通電ステージによりどの FET を PWM 制御するか、ON・OFF するか決定します。通 電ステージ 1 の場合は次の通電パターンです。 • U 相 High 側 FET が PWM 制御、V 相 Low 側 FET が High レベル、その他の FET は Low レベル 6 つの信号を Bus Creator ブロックでバス化(1 本の信号線として扱えるように)して います。上から U 相 High 側 FET、V 相 High 側 FET、W 相 High 側 FET、U 相 Low 側 FET、V 相 Low 側 FET、W 相 Low 側 FET の信号です。後段のブロックで各信号線 を各 FET に接続しています。通電ステージ 2〜6 も同様に SwitchCase Block の case 条 件に FET の通電パターンを記述しています。 リスト 3.2 は C 言語のソースコードです。通電ステージ 1 のとき analogWrite 関数で 表 3.1 のとおりに通電設定している処理になっています。 ▼リスト 3.2 FET 通電パターン設定 通電ステージ 1 40

41.

3.3 PWM 通電パターン取得機能 1: void setFETDrivePattern() 2: { 3: byte hallSensorPosition; // ホールセンサー位置 4: 5: hallSensorPosition = digitalRead(HALL_W_PORT) << 2 | 6: digitalRead(HALL_V_PORT) << 1 | 7: digitalRead(HALL_U_PORT); 8: 9: switch(hallSensorPosition) { 10: /* ホールセンサ入力位置:W=1, V=0, U=1 */ 11: /* FET通電ステージ1:UH=PWM, VH=0, WH=0, UL=0, VL=1, WL=0 */ 12: case HALL_SENSOR_POSITION_5: 13: analogWrite(FET_UH_PORT, pwmDuty); 14: analogWrite(FET_VH_PORT, 0); 15: analogWrite(FET_WH_PORT, 0); 16: digitalWrite(FET_UL_PORT, LOW); 17: digitalWrite(FET_VL_PORT, HIGH); 18: digitalWrite(FET_WL_PORT, LOW); 19: break; 通電ステージ 2 図 3.16 は通電ステージ 2 の制御ブロックです。 ▲図 3.16 通電ステージ 2 41

42.

第 3 章 モデルの説明 リスト 3.3 は C 言語のソースコードです。 ▼リスト 3.3 FET 通電パターン設定 通電ステージ 2 1: void setFETDrivePattern() 2: { 3: byte hallSensorPosition; // ホールセンサー位置 4: 5: hallSensorPosition = digitalRead(HALL_W_PORT) << 2 | 6: digitalRead(HALL_V_PORT) << 1 | 7: digitalRead(HALL_U_PORT); 8: 9: switch(hallSensorPosition) { 10: /* 省略 */ 11: 12: /* ホールセンサ入力位置:W=0, V=0, U=1 */ 13: /* FET通電ステージ2:UH=PWM, VH=0, WH=0, UL=0, VL=0, WL=1 */ 14: case HALL_SENSOR_POSITION_1: 15: analogWrite(FET_UH_PORT, pwmDuty); 16: analogWrite(FET_VH_PORT, 0); 17: analogWrite(FET_WH_PORT, 0); 18: digitalWrite(FET_UL_PORT, LOW); 19: digitalWrite(FET_VL_PORT, LOW); 20: digitalWrite(FET_WL_PORT, HIGH); 21: break; 通電ステージ 3 図 3.17 は通電ステージ 3 の制御ブロックです。 42

43.

3.3 PWM 通電パターン取得機能 ▲図 3.17 通電ステージ 3 リスト 3.4 は C 言語のソースコードです。 ▼リスト 3.4 FET 通電パターン設定 通電ステージ 3 1: void setFETDrivePattern() 2: { 3: byte hallSensorPosition; // ホールセンサー位置 4: 5: hallSensorPosition = digitalRead(HALL_W_PORT) << 2 | 6: digitalRead(HALL_V_PORT) << 1 | 7: digitalRead(HALL_U_PORT); 8: 9: switch(hallSensorPosition) { 10: /* 省略 */ 11: 12: /* ホールセンサ入力位置:W=0, V=1, U=1 */ 13: /* FET通電ステージ3:UH=0, VH=PWM, WH=0, UL=0, VL=0, WL=1 */ 14: case HALL_SENSOR_POSITION_3: 15: analogWrite(FET_UH_PORT, 0); 16: analogWrite(FET_VH_PORT, pwmDuty); 17: analogWrite(FET_WH_PORT, 0); 18: digitalWrite(FET_UL_PORT, LOW); 19: digitalWrite(FET_VL_PORT, LOW); 20: digitalWrite(FET_WL_PORT, HIGH); 21: break; 43

44.

第 3 章 モデルの説明 通電ステージ 4 図 3.18 は通電ステージ 4 の制御ブロックです。 ▲図 3.18 通電ステージ 4 リスト 3.5 は C 言語のソースコードです。 ▼リスト 3.5 FET 通電パターン設定 通電ステージ 4 1: void setFETDrivePattern() 2: { 3: byte hallSensorPosition; // ホールセンサー位置 4: 5: hallSensorPosition = digitalRead(HALL_W_PORT) << 2 | 6: digitalRead(HALL_V_PORT) << 1 | 7: digitalRead(HALL_U_PORT); 8: 9: switch(hallSensorPosition) { 10: /* 省略 */ 11: 12: /* ホールセンサ入力位置:W=0, V=1, U=0 */ 13: /* FET通電ステージ4:UH=0, VH=PWM, WH=0, UL=1, VL=0, WL=0 */ 14: case HALL_SENSOR_POSITION_2: 15: analogWrite(FET_UH_PORT, 0); 44

45.

3.3 PWM 通電パターン取得機能 16: 17: 18: 19: 20: 21: analogWrite(FET_VH_PORT, pwmDuty); analogWrite(FET_WH_PORT, 0); digitalWrite(FET_UL_PORT, HIGH); digitalWrite(FET_VL_PORT, LOW); digitalWrite(FET_WL_PORT, LOW); break; 通電ステージ 5 図 3.19 は通電ステージ 5 の制御ブロックです。 ▲図 3.19 通電ステージ 5 リスト 3.6 は C 言語のソースコードです。 ▼リスト 3.6 FET 通電パターン設定 通電ステージ 5 1: void setFETDrivePattern() 2: { 3: byte hallSensorPosition; // ホールセンサー位置 4: 5: hallSensorPosition = digitalRead(HALL_W_PORT) << 2 | 6: digitalRead(HALL_V_PORT) << 1 | 45

46.

第 3 章 モデルの説明 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: digitalRead(HALL_U_PORT); switch(hallSensorPosition) { /* 省略 */ /* ホールセンサ入力位置:W=1, V=1, U=0 */ /* FET通電ステージ5:UH=0, VH=0, WH=PWM, UL=1, VL=0, WL=0 */ case HALL_SENSOR_POSITION_6: analogWrite(FET_UH_PORT, 0); analogWrite(FET_VH_PORT, 0); analogWrite(FET_WH_PORT, pwmDuty); digitalWrite(FET_UL_PORT, HIGH); digitalWrite(FET_VL_PORT, LOW); digitalWrite(FET_WL_PORT, LOW); break; 通電ステージ 6 図 3.20 は通電ステージ 5 の制御ブロックです。 ▲図 3.20 通電ステージ 6 リスト 3.7 は C 言語のソースコードです。 46

47.

3.3 PWM 通電パターン取得機能 ▼リスト 3.7 FET 通電パターン設定 通電ステージ 6 1: void setFETDrivePattern() 2: { 3: byte hallSensorPosition; // ホールセンサー位置 4: 5: hallSensorPosition = digitalRead(HALL_W_PORT) << 2 | 6: digitalRead(HALL_V_PORT) << 1 | 7: digitalRead(HALL_U_PORT); 8: 9: switch(hallSensorPosition) { 10: /* 省略 */ 11: 12: /* ホールセンサ入力位置:W=1, V=0, U=0 */ 13: /* FET通電ステージ6:UH=0, VH=0, WH=PWM, UL=0, VL=1, WL=0 */ 14: case HALL_SENSOR_POSITION_4: 15: analogWrite(FET_UH_PORT, 0); 16: analogWrite(FET_VH_PORT, 0); 17: analogWrite(FET_WH_PORT, pwmDuty); 18: digitalWrite(FET_UL_PORT, LOW); 19: digitalWrite(FET_VL_PORT, HIGH); 20: digitalWrite(FET_WL_PORT, LOW); 21: break; 異常 図 3.21 は異常の場合の制御ブロックです。 47

48.
[beta]
第 3 章 モデルの説明

▲図 3.21 通電ステージ異常

リスト 3.8 は C 言語のソースコードです。
▼リスト 3.8

FET 通電パターン設定 異常

1: void setFETDrivePattern()
2: {
3:
byte hallSensorPosition;
// ホールセンサー位置
4:
5:
hallSensorPosition = digitalRead(HALL_W_PORT) << 2 |
6:
digitalRead(HALL_V_PORT) << 1 |
7:
digitalRead(HALL_U_PORT);
8:
9:
switch(hallSensorPosition) {
10:
/* 省略 */
11:
12:
default:
13:
analogWrite(FET_UH_PORT, 0);
14:
analogWrite(FET_VH_PORT, 0);
15:
analogWrite(FET_WH_PORT, 0);
16:
digitalWrite(FET_UL_PORT, LOW);
17:
digitalWrite(FET_VL_PORT, LOW);
18:
digitalWrite(FET_WL_PORT, LOW);
19:
break;
20:
}
21:

48

49.

3.4 FET 駆動機能 3.4 FET 駆動機能 図 3.22 は FET 駆動機能です。 ▲図 3.22 FET 駆動機能(枠内部) 「3.3 PWM 通電パターン取得機能」出力の複数の信号(バス信号)を BusSelector ブ ロックで 1 つずつ信号として取り出します。上から U 相 High 側 FET、V 相 High 側 FET、W 相 High 側 FET、U 相 Low 側 FET、V 相 Low 側 FET、W 相 Low 側 FET の 信号です。 High 側 FET は通電パターンにより PWM 制御することがあるため PWM ブロッ クを接続しています。Low 側 FET は出力端子のレベルを制御するため Digital Write ブロックを接続しています。C 言語のソースコードはリスト 3.2 で FET High 側は analogWrite、FET Low 側は digitalWrite 関数を使っています。 3.5 スロットル開度取得機能 図 3.23 はスロットル開度取得機能です。 49

50.

第 3 章 モデルの説明 ▲図 3.23 スロットル開度取得機能(枠内部) カートの速度調整はスロットルを使います。スロットルの開度はインバーター基板に 0〜5V の電圧で入力され Analog Input ブロックで AD 変換しています。AD 変換値は FET High 側の PWM ブロックの設定値として使用しています。AD 変換値が大きいほ ど PWM 制御の On Duty 幅も大きく、モータ回転数も高くなりカートは早く走ります。 トップ階層で DataStoreWrite、DataStoreMemory ブロックでスロットル開度を保存し ています。保存したスロットル開度は図 3.15 通電ステージ 1〜6 の DataStoreRead ブ ロック(名称:PWMDataRead)で参照し、FET High 側の PWM 設定値にしています。 スロットル開度は C 言語のグローバル変数のように使っています。 AD 変換値を Divide ブロックで 4 で割っていますが、これは Analog Input ブロック 分解能 10bit を PWM ブロックの分解能 8bit に合わせているためです。 リスト 3.9 は analogRead 関数で AD 変換しています。 ▼リスト 3.9 スロットル開度取得 1: void setFETDrivePattern() 2: { 3: void expireTimer() { 4: static int counter1sec = 0; 50

51.

3.6 パイロット LED 点滅機能 5: 6: 7: 8: 9: static boolean pilotLedStatus = LOW; /* AD値(0〜1023, PWM duty 0〜255) */ pwmDuty = analogRead(THROTTLE_PORT) / 4; 3.6 パイロット LED 点滅機能 図 3.24 はパイロット LED 点滅機能のトップ階層です。 ▲図 3.24 パイロット LED 点滅機能トップ階層(枠内部) 書き込まれたモデルが動作しているか目視確認する意図で Arduino MEGA に実装され ている LED を 2 秒周期で点滅しています。モーター制御とは関係がない動作です。LED 点滅のロジックは Triggered Subsystem ブロック内部で実行しています。 Pulse Generator、Triggered Subsystem ブロックについて説明します。Pulse Generator ブロックは文字とおりパルスを生成するブロックです。パイロット LED 点滅機能で は 1 秒周期のパルスを作り、Triggered Subsystem ブロックの動作トリガとして利用して います。図 3.25 は Pulse Generator ブロックの設定画面です。 51

52.

第 3 章 モデルの説明 ▲図 3.25 Pulse Generator ブロックの設定画面 周期(秒)が 1、パルス幅(周期の割合(%) )が 50 と設定しているので、 • 1 秒周期の Duty50% のパルス波形 が生成されます。 52

53.

3.6 パイロット LED 点滅機能 Triggered Subsystem ブロックはトリガによって動作する Subsystem ブロックです。 Subsystem ブロックは「3.3 PWM 通電パターン取得機能」でも使用しました。Triggered Subsystem ブロックは外部からのトリガによってブロック内部のロジックを実行する点 が Subsystem ブロックと違います。パイロット LED 点滅機能では Pulse Generator ブ ロックのパルスを Triggered Subsystem ブロックの動作トリガとして利用しています。 図 3.26 は Triggered Subsystem ブロック内部 Trigger ブロックの設定画面です。 ▲図 3.26 Triggered Subsystem ブロック内部 Trigger ブロックの設定画面 トリガー タイプを立ち上がりに設定しています。この設定で Triggered Subsystem ブロックに入力しているパルスの立ち上がりでブロック内部が動作します。図 3.27 は 53

54.

第 3 章 モデルの説明 Trigger ブロック トリガー タイプの選択肢です。 ▲図 3.27 Trigger ブロック トリガー タイプの選択肢 トリガー タイプは立ち上がりの他に立ち下がり、両方、関数呼び出しの合計 4 種類か ら選択できます。 図 3.28 は Triggered Subsystem ブロック内部のパイロット LED 点滅機能の制御ロ ジックです。 54

55.

3.6 パイロット LED 点滅機能 ▲図 3.28 パイロット LED 点滅機能の制御ロジック 固定値 1 と前回の出力値(初期値は 0)の排他的論理和(XOR)演算を行います。結 果、LED が点滅します。この Triggered Subsystem は 1 秒周期でパルスが入力されます が、 「立ち上がり」で動作するよう設定しているので 2 秒周期で LED は点滅します。トリ ガー タイプを「両方」にすれば 1 秒周期で LED は点滅します。 リスト 3.10 はパイロット LED 点滅の C 言語ソースコードです。expireTimer は 10msec ごとに呼び出され、100 回カウントしたら LED 出力を反転します。よってこの LED は 1 秒周期で点滅します(モデルと C 言語の動作が異なります)。 ▼リスト 3.10 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: スロットル開度取得 // EvKartPin.h /***** タイマー *****/ #define COUNTER_1SEC (100) /* 1000msec/10msec */ /***** パイロットLED *****/ #define PILOT_LED (13) /* Arduino MEGAに実装されているLED */ // main.cpp void expireTimer() { static int counter1sec = 0; static boolean pilotLedStatus = LOW; 55

56.
[beta]
第 3 章 モデルの説明

12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22: }

// 省略
++counter1sec;
if (counter1sec >= COUNTER_1SEC) {
counter1sec = 0;
/* パイロットLEDの点滅 */
digitalWrite(PILOT_LED, pilotLedStatus);
pilotLedStatus = !pilotLedStatus;
}

■モデルベース開発はいくらかかるの?(個人向け Home ライセン
スの場合)
今回モデルベース開発に MathWork 社の個人向け Home ライセンスで MAT-

LAB、Simulink、Simulink Support Package for Arduino Hardware の 3 つのソ
フトウェアを使いました。参考までに開発環境のコストを紹介します。執筆時点
の MATLAB、Simulink の価格は次のとおりです。

*Simulink Support Package for Arduino Hardware は無料でダウンロード可能
です。

• MATLAB:15,500 円
• Simulink:4,490 円
価格は次のリンクから確認可能です。

https://jp.mathworks.com/store/link/products/home/new?s_iid=htb_
buy_gtwy_cta4
購入すると 1 年間の製品ライセンスが付与されます。次年度も継続して使う場合
は更新が必要です。図 3.29 は更新費用です。筆者のアカウント画面のスクリーン
ショットです。

56

57.

3.6 パイロット LED 点滅機能 ▲図 3.29 MATLAB, Simulink の年間更新費用 • MATLAB:7,490 円 • Simulink:2,290 円 57

58.

第4章 動作確認結果 本章は動作確認結果について書きます。動作確認環境は 2 つに分けられます。 • シミュレーション環境 • スタンドアロン環境 シミュレーション環境とスタンドアロン環境の違いは PC を接続するか、しないかで す。シミュレーション環境は Arduino の実行時状態を PC でモニタリングできます。 図 4.1 は動作確認環境の写真です。 58

59.

▲図 4.1 動作確認環境 モーターをカート本体に取り付けて動作確認すると大きな作業スペースが必要になるた めモーターを EV カートから取り外して確認します。 次に動作確認環境の構成要素を書きます。表 4.1 は動作確認環境の構成要素です。表 4.1 の「キット同梱」とはインバーター・キットセットに含まれているものです。 • ブラシレス・モーター & インバーター・キットセット - https://shop.cqpub.co.jp/hanbai/books/I/I000055.htm 59

60.

第 4 章 動作確認結果 ▼表 4.1 動作確認環境の構成要素 No 1 2 3 4 5 6 7 8 9 10 11 12 構成品 内容 キット同梱 インバーター基板 ○ 治具基板 3 相インバーター回路。FET が実装されている。 インバーター基板と Arduino MEGA 基板を接続する。 Arduino MEGA 治具基板と接続する。モーター通電制御を行う。 - ブラシレスモーター U・V・W 相の 3 相の信号線をインバーター基板と接続する。 ○ モーター固定台 モーターを固定する。 ○ ホールセンサー 3 つのホールセンサーでモーター位置を特定する。 ○ スロットル 可変抵抗で代用する。 ○ PC USB ケーブル シミュレーション環境のみ。 電源供給用治具 後述の AC アダプタを接続するために必要 AC アダプタ 24V を供給。 - シミュレーション環境のみ。 ブレーカー ○ PC と USB ケーブルはシミュレーション時に使用します。 4.1 シミュレーション シミュレーションでモデルの各種状態をモニタリングできます。 PC と USB ケーブルを接続し、インバーター基板の電源 ON します。Simulink で図 4.2 のシミュレータタブ -> 実行を押下するとシミュレーションが開始となります。 60

61.

4.1 シミュレーション ▲図 4.2 Simulink シミュレーション実行画面 図 4.3 はシミュレーション実行中の画面です。 61

62.

第 4 章 動作確認結果 ▲図 4.3 Simulink シミュレーション実行中画面 画面左下に「実行中」と表示され、画面右下には実行時間が表示されています。この状 態になればモデルの各種状態をモニタリングできます。 シミュレーションは Arduino とシリアル通信を行い実現しており Arduino MEGA だ とできます。シミュレーションの動作モードは「External mode」と呼ばれています。 Arduino UNO は External mode 未対応のためモニタリングできません。 4.2 ホールセンサー信号検出と FET 通電パターンの設定 「シミュレーションはモデルの状態をモニタリングできる」と書きましたが具体的な確 認方法を説明します。モニタリングするにはモニタリングしたい信号と「Display」また は「Scope」ブロックをつなげます。 ここではホールセンサー信号と FET 通電パターンを確認します。 モーター制御のタイミングチャートと表を再掲します。ホールセンサーのレベルから通電 ステージが正しく取得できているかを確認していきます。 62

63.

4.2 ホールセンサー信号検出と FET 通電パターンの設定 ▲図 4.4 モーター制御のタイミングチャート ▼表 4.2 ホールセンサー信号と FET 通電ステージ設定パターン 通電ステージ 1 2 3 4 5 6 Hall W 1 0 0 0 1 1 Hall V 0 0 1 1 1 0 Hall U 1 1 1 0 0 0 UH PWM PWM 0 0 0 0 VH 0 0 PWM PWM 0 0 WH 0 0 0 0 PWM PWM UL 0 0 0 1 1 0 VL 1 0 0 0 0 1 図 4.5 はホールセンサパターンと通電ステージ 1 の変換を確認している図です。 63 WL 0 1 1 0 0 0

64.

第 4 章 動作確認結果 ▲図 4.5 通電ステージ 1 図の枠①〜③を参照ください。 ①はホールセンサーの信号レベルです。 W 相は 1、V 相は 0、U 相は 1 と Display ブロックに表示されています。 ②はホールセンサーパターンです。 ①のホールセンサー信号をビットシフトしています。 W 相を 2bit、V 相は 1bit、U 相は 0bit 左シフトした結果、「5」となります。 ②の Display ブロックに 5 と表示していることが確認できます。 ③は通電ステージです。 ②のホールセンサーパターンから通電ステージを取得します。 ホールセンサーパターン 5 は通電ステージ 1 になります。 ③の Display に 1 と表示されていることが確認できます。 図 4.4、表 4.2 の記載とおりの結果となっているので動作は OK です。 通電ステージ 2〜6 も同様に確認します。 64

65.

4.2 ホールセンサー信号検出と FET 通電パターンの設定 図 4.6 はホールセンサパターンと通電ステージ 2 の変換を確認している図です。 ▲図 4.6 通電ステージ 2 図 4.7 はホールセンサパターンと通電ステージ 3 の変換を確認している図です。 65

66.

第 4 章 動作確認結果 ▲図 4.7 通電ステージ 3 図 4.8 はホールセンサパターンと通電ステージ 4 の変換を確認している図です。 66

67.

4.2 ホールセンサー信号検出と FET 通電パターンの設定 ▲図 4.8 通電ステージ 4 図 4.9 はホールセンサパターンと通電ステージ 5 の変換を確認している図です。 67

68.

第 4 章 動作確認結果 ▲図 4.9 通電ステージ 5 図 4.10 はホールセンサパターンと通電ステージ 6 の変換を確認している図です。 68

69.

4.2 ホールセンサー信号検出と FET 通電パターンの設定 ▲図 4.10 通電ステージ 6 このように確認したいポイントに Display ブロックを配置していけば信号の状態を確認 できます。組込みソフトウェア開発の printf デバッグのようです。 Display ブロックでモデルの状態を確認していましたが、同様のことが Scope ブロック でできます。図 4.11 は Scope ブロックに図 4.4、表 4.2 の信号を接続したモデルです。 69

70.

第 4 章 動作確認結果 ▲図 4.11 Scope ブロックでモニタリングする例 これでシミュレーションを実行し Scope ブロックをダブルクリックすると図 4.12 の画 面になります。 70

71.

4.3 スロットル開度の取得 ▲図 4.12 Scope ブロックの表示結果 オシロスコープのような画面が表示されます。一番上の波形は通電ステージ番号です。 通電ステージ番号が 1 から 6 に変化すると High 側 FET、Low 側 FET の信号が図 4.4、 表 4.2 のとおりになっていることが確認できます。 ※ PWM 設定値は 0 の場合の図なので PWM のパルス部分は 0 固定になっています。 このように Scope ブロックはタイミングチャートで規定される各信号を確認するときに 便利です。 4.3 スロットル開度の取得 スロットル開度は電圧 0〜5V を AD 変換して決めます。Simulink モデルで AD 変換 を行う Analog Input ブロックは 10bit です。0V が 0(0x000)、2.5V が 511(0x1FF)、 5V が 1023(0x3FF)近辺の値に変換されていれば OK です。任意 3 点の電圧を AD 変 換した結果を次に示します。 図 4.13 の Display Throttle Voltage は 1.302V を AD 変換した結果です。 71

72.

第 4 章 動作確認結果 ▲図 4.13 1.302V を AD 変換した結果 図 4.14 の Display Throttle Voltage は 2.594V を AD 変換した結果です。 72

73.

4.3 スロットル開度の取得 ▲図 4.14 2.594V を AD 変換した結果 図 4.15 の Display Throttle Voltage は 5.03V を AD 変換した結果です。 73

74.

第 4 章 動作確認結果 ▲図 4.15 5.03V を AD 変換した結果 表 4.3 は計測結果の一覧表です。 スロットル開度は AD 変換値を 4 で割り、PWM ブロック設定値として使用します。 ▼表 4.3 スロットル電圧と開度の動作確認結果 No 1 2 3 電圧(V) 1.302 2.594 5.03 AD 変換値(dec) 259 518 1010 開度(dec) 64 129 252 3 点とも期待値に近い値に AD 変換できているので問題なさそうです。 74

75.

4.4 スタンドアロン動作確認 4.4 スタンドアロン動作確認 PC を接続せずスタンドアロンで動作確認します。 Simulink のメニューからハードウェア -> ビルド、配布および開始 -> ビルド、配布お よび開始を選択します。図 4.16 はそのときの画面です。 ▲図 4.16 ビルド、Arduino に書き込み ビルド、書き込みが終了すると図 4.17 の画面になります。 75

76.

第 4 章 動作確認結果 ▲図 4.17 ビルド、Arduino に書き込み終了時の画面 図 4.17 を見ると次の表示があります。 • Program は 4.9% • Data は 19.2% 本書のモデルは ROM 使用量が 4.9%、RAM 使用量が 19.2% ということがわかります。 モデルファイル(ev_kart.slx)と同じ階層には次のファイルが出力されています。 • ev_kart.elf • ev_kart.hex 組込みソフトウェア開発でお馴染みの elf ファイル、hex ファイルです。おそらく Simulink で「ビルド、配布および開始」の操作を実行すると hex ファイルが Arduino に 書き込まれていると思います。 図 4.17 の画面となったらインバーター基板の電源を OFF し、治具基板に接続している USB ケーブルを取り外します。その後電源を ON します。この状態でスロットル(正確 にいうとスロットルの代用品の可変抵抗)を操作するとモーターが回ります(※ 1) 。可変 抵抗を操作するとモーターの回転数が変化することが確認できます。これでスタンドアロ ン動作を確認できました。 76

77.

4.4 スタンドアロン動作確認 ※ 1 筆者のインバーター基板は第 5 章「課題」末尾のコラムに書いた理由で壊れたため モーターを手回しでアシストしないと回転しません。正常なハードウェアであれば手回し でアシストしなくてもモーターが回ると思います。 77

78.

第5章 課題 本書で紹介したモデルでモーターが回りますが次の観点から改善の余地があります。 •「乗り物」として見たとき危険。 • 効率のよい制御に改善できる。 5.1 デッドタイム対応 CQ EV カートのデフォルト CPU(V850ES/FG3)はモーター制御用の機能を内蔵し ています。具体的には同相の High 側 FET、Low 側 FET を同時に ON しないようにす る「デッドタイム」調整用の機能です。たとえば U 相 High 側 FET、U 相 Low 側 FET が同時に ON するタイミングです。同相の FET が同時に ON した場合、大電流が流れ FET が破壊されます。今回 Arduino でモデルベース開発しモーター制御しましたがこ のデッドタイムを考慮していません。きちんと FET の通電タイミングを検証すべきです し、実際の製品開発ではありえないことをやっています。デッドタイム調整機能をもたな い CPU でモーター制御する場合は、CPU とインバーター基板の間にデッドタイム調整 ロジックを実装した FPGA を置く、などの対策が必要になると考えます。 もしみなさんがブラシレスモーターを 3 相インバーター回路で制御したい場合、デッド タイム調整をどう実現するかは重要なポイントだと考えます。 5.2 電源 ON でモーターが急回転するリスク 本書で紹介したモデルですがアクセルを開けて電源 ON するとモーターが回転します。 急回転は物理的に危険ですし、大電流が流れる可能性もあり対策が必要です。 78

79.

5.3 ホールセンサーのポーリング 電源 ON 後アクセルが開いていたら一定期間モーターを回転させないなどの安全対策 が必要だと考えます。 5.3 ホールセンサーのポーリング CQ EV カートのデフォルト CPU はホールセンサーの立上り、立ち下がりエッジで通 電パターンを設定しています。 本書の Arduino モデルベース開発の場合、ポーリングでホールセンサーのレベルを読み 取っています。ホールセンサの立上りエッジ、立ち下がりエッジを検出したときのみホー ルセンサーのレベルを読み込み、通電パターンを設定するのが無駄がない処理だと考えま す。私も立上り、立ち下がりエッジでのみ処理するようトライしたのですが実現できませ んでした。Simulink Support Package for Arduino Hardware の External Interrupt と いう外部割り込みを実現するブロックがあり、希望の動作を実現できるかなと試しました がなにか実装に問題があったのかできませんでした。後日ホールセンサーのポーリングを 割り込み方式に改善したいと考えています。 5.4 スロットル開度に不感帯を設ける スロットル開度の上限、下限に不感帯を設ける、などの制御も必要かなと考えていま す。スロットル開度は 0〜5V ですがそれを PWM 設定値 0〜255 に割り当てています。 それを 0.5V〜4.5V の範囲を PWM 設定値として割り当てる、みたいにすることが望ま しいと思います。部品の不安定な電圧部分を制御に利用しない、というのは組込み製品開 発では定石と考えられるためです。 5.5 部品の保護 本書のモデルではアクセル開けた分だけモーターの回転数があがります。 アクセル開度とモーターの回転数は比例関係です。とてもわかりやすいですが相電流を 監視し部品の定格電流に到達する前に PWM 制御の ON 幅を絞る、といった部品を保護 する制御が必要だと感じています。CQ EV カートのインバーター基板はそのような制御 ができるよう追加部品を実装可能なハンダ付けスペースがあります。より高度な制御も実 現可能です。インバーター基板の写真を再掲します。 79

80.

第 5 章 課題 ▲図 5.1 インバーター基板 図 5.1 の枠①は追加部品を実装可能なハンダ付けのスペースです。 写真には実装されていないですが過去に電流センサーを追加実装していたことがありま した。そのときに必要だった抵抗、コンデンサ等が残っています。 5.6 機能拡張 EV カートは前述した追加部品を実装可能なハンダ付けのスペースがあり機能拡張が可 能なつくりとなっています。 80

81.

5.6 機能拡張 5.6.1 CAN 通信 図 5.1 の枠②は CAN トランシーバーが実装可能なスペースです。 自動車といえば CAN 通信ですが EV カートも CAN トランシーバーと数点の外部部 品を追加実装することで CAN 通信ができます。EV カートデフォルトの CPU 基板で CAN 通信は確認できました。 Simulink Support Package for Arduino Hardware に CAN Transmit、CAN Receive というブロックがあるので Simulink + Arduino でも CAN 通信ができるようです。た だ、CAN コントローラ(MCP2515)が必要でハードウェア改造も必要です。 5.6.2 Arduino 対応の拡張基板 Arduino はラズベリーパイと並んで電子工作の定番と個人的に思っています。Arduino 対応の機能拡張基板は非常に多くあります。 今回モデルベース開発で CPU を Arduino に変更したことでいろいろな機能拡張の可 能性がでてきて EV カートでできることの幅が広がったと感じています。 ■開発失敗談〜FET が壊れた件〜 今回の開発中にインバーター基板の FET から火花が飛び壊れる事故がありま した。原因は「5.1 デッドタイム対応」 、 「5.2 電源 ON でモーターが急回転するリ スク」によるものと考えています。 火花がでたソフトウェアは Simulink モデルではなく、Arduino C 言語版のソ フトウェアでした。 モーターに実際に通電する前にしっかりタイミングの検証をしておくべきだった と後悔しました。モーター制御開発のあるあるだと思いますのでシェアさせてい ただきました。 81

82.

第6章 参考書籍 ありがとうございます。いつもお世話になっています。 • C コードからの Simulink モデルの作成, 赤星博輝/株式会社ネクスティエレクト ロニクス - この本がなければ C 言語から Simulink モデルを作成できず本書は書けませんで した。C 言語をどう Simulink モデルに落とし込むか、その実現方法がひととおり 書かれています。 • 急に MATLAB/Simulink を使うことになった時に読む本, 赤星博輝/株式会社ネ クスティエレクトロニクス - MATLAB, Simulink の使い方が丁寧に書かれています。この本のおかげで MATLAB, Simulink に早く馴染めました。 • Arduino と MATLAB で制御系設計をはじめよう! (Physical Computing Lab), 平田 光男 著 - Simulink と Arduino の連携はこの本から学びました。Arduino を MATLAB, Simulink で動かす方法が書かれています。 • Simulink Support Package for Arduino Hardware https://jp.mathworks. com/help/supportpkg/arduino/index.html - MathWork 社の Simulink Support Package for Arduino Hardware のドキュメ ント - ここに今回使用した Common ライブラリーの各ブロック仕様が書かれています。 https://jp.mathworks.com/help/supportpkg/arduino/common.html • モータから手作り!フルクラフト EV カート (トラ技エレキ工房 No.3), CQ 出版 社 - EV カートの解説本。メカ・モーター・インバーター基板・組込みソフトウェア 82

83.

と EV カートについて網羅的に解説しています。 • Microsoft Excel で 波 形 を 描 く 方 法, http://nahitafu.cocolog-nifty.com/ nahitafu/2007/04/excel_e5a2.html - ホールセンサーと FET 通電パターンのタイミングチャートを書くときに使わせ てもらいました。 83

84.

著者紹介 k-abe twitter: @juraruming GitHub: https://github.com/grace2riku 1980 年生まれ、2002 年より組込みソフトウェアエンジニアとしてキャリアをスター ト。C 言語、ベアメタルの組込みソフトウェア開発がキャリアの大半を占める。 EV カートとの出会いは発売時の 2013 年 12 月から。EV カートは機械、電気、組込み ソフト、IT と色々な要素技術で拡張可能と考えており魅力を感じている。日々、EV カー トの機能拡張によるスキルアップを考えている。 84

86.

EV カートで始めるモデルベース開発 2020 年 9 月 12 日 技術書典 9 版 v1.0.0 著 者 k-abe 編 編 集 k-abe 発行所 k-abe (C) 2020 k-abe 86