0. はじめに
昨年度の自動制御連合講演会以降,X で @ta98otani さんと情報交換しながら,Simulink を利用した低コストな制御実験環境の構築を進めています.先日,
- 「roller485lib は、Raspberry Pi Pico とも相性よく動きました。Pi pico 用のGroveシールド使ったので、接続も簡潔。Arduino とほぼ同じでした。 ご報告まで!」
という連絡を受け,私も試してみたので,忘備録としてまとめます.
Roller485 やシールド Grove Shield for Pi Pico v1.0 がなくても,Raspberry Pi Pico と MATLAB/Simulink(R2024b 以降) があれば,Lチカ(LED 点滅)までは試せます.
配布するファイル はこちらからダウンロードしてください.
ファイルについては,4 章および 5 章で説明しています.
1. Raspberry Pi Pico って何なん
一言でいうと,「めちゃくちゃ安くて,電子工作に特化した小さな組み込み用コンピュータ(マイコン)」です.ざっくりとした特徴はこんな感じです.
-
ラズパイ財団が開発
有名な「Raspberry Pi」の仲間ですが,よりシンプルで,消費電力もかなり低いのが特徴です. -
中身がしっかりしている
「RP2040」という独自チップを搭載しており,使い勝手と性能のバランスが良いことで注目されています. -
お気軽系からがっつり系まで対応
Python(MicroPython)でサクッと書くこともできますし,今回のように Simulink でモデルを組んで動かすような本格的な開発にも対応しています.
なお,普通の Raspberry Pi(Linux が動くタイプ)とは違って,Raspberry Pi Pico には OS が入っていません.その代わり,動作はとてもシンプルで,スタンドアロンで実行する場合は,
- 電源 ON
- フラッシュに書き込まれたプログラムがすぐ実行される
- そのままずっと処理を繰り返す
という感じです.
2. ソフトウェア
2.1 使用したソフトウェア
MATLAB/Simulink を使用します.R2024b 以降のバージョンで Raspberry Pi Pico の使用が可能です.ただし,R2024b では SCL, SDA の Pin 番号の変更ができませんので注意してください(R2025a 以降の方が設定の自由度が高い).
最低限必要なのは
- MATLAB
- Simulink
- Control System Toolbox
および,無償で提供されている Simulink サポートパッケージ
です.
2.2 Simulink サポートパッケージのインストール
Simulink サポートパッケージは Arduino 用のものであることに注意してください.Simulink Support Package for Arduino Hardware のインストール方法はこちらを参照してください.
2.3 Simulink ライブラリ roller485lib のインストール
今回は,BLDC モータユニット Roller485 を動かすので,筆者が提供する Simulink ライブラリ
をインストールします.解説記事はこちら.
roller485lib のインストール方法をざっくりと説明します.上記の github から roller485lib をダウンロードします.
そして,zip ファイル
- Roller485lib-main.zip
を展開(解凍)します.このとき,フォルダ Roller485lib-main が生成され,ファイルの構成は以下のようになります.
- Roller485lib-main
- slblocks.m
- README.md
- roller485.png
- roller485_matlab_fcn.png
- roller485_matlab_fcn2.png
- roller485lib.slx
- LICENSE.txt
- sample_roller485lib
- arduino_mega_R2023a
- arduino_uno_R3_R2023a
- esp32_wroom_com5_R2023a
- raspberry_pi_pico_I2C0_R2025b
- raspberry_pi_pico_I2C1_R2025b
- raspberry_pi_pico_R2024b
Windows であれば,このフォルダ
- C:\Users\xxx\Documents\MATLAB\Roller485lib-main
(xxx は使用者のユーザ名です)
に置いておくとよいでしょう.つぎに,MATLAB 起動時にこのフォルダにパスを通すために,フォルダは
- C:\Users\xxx\Documents\MATLAB
に以下の M ファイル startup.m を置いておきます.
addpath('C:\Users\xxx\Documents\MATLAB\Roller485lib-main')
これでインストールは終了です.うまく設定ができていれば,MATLAB を起動後,
>> roller485lib
と入力すれば,以下の Simulink ライブラリ roller485lib のウィンドウが開きます.
2.4 Simulink モデルのパラメータ設定
マウスカーソルを Simulink モデルの空白部分に移動して右クリックし,コンフィギュレーションパラメータを設定します.
そして,以下のように設定してください.
SDA と SCL のピン番号については,後で説明します.
以上の設定を行い,Simulink ブロック
- Pulse Generator
- Digital Output
- Display
を配置し,ブロックパラメータを設定してから Simulink モデルを,
- sample_setting.slx
という名前で保存してください(後で使用します).
![]() |
|---|
| sample_setting.slx |
この Simulink モデルは Lチカ(LED 点滅)を行うものです.
COM 番号の設定については後述します.
3. ハードウェア
3.1 使用したハードウェア
以下の製品を使用しました(リンク先はスイッチサイエンスさんですが,他からも購入できます).
- Raspberry Pi Pico H …… ¥1,012
- Grove Shield for Pi Pico v1.0(Pi Pico v1.0 用 Grove シールド) …… ¥837
- M5Stack 用 GROVE 互換ケーブル 20 cm(5 本セット) …… ¥704
また,以下のいずれかを用意してください.
- Roller485 Lite Unit without Slip Ring (STM32) (M5Stack 社の BLDC モータユニット) …… ¥6,743
- Roller485 Unit (STM32) (M5Stack 社のスリップリング付き BLDC モータユニット) …… ¥8,316
なお,Raspberry Pi Pico2 は Simulink には対応していませんので,注意してください(2026/03/17 確認).これ以外に,パソコンと Raspberry Pi Pico(Micro-B 端子)を接続するための USB ケーブルが必要です.
3.2 Raspberry Pi Pico のピン配置
Raspberry Pi Pico のピン配置を以下に示します.
- 電源関係
- 5V:USB 接続されているときに 5V の電圧を出力
- GND
- 3V3 (OUT):3.3V の電圧を出力
- 3V3_EN:Pico 全体を ON/OFF するスイッチのような役割(GND に接続すると OFF になる)…… EN は Enable の略
- VSYS:1.8V 〜 5.5V の外部電源を接続可能
- 汎用 (GP0 ~ GP28)
-
I2C:同期シリアル通信
-
I2C0:1 つ目の I2C で,SDA と SCL の組み合わせは自由
- SDA:GP0, GP4, GP8, GP12, GP16, GP20
- SCL:GP1, GP5, GP9, GP13, GP17, GP21
-
I2C1:2 つ目の I2C で,SDA と SCL の組み合わせは自由
- SDA:GP2, GP6, GP10, GP14, GP18, GP26
- SCL:GP3, GP7, GP11, GP15, GP19, GP27
-
I2C0:1 つ目の I2C で,SDA と SCL の組み合わせは自由
- SPI:同期シリアル通信
- SPI0:1 つ目の SPI で,RX, TX, SCK, CSn の組み合わせは自由
- RX:GP0, GP4, GP16, GP20
- TX:GP3, GP7, GP19, GP23
- SCK:GP2, GP6, GP18, GP22
- CSn:GP1, GP5, GP17, GP21
- SPI1:2 つ目の SPI で,RX, TX, SCK, CSn の組み合わせは自由
- RX:GP8, GP12, GP24, GP28
- TX:GP11, GP15, GP27
- SCK:GP10, GP14, GP26
- CSn:GP9, GP13, GP25
- SPI0:1 つ目の SPI で,RX, TX, SCK, CSn の組み合わせは自由
- UART:非同期シリアル通信
- UART0:1 つ目の UART で,TX と RX の組み合わせは自由
- TX:GP0, GP12, GP16, GP28
- RX:GP1, GP13, GP17
- UART1:2 つ目の UART で,TX と RX の組み合わせは自由
- TX:GP4, GP8, GP20, GP24
- RX:GP5, GP9, GP21, GP25
- UART0:1 つ目の UART で,TX と RX の組み合わせは自由
- ADC:16bit の A/D 変換(0~3.3V を 0~4095 の数値で取得)
- ADC0:GP26
- ADC1:GP27
- ADC2:GP28
- ADC3:GP29(VSYS 電圧の監視に使用)
- ADC4:チップ内部の温度センサに接続(外部ピンなし)
-
I2C:同期シリアル通信
今回は I2C で Roller485 を接続し,Simulink を用いて動作させます.Raspberry Pi Pico には,独立して使える 2 つの I2C モジュール(I2C0, I2C1)が用意されています.
デバイスの I2C アドレスの競合を回避できます.
たとえば,Roller485 のデフォルト(出荷時)の I2C アドレスは 0x64 です.Roller485 を 2 台使用する場合でも,I2C0 と I2C1 に 1 台ずつ接続すれば,どちらもデフォルトの 0x64 のままで競合しません.
また,I2C バスを分けることで配線の簡略化や通信負荷の低減といった利点もあります.
R2025a 以降であれば,I2C0, I2C1 のピン番号を以下のように設定できます.
それに対して,R2024bでは,I2C0, I2C1 のピン番号を指定することができず,固定されています.
3.3 Grove Shield for Pi Pico v1.0 のピン配置
Roller485 などの M5Stack 社の I2C 対応の製品は,Grove ケーブルが使用されます.これにより,配線をスッキリまとめることができます.
Raspberry Pi Pico を使う場合でも,「Grove ケーブルで手軽に接続したい」と思いますよね.そんなときに便利なのが,seeedstudio 社製のシールド
です.以下のサイトに,詳細が説明されています.
Grove Shield for Pi Pico v1.0 には Grove ポート(4 ピンコネクタ)として
-
I2C ポート
- I2C0 ポート
- I2C1 ポート
- アナログポート
- A0 ポート
- A1 ポート
- A2 ポート
- UART ポート
- UART0 ポート
- UART1 ポート
- デジタルポート
- D16 ポート
- D18 ポート
- D20 ポート
が用意されています(下図参照).
つまり,I2C 用の Grove ポートとしては,
-
I2C0 ポート
- SDA:GP8
- SCL:GP9
-
I2C1 ポート
- SDA:GP6
- SCL:GP7
の使用が想定されています.また,ピン配置を確認してみると,
-
UART0 ポート …… I2C0 ポートとして使用可能
- SDA:GP0
- SCL:GP1
-
UART1 ポート …… I2C0 ポートとして使用可能
(R2024b では UART1 ポートを I2C0 ポートとして使用)- SDA:GP4
- SCL:GP5
-
A1 ポート …… I2C1 ポートとして使用可能
(R2024b では A1 ポートを I2C1 ポートとして使用)- SDA:GP26
- SCL:GP27
も I2C0,I2C1 のポートとして使用することが可能であることがわかります(下図参照).
以上をまとめると,Grove Shield for Pi Pico v1.0 の Grove ポートを使用する場合の Simulink の設定は以下のようになります.
4. 初期設定
以下の Step 1 から Step 3 の作業は,購入した Raspberry Pi Pico に対して最初の1回のみ行えばよいです.これにより Raspberry Pi Pico を Simulink で利用できる環境が整うため,基本的には初期設定後にこれらの作業を繰り返す必要はありません.
Step 2
MATLAB のコマンドウィンドウで,2.1.4 節で示した Simulink モデル sample_setting.slx を保存しているフォルダをカレントフォルダに設定します.たとえば,
>> cd D:\github\pico_files
と入力してカレントフォルダを指定します.
その後,以下の操作により,Simulink モデル sample_setting.slx をビルドします.
ビルドが終了したら,カレントフォルダに
- sample_setting.uf2
が生成されますので,このファイルをドライブ「RPI-RP2」にドラッグします.
その結果,ドライブ「RPI-RP2」の表示が消えます.
同時に,「ほかのデバイス」にあった「RP2 Boot」の表示が消えて,
- 「ポート(COM と LPT)」に「USB シリアスデバイス (COM**)」と表示
に切り替わります.
そして,Raspberry Pi Pico が L チカ(LED 点滅) しているはずです.
Step 3
USB ケーブルをいったん,取り外します.
BOOTSEL ボタンを押さずに Raspberry Pi Pico と PC を USB ケーブルで接続します.このとき,
- 「ポート(COM と LPT)」に「USB シリアスデバイス (COM**)」と表示
されていることを確認します.
初期設定が終わったら,あとは Arduino と同様の操作で,Raspberry Pi Pico を操作することができます.ただし,COM 番号を手動で設定した方が安全です.
5. さあ、いよいよ Roller485 を動かすぞ!!
Grove Shield for Pi Pico v1.0 の Grove ポート を利用することを前提とし,BLDC モータ Roller485 を動かしてみましょう.配布するサンプルプログラムは以下のとおりです.sample_setting.slx 以外は COM 番号を 17 に設定していますので,ご使用の環境に応じて番号を変更してください.
-
sample_R2025b …… R2025b 用
- sample_setting.slx
- sample_basic_confirm.slx
- sample01_pico_speed_mode_I2C0.slx
- sample02_pico_speed_mode_I2C1.slx
- sample03_pico_speed_mode_I2C0_I2C1.slx
-
sample_R2025a …… R2025b, R2025a 用
- sample_setting.slx
- sample_basic_confirm.slx
- sample01_pico_speed_mode_I2C0.slx
- sample02_pico_speed_mode_I2C1.slx
- sample03_pico_speed_mode_I2C0_I2C1.slx
-
sample_R2024b …… R2024b 用
- sample_setting.slx
- sample_basic_confirm.slx
- sample01_pico_speed_mode_I2C0_UART1.slx
- sample02_pico_speed_mode_I2C1_A1.slx
- sample03_pico_speed_mode_I2C0_UART1_I2C1_A1.slx
![]() |
|---|
| sample01_pico_speed_mode_I2C0.slx |
![]() |
|---|
| sample02_pico_speed_mode_I2C1.slx |
![]() |
|---|
| sample03_pico_speed_mode_I2C0_I2C1.slx |
R2025b を使用して,Simulink モデル
- sample02_pico_speed_mode_I2C1.slx
を実行した結果です.Grove Shield for Pi Pico v1.0 の I2C1 ポート と Grove ケーブルを介して接続された Roller485 を speed mode で動かしています.Simulink モデルの各ブロックの I2C Module を 1 に設定しています.速度の目標値は 10 秒周期で -60rpm と 60rpm に変化させています.
Simulink モデル
- sample03_pico_speed_mode_I2C0_I2C1.slx
を実行した結果です.2 台の Roller485 をそれぞれ Grove Shield for Pi Pico v1.0 の I2C0 ポートと I2C1 ポートに接続しています.Simulink モデルの各ブロックの I2C Module を 0 と 1 に分けているので,2 台の Roller485 の I2C アドレスをデフォルトの 0x64 としたままでも,問題なく動きます.速度の目標値は 10 秒周期で -60rpm と 60rpm に変化させています.
6. おまけ
6.1 マイコンボードの速度比較
手元にあった
- Arduino Mega
- M5Stack BASIC (ESP32)
- Raspberry Pi Pico
を,実行速度の観点から比較してみました.
サンプル時間を 2ms として実行してみましたが,Arduino Mega だと,実時間と表示されているグラフの時間が大きくずれてしまいました.Arduino Mega は 4 ~ 5ms くらいが限界のようです.
それに対して,M5Stack Basic (ESP32) や Raspberry Pi Pico はサンプル時間が 2ms でも実時間でグラフ表示ができました.
6.2 回転型倒立振子の振り上げ安定可制御
回転型倒立振子も無事に倒立しました!
振子用の角度センサ(磁気式エンコーダ)も I2C に対応しています.この倒立振子については,以下の文献を参照してください(原著では Arduino Mega で動かしていますが,M5Stack Core/Fire/BASIC でも大丈夫です).
- 川田昌克:低コストBLDC モータを用いた高性能倒立振子教育プラットフォームの提案,第 14 回 SICE 制御部門マルチシンポジウム (MSCS2026) (2026.3)
- 川田昌克:Simulink を用いた BLDC モータ駆動による低コストかつ高性能な倒立振子プラットフォームの構築,日本機械学会ロボティクス・メカトロニクス講演会 2026 (ROBOMECH2026) (2026.6)
なお,以下のイベントで実演したいと思っていますので,お暇ならどうぞ(ROBOMECH は参加費が必要ですが,M5stack Japan Tour は無料で参観できるようです).
- M5stack Japan Tour 2026 Spring Osaka (2026/04/25)
- ROBOMECH2026 in Fukuoka (2026/06/28-07/01 のいずれか)
勢いで申し込んでしまった😅.
7. おわりに
Raspberry Pi Pico を認識させる手順をまとめるのに手間取ってしまいましたが,ここで説明した初期設定でいけるはず… MacOS でも動くようですよ(@ta98otani さんの動画がそうだった).
いずれにせよ,低コストな Raspberry Pi Pico も Simulink で使えるようになってうれしいですね.ひと昔前は,こんなに低コストで高性能な実験装置が作れるとは想像できませんでした.
もうしばらく,教材開発を進めてみます!






































