Raspberry PiとMATLABを接続してプログラムを書く
はじめに
最近苦悩していた『Raspberry PiにMATLAB(およびSimuLink)のパッケージをインストールする方法』をまとめました.
記録を残しておかないと自分が忘れてしまうので.
これが正攻法だという保証はありません.
不具合が起きた場合は自己責任でお願いします.
また,自分はRasPiもMATLABも初心者であるため,かなり事細かく記載してあります.
目次を見て「そんなの分かってるわ!」という項目があれば読み飛ばしてください.
目次
- はじめに
- 目次
- 実行環境
- OSのインストールと初期設定
- Bluetooth設定
- WiFi設定
- パッケージリストとファームフェアのアップデート
- 日本語入力化を有効にするため,Google日本語入力の「Mozc」パッケージをインストール
- 「Quimat 3.5インチタッチスクリーンディスプレイ」のタッチパネルを有効化
- IPアドレスの確認
- SSH接続の有効化
- Tera Termのインストール
- SSH接続
- vimのインストール
- ユーザー名の変更
- 自動ログインユーザの変更
- 自動ログインユーザの変更
- sudo権限の変更
- MATLABとの接続に必要なパッケージをインストール
- MATLABをインストール
- MATLABの起動
- RaspberryPiのパッケージをインストール
- RasPiとMATLABの接続を確認
- おわりに
- 参考文献
実行環境
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」を選択
パッケージリストとファームフェアのアップデート
デスクトップ画面が開けたら左上の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」ボタンを押すと再起動を促されるので再起動
SSH接続
RasPiボードとPCをイーサネットケーブル(LANケーブル)で接続
(PCはWiFi接続できている状態が好ましい.WiFiモジュールが搭載されていないPCでLANポートが1つしかない場合はUSBタイプのイーサネットアダプター等を使用すると良い)
Tera Termを起動し,ホスト(T)に先ほど確認したIPアドレスを入力して「OK」
(「セキュリティ警告」が出た場合は「続行(C)」をクリック)
「ユーザー名(N)」に「pi」,「パスフレーズ(P)」に「設定したパスワード」を入力
以下のような画面が表示されたらSSH接続成功!
vimのインストール
以下の作業はすべてTera Termを用いてSSH接続したまま行うと勝手が良い
$ sudo apt-get install vim
(続行しますか[y/n]と出た場合は「y」を入力してENTER)
シンタックスハイライトと自動インデント機能の有効化
$ sudo vi /etc/vim/vimrc “syntax on “if has("autocmd") “ filetype plugin indent on “endif
上記の「"」を全て削除して以下のようにする
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
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の起動
(ファイアフォールでブロックされた場合は「許可する(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 PiとMATLABを接続」に関しては数項のみだったと思います.
初心者向けの記事になってしまいましたが,筆者が初心者なので仕方ありません.
また,これは自分用の覚書という趣旨でもありましたのであしからず...
僕より先にこれらをマスターしている方々は多々おられると思いますが,その方法をまとめてある記事が少ないような気がしましたので,今回この記事を書いた次第であります.
もっと良いやり方やRasPiとMATLABの使った活用事例を知っている方はぜひぜひご教授をお願いいたします.
最後に紹介ですが「トランジスタ技術2016年12月号」にRasPiとMATLABの使った実用例がまとめられていますので参考にしてみてください.
以上です.
今後ともよしなにお願いいたしますm(_ _)m
参考文献
Raspberry Pi の アップデート - Qiita
Raspberry Pi3の日本語入力を有効にする - Qiita
RaspberryPiでのVim設定について - Qiita
RaspberryPiをRaspbianで使う場合の初期設定メモ(ユーザ追加) - Qiita
Raspbianでpiユーザ名とパスワードをうまいこと変更する - Qiita
[メモ] (らずぱい) sudoers: /etc/sudoers.d/010_pi-nopasswd - Qiita
vim :: readonly のファイルを sudo で強制的に保存する [Tipsというかメモ]
Raspbian Jessie でSimulinkと連携 | misc
Ubuntu 17.04 installation failure · Issue #2 · CoderPuppy/lua-nn · GitHub
MATLAB 文字セット エンコードの変更 - MATLAB slCharacterEncoding - MathWorks 日本
MATLABとRaspberry PiでHelloWorldやLチカ。 - シュウジマブログ