はじめてのMATLAB x Raspberry Pi 連携

# はじめに

2年以上ぶりの投稿になります。今日はMATLABとRaspberry Pi連携を試してみたので、自分の備忘も兼ねて久しぶりにQiita記事に残しておきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/521542/5995ce6a-bdcc-6e04-a099-8e0c0941a732.png)


基本的にはMathWorks社の公式ページで公開されている例題の通りに動かしただけですが、ドキュメンテーションが英語なこともあり、理解するまで少し時間が必要でした。そのため、できるだけ日本語でポイントをまとめながら、初心者にもわかりやすい記事にしたいと思います。
なお、ざっくりですが、筆者は普段MATLABでアルゴリズム等を書いていますので、ソフト側はまあまあ使えます。ハードウェアの方は、昔数年ほど組込みシステムを触っていたのでなんとなくの土地勘（OSとは？GPIOとは？など）はありますが、もう5年以上のブランクがある状況です。

### 実行した例題

▼Raspberry Piのセットアップ完了後に試した例題。こういう機能があるという、基本的な部分がざっとなぞれるので良かったです。

https://jp.mathworks.com/help/supportpkg/raspberrypiio/ref/getting-started-with-matlab-support-package-for-raspberry-pi-hardware.html

▼Raspberry PiのGPIOピンを操作する例題。上の例題でもGPIOのOn/Offはできるのですが、こちらの例題ではブレッドボードにLEDや抵抗を刺して、より電子工作らしいこともできる例題です。

https://jp.mathworks.com/help/supportpkg/raspberrypiio/ref/working-with-raspberry-pi-hardware.html

# セットアップ

### 準備するもの

・MATLAB R2022a (Raspberry Pi 4 Model BはR2020a以降のバージョンで利用可能です）
・Raspberry Pi 4 Model B (-->今回は[LABISTSのスターターキット](https://labists.com/products/labists-raspberry-pi-4g-ram-32gb-card)を買いました）
・電源ケーブル（スターターキットに同梱）
・SDカード（スターターキットに同梱）
・USB Type-CのSDカードリーダー（スターターキットに同梱）
・HDMIケーブル（スターターキットに同梱）
・イーサネットケーブル（有線接続の場合）
・マウス（無線接続の場合マウス操作でWiFi設定できると楽かなと思いました）
・キーボード（同上）
・モニター（同上）

### セットアップ手順

MATLAB x Raspberry Pi連携をするには、MATLAB側とRaspberry Pi側の両方にセットアップが必要です。具体的な手順は[こちら](https://jp.mathworks.com/help/supportpkg/raspberrypiio/ug/install-support-for-raspberry-pi-hardware.html)のページにまとまっていますが、この記事では日本語でポイントをまとめます。

##### 1. MATLAB Support Package for Raspberry Pi Hardwareのインストール

MATLABのホームタブにあるアドオンボタンから、ハードウェアサポートパッケージの入手を行います。今回具体的にインストールしたのは"MATLAB Support Package for Raspberry Pi Hardware"という名前のツールです。
Raspberry PiのサポートパッケージはSimulinkのものもあるようですが、ここではMATLABのものを使用しましたのでお間違いないようお願い致します。

##### 2. Raspberry Pi側のセットアップ

上記のサポートパッケージをインストール完了すると、Raspberry Pi側のセットアップ用画面に遷移することができます。この時、**まだRaspberry Piは接続されていなくても問題ありません**。セットアップ用画面を進める中で、Raspberry Piを接続するタイミングや接続方法についてのインストラクションが出てきますので、それに従って進めましょう。
今回自分はイーサネットケーブルで有線接続させる方法を取りました。
Raspberry Pi側のセットアップ画面では、主に以下のことを行いました。全てセットアップ画面に表示されますので書いてある通りに進めれば良いのですが、画面を開くまで何を行うかわからずドキドキしたので、概要を知っておきたい方は以下をご確認ください。

【主なステップ】
* Raspberry PiとホストPCとの接続方法を選択
* ホストPCにSDカードを接続
* 使用するRaspberry PiのOSイメージファイルの選択（デフォルト様なものとカスタマイズのものが選べましたが、知識がないので今回はデフォルトを選択）
* OSイメージファイルをホストPCにダウンロードおよびダウンロードファイルのベリファイ（ここでSDカードにOSイメージファイルが上書きされます。元々SDカードに別のイメージファイルやデータが入っていた方は**事前にバックアップ**を取っておきましょう。）
* Raspberry Piとの接続（SDカードをRaspberry Piに差し替える）
* Raspberry PiのOSの書き換え（アップデート？）作業

##### ちなみに...
もともとRaspberry Piには、LABISTSのスターターキットに入っていたRaspbianをインストールしていたのですが、MATLAB連携をする際には追加の設定が必要とのことで、上記のステップでセットアップしました。ここまで準備ができれば、最初に紹介した例題を実行する準備は完了です。筆者は、WebでMATLAB x Raspberry Pi連携の方法を調べ、かつ、スターターキットを空けてからここまでくるのに3～4時間要しましたが、手順をなぞるだけならもっと早くできそうです。なお、Raspberry Piを触ったのは5年以上ぶり、Raspberry Pi 4を触ったのは初めてでしたが、昔Raspberry Pi 2や組込みソフトで遊んだことはあるので、なんとなくの基礎はあるレベルから始まっている点はご了承ください。

# 公式の例題を実行

### Getting Started with MATLAB Support Package for Raspberry Pi Hardware

再掲ですが、[こちら](https://jp.mathworks.com/help/supportpkg/raspberrypiio/ref/getting-started-with-matlab-support-package-for-raspberry-pi-hardware.html)の例題です。追加のハードウェア接続も必要がないので、Raspberry Pi連携初めての方はこの例題から始めるのがお勧めです。
MATLABとRasperry Piを連携するにはraspiオブジェクトの作成が必要になります。

```matlab
rpi = raspi();
```

このオブジェクトの中には、IPアドレスやポート情報などが入っていました。Raspberry Piをシャットダウンした後はこのオブジェクトも削除するようにしましょう。

```matlab
system(rpi, 'sudo shutdown -h now');
clear rpi
```

また、この例題では所謂"Lチカ"や、Raspberry Piのシステムコマンド実行方法、ファイルの送受信の方法などが学べました。

### Working with Raspberry Pi Hardware

再掲ですが、[こちら](https://jp.mathworks.com/help/supportpkg/raspberrypiio/ref/working-with-raspberry-pi-hardware.html)の例題です。ここでは、例題のページにも記載がある通り、いくつか追加でハードウェアが必要になりますのでご注意ください。この例題で必要なものをまとめます。

【必要なもの】

* Raspberry Pi本体
* Raspberry Piへの給電ケーブル（1A以上）
* ブレッドボード
* ジャンパーケーブル
* LED x1
* 抵抗（330Ω、1kΩ、10kΩ 1つずつ）
* ボタンもしくはスイッチ

この例題では、Raspberry PiのGPIOポートにLEDやボタン等を外付けさせて動かす方法を紹介しています。このQiita記事のトップにある画像が、この例題の成果です。例題ページの中では、LEDは電流が一方向にしか流れない点の説明や、具体的なブレッドボードの配置など、電気回路のことをすっかり忘れてしまっていた自分でもちゃんとわかるように書かれていました。

この例題には大きく分けて、**Working with LEDs**のパートと**Working with Pushbuttons**のパートがあります。

##### Working with LEDs
Working with LEDsの方は、例題に書いてある通りに進めれば動きますので着実に進めましょう。
GPIOポートがわからなくなったら、以下のコマンドで確認することも可能です。（初めて知った機能ですがすごく便利でした！）

```matlab
showPins(rpi);
```
以下のようなfigureが出てきてピンの位置を教えてくれます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/521542/1d52daa6-f76a-02e1-7404-2a14e1ded330.png)

ハード連携が初めての方に簡単に解説すると、以下のコマンドではLEDが接続されているGPIOポート（24番ピン）を1に設定することでLEDに電流を流しています。

```matlab
writeDigitalPin(rpi, 24, 1);
```

反対に0に設定することで、LEDに流す電流をオフにしています。

```matlab
writeDigitalPin(rpi, 24, 0);
```

LEDをチカチカさせる例題では、上記の2コマンドを0.5秒毎に繰り返し実行することでチカチカの部分を実装している、ということになります。

```matlab
for i = 1:10
    writeDigitalPin(rpi, 24, 1); %ON
    pause(0.5);
    writeDigitalPin(rpi, 24, 0); %OFF
    pause(0.5);
end
```

##### Working with Pushbutton
Working with Pushbuttonsの方は、ボタンを押すと1秒間LEDが高速でチカチカしますよ、という例題になります。上記のLEDはそのまま接続しておき、ここにボタンorスイッチを追加で接続させる形になります。接続するGPIOポートの番号を間違えないようにお気をつけください。

ボタンまで接続が終わったら、以下のコマンドでポートの値を読みだしてボタンが動作していることを確認しましょう。

```matlab
readDigitalPin(rpi, 23)
```
ボタンを押している時にはこの値が1に、ボタンを押していない時にはこの値が0に、それぞれなるはずです。ならない場合はポート番号やケーブルの接続などを確認しましょう。

ボタンが正しく接続できれば、以下のコードで、ボタン入力をトリガーにLEDを高速チカチカさせます。先ほど、ボタンを押している時にはreadDigitalPinの返り値が1になると書きました。以下のif文では、この仮値が1になるときにLEDのポートを制御させるfor文に入り、LED高速チカチカを実現しています。ボタンを押さなかったら10秒でfor文が終了しますのでご注意ください。

```matlab
for i = 1:100
    buttonPressed = readDigitalPin(rpi, 23);
    if buttonPressed
        for j = 1:10
            writeDigitalPin(rpi, 24, 1);
            pause(0.05);
            writeDigitalPin(rpi, 24, 0);
            pause(0.05);
        end
    end
    pause(0.1);
end
```

# おわりに
最終的にはRaspberry Piへの組込みソフトウェア実装を目標としています。このワークフローの延長線上にデプロイがあるのか、はたまた全く的外れなことを試しているのか、それすらもまだわかりませんが、また引き続きアップデートがあれば更新していきたいと思います。
最後まで読んで頂きありがとうございました。