3
1

More than 3 years have passed since last update.

Simulinkを使ってNucleo STM32F411REでCAN通信(2ch)とアナログ入力

Last updated at Posted at 2021-06-26

概要

モデルベース開発をしているような研究室で、Simulinkベースで車両を動かしたい、Simulinkで開発できるECUを用意したいというケースも多いと思います。そこで今回はSimulinkを使ってNucleo STM32F411REでCAN通信(2ch)とアナログ入力を動かすというところまでやってみたいと思います。

環境/使用機材

STEP1 ST-LINK USBドライバのインストール

最初STM32とPCを接続する場合、ST-Link Debugが不明なデバイスとなっていて気持ち悪いので、ドライバのインストールをします。必ずしも必要かは微妙です。
まず、ドライバをダウンロードし、解凍します。
STSW-LINK009 USB driver signed for Windows7, Windows8, Windows10
次に、STM32とPCをUSBケーブルで接続し、デバイスマネージャーを開きます。
001.png
するとST-Link Debugが不明なデバイスとして認識されているので、右クリック>プロパティ>ドライバータブ>ドライバーの更新をクリックし、コンピューター上のドライバーを参照のところで、先程解凍したファイルを設定し、ドライバーをインストールします。
002.png
ついでに後でSimulinkでの設定で必要になるCOMポート番号もここでチェックしておきましょう。
stm32_driver_005.png
とりあえずCOM10として認識していることを確認しました。これでOKです。

STEP2 MATLAB/Simulinkのセットアップ

前述の環境/使用機材に記載のように、アドオンの追加でSimulink Coder Support Package for STMicroelectronics Nucleo BoardsCAN device driver mcp2515 for Arduino and Raspberry Piをインストールします。注意点としては、

  • MATLABはバージョンによってはNucleo用のDACブロックあたりで問題が発生したので2017bあたりが良い
  • Program Filesのようなスペースを含むディレクトリにMTALABをインストールすると問題が発生する可能性があるので、スペースを含まないディレクトリにインストールしたほうが良い
  • Simulink Coder Support Package for STMicroelectronics Nucleo Boardsインストール時、サードパーティ製のソフトウェアインストールでコケるときがあり、何回か挑戦したら入った

という感じです。

STEP3 Exampleモデルを使った動作チェック

まずは、Exampleで動作チェックしましょう。MATLABからアドオン>アドオンの管理をクリックし、Simulink Coder Support Package for STMicroelectronics Nucleo Boardsからドキュメンテーションを開くをクリックします。
003.png
なんでもよいのですが、今回はこのExampleを使って動作確認したいと思います。右下のOpen Modelをクリックし、モデルを開きます。
stm32_driver_007.png
モデルを開いたらモデル コンフィギュレーション パラメータ(歯車アイコン)を開きます。
そしてハードウェア実行からハードウェア ボードをF411REにセットし適用をクリックし、Target hardware resourcesからExternal modeをクリックし、前項で確認したCOMポート番号を設定し、OKをクリックします。(ハードウェア ボードを切り替えるとCOMポート番号がリセットされるようなので、一つずつ適用したほうが良さそう)
004.png
その後、実行やハードウェアに展開が問題なくできれば動作チェック完了です。
005.png
ここで、実行とハードウェアに展開の違いについてメモしておきます。

  • 実行 : エクスターナルモードになっている状態で実行すると、DisplayなどをリアルタイムでPCで見ながらモデルを実行することができます。開発中はこちらを基本使用します。
  • ハードウェアに展開 : ハードウェア上でモデルを動かすことができます。最後、車に搭載するときはこちらを選択します。

STEP4 モデルの作成(アナログ入力)

先程のExampleモデルをベースにモデルを作成していきます。Exampleモデル別名で任意のディレクトリに保存します。
次にコンフィギュレーション パラメーター>ソルバーからシミュレーション終了時間をinfに設定し、(Externalモードが時間で終了しないよう)追加パラメーターの固定ステップサイズを、制御対象に合わせた周期に設定します。(何秒毎に計算するかの設定)
006.png
次に一旦すべてのブロックを消して、Simulinkライブラリ ブラウザーからSimulink Coder Support Package for STMicroelectronics Nucleo Boards>Common>Analog InputブロックとDisplayブロックをドラッグアンドドロップして配置します。
また、ポテンショメータを下記のようにSTM32に結線します。

STM32 Potentiometer
3V3 Vcc
A0 Output
GND GND

ピンマップを見てもよく分からなかったのですが、Pin16=A0ピンみたいです。これで実行してポテンショメータをグリグリ動かして、値が変化すればOKです。
007.png

STEP5 モデルの作成続き(CAN通信)

SPI通信を使ってCANシールドと接続しCAN通信を行いたいのですが、1から作るのは大変なので今回はCAN device driver mcp2515 for Arduino and Raspberry Piを改造し、STM32に適合させる形で行います。

MATLABからアドオン>アドオンの管理>CAN device driver mcp2515 for Arduino and Raspberry Pi>フォルダを開くをクリックし、MATLABに戻りmcp2515/example/arduino_CAN_Echo.slxを開きます。そして、モデルを一通りコピーします。
008.png
CANbeginの設定で、Oscillatorを16Mhz(CANシールドの部品に小さく書いてあります)、CAN Bus Speedを制御対象のCANボーレートに合わせます。また、ModelはArduinoのままで、Chip Selectは適当で大丈夫です。(上手に改造すればChip Selectの機能は活かせると思いますが、今回の改造方法ではこの機能は失われます)
ブロック左下の下矢印をクリックし、サブシステムの中に入っていきます。
009.png
そして中にあるArduino用のSPIブロックをすべてSTM32用のSPIブロックに置き換えていきます。(合計10個ぐらいあるので探してください。またCANbeginだけではなく、CANreceive、CANtransmit内にも2個ずつぐらいあります)
010.png
ここで、Slave selectはCAN ch0用には7(D7ピン)、CAN ch1用には4(D4ピン)としました。これはCANシールドのCS0、CS1それぞれにつながるデジタルピン番号となります。最終的にはこのような形となりました。サブシステム内にはSPIブロックを置き換えたarduino_CAN_Echo.slx内ブロックが入っています。
011.png

STEP6 STM32とCANシールドの結線(CAN通信)

前述のポテンショメータはA0ピン、Slave selectはCAN ch0用には7(D7ピン)、CAN ch1用には4(D4ピン)としたので、最終的には下記のような形で結線しました。

STM32 Potentiometer
3V3 Vcc
A0 Output
GND GND
STM32 CAN shield
3V3 5V
GND GND
MISO/D12 MISO
PWM/MOSI/D11 MOSI
SCK/D13 SCK
D7 CS0
D4 CS1

また、CANシールドのジャンパ線は3V3にしています。役に立つか分かりませんが、こんな感じです。
012.png
画像のようにCANシールドのジャンパ線を終端抵抗有りにして、動作確認用のPCAN-USBにも終端抵抗を取り付け動作確認をしました。
013.png
PCAN-Viewを使ってCANメッセージを送ってあげるとちゃんとEchoされて来ました。Extended IDも対応しています。

後は好きなようにモデルを組んで動かしてください!

3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1