2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Simulink&Nucleo-L432KCで7セグメントLEDを動かす

Last updated at Posted at 2025-02-05

mbedが2026年7月にサービスを終了するとアナウンスがあってから半年、未だにNucleoの動作環境構築に悩んでいました。
CubeIDEで開発をしてもいいのですが、せっかく大学ライセンスでMATLAB/Simulinkが使えるならぱ、ライブラリもあるしそっちで構築してみようというのが始まり

今回は、SimulinkからNucleo-L432KCを用いて4桁7セグメントLEDを動かすことを目標にしています(+おまけでCAN受信も行います)
Simulink使わなければ楽に作れますが、敢えてのチャレンジです。

対象者

  • マイコンをそれなりに触ってきた
  • Simulinkで効率的にSTM32開発を行いたい
  • MATLAB/Simulink触れたことがある

準備するもの

動作環境

  • Windows 11 Education 23H2
  • MATLAB 2024a
  • Simulink バージョン24.1

初期設定

アドオンである、Embedded Coder Support Package for STMicroelectronics STM32 Processors は日本語文献が少なく苦労します。それほど上級者向けまたは需要が無いということなのでしょうか...
mathworks社のヘルプページを以下に掲載します。

インストール手順

①インストール
MATLABホームのアドオンエクスプローラーからインストールが完了すると「アドオンの管理」に以下の写真のような行が追加されます。赤い四角で囲った設定マークをクリックして詳細設定を開始します。
スクリーンショット 2025-02-03 115016.png

②使用マイコン設定
設定画面では使用するマイコンにチェックマークを入れてください。今回はL432KCのため、「STM32L4xx Based MCU」にチェックを入れてください。将来的に他のマイコンを使用する場合はそれに合わせてください。後で追加することも可能です。
スクリーンショット 2025-02-03 115613.png
次に必要なソフトをインストールします。
ウィンドウに表示されている Download リンクからOSに対応した製品をインストールしてください。その際、 Versionに記載されたのと一致 させるようにしてください。後で認識しない原因となります。(My STアカウント必須)
スクリーンショット 2025-02-03 120000.png

2製品のインストールが終わったら、正しくインストールされているかのチェックです。基本的にインストール先をデフォルト設定している場合はパスできます。

最後にパッケージのインストールです。Install ボタンを押して気長にお待ちください。ウィンドウ内のNOTEにも書いていますが、STM32CubeMXのポップアップ画面が隠れて表示されていることもあります。許可を出さないとインストールが進まないため放置することは推奨しません。
スクリーンショット 2025-02-03 120547.png

③チェック

  • STM32CubeMXが起動できるか
  • Simulinkのライブラリブラウザーを開いたときにアドオンが表示されているか

この2点を確認してください。インストール終了です!

配線

  • 74HC595の説明はカットします。このサイトは参考になりました
  • 今回は作りたいものが3桁までのため3桁目までしか使いません。ドットも表示しません。将来的な機能追加のため

配線図は以下の通りです。ブレットボード上に展開してください。NucleoのPA4はそのままマイコンのA4ピンに接続されているわけではないので、データシートのP29を参考にしてください。
スクリーンショット 2025-02-04 105816.png
スクリーンショット 2025-02-05 092057.png
NMOSにプルダウン抵抗(G-S間抵抗)は?と私も思いましたが、GPIOの設定でプッシュプル型にしているため不要なのかもしれません。オープンドレインなら必要なはず。ゲート抵抗は抵抗値が高いとスイッチングに影響が出ますが今回は440Ωでもスイッチングの遅れは感じませんでした。
74HC595とLEDの間は適切な抵抗を入れてください。今回は440Ωを入れています。
これを見たらわかるようにSPI通信を使用してデータ転送を行います。

モデル作成

必要な機能は

  • 数値データを各桁に分解
  • 各桁ごとにデータ送信
  • 桁の切り替え

です。
これを見たらわかるように、順序が大事なプログラムですが、Simulinkで実行順序を正確に構築することは多少難しく感じています。そのため今回はStateflowを使用して順序を構築しました。優先順位機能を使ってもよいのですが、視覚的に分かりやすいので採用します。
Simulinkモデルは以下です。

スクリーンショット 2025-02-04 115350.png

桁分解サブシステム

スクリーンショット 2025-02-04 115507.png

数値データがdouble型で入ってくることを想定しています。直後にData Type Conversionブロックでuint16に変換しています。出力は3要素の配列です。

桁処理&送信 stateflow

1桁ずつ同じ処理を繰り返しています。4桁の場合はもうひとつ増やすだけ
モデル全体のステップ時間が0.001秒なので、after(1,msec)は指定するだけ無駄ですが念のため設定しました。
スクリーンショット 2025-02-05 091426.png

digittransferモデル

データを送信する場所です。
スクリーンショット 2025-02-05 091555.png
桁の数値から送信データを作るMatlab FunctionとSPI送信ブロックで構成されています。

SPI Controller Transferブロックの設定は
スクリーンショット 2025-02-04 114803.png
スクリーンショット 2025-02-04 114812.png
このようにしました。CubeMXの設定と合わせてください。
Rxは不要なので無効化します。送信専用ブロックでもいけるのかな?

モデル内のmatlab functionは以下です。

function output = fcn(u, data)

y = u(1);
output = data(y+1);

引数uには、桁分解サブシステムの出力が、引数dataにはNumpatterndataとあります。ベースワークスペースに定義され、中身はこのような配列になっています。送信する数字に対応しています。
スクリーンショット 2025-02-04 115024.png

このfunctionの出力はoutputで1桁分の送信データが入っています。
注意点として、y=u(1)は3桁目であるからで、2桁目の場合はy=u(2)としてください。これは桁分解サブシステムのoutputが3要素であるからです。

Digiton/off モデル

桁を選択するために後ろのN-chMOSFET駆動信号を送信します。
Onの場合はConstantブロックで1を、Offは0を送信するだけです。
ポートの設定を適宜変更してください。
スクリーンショット 2025-02-05 091215.png

CubeMXの設定

ここからの設定に関しては公式ヘルプにも基本的事項は掲載してありますので参考に。

設定が終わるとピンの設定はこうなります。

スクリーンショット 2025-02-04 204957.png

File -> New Project -> Board selectorでNUCLEO-L432KCを選択し、プロジェクトを作成します。
左欄Connectivity->SPI1をFull-Duplex Master で有効化します。SPI通信のボーレートはLED表示の安定性に関連してくるためPrescalerを調整して遅めに設定しても問題ありません。
digit1~3とSPI1_CSはGPIO_Outputです。
Simulinkのエクスターナルモードでテストを行うため、USARTのDMA設定もしておきます。初期設定がUSART2だったのでそちらを使用。1でもいいと思われる。
スクリーンショット 2025-02-04 210614.png

ピンの設定が終わったら、Project Manager -> Projectに進み以下の設定を行います

  • Do not generate the main() を有効化する

Project Manager -> Advanced Settingsに進み以下の設定を行います

  • 使用する機能をHALからLLに選択する
  • Do Not Generate Function Calls のチェックを全て外す
  • Visibility (Static)のチェックを全て外す

後程Simulinkのエクスターナルモード実行時にエラーが起きないように、MX_DMA_Initの順番は、MX_USART_UART_Initの前に並び変えておいてください。詳細はここ

スクリーンショット 2025-02-04 205831.png

これで準備はできました。Simulinkのコンパイル時にCubeMXの設定エラーは丁寧に表示してくれるため、迷宮入りすることはありません。Simulinkサンキュー

さあ実行

単体で実行してもデータの元がないため、Simulinkのエクスターナルモードを使用して、PC上で値を変化させながらテストを行います
スクリーンショット 2025-02-04 214743.png
モデルではConstantブロックにknobを紐づけています。実行中にknobを動かすことでConstantブロックの値が変化し、送信される数値も変わる仕組みです。
ソルバーは固定ステップ0.001秒刻みに設定しました。

NucleoをPCにつなぎ、ハードウェア設定からCOMポートの設定を間違いなく行い、
スクリーンショット 2025-02-04 214329.png
「監視と調整」ボタンから実行できます。
きれいに表示できましたでしょうか??

私の環境ではSPI通信速度を30Mbpsに設定するとダイナミック表示が上手くできませんでした。そこで7.5Mbpsに落とすときれいに表示されました。ちらつく場合はそういった設定も必要かもしれません。

スタンドアロンで実行する際は右の「ビルド」ボタンからコンパイルを行うと.binファイルが出力されます。

(おまけ)CAN通信もやってみる

データの入力元をほかのマイコンからのCANにしてみます。
CANの受信には、CAN Readブロックと CAN Unpack ブロックを使用します。
スクリーンショット 2025-02-05 085549.png
CAN Readだけでも構成はできますが、後処理が複雑になるため、CANメッセージとして出力し、Unpackブロックで指定したdbcファイルを基に、信号ごとに抽出しています。
dbcファイルが用意できない場合はID、ビット数などをUnpackブロックに指定することも可能です。

CubeMXでのCAN設定には以下の記事を参考にしました。

ボーレートを500kbpsにするため、Configurationは写真のように設定しました。割り込み設定は不要です。
スクリーンショット 2025-02-05 090225.png
CANトランシーバーは前述記事と同様にMCP2561で構成することができます。
CANの送信側は適当にご用意ください。

まとめ

STM32 NucleoをSimulinkから動かし、7セグメントLEDを光らせる手順を紹介しました。
Simulinkの利点であるシミュレーションを活かして、MBDなどに役立ててもらえればと思います。

参考文献(再掲)

  • STM32L432KC

  • Embedded Coder Support Package for STMicroelectronics STM32 Processors

  • 74HC595 秋月電子

  • CANdb

  • CubeMXでのCAN設定

2
0
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
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?