LabVIEW+LINX+BeagleBoneBlackを試してみた

#はじめに
LINXはDigilent社のオープンソースプロジェクトで、LabVIEWで組込み開発をするためのツールキットです。
ターゲットに専用のファームウェアを書き込むことで、LabVIEWからリモート(シリアル通信やTCP通信)でI/Oを制御することが出来ます。
ArduinoやDigilent社のChipKit、Raspberry Pi、BeagleBoneBlack等に対応しており、ハードウェアの違いをそれほど意識することなくプログラミングすることが出来ます。

Raspberry PiとBeagleBoneBlackについては今年リリースされたLINX3.0から対応するようになりました。
他のターゲットとは異なり、cRIOのようにターゲット側でLabVIEWのコードが実行されるようになっており、スタンドアローン動作が可能になっています。

LINXがどのような仕組みで動作しているかは下記で分かりやすく説明されています。予め目を通しておくと記事の内容を理解しやすいと思います。
[How LINX Works](https://www.labviewmakerhub.com/doku.php?id=learn:libraries:linx:misc:linx-internals)

以前からLabVIEWを使った組込み開発には興味があったのですが、スタンドアローン動作まで出来るターゲットとなるとcRIOやmyRIOくらいしかなく、開発環境のことも考えるとスルーせざるを得ませんでした。(高いので…)
そんな中、つい最近になってLINXでスタンドアローン動作出来るターゲットが追加されたと知り、アドベントカレンダーを機に試してみることにしました。

#注意事項
##ライセンスについて
BeagleBoneBlackとRaspberry Pi用に提供されているLabVIEWランタイムは**商用利用不可**のライセンスになっていますので注意して下さい。

##開発環境について

BeagleBoneBlackやRaspberry Pi等をターゲットとする場合、開発機で使用するLabVIEWは2014 32bitの英語版のみをサポートしています。
( ボード側にインストールするLabVIEWランタイムの仕様による制約と思われます。現時点では日本語版や2014以外の開発環境では動作しませんでした。)
Arduino等のRemoteI/Oとして動作するタイプのターゲットについては開発環境が日本語版や新しいバージョンでも問題ありません。

#使用するもの
##ハードウェア
・BeagleBoneBlack
・microSDカード 4GB以上

※今まで存在を知らなかったボードで興味があったのでBeagleBoneBlackを選んでみました。

##ソフトウェア
・LabVIEW 2014 Home Bundle (英語版)
・VI Package Manager 2016
・LINX
・7-Zip
・W32 Diskimager

#開発環境の準備

以下の手順で環境を準備します。
・LabVIEW2014 Home Bundleのインストール
・NI-VISAのインストール
・VI Package Managerのインストール
・LINXのインストール
・BeagleBoneBlackの初期セットアップ
・BeagleBoneBlackにLabVIEWランタイムをインストール
・動作確認

##LabVIEW2014 Home Bundleのインストール

LabVIEW Home Bundleを購入するとダウンロード先やチュートリアル等のURLと、シリアルNoの書かれた紙が付いてきます。

![_B210782.jpg](https://qiita-image-store.s3.amazonaws.com/0/36514/17d586e1-a430-be39-bef8-8f5689a5700f.jpeg)

記載のURLのページにあるDownload Nowのリンクを開くとNIのページにジャンプしてLabVIEW本体をダウンロードすることが出来ます。
※シリアルNo無しでインストールすると体験版として使用可能です。

https://www.labviewmakerhub.com/labview

![image](https://qiita-image-store.s3.amazonaws.com/0/36514/67b69943-6918-344b-29ca-46c63ac23b65.png)

冒頭に書いた通りRaspberry PiやBeagleBoneBlackをターゲットにする場合は互換性の理由から、**英語版**をダウンロードします。

![image](https://qiita-image-store.s3.amazonaws.com/0/36514/70d3145e-4971-0f0a-af25-c5c8566cbb7d.png)

ダウンロードしたインストーラを実行して進めていくと、シリアルNoを入力する画面が表示されます。
Home Bundleの場合は一番上の欄にだけシリアルNoを入力すればOKです。

![2016-11-21 22_23_05-LabVIEW 2014 SP1.png](https://qiita-image-store.s3.amazonaws.com/0/36514/b59ff9f8-1077-c9fc-06a8-993ff81f1a91.png)

さらに進めていくと、インストールするパッケージの選択画面が表示されます。

NI Device DriversはNI製のハードウェアを使う場合に必要になる主要なドライバを一式含んだパッケージです。
結構容量を食うのと常駐タスクが増えるので必要になるまで入れなくて良いです。インストールから外します。

![2016-11-21 22_24_49-LabVIEW 2014 SP1.png](https://qiita-image-store.s3.amazonaws.com/0/36514/ba2d979f-116a-26ae-e2a9-0c924f103013.png)

さらに進めるとアクティベーションを求められるので、それを済ませて再起動すればLabVIEW本体のインストールは完了です。

##NI-VISAのインストール

VISAは計測器の様々な物理的なインタフェース(GPIB,シリアル,Ethernet,USB等)を抽象化して、統一されたインタフェースでプログラミング出来るようにしてくれるAPIです。
LabVIEWでシリアル通信をする時はVISAが必要になるので入れておきます。

NIのドライバのダウンロードページからNI-VISAを選択します。
http://www.ni.com/downloads/drivers/ja/
![image](https://qiita-image-store.s3.amazonaws.com/0/36514/6ce0890e-ebcd-8780-8d68-7c9b10fe1580.png)


リリース日でソートすることで最新版を簡単に見つけることが出来ます。
![image](https://qiita-image-store.s3.amazonaws.com/0/36514/4fcd0813-eed1-a9ec-db04-91fc89e68702.png)

※インストール作業は迷うポイントは無いと思うので説明を省略します。

##VI Package Managerのインストール

VI Package Managerはアドオンの入手や管理によく使われているツールです。
LabVIEW 2014をインストールするとVI Package Managerも自動でインストールされますが、バージョンが古いので、手動で最新版をインストールしておきます。

下記のURLからFree版をダウンロードしてインストールします。
https://vipm.jki.net/

※特にインストールで迷うようなところは無いので説明は省略します。

##LINXのインストール

VI Package Managerを起動します。
対象とするLabVIEWのバージョンに2014を選択し、検索バーにLINXと入力します。

![2016-11-21 22_44_12-JKI VI Package Manager.png](https://qiita-image-store.s3.amazonaws.com/0/36514/a5202e45-2ff1-f2f4-44bb-0b0443343a40.png)

Digilent LINX を選択してコンテキストメニューからInstallを選択します。

![2016-11-21 22_44_42-JKI VI Package Manager.png](https://qiita-image-store.s3.amazonaws.com/0/36514/a0fe01d7-8875-9d67-c41c-2b41d4ced7fc.png)

LINXと依存関係のあるMakerHub Toolboxが入っていない場合は自動的にリストアップされるのでそのままContinueでインストールを進めます。

![2016-11-21 22_45_17-JKI VIPM - Package Action Confirmation.png](https://qiita-image-store.s3.amazonaws.com/0/36514/e62017bf-6634-2b33-4a92-cfa8a4ba7ded.png)

続いてライセンスの文章等が表示されるので、内容を確認して進めていけばインストールが完了します。

##BeagleBoneBlackの初期セットアップ

BeagleBoneBlackとPCをUSBケーブルで繋ぐと、ストレージデバイスとして認識されます。
中にあるSTART.htmを開くと、Getting Startedというページが開きます。

![2016-11-21 02_00_57-BeagleBone Getting Started (F_).png](https://qiita-image-store.s3.amazonaws.com/0/36514/42d6a9e7-8d8d-7690-879d-61fe7a87b6ab.png)

少しスクロールするとドライバのリンクがあるので、環境に合ったものをインストールします。
![image](https://qiita-image-store.s3.amazonaws.com/0/36514/0cb65423-1b3e-a245-5356-b8db7176b553.png)

ドライバをインストールすると、Linux USB Ethernetというネットワークアダプタが追加され、USB接続だけでBeagleBoneBlackにアクセス出来るようになります。

続いてUpdate board with latest softwareの項にあるリンクから最新版のイメージを入手します。
（古いバージョンの場合、LabVIEWランタイムのインストールでエラーが発生する可能性があります。）

![image](https://qiita-image-store.s3.amazonaws.com/0/36514/6b69b1b6-6d79-55f9-bca8-0d039717ef6a.png)

Jessie for BeagleBone をダウンロードします。（ 簡単にしか試していないですが、GUI無し版のJessie IoTでも良いようです。）

![2016-11-21 02_21_08-スタート.png](https://qiita-image-store.s3.amazonaws.com/0/36514/0b57a0b3-811b-e2f1-35af-0a6ec1a7bf4b.png)

7-Zipで入手したイメージファイルを展開します。

![2016-11-21 02_32_43-91% 展開中  6-11-06-4gb.img.xz.png](https://qiita-image-store.s3.amazonaws.com/0/36514/6bd4a792-59e6-a0d5-41c2-4805bc7b6e85.png)

Win32 Disk Imagerで展開したイメージファイル選択してをMicroSDカードに書込みます。
この時書込み先のドライブを間違うとイメージファイルでドライブの内容が上書きされてしまうので、十分に確認した上でWriteを押します。

![2016-11-21 02_33_19-Win32 Disk Imager.png](https://qiita-image-store.s3.amazonaws.com/0/36514/b4b1b8bd-cd4f-c0f6-0931-057f4f464b4c.png)

書き込んだSDカードをボードにセットしたら、SDカードから起動させます。
SDカードスロット側のスイッチを押しながら電源ボタンを押し続け、LEDが同時に4つ点灯したらボタンを放します。

![_1015939.jpg](https://qiita-image-store.s3.amazonaws.com/0/36514/9082a277-1a53-3d2d-c821-61135ffde76d.jpeg)


##BeagleBoneBlackにLabVIEWのランタイムをインストールする

**LabVIEWランタイムのインストールには予めBeagleBoneBlackがインターネットへ繋がるようにしておく必要があります。
DHCPで自動的にIPを取得するので、通常は有線LANで接続しておけばOKです。**　

LabVIEWを起動してTools → MakerHub → LINX → LINXTargetConfiguration を開きます。
![2016-11-21 22_49_31-Program Manager.png](https://qiita-image-store.s3.amazonaws.com/0/36514/4afb53da-06fe-533f-c690-958167810bca.png)

ConnectTargetの画面でBeagleBoneBlackと接続します。
BBBの文字をクリックするとIPとユーザ名のデフォルト値が入力されるので、そのままConnectを押します。
![2016-11-21 21_47_45-LINX Target Configuration.png](https://qiita-image-store.s3.amazonaws.com/0/36514/e4af51f3-9753-d519-92f5-41bd19fb2d06.png)

Install Software のページに移動してLabVIEW Runtimeをインストールします。

Installボタンをクリックすると自動的にボード側にLabVIEWのインストールが実行されます。
![2016-11-21 07_33_19-LINX Target Configuration.png](https://qiita-image-store.s3.amazonaws.com/0/36514/dbcf1043-65fc-d432-120d-38ee31555503.png)

インストールが完了後、LaunchExampleをクリックするとサンプルプロジェクトが開きます。
![2016-11-21 21_57_17-LINX Target Configuration.png](https://qiita-image-store.s3.amazonaws.com/0/36514/56220bfe-b3a1-833f-b202-28094ea45600.png)

##サンプルプロジェクトで動作確認

BeagleBoneBlackの下の階層にBBB Main.viというのがあるので開きます。
![image](https://qiita-image-store.s3.amazonaws.com/0/36514/2b028201-bf8d-fa92-ebd8-8b2457495b8b.png)

VIの実行ボタンをクリックするとVIがターゲット側にデプロイされます。
![2016-11-21 22_55_14-BBB Main.vi Front Panel on BeagleBone Black.lvproj_BeagleBone Black.png](https://qiita-image-store.s3.amazonaws.com/0/36514/16202051-e355-b118-af44-d7361e69f060.png)
![image](https://qiita-image-store.s3.amazonaws.com/0/36514/fb67fd05-bed5-ef9c-e020-1bd54f1d494c.png)

デプロイ完了後に閉じると動作がスタートします。
![2016-11-21 22_51_35-Deployment Progress.png](https://qiita-image-store.s3.amazonaws.com/0/36514/4a746d9d-81e1-083e-bc03-d392b946eb2a.png)

VIのフロントパネルにある通りにLEDを接続して Click Me! と書かれているLEDの制御器をクリックするとそれに連動してLEDを点けたり消したり出来ます。
![_B210787.jpg](https://qiita-image-store.s3.amazonaws.com/0/36514/29cb74c0-53ca-5120-03b5-5dd31d620dce.jpeg)


ただLEDを光らせても面白くないのでアナログ入力も試してみました。
サンプルVIのループ内のVIを1個置き換えるだけでアナログ電圧を取り込めました。PCでの開発同様、波形チャートで可視化も出来ます。

ただ、DAQのようにハードウェアタイミングで取り込みが出来るわけではないので、DCや低周波でしか使えなさそうです。
(リモートでデバッグをしているのも影響していると思いますが、ある程度のウェイトを入れないとループの周期がばらつきます。)
タイミングストラクチャもなぜかエラーになって使えないようなので、正確なタイミング管理は出来ないと割り切る必要がありそうです。

![image](https://qiita-image-store.s3.amazonaws.com/0/36514/3ce0719a-4fe0-37a0-97c9-802812e6a039.png)
![image](https://qiita-image-store.s3.amazonaws.com/0/36514/5b64f116-8260-36a5-7240-4b30d8e39d91.png)

時間があまり無かったので今回はここまでです。
実は色々と試す前はネットワークに繋がる学習リモコンを作ろうと思っていたのですが、デジタルI/Oでもタイミングが問題になりそうだったのでやめました。(学習リモコンのネタはArduino Compatible Compiler for LabVIEWでやるかも？)

次はタイミングが問題にならないDC計測系のネタでI2CやSPIを使って何かやってみたいと思います。