MATLABとRaspberry PiでHelloWorldやLチカ。

MATLAB Support Package for Raspberry Pi Hardwareを使用することで、MATLABからRaspberry Piを動かすことができます。 リモートでRaspberry Pi上のコマンドを実行できるほか、その結果をMATLAB上に表示することもできます。 echoコマンドを実行することで、Hello Worldを表示させてみます。

実行環境

筆者の実行環境は次の通りです。

Raspberry Pi

パソコン

MATLAB

  • MATLAB R2018a
  • MATLAB Support Package for Raspberry Pi Hardware
  • その他たくさんのパッケージ
    • 筆者の環境ではあらかじめたくさんのパッケージがインストールされているため、必要性がわからない

注意点

以下はRaspberry Pi 3を無線LANでインターネットに接続しながら、実行している。 無線LANを接続していない場合、インストールなどで止まってしまうかも(とくに確認していない)。その場合はインターネットに接続されたネットワーク上にパソコンとRaspberry Piを接続する必要がある。

1. 物理的に接続

LANケーブル(ストレートケーブルでOK)でRaspberry Piとパソコンを直接接続する。

2. IPアドレスを確認

Raspberry Pi上のターミナル(LXTerminal)でIPアドレスを確認

($は打つ必要が無い)

$  ifconfig

すると、以下のような文字列が一気に出てくる。

eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
inet xxx.xxx.xxx.xxx  netmask xxx.xxx.xxx.xxx  broadcast xxx.xxx.xxx.xxx
(省略)

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
(省略)

wlan0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
(省略)

この中のeth0の項目にある、inet以降の数字列(xxx.xxx.xxx.xxxのようなドットで区切られた数値4つ)が有線LAN(Ethernet)のIPアドレス。 これを以降で使用する。 netmask(サブネットマスク)やbroadcast(ブロードキャストアドレス)は今回は必要ではない。

3. 通信の確認

パソコンのコマンドプロンプト(Windows)orターミナル(mac or Linux)でpingを飛ばす。

($は打つ必要が無い)

$  ping xxx.xxx.xxx.xxx

成功すると、

$  ping xxx.xxx.xxx.xxx
64 bytes from xxx.xxx.xxx.xxx: icmp_seq=1 ttl=64 time=0.396 ms
(成功例: これが1秒毎に出てくる。)

永久に出続けてしまうときは、Ctrl+Cを押すと止まる 。

失敗すると、

$  ping xxx.xxx.xxx.xxx
Request timeout for icmp_seq 0
(失敗例: これが1秒毎に出てくる。)

永久に出続けてしまうときは、Ctrl+Cを押すと止まる 。

  • 失敗するときは
    • この問題はRaspbianやMATLABのバージョンと関係が無い
    • IPアドレスが間違っていないか確認する
    • LANケーブルなどを交換する
    • その他の方法で通信ができているか確認する

4. MATLABと接続する

MATLABのコマンドウィンドウで以下のコマンドを打つ。

(>>は打たなくてよい)

>> rpi = raspi('xxx.xxx.xxx.xxx', 'pi', 'raspberry');

xxx.xxx.xxx.xxxはIPアドレス pi はRaspbianのユーザ名(初期設定はpi) raspberry はRaspbianのパスワード(初期設定はraspberry)

すると1分程度経過した後に

### Updating Raspberry Pi I/O server...
### Connecting to board...
### Connected to xxx.xxx.xxx.xxx...
### Installing nanomsg Library (this might take a while)...
### Creating server folder...
### Transferring source files...
### Building MATLAB I/O server...
### Launching MATLAB I/O server...
>>

と出てくる

5. Hello Worldする

以下をMATLABのコマンドウインドウに打つ。

(>>は打たなくてよい)

>> system(rpi, 'echo Hello, World!' )

すると、

ans =

    'Hello, World!
     '
>>

と出るはず。 このansはRaspberry Pi上でechoコマンドを実行した結果が返ってきている。 これでHello, Worldできた。

終わったら、

>> clear rpi

と打つことで接続を終了できる。

  • 失敗するときは
    • echoの行にセミコロンがあると、成功していても結果が出ないので失敗しているように見える。
    • 日本語が文字化けする場合はMATLABで slCharacterEncoding('UTF-8') を設定。

6. mファイルでHello Worldする

MATLABのエディターで以下を打つ。

clear rpi %念のためrpiを削除
rpi = raspi('xxx.xxx.xxx.xxx', 'pi', 'raspberry'); %接続を開始
system(rpi, 'echo Hello, World!' ) %echoコマンドを実行させる
clear rpi %rpiを削除して、接続を終了

それを"helloworld.m"のなどの名前で保存する。

そして実行すると、コマンドウインドウに、

ans =

    'Hello, World!
     '
>>

と出てくる。

7. 簡単な計算をして、計算結果を見る。

同じくmファイルを作成

clear rpi %念のためrpiを削除
rpi = raspi('xxx.xxx.xxx.xxx', 'pi', 'raspberry'); %接続を開始

n = 20; %ループ回数
sum = 0; %合計を格納

%計算ループ
for i = 1:n
    sum = sum + i; %加算
    system(rpi, [ 'echo "i=' , num2str(i) , ', sum=' , num2str(sum) ,'"'] ) %echoコマンドで途中経過を出力 

end

system(rpi, [ 'echo "sum(1:n)= ',num2str(sum) , '"' ] ) %echoコマンドで計算結果を表示

clear rpi %rpiを削除して、接続を終了

実行すると、たくさんの途中経過の出力の後に、

ans =

    'sum(1:n)=210
     '

と出るはず。

8. Lチカする

同じくmファイルを作成

clear rpi %念のためrpiを削除
rpi = raspi('xxx.xxx.xxx.xxx', 'pi', 'raspberry'); %接続を開始
led = rpi.AvailableLEDs{1};

%Lチカループ
for i = 1:10 %10回繰り返す
    writeLED(rpi, led, 0); %LEDをオフ
    pause(0.5); %0.5[sec]の待機
    writeLED(rpi, led, 1); %LEDをオン
    pause(0.5); %0.5[sec]の待機
end

system(rpi, 'echo "mmc0" | sudo tee /sys/class/leds/led0/trigger'); %LEDの制御を解放
clear rpi %rpiを削除して、接続を終了

参考

Getting Started with MATLAB Support Package for Raspberry Pi Hardware - MATLAB & Simulink Example - MathWorks 日本

Create connection to Raspberry Pi hardware - MATLAB raspi - MathWorks 日本