Raspberry PiとMATLABを接続してプログラムを書く

はじめに

最近苦悩していたRaspberry PiMATLAB(およびSimuLink)のパッケージをインストールする方法』をまとめました.
記録を残しておかないと自分が忘れてしまうので.
これが正攻法だという保証はありません.
不具合が起きた場合は自己責任でお願いします.

また,自分はRasPiもMATLABも初心者であるため,かなり事細かく記載してあります.
目次を見て「そんなの分かってるわ!」という項目があれば読み飛ばしてください.

実行環境

  • OS:Windows 10 Enterprise
  • MATLAB:R2019a
  • Tera Term:Version 4.102
  • RasPi:RaspberryPi 3 B+
  • NOOBS:Version 3.0.1
  • Display:Quimat 3.5インチタッチスクリーン
  • Keyboard:Bluetooth Keyboard Agenstar

OSのインストールと初期設定

RaspberryPiのHPからNOOBSをダウンロード(Download ZIP)
www.raspberrypi.org

NOOBSの解凍
microSDカードにNOOBSを解凍した中身をコピー
RasPiボードにmicroSDカードを挿入,電源投入(パーティションの設定に10分前後かかるかも)
Raspbianにチェックマークを入れてインストール
下の方に出ているタブで言語設定を『日本語』に設定(キーボード設定はご自由に)
タイムゾーン,キーボード設定,パスワード等の設定は任意で

Bluetooth設定

タスクバー(Menu Bar)のBluetoothアイコンをクリックして「Make Discoverable」を選択
その後もう1度Bluetoothアイコンをクリックし,「Add Device」を選択
任意のデバイスを選択し「Pair」ボタンをクリック→ペアリング設定
接続できたらタスクバー(Menu Bar)のBluetoothアイコンをクリックして「Stop Discoverable」を選択

WiFi設定

タスクバー(Menu Bar)のWiFiアイコンをクリックして任意のSSIDを選択
パスワードを入力すると一定時間後に接続が完了する

パッケージリストとファームフェアのアップデート

デスクトップ画面が開けたら左上のRasPiロゴをクリックして>アクセサリ>LXTerminal を起動
(続行しますか[y/n]と出た場合は「y」を入力してENTER)

$ sudo apt-get update
$ sudo apt-get upgrade
$ sudo apt-get dist-upgrade
$ sudo rpi-update

(アップデート時間が長いのでこの間にデスクトップやMenu Barの設定をすると良い.以下の記事が参考になります)
ur0.work

日本語入力化を有効にするため,Google日本語入力の「Mozc」パッケージをインストール

$ sudo apt-get install fcitx-mozc

インストールが終わったらRasPiを再起動する

$ sudo reboot

起動後RasPiロゴをクリック>設定>Fcitx設定 を起動
タブを「全体の設定」に変更し,「入力メソッドのオンオフ」の右端が「zenkakuhankaku」になっていれば設定完了

「Quimat 3.5インチタッチスクリーンディスプレイ」のタッチパネルを有効化

以下の記事を参考にさせていただきました
karaage.hatenadiary.jp

LXTerminal を起動し,以下のコードを入力する

$ git clone https://github.com/karaage0703/raspberry-pi-setup
$ cd raspberry-pi-setup
$ ./setup-quimat_3_5_display.sh

インストールが終わったらRasPiを再起動する

$ sudo reboot

起動後,タッチ入力が可能になっているはずです

解像度の設定

RasPiロゴをクリック>設定>Raspberry Piの設定>システム>解像度を設定(R)>「CEA mode 3 720x480 60Hz 16:9」
(↑この設定に関してはお好みで)
(ついでに「オーバースキャン」のチェックボックスを「無効」にすると良い)

「OK」ボタンを押すと再起動を促されるので再起動

IPアドレスの確認

LXTerminal を起動

$ 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」が有線LAN(Ethernet)のIPアドレス
これ以降IPアドレスはこれを用いる

SSH接続の有効化

RasPiロゴをクリック>設定>Raspberry Piの設定>インターフェイス を開く
ここで「SSH」が有効になっていない場合は有効のタブにチェック
今後のことを考えて「カメラ」「VNC」「I2C」「Serial Port」なども有効にしておく

「OK」ボタンを押すと再起動を促されるので再起動

Tera Termのインストール

ja.osdn.net

上記のURLからTera Termをインストールする
言語などは任意設定

SSH接続

RasPiボードとPCをイーサネットケーブル(LANケーブル)で接続
(PCはWiFi接続できている状態が好ましい.WiFiモジュールが搭載されていないPCでLANポートが1つしかない場合はUSBタイプのイーサネットアダプター等を使用すると良い)
Tera Termを起動し,ホスト(T)に先ほど確認したIPアドレスを入力して「OK」
(「セキュリティ警告」が出た場合は「続行(C)」をクリック)
「ユーザー名(N)」に「pi」,「パスフレーズ(P)」に「設定したパスワード」を入力
以下のような画面が表示されたらSSH接続成功!

SSH接続ができなかった場合

RasPiをシャットダウンし,microSDカードをPCに接続する(ディスクのフォーマットを求められる場合があるがフォーマットしなくても良い)
コマンドプロンプトを開く(Windowsアイコンの上で右クリック>コマンドプロンプト)
以下のコマンドを入力

C:\User\[UserName]> type nul ssh

ローカルディスク(C:)>ユーザー>[UserName]の直下に「ssh」という名前の空ファイルが作成されているはずなので,これをmicroSDカードの「boot」へ移動
microSDカードをRasPiボードに挿入し,起動する


vimのインストール

以下の作業はすべてTera Termを用いてSSH接続したまま行うと勝手が良い

$ sudo apt-get install vim

(続行しますか[y/n]と出た場合は「y」を入力してENTER)

シンタックスハイライトと自動インデント機能の有効化
$ sudo vi /etc/vim/vimrc

“syntax onif has("autocmd")filetype plugin indent onendif

上記の「"」を全て削除して以下のようにする

syntax on

if has("autocmd")
  filetype plugin indent on
endif

(Vimでは「CTRL+V」キーを押した後,「SHIFT+I」キーを押すと編集できる.「CTRL+V」→「D」で後ろの文字を1文字削除)
(「ESC」キーで編集終了,「:wq」で編集を保存して終了,「:q」で終了「:q!」で編集を削除して終了)

ユーザー名の変更

tmpユーザーを作成
$ sudo useradd -M tmp
tmpユーザーをsudoグループに追加
$ sudo gpasswd -a tmp sudo
tmpユーザーのパスワードを設定
$ sudo passwd tmp

自動ログインユーザの変更

$ sudo vim /etc/lightdm/lightdm.conf

autologin-user=pi

上記の行頭に「#」を入力して以下のようにする

#autologin-user=pi

:wq」で編集を保存して終了

$ sudo vim /etc/systemd/system/autologin@.service

ExecStart=-/sbin/agetty --autologin pi --noclear %I $TERM

上記の「pi」を「tmp」に変更して以下のようにする

ExecStart=-/sbin/agetty --autologin tmp --noclear %I $TERM

:wq」で編集を保存して終了し,RasPiを再起動

$ sudo reboot

起動したらログイン画面になるが,ログインせずともTera TermでSSH接続できる
Tera Termを起動する
ホスト(T)に前回と同じIPアドレスを入力して「OK」
(「セキュリティ警告」が出た場合は「続行(C)」をクリック)
「ユーザー名(N)」に「tmp」,「パスフレーズ(P)」に「tmpで設定したパスワード」を入力
$ who 」と入力し「tmp」ユーザーしか表示されなければOK!

piユーザ名変更(新規ユーザー名は「new」)
$ sudo usermod -l new pi

「あなたはシステム管理者から通常の~」と表示されたあと「tmp」ユーザーのパスワードを求められるので「tmpで設定したパスワード」を入力

usermod と groupmod を変更し,再起動を行う
$ sudo usermod -d /home/new -m new
$ sudo groupmod -n new pi

$ sudo reboot
「new」ユーザーでログイン

起動したらログイン画面になるのでユーザー選択のタブで「new」を選択し「元piで設定したパスワード」を入力
Tera Termを起動する
ホスト(T)に前回と同じIPアドレスを入力して「OK」
(「セキュリティ警告」が出た場合は「続行(C)」をクリック)
「ユーザー名(N)」に「new」,「パスフレーズ(P)」に「元piで設定したパスワード」を入力

「new」ユーザーのパスワードを変更する
$ sudo passwd new

再び「あなたはシステム管理者から通常の~」と表示されたあと「new」ユーザーの新たなパスワードを2度入力する

自動ログインユーザの変更

以前の項で操作した箇所を再び再編集する

$ sudo vim /etc/lightdm/lightdm.conf

#autologin-user=pi

上記の行頭の「#」を削除して「pi」を「new」にする

autologin-user=new

:wq」で編集を保存して終了

$ sudo vim /etc/systemd/system/autologin@.service

ExecStart=-/sbin/agetty --autologin tmp --noclear %I $TERM

上記の「tmp」を「new」に変更して以下のようにする

ExecStart=-/sbin/agetty --autologin new --noclear %I $TERM

:wq」で編集を保存して終了

変更できたらRasPiを再起動する

$ sudo reboot
tmpユーザを削除

Tera Termを起動する
ホスト(T)にいつものIPアドレスを入力して「OK」
(「セキュリティ警告」が出た場合は「続行(C)」をクリック,「既存の鍵を,新しい鍵で上書きする(R)にチェックマークを入れると今後表示されなくなる」)
「ユーザー名(N)」に「new」,「パスフレーズ(P)」に「newで設定したパスワード」を入力

$ sudo userdel tmp

「new」ユーザーの新たなパスワードを2度入力し,続けて再起動する

$ sudo reboot

sudo権限の変更

2016年11月以降パスワード入力を不必要にするsudo権限の保存場所が /etc/sudoers から /etc/sudoers.d/010_pi-nopasswd へ移行したようなので,後者を編集する
(ただし, /etc/sudoers.d/010_pi-nopasswd はREADONLYファイルなので注意!)

Tera TermでSSH接続

$ sudo vi //etc/sudoers.d/010_pi-nopasswd

pi ALL=(ALL) NOPASSWD: ALL

「CTRL+V」→「SHIFT+I」で上記の「pi」を「new」に変更する

new ALL=(ALL) NOPASSWD: ALL

「ESC」キーで変更終了
READONLYファイルであるため「:w !sudo tee %」コマンドを入力し「:q!」で終了

再度sudo権限の保存場所を確認し「new ALL=(ALL) NOPASSWD: ALL」の状態であれば変更完了!

 $ sudo vi //etc/sudoers.d/010_pi-nopasswd

MATLABとの接続に必要なパッケージをインストール

一応もう1度パッケージリストと全体パッケージのアップデート

$ sudo apt-get update
$ sudo apt-get upgrade

MATLABパッケージをインストール
(続行しますか[y/n]と出た場合は「y」を入力してENTER)

$ sudo apt-get install libsdl1.2-dev alsa-utils espeak x11vnc guvcview i2c-tools libi2c-dev ssmtp ntpdate git-core v4l-utils cmake
$ sudo apt-get install libnanomsg-dev
$ sudo apt-get autoremove

DNS逆引き無効化

$ sudo vi /etc/ssh/sshd_config

「CTRL+V」→「SHIFT+I」キーで編集開始
一番下の行を改行して以下の処理を追加

#Turn off revrse DNS lookup
UseDNS no

このままだと何故かSSH接続できなくなってしまうため,以下のように魔法の1行を追加する

IPQos cs0 cs0

少し上から見ると次のようになる

# Example of overriding settings on a per-user basis
#Match User anoncvs
#       X11Forwarding no
#       AllowTcpForwarding no
#       PermitTTY no
#       ForceCommand cvs server

#Turn off revrse DNS lookup
UseDNS no

IPQos cs0 cs0

以下のコードでsshを再起動しする([ ok ]と表示されたら成功)

$ sudo /etc/init.d/ssh restart

また,念のためRasPiも再起動する

$ sudo reboot

MATLABをインストール

以下のURLにアクセス

jp.mathworks.com

MathWorksのアカウントを作成

アカウントの手続きを済ませてMATLABをインストール

MATLABの起動

(ファイアフォールでブロックされた場合は「許可する(A)をクリック」)
MathWorksアカウントへのサインインを求められるので,設定したメールアドレスとパスワードを入力

MATLAB文字コードを変更

「コマンドウィンドウ」に以下の構文を入力してENTER

>>currentCharacterEncoding = slCharacterEncoding()

おそらくデフォルトは「Shift-JIS」なので以下のように返ってくる

currentCharacterEncoding = 'Shift_JIS'

このままでは不都合なので,以下のようにして「UTF-8」に変更する

>>slCharacterEncoding('UTF-8')

再度文字コードを確認し,以下のように 「'UTF-8'」と返って来れば変更完了!

 >> currentCharacterEncoding = slCharacterEncoding()

currentCharacterEncoding = 'UTF-8'

RaspberryPiのパッケージをインストール

「ホーム」のタブから「アドオン」のタブを下ろし,「ハードウェア サポート パッケージの入力」を選択
右上の検索窓に「rasberry pi」と入力し検索
以下2つのパッケージをインストールする

MATLAB Support Package for Raspberry Pi Hardware
Simulink Support Package for Raspberry Pi Hardware
(いずれもパッケージを選択し,インストール>インストール→承諾する→後でセットアップする)

RasPiとMATLABの接続を確認

RasPiボードとPCをイーサネットケーブル(LANケーブル)で接続
今までと同様にTera TarmでSSH接続ができることを確認
MATLABを起動
MATLABの「コマンドウィンドウ」に以下のコマンドを入力してENTER↓
(「new」はユーザー名「pass」は「new」ユーザーのパスワード)

>> mypi = raspi('xxx.xxx.xxx.xxx', 'new', 'pass');

ENTERを入力した後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...

mypi =
raspiのプロパティ:

DeviceAddress:’xxx.xxx.xxx.xxx’
Port:xxxxxx
BoardName:’Raspberry Pi 3 Model B+’
AvailableLEDs:{‘led0’}
AvailableDigitalPins:{4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27}
AvailableSPIChannels:{}
AvailableI2CBuses:{‘i2c-1’}
AvailableWebcam:{‘/dev/video10’,’/dev/video11’, ’/dev/video12’}
I2CBusSpeed:100000
Hello Worldしてみる

MATLABの「コマンドウィンドウ」に以下のコマンドを入力してENTER

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

するとその下に次のように表示される

ans =
    'Hello, World!'

終わったら >> clear mypi で接続を終了する

.mファイルでHello Worldしてみる

左上の「新規作成」のタブから「スクリプト」を選択
「エディタ」に以下を入力

%mypiを削除
clear rpi
%raspiと接続
mypi = raspi('xxx.xxx.xxx.xxx', 'new', 'pass');
%echoコマンドを実行
system(rpi, 'echo Hello, World!' )
%mypiを削除して,接続を終了
clear rpi

すると「コマンドウィンドウ」に次のように表示される

ans =
    'Hello, World!'
.mファイルでLチカしてみる

左上の「新規作成」のタブから「スクリプト」を選択
「エディタ」に以下を入力

%rpiを削除
clear rpi 
%rpi接続設定
rpi = raspi('169.254.216.152', 'askb', 'Iku96820'); 

%電源LED(赤)の下のステータスLED(緑)をledとして定義
led = rpi.AvailableLEDs{1};

%Lチカforループ(1秒間隔で点滅)
>|matlab|
for i = 1:10
    writeLED(rpi, led, 0);
    pause(1);
    writeLED(rpi, led, 1);
    pause(1);
end
%LEDの制御を解放
system(rpi, 'echo "mmc0" | sudo tee /sys/class/leds/led0/trigger');
%rpiを削除
clear rpi

すると指定したLEDが1秒間隔で10回点滅するはずです

おわりに

これでSimuLinkも同様に扱えます.
SimuLinkでのLチカは以下のMATLAB公式サポートが詳しく説明してくれているので,こちらを参考にしてください.
jp.mathworks.com

やっとMATLABからRasPiを動かせるようになりました.
かなり長くなってしまいましたね.
しかし,初期設定で手間取っていたため本来の目的である「Raspberry PiMATLABを接続」に関しては数項のみだったと思います.
初心者向けの記事になってしまいましたが,筆者が初心者なので仕方ありません.
また,これは自分用の覚書という趣旨でもありましたのであしからず...

僕より先にこれらをマスターしている方々は多々おられると思いますが,その方法をまとめてある記事が少ないような気がしましたので,今回この記事を書いた次第であります.
もっと良いやり方やRasPiとMATLABの使った活用事例を知っている方はぜひぜひご教授をお願いいたします.

最後に紹介ですが「トランジスタ技術2016年12月号」にRasPiとMATLABの使った実用例がまとめられていますので参考にしてみてください.


以上です.
今後ともよしなにお願いいたしますm(_ _)m