Embedded coderを使おう!
こんにちは
今回の内容は「embedded coder」を使ってSimulinkによるマイクロマウスの制御プログラムを作ろう!です。
最初は一つ一つの設定の意味とか詳しく解説しようと思ったのですが、設定項目が多いので
動画で許してください(笑)
「embedded coder」はMathworksによるマイクロマウスへのライセンス提供に含まれております。
インストールされてなければ、インストールしていないツールボックスをすべてインストールしましょう!
「embedded coder」を使った制御プログラムの作成は下記の流れとなります。
③については、⑤で結果に差異が出た場合に行えばよいと思うので、飛ばしていいと思います。
※下の①や②の番号と第一章、第二章は対応しないです。
①Simulinkでモデル作成
②モデルをビルドし、auto codeの生成
③visual studioやs-fuctionでauto codeをコンパイルし、simulink上の実行結果と差異がないかの確認
④マイコンのプロジェクトにauto codeを組み込みビルド
⑤マイコン上で実行し、simukink上の実行結果に差異がないかの確認
第1章:初期設定,ビルドの確認
■(00:00~01:00)プロジェクトを新規に作り、簡単な入出力を作る。
・auto codeの関数の入出力設定をするために、事前に入出力を作る必要がある。
■(1:00~1:30)信号の型名の要素数の表示設定、信号の型の設定
・組み込みではdoubleでなくfloatを使用することや、とりあえずintではなくcharやshortのように型を正しく設定する必要があるのでsimulink上でも型を指定します。また、型をすぐに確認できるようなsimulinkの設定を行います。
■(1:50~9:30)コンフィギュレーションパラメータの設定
・細かいことは割愛しますが、重要な点だけ。
・動画上で行っている設定はデバッグ用のcodeを出力する設定です。モデルとコードの整合が取りやすく可読性は良いですが、RAM効率、実行効率は良いとは言えません。この設定で十分マイコンで動くなら良いですが厳しい場合は、コード生成->最適化にて設定を調整することでRAM効率、実行速度を向上させることが可能です。
・一番最初にコード生成にて、シミュレーションターゲットファイルのを「embedded coder」に設定することが重要です。「embedded coder」に設定しないと出てこない設定項目があるのでい一番最初に行うことをお勧めします。
・最初に簡単な入出力を作成しましたが、コード生成->インターフェース->モデルの関数を設定にて、関数の入出力を設定できるようにするためです。
■(9:30~11:00)ビルド&RAM容量とauto codeの確認
・Ctrl+Bでビルドができます。
・ビルドするとレポートが出力され、必要なRAM容量が解析されます。
・TestAutoCode_Pという構造体変数にgainの設定値が格納されていることがわかります。今の設定だとRAMに確保される状態です。gainを実行中に変更したい場合はこのままでも良いですが、正直constに設定したいところです。(次にその方法を紹介します)
■(11:00~11:30)const、volatileの設定
・コード->C/C++コード->コードパースペクティブでのモデルの構成で設定を行います。(あれれ、おかしいぞ、設定ができない。次の動画へ続く)
第2章:変数の修飾子(const,volaitle)の設定,サブシステムの設定
■(00:00~00:30)const、volatileの設定(続き)
・Embedded coder ディクショナリてのを一回開くと設定できるようになるそうです。
・お好みでvolatileとconstを設定しましょう。
■(00:30~01:30)再度ビルドし、volatile、constになっているかを確かめる
・volatile constでgainの常数が格納されていることを確認。
■(00:30~05:30)サブシステムの取り扱い
・題目とは関係ないですが、情報表示->自動生成名の非表示のチェックを外すのが良いです。
・Atomicサブシステムとして扱うにチェックがないと、サブシステム含めすべてが1つの関数にベタっと書かれます。
・Atomicサブシステムとして扱うにチェックを入れ、関数のパッケージ化を「再利用できない関数」に、そのほかを適当に設定すると、サブシステム名(今回はSybsystem)のcとhファイルが作られ、構造化されます。(なんで計算結果をグローバル変数で渡すんだろう...)
第3章:バスオブジェクト(構造体)
・3:30~4:00のエラーは見逃してください...操作ミスです。
■(00:00~01:25)バスオブジェクトの作成
・入出力が増えると、いくつかの信号をまとめて構造化したいと思います。C言語の構造体がSimulinkではbusに当たります。
・モデル内のみのバスは事前定義が不要ですが、モデル全体の入出力となるバスにはC言語のように事前の定義が必要です。
・バスの事前定義にはバスエディタを使用します。(編集->バス エディタ)
・バスエディタでは、各エレメンツの型を次元(配列の要素数)を設定します。
・バスエディタで変種すると、ワークスペースに変数が出力されます。ctrl+Sをしても保存されないことに注意です。変数を直接名前を付けて保存しましょう。
■(01:45~05:10)バスオブジェクトにしたがったモデルの作成
・In1の出力をバスエディタで設定したバスオブジェクトとします。
・Out1も同様に設定すべきですが、ここでは忘れています(信号が1本だったのでエラーが出ていない)
■(05:10~05:20)バスオブジェクトがワークスペースにない場合
・モデル内にバスオブジェクトを設定したのに、ワークスペースにバスオブジェクトが存在しないとエラーが出ます。モデル内ではワークスペースにバスオブジェクトを見に行くことがわかります。
■(05:20~06:50)バスオブジェクトの自動読み込み設定
・先ほどバスオブジェクトを”test_bus.mat”で保存したので、そのmatファイルを読み込むmファイルを作成し、set_simulink.mで保存します。
・作成した、mファイルをモデルを初期化する際に自動実行するように設定を行います。ファイルをファイル->モデル プロパティ->モデル プロパティで出てくるウィンドウのコールバック->InitFcnにset_simulinkと書くと、set_simulink.mが自動実行されます。
■(05:20~08:20)信号名とバスオブジェクトのエレメンツ名の不一致
・先ほど忘れていたOut1にバスオブジェクトを設定します。
・信号名とバスオブジェクトのエレメンツ名と異なる状態でビルドするとエラーが起きます。
・信号名を修正し、エレメンツ名と同じとするとエラーが解消されます。
第4章:マイコンへの組み込み
■(00:00~01:50)作成したモデルのSimulink上でのシミュレーション
・時間刻みを変数DTとし、set_common_param.mで保存します。
・set_common_param.mをset_offline_param.mで呼び出すようにします。
・simulink上でのシミュレーション終了時間をSIM_ENDとし、set_offline_param.mで保存します。
・simulink上でのシミュレーションするための信号を、set_offline_param.mで保存します。
・先ほどのように、InitFuncのコールバックにてset_offline_param.mを呼び出すように設定します。
・mファイルよりこのモデルのシミュレーション行いとりあえず結果が出ました。
■(01:50~06:21)ビルドし、マイコンに移植
・マイコンに移植するようのモデルを開きビルドします。このモデルにあるサブシステム「ControlModel」は先ほどシミュレーションした”オフライン用”のモデルと共有化されています。(共有化の方法はまた後程)
・生成されたファイルはたくさんありますが、必要なのはert_main.cを除いたhファイルとcファイルです。これらのファイルをマイコン用のプロジェクトに登録します。(動画では登録済み)
・インクルードするヘッダーファイルは1つでよく、simulink名.h(この場合はtest_auto_code.h)です。
・入力と出力用の構造体はsimulink名_types.hにあります。この構造体の実態をどこかで確保します。
・起動時に1回だけsimulinl名_initialize()を実行します。
・制御周期毎に入出力用の構造体ポインタを引数として、simulink名_step(&output,&input)を実行します。(動画ではwhileループ。本当は割り込み関数が良い)
・動作確認のため、入出力用の構造体のメンバの値をUARTで出力するようにする。
■(06:21~07:05)書き込み&実行
・tera termでurat経由でマイコン実行結果を取得
■(07:05~10:00)マイコンでの実行結果とsimulinkでの実行結果を比較
・tera termで取得できた文字列をcsvとして保存し、matlabでcsvを配列として読み込む
・simulinkの実行結果とcsvから読み込んだ結果を比較し、おおよそ一致していることを確認(グラフを重ねるべきだが面倒なので割愛)
以上の流れを行えばとりあえずsimulink上でマイクロマウスの制御ロジックの構築はできると思います。
下記については気が向いたら書こうと思います。
・マイコン用のコード生成用のモデルとシミュレーション用のモデルの共有方法、
・auto codeでインクルードされる
では、良きモデルベース開発を~
そうそう、ハクメイとミコチってアニメ化された漫画ありましてですね、おすすめなので是非!!!