LabVIEW Interface for Arduino を使ってみた

最終更新日:2017/2/2

I2Cデバイスを扱うようになって、基本単体動作させ、場合によってはPCと接続してデータ取得したり、制御したり出来る環境を思い描くようになりました。
I2Cデバイスを扱う場合まず思い立つのは Arduino です。現時点で入手するとなると Arduino Uno R3 のようです。\3000前後で入手可能です。

Arduinoの概要はウィキペディアの記事を読むのが一番かと思います。 https://ja.wikipedia.org/wiki/Arduino

実際にどんなところで使われているか気になりました。

UNOにはDIP20pinのchipがソケット付けで搭載されています。プログラムを書き込んでしまえば、このチップを専用のボードに挿してよりコンパクトな仕組みに作り替えることも出来ます。


  1. LIFA環境整備
  2. LIFAのExample紹介
  3. 実際に使ってみて
  4. 関連書籍紹介
  5. 余談


現在のメインストリームは UNO なのかと思います。CPUはATmega328。8-bit RISC アーキテクチャです。
※チップ単価は300円もしないようです、ただ、ブートローダ等々いくらか処理しないとArduino相当にはならないようです。
このCPUの処理能力がどの程度のものなのか気になるところです。

項目 内容
マイクロコントローラ(マイコン) ATmega328P
動作電圧 5V
入力電圧(推奨値) 7〜12V入力
電圧(制限値) 6〜20V
デジタルI/Oピン 14ピン(内6ピンがPWM出力可)
PWMデジタルI/Oピン 6ピン
アナログ入力ピン 6
I/Oピンあたりの直流電流 20mA
3.3Vピンの直流電流 50mA
フラッシュメモリ 32kB (内0.5kBをブートローダが使用)
SRAM 2kB
クロック周波数 16MHz
長さ 68.6mm
53.4mm
重量 25g

基本はClockと1命令に掛かるクロックサイクル数の関係かと思います。PICはクロックが遅いモデルもまだまだあるようですね。
AVRは20MHzぐらいが多いでしょうか。またPICは1命令4クロックですが、AVRは基本1命令1クロックで同じクロックレートなら単純演算は速いですね。
また、同様のCPUである PIC との比較も気になります。どのような点で Arduino を使うべきかの指針にもなるのかと思います。
※アセンブラでコーディングしている人で、PICのニーモニックが素直で無く、AVRは素直な記述が出来るという書込を見かけました。

使い勝手で比較している方も多いですね。
AVRは基本FLASH ROMで書き換えも1000回程度は出来るようですが、PICは1TIMEのものが多々あるようです。それに起因するのか、PICは書き込み時の電源電圧も別途用意する必要があるケースが多いので、この点からAVRへ移行している方も見えるようです。

PIC以外にも、ここ10年の間にUSB接続の小型8bitマイコンボードがたくさん出ました。
手元にCQ出版雑誌付録にもなった78K0があります。H8搭載のボードもたくさんありますし、TIのMSP430搭載のボードもあります。
結局のところ勝ち組はどれなのか、情報が欲しいところですが、少なくともArduinoは勝ち組なんでしょうね。互換機が多いのがその考えの理由でもあります。また、教本が多いのも理由に挙げて良いのかと思います。
※ムック付録として互換基板を掲載し、使い方を含め紹介しているためユーザの裾野拡大に一役していると思います。


ArduinoIDEはCライクのプログラム言語でコーディング・コンパイル出来る環境です。
LabVIEWはクロスコンパイル環境を提供していることもあり、ArduinoIDEに中間言語を送ってBUILDする環境を2010年には構築したようです。
それが現在では無償提供されています。
Windows環境に限らず、Mac版、Linux版でも使えるのは有り難いです。

まずは環境整備する必要があります。
NIのユーザフォーラムに記事があります。
https://forums.ni.com/t5/LabVIEW-Interface-for-Arduino/LabVIEW-Interface-for-Arduino-Setup-Procedure/ta-p/3521346
この記事は2011掲載のものです。可成り時間が経っているため、実際にこの記事のまま使えるかどうかは気になるところです。

  1. ArduinoIDEをDLし適当な場所に解凍してC:\Program Files (x86) にコピー 今回は arduino-nightly
    https://arduino.cc/en/Main/Software
    解凍後のフォルダサイズは400MBを優に超えます。
  2. LabVIEWをインストールする。(既にインストール済みならスキップ)  この記事はLabVIEW2016で実施
  3. NI-VISAドライバをインストールする。(既にインストール済みならスキップ)  この記事はNI-VISA16.0で実施
  4. JKI VI Package Managerをインストール。(既にインストール済みならスキップ) 最新版を使用。2016SP1
  5. LabVIEW Interface for Arduino Toolkit をインストール
    参照:https://digital.ni.com/public.nsf/allkb/A20FBBD36820669086257886004D5F4D?OpenDocument
    今回インストールしたバージョンは2.2.0.79でした。
  6. Arduinoに接続する準備をします。接続方法もKnowledgebaseに記載があるので参考にします。
    参照:https://digital.ni.com/public.nsf/allkb/0F9DADF9055B086D86257841005D1773?OpenDocument
    1. Arduino IDEは既にダウンロードしてC:\Program Files(x86)にインストール済みのはずです。
    2. USBケーブル(A-B)にてPCとUNOを接続します。このときUSBドライバのインストールが走るはずですが見つからないはずです。
      https://forum.arduino.cc/index.php?topic=46838.0

      UNOおよびその互換機は VID2341PID0043 のようです。
      ちなみに、mega 2560の場合 VID2341PID0042 のようです。
    3. 見つからないのでArduino IDE内のドライバを指定してインストールします。

      これを実行すればFTDIのドライバがインストールされ、通信できるようになります。
      デバイス:ArduinoUnoと表示されました。VID2341PID0043=Unoです。
      COMポートの番号を控えておいてください。
      ※互換機の場合FTDIではなくCH340というchip搭載のUNOやNANOが存在することが判りました。この場合、arduino-nightlyにはドライバが含まれていませんので、自動検索に失敗するようです。自身でCH340のデバイスドライバを検索・ダウンロード・インストールする必要があります。
    4. Arduino IDEを起動して、LabVIEW Interface for Arduinoに搭載されているファームウエアをボードにダウンロードします。

    5. ファイル>>開く を選択して、LabVIEW Interface for Arduinoに用意されている LIFA_Base を開きます。


      ※拡張子.inoはArduino Sketch Fileです。

      LIFA_Base.ino は LabVIEW Interface for Arduino用のファームウエアです。
    6. このファームウエアをコンパイルしてArduinoUno本体にダウンロードします。
      まずツールメニューのボード一覧からターゲットボードを選択します。このリストはarduino-nightlyのArduino IDEが対応しているボード一覧でありLIFAがすべて対応しているかどうかは別問題です。
    7. シリアルポートポートを選択します。

      ※IDE起動時に自動選択している節があります。
    8. 書き込みます。
      下の絵のボタンがスケッチのダウンロードボタンです。


      まずコンパイルし、、続いてダウンロードして完了です。

      半分以上のメモリを費やすようです。18kで収まるようなプログラムで、17種類のExampleは動かすことが出来ます。
      ※ローカルメモリの残量が表示されています。アナログデータの取得時等で考慮が必要になるかもしれません。

予め提供されているExampleは17種類有ります。簡単に紹介します。

  プロジェクト名  
@ IR Project この例はNECの赤外線レシーバーおよび赤外線LEDを使用して、送受信データをコード化します。
赤外線リモコンによる通信確認のプロジェクトになっています。赤外LEDとディテクタが必要です。
2台のArduinoが必要みたいです。PCは1台でも良いと思われます。
家電リモコンのフォーマット情報は、
https://elm-chan.org/docs/ir_format.html
を参照されるとわかりやすいです。これを理解し、赤外LEDを用意すれば、TVリモコンをジャック出来ます。
A Arduino Analog Read Pin Arduinoの上のユーザ選択可能なアナログ入力ピンから電圧を読む例。
Arduinoに装備されたADCの確認です。入力範囲が0-5Vです。Exampleでは外部に可変抵抗器を
用意し、Arduinoに装備された5V/GNDを接続して中間端子をADC端子に入力して電圧モニタする
というものです。
Arduinoの端子は過大電流を与えるとすぐに壊れるという情報があります。抵抗値に注意です。
B Arduino BlinkM BlinkMをコントロールするためにI2Cを使用する例。
BlinkMはI2Cで制御するカラーLEDモジュールです。これを接続してカラーコントロールしましょうという
Exampleです。I2C接続の場合はターゲットデバイスが無いと動作確認出来ません。
C Arduino Continuous Sampling このVIは、単一の入力ピンからのaquireアナログ入力データへのArduinoの上で連続的なaquisitionモードを使用する例を示します。
VIが第1の実行である場合、ユーザはaquisitionのために見本郵送料率を設定することができます。
Arduinoの最大のaquisition速度は5KHZです。
このモードは実行上で回されていますが、他のLIFAコマンドはアナログデータを破壊するでしょう。
1位から他のLIFAコマンド回転連続モードの使用。
アナログ電圧の連続入力Exampleです。
サンプリングレートは最小4msec程度 割り込み処理なので場合によっては20msec掛かっています。
分解能は10bitです。
D Arduino Finite Analog
Sampling
この例は、アナログ入力からのサンプルの有限数を得ます。
バッファリングしてアナログ電圧入力することが出来ます。
この場合のサンプリングレートはMax5kS/sという情報が書かれています。
サンプル数は要注意です。ユーザメモリは1K程度しか余っていないので大きな値をセットすることは
出来ないはずです。
データを読み出すのにそこそこ時間が掛かります。115.2kbpsでは致し方無しです。
E IR Sensor Example 移動を検知するためにIRセンサーを備えたArduinoを使用する例。
移動が見られる場合、および移動が見られることをやめる場合、その例は行為を引き起こします。
ユーザは移動が見られるに違いない秒の数のためにしきい値をセットすることができます、移動行為を引き起こします。
赤外線距離センサのExampleです。
センサを所有していないため確認出来ていません。
F Arduino LCD Event Based テキストが前面パネル上で変わる場合に、コミュニケーションを引き起こすために出来事を使用して、LCDにテキストを書きます。
Display表示のサンプルです。
手元にI2Cのディスプレイがあるのですが、こちらは4bit遣り取りのLCDDisplayが対象
です。このExampleは未確認です。
G Arduino LCD Hello World 4-bit 4ビットのモードを使用して、液晶ディスプレー画面に前面パネル上のテキストを書きます。
こちらもDisplay表示のサンプルです。
このExampleも未確認です。
H Arduino Light Show wavのオーディオ・データに基づいたTri Colored LEDs(あるいはBlinkMの)をコントロールするためにArduinoを使用する例。
RGBLEDを読み込んだWAVファイルの情報で光量を変化させながら実行するというものです。
3色REDはBlinkMを想定はしていませんので、LEDを3つ用意して接続すれば確認は出来ます。
音の強弱で3つのLEDそれぞれの輝度が変わることが確認出来ます。
I Arduino Photocell 光電池の値を読むためにArduinoを使用する例。
PhotoCellをアナログ入力に接続して輝度の変化を読み取るというExampleです。
PhotoCellを所有していないので確認出来ませんが、基本アナログ入力なのでデバイスさえ有れば普通に動くはずですね。
J Arduino RGB LED この例は、RGB LEDをコントロールするためにArduinoのPWMピンを使用します。
LightShowのサンプルとさほど変わりません。
PWM制御出来る端子に3つのLEDを接続してON時間制御で明るさを変えます。
K Arduino Servo 2つのサーボを使用する例
サーボのExampleです。サーボを持っていないので未確認です。1000円も出せば購入できるの
だから近々に確認します。
サーボの入力にPWM出力を与えています。
L Arduino Seven Segment Display 7つのセグメント・ディスプレイをコントロールするためにArduinoのデジタル出力ピンを使用する例。
7セグLEDに対する表示Exampleです。
7セグLEDが手元に無いため未確認です。
M Arduino Stepper Motor 1軸のモータ制御例です。
Pluse/Direction接続のステップモータドライブExampleです。
モータを直接ドライブできないので、間に定電流回路(モータドライバ)が必要です。
パルス出力だけであれば確認出来るのですが、手元にモータはあるもののそれを駆動する
モータドライバボードがありません。DRV8834がほしいのですが、、、
シールドと呼ばれる拡張ボードがあれば使いやすいです。要検討。
N Arduino Thermistor Read サーミスターから温度を読むためにArduinoを使用する例。
ユーザは供給電圧を選択することができます、抵抗、アナログ入力ピンおよびユニット(C、F、K)をペアにしました。
サーミスタによる温度検知のExampleです。
デバイスさえ有れば普通に動くはずです。
O Arduino Thumbstick 親指杖の角度および大きさに基づいた色を生成するために使用されるアナログ親指杖からの入力を捕らえるためにArduinoを使用する例。
これらの色は前面パネルに表示され、RGB LEDに送られます。
(RGB LEDは、容易にBlinkMsと取り替えることができます。)
アナログタイプの2軸ジョイスチック入力のExampleです。
強度を輝度で表しています。
アナログタイプの2軸ジョイスチックは入荷待ちです。
P Arduino Tone スピーカーまたはピエゾのブザー上でなすことができる調子を生成するためにarduinoのデジタル出力ピンを使用する例。
圧電ブザーを鳴らすExampleです。(PWM未対応の)デジタル端子に接続して音を出します。
圧電ブザーを所有していないため未確認です。

提供されている関数は結構な関数が用意されています。

USB接続ですが、FTDIのUSB-RS232C変換チップを介しており、通信速度は基本115200bpsです。USB1.1接続であれば12Mbpsが期待できるのですが。

今回使用したArduinoIDEは『arduino-nightly』です。この中にFTDI社のドライバが用意されているのですが、よく見てみるとSilicon Labs社のCP210x用ドライバも同梱されていました。なんとなくですがSilicon Labs社の方が好きなので、USB-UART部がcp210xのものが存在しないか調査しました。
結果はUNO互換機では無いのですが、Japanino がCP2104搭載と云うことが判りました。ただ、Japaninoリリース当時のArduinoIDE環境にはドライバが搭載されていなかったようです。
ProMiniには元々USB接続するI/Fが用意されていないので、ここにCP2102のボードを接続して使うという紹介は結構見つかりました。なるほど感があります。

関数内に接続方法を指定出来るようになっています。XBEEやBlueTooth接続も可能になっています。※その程度は対応しています。
ボードの種類も予め選択する必要があるようです。UNOはもちろん対応しています。他にMega2560 と  Duemilanove が選択できます。

PINアサイン等決まっている部分があるので、ProMiniだとどうなるのか興味深いところです。

デバイスとしてProMiniでも使える様ですが、ファームウエアの書き換えが必要になるかもしれません。基本Atmega328用のようです。ProminiはAtmega328Pとあり、たぶん使えます。※未確認です。


UNOにはPWM対応のPINが6つ有ります。この6つのpinは同じ仕様ではないようです。

PWM対応pinは3/5/6/9/10/11の6本です。何が違うのかというと基本周波数です。各PINをPWM設定してDUTY50%(127設定)で出力し、LabTOOLの入力してモニタしてみました。

ちゃんと調べれば判ることでしたが、結果から調査し直さないと発見できないかもしれません。また、PWMですが周波数の変更方法が判りません。使い方次第でしょうが、疑似アナログ信号として使うには振幅しか変更できないという問題が出ます。
DCモータの速度制御で有れば250段階の調整が出来るのでOKですね。

setPwmFrequency()を使うと基本周波数の変更が出来るようです。この機能はLIFAには用意されていないようです。
https://playground.arduino.cc/Code/PwmFrequency
の内容からすると、490HzというのはsetPwmFrequency(3, 64);が実行されていて(488≒31250/64)となっているのかと思われます。


クロック出力するにはどうしたらよいのかという疑問が出ました。パルスモータによる位置制御を行う場合、有限要素のパルス出力をしたいです。このとき速度はクロック周波数の設定になるかと思います。LIFAで実現する場合の手ほどきが見当たりません。

調査結果からすると TONE というEXAMPLEがこの回答になるようです。ただ、この機能は1chしか有効ではないようです。DIOpinはたくさんあるので複数指定して実行してみたのですが、エラーにはならないものの、最初のpin設定しか出力出来ません。また、周波数値も下限が31Hz程度、上限が66.7kHzのようです。周波数設定がU16のため上限がこの辺りになっているようです。下限は30Hzにすると期待通りにならないことから31Hz程度としています。

https://garretlab.web.fc2.com/arduino/inside/arduino/Tone.cpp/tone.html


LabVIEW Interface for Arduinoでどこまで出来るのか、突き詰めてゆかないといけません。
一般に提供されているスケッチ(プログラム)をLabVIEW Interface for Arduinoで書き換えることが出来るのか、その辺りも確認する必要があります。

ちょっと勘違いをしていたことが判りました。LabVIEW Interface for Arduinoで提供されているものは、LabVIEW Interface for Arduinoに含まれている事前にBUILDされたフォームウエアをArduinoにダウンロードして、USB-RSドライバを介して、Arduinoと通信するというものです。
LabVIEW Interface for Arduinoで提供されている範囲の機能を使用する範囲であれば、そのままコードを書いて通信しますが、決して作成したプログラムをArduinoにダウンロードして使うと云った代物では無いと云うことです。

また、sparkfunでは『Arduino+LabVIEW Bundle』なる商品も存在した事が判りました。DEV-11225 LabVIEW2010がバンドルされたもので$55 日本では1万円程度だったようです。

『Programming Arduino With LabVIEW』なる書籍も確認しました。



『Arduino Compatible Compiler for LabVIEW』を見つけました。
https://sine.ni.com/nips/cds/view/p/lang/ja/nid/213121

こちらは正しくクロスコンパイラ環境を提供しています。とても興味深いので別途レポートします。


I2Cデバイスも接続可能ですが、UNO R3 にはSDA、SCLの専用端子が用意されています。R2ではSDA(A4) SCL(A5)を割り当てています。
資料を見る限り、400KHzの通信に対応できるとあるのですが、ちょっと処理が追いつかないという書込も見られます。


余談1

UNOには互換機がたくさんあります。パターン丸写しで、価格が5分の1くらいの商品もあります。これら互換品でもLabVIEW Interface for Arduinoで動くのかどうか気になるところです。一つ購入して動かしてみました。

購入したのは Kuman UNO R3ボード です。ケース付きなのでどんなものかと思い購入しました。
で、結果ですが、普通に動くようです。ただし、ボード上のコネクタの半田付けが実に雑です。シールドを付けることが出来ないほど傾いて付けてあります。半田付けは手半田のようですので、ちゃんとジグを使って固定して手半田すればこんなことにはならないと思います。安価な理由は検品NG品だからかもしれません。

余談2

ArduinoUno用のケースには幾つかのパターンがあるようです。

  1. アクリルケースで部品点数6点 M2のねじ(長)・ナット×4 M2のねじ(短)・ナット×4 プラスペース×4
    材質の違いバージョンもあり。 パターン情報を元にレーザーカッターで作るだけなので互換品が多い。
    レーザカッターによる表面焦げのある商品も多い。
    加工精度についてはさほど問題になるようなことはない模様
  2. アクリルケースで6枚多層組み立てモデル プラスチックボルト・ナット×4
    結構安価なモデルもあるので2ndソース品が多いのでしょう
      1. 平板に固定するケースもあります。これが初期のものなのでしょうか?ブレッドボードと一緒に固定するようです。
        これが一番使いやすそうです。


戯言(nonsense)に戻る


免責事項

本ソフトウエアは、あなたに対して何も保証しません。本ソフトウエアの関係者(他の利用者も含む)は、あなたに対して一切責任を負いません。
あなたが、本ソフトウエアを利用(コンパイル後の再利用など全てを含む)する場合は、自己責任で行う必要があります。

本ソフトウエアの著作権はToolsBoxに帰属します。
本ソフトウエアをご利用の結果生じた損害について、ToolsBoxは一切責任を負いません。
ToolsBoxはコンテンツとして提供する全ての文章、画像等について、内容の合法性・正確性・安全性等、において最善の注意をし、作成していますが、保証するものではありません。
ToolsBoxはリンクをしている外部サイトについては、何ら保証しません。
ToolsBoxは事前の予告無く、本ソフトウエアの開発・提供を中止する可能性があります。

商標・登録商標

Microsoft、Windows、WindowsNTは米国Microsoft Corporationの米国およびその他の国における登録商標です。
Windows Vista、Windows XPは、米国Microsoft Corporation.の商品名称です。
LabVIEW、National Instruments、NI、ni.comはNational Instrumentsの登録商標です。
I2Cは、NXP Semiconductors社の登録商標です。
その他の企業名ならびに製品名は、それぞれの会社の商標もしくは登録商標です。
すべての商標および登録商標は、それぞれの所有者に帰属します。