Help us understand the problem. What is going on with this article?

MATLAB EXPO 2019 Lightning Talkのメイキングオブ(その1)

はじめに

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

  1. Simulink Support Package for Arduino編(本ページ)
  2. Camera de Mouse編

1.Simulink Support Package for Arduino編

 前回(2018年秋)のMATLAB EXPOでは、MATLAB Addonを用いて、mファイルからArduinoを動かす話をさせていただきました。
MATLAB Addonを用いた場合、Arduino IDEを用いずにMATLABからArduinoのプログラミングができるので、Arduinoに慣れていない方には便利です。
 しかしながら、MATLAB Addonを用いた場合、MATLABを動かすPCとArduinoを切り離して動作させることができない、という問題があります。
 そこで今回は、Simulink Support Package for Arduinoを使って、スタンドアロンでArduinoを動かす、説明をしてみたいと思います。
 なお、Simulink関連のファイルはMathworksの File Exchangeからダウンロードいただけます。

1-1 Simulink Support Package for Arduinoのインストール

 まず、MATLABのメニューバーから「アドオン」をクリックします。

image.png

アドオン・エクスプローラから「Simulink Support Package for Arduino」をインストールします。
image.png

MATLABのコマンドウィンドウから、「slLibraryBrowser」と打ち込むと、simulinkのライブラリブラウザが表示され、Simulink Support Package for Arduinoで使えるブロックセットも表示されます。
image.png

ディジタル入出力、アナログ入出力(アナログ出力はArduinoによりできないものもあります)、Servo系や、I2C、SPI、シリアル入出力といったインターフェース系、その他、イーサネットやWi-fiのブロックセットがあります。
image.png

Mathworksのwebには一例として、I2Cのセンサから温度を読み取り、温度によりLEDを点滅させる例が載っています。
 これは、良いサンプルですが、イマイチ映えないので、今回は別のものを作ることにしました。
LEDがルーレットのように点滅するものです。

1-2 LED点滅デモ用ガジェットの製作

このデモサンプルのSimulink部分は下記のようなブロックから構成されています。
image.png

左のフリーランニングの4ビットカウンタの出力を、それぞれのビットに分け、Arduinoの4つの端子から出力させるものです。そして、4ビットをデコードし、16個のLEDのうちの1個のLEDを点灯させます。
全体のブロック図は下記のようになります。
image.png

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

1-3 簡略化したLED点滅ガジェットの作成

まず、LEDの数を8個に減らします。そして、Arduinoから直接にLEDをドライブすることにします。
Simulinkのブロックは下記のようになります。
image.png

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

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が、例えば4ならばb4が1となり、それ以外(b0~b3、b5~b7)は0となります。
フリーランカウンタの設定は、ビット数を3に、サンプル時間は、それぞれのLEDの点灯時間に設定します。例えば、下の場合は0.5秒ずつ点灯します。
image.png
ハードウェアですが、今回、Arduino Unoを用い、pin4からpin11までの8本をLEDのドライブに割り当てています。配線は下記のようになります。LEDのみを接続すると電流が流れすぎてLEDが壊れるので(あるいはArduinoが壊れるので)、適当な電流が流れるようにLEDに並列に抵抗を入れます。
image.png
今回はハンダ付けなしで行なうためにブレッドボードを用いてみました。下記のようになります。
image.png
配線が終わったら、ArduinoとPCを接続しましょう。
image.png
「Arduinoを検出した」というメッセージが出ます。このデバイス(Arduino Uno)はSimulink Support Packageで使えることを示しています(MATLAB Support Packageをインストールしていない場合には2行目は出ません)。

1-3 コンパイルと書き込み

Simulinkウィンドウのメニューから右端の「ハードウェアに書き込み」をクリックします(実際にはシミュレーションをして検証をしたりしますが、ここでは省略しました)。
image.png
コンパイルされてビルドされ、Arduinoに書き込まれます。
この状態で、ArduinoはPCからの接続を外して、スタンドアロンで動作するようになります。


おつかれさまでした。

その2:マウスdeカメラ編へ

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away