MATLAB EXPO 2019 Lightning Talkのメイキングオブ（その１）

## はじめに
こんにちは、某企業の中の人です。
去る５月２８日に開催されましたMATLAB EXPOのお遊びセッション（ライトニングトーク）とポスターで発表したところ、なぜか来場者投票でポスター１位になってしまいました（ライトニングトーク部門での投票がなかったので、ポスターに投票されたのだと思います。ポスターのほうは、それほどパッとしなかったので）。
ということで、諸般の事情により、ライトニングトークの『メイキングオブ』をお届けします。

1. Simulink Support Package for Arduino編（本ページ）
2. [Camera de Mouse編](https://qiita.com/Monzo_N/items/3ba3173b1af502856bf9)

## １．Simulink Support Package for Arduino編
　前回（2018年秋）のMATLAB EXPOでは、MATLAB Addonを用いて、ｍファイルからArduinoを動かす話をさせていただきました。
MATLAB Addonを用いた場合、Arduino IDEを用いずにMATLABからArduinoのプログラミングができるので、Arduinoに慣れていない方には便利です。
　しかしながら、MATLAB Addonを用いた場合、MATLABを動かすPCとArduinoを切り離して動作させることができない、という問題があります。
　そこで今回は、Simulink Support Package for Arduinoを使って、スタンドアロンでArduinoを動かす、説明をしてみたいと思います。
　なお、Simulink関連のファイルはMathworksの [File Exchangeからダウンロード](https://jp.mathworks.com/matlabcentral/fileexchange/71803-led-blink-using-simulink-support-package-for-arduino)いただけます。 

### １－１　Simulink Support Package for Arduinoのインストール
　まず、MATLABのメニューバーから「アドオン」をクリックします。
<div align="center">![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/434947/29911240-079e-8c9a-d60d-c5ad0ac729c0.png)</div>

アドオン・エクスプローラから「Simulink Support Package for Arduino」をインストールします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/434947/a11179d4-2a41-a481-85cb-5a0d6d3687d0.png)

MATLABのコマンドウィンドウから、「slLibraryBrowser」と打ち込むと、simulinkのライブラリブラウザが表示され、Simulink Support Package for Arduinoで使えるブロックセットも表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/434947/d05c94c5-dc01-0088-2afb-972bbadf3eda.png)

ディジタル入出力、アナログ入出力（アナログ出力はArduinoによりできないものもあります）、Servo系や、I2C、SPI、シリアル入出力といったインターフェース系、その他、イーサネットやWi-fiのブロックセットがあります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/434947/dd0ad6ef-f1ce-4ff3-790b-e16e49c8cc4c.png)

Mathworksのwebには一例として、[I2Cのセンサから温度を読み取り、温度によりLEDを点滅させる例](https://jp.mathworks.com/help/supportpkg/arduino/ref/read-temperature-from-an-i2c-based-sensor-using-arduino-hardware.html)が載っています。
　これは、良いサンプルですが、イマイチ映えないので、今回は別のものを作ることにしました。
LEDがルーレットのように点滅するものです。

<blockquote class="twitter-tweet" data-cards="hidden" data-lang="ja"><p lang="und" dir="ltr"><a href="https://t.co/ZJO2vNeE5D">pic.twitter.com/ZJO2vNeE5D</a></p>&mdash; Monzo_N (@n_monzo) <a href="https://twitter.com/n_monzo/status/1139766470236241921?ref_src=twsrc%5Etfw">2019年6月15日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

### １－２　LED点滅デモ用ガジェットの製作
このデモサンプルのSimulink部分は下記のようなブロックから構成されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/434947/ac52bc96-d0a0-fcab-de7e-56c44adf90ea.png)


左のフリーランニングの4ビットカウンタの出力を、それぞれのビットに分け、Arduinoの４つの端子から出力させるものです。そして、4ビットをデコードし、16個のLEDのうちの1個のLEDを点灯させます。
全体のブロック図は下記のようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/434947/c7d72bd9-516b-55dd-7240-32fd8fed890f.png)


EXPOでご紹介したハードウェアの構成は以上のとおりですが、PLD（プログラミング・ロジック・デバイス）をプログラミングしたり、トランジスタで用いて電流増幅したりといった面倒な作業を含むので、ここでは簡略化したもので説明したいと思います。

### １－３　簡略化したLED点滅ガジェットの作成
まず、LEDの数を8個に減らします。そして、Arduinoから直接にLEDをドライブすることにします。
Simulinkのブロックは下記のようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/434947/d89002df-edce-6eb7-76a9-5111e376234a.png)

左端は３ビットのフリーラン・カウンタです。その右側のブロックですが、今回、「Simulinkは苦手」という方のために、mファイルのブロックを置いてみました。このブロックはSimulinkブラウザの中の「User-Defined Functions」の中にある「MATLAB Function」です。　中身はこんな感じになっています。

```matlab:decorde.m
function [b7,b6,b5,b4,b3,b2,b1,b0]=decode(u)

b7 = (u==7);
b6 = (u==6);
b5 = (u==5);
b4 = (u==4);
b3 = (u==3);
b2 = (u==2);
b1 = (u==1);
b0 = (u==0);
```

入力値uが、例えば４ならばb4が１となり、それ以外（b0～b3、b5～b7）は０となります。
フリーランカウンタの設定は、ビット数を３に、サンプル時間は、それぞれのLEDの点灯時間に設定します。例えば、下の場合は0.5秒ずつ点灯します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/434947/4b518f42-148e-0f40-8008-5e79047255df.png)
ハードウェアですが、今回、Arduino Unoを用い、pin4からpin11までの８本をLEDのドライブに割り当てています。配線は下記のようになります。LEDのみを接続すると電流が流れすぎてLEDが壊れるので（あるいはArduinoが壊れるので）、適当な電流が流れるようにLEDに並列に抵抗を入れます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/434947/c10d8db4-5a1a-c89d-87fa-c78e96e58201.png)
今回はハンダ付けなしで行なうためにブレッドボードを用いてみました。下記のようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/434947/0a7c456b-0d80-7487-f619-7fd5766aa324.png)
配線が終わったら、ArduinoとPCを接続しましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/434947/3388ce33-7214-ffc4-0066-e655bfa777d3.png)
「Arduinoを検出した」というメッセージが出ます。このデバイス（Arduino Uno）はSimulink Support Packageで使えることを示しています（MATLAB Support Packageをインストールしていない場合には２行目は出ません）。

### １－３　コンパイルと書き込み
Simulinkウィンドウのメニューから右端の「ハードウェアに書き込み」をクリックします（実際にはシミュレーションをして検証をしたりしますが、ここでは省略しました）。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/434947/cb800db9-eb99-fcfb-5c0a-0c6ddc51a356.png)
コンパイルされてビルドされ、Arduinoに書き込まれます。
この状態で、ArduinoはPCからの接続を外して、スタンドアロンで動作するようになります。
<blockquote class="twitter-tweet" data-lang="ja"><p lang="und" dir="ltr"><a href="https://t.co/8XpM4bSejg">pic.twitter.com/8XpM4bSejg</a></p>&mdash; Monzo_N (@n_monzo) <a href="https://twitter.com/n_monzo/status/1139766602352566272?ref_src=twsrc%5Etfw">2019年6月15日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

おつかれさまでした。

[その２：マウスdeカメラ編へ](https://qiita.com/Monzo_N/items/3ba3173b1af502856bf9)