06-23-2019 06:45 AM
はじめに
MDuino 57AAR+というArduino Mega2560とリレーなどのIOシールドがPLC風の筐体に収められたIOボックスを購入しました。
スペインのIndustrial Shieldsという会社の製品でRSオンライン、ロボショップなどで扱っていますが、検索してもあまり情報が得られないので参考になればと思い投稿しました。LabVIEWとArduinoを連携させるLINXでも使えますので、工場のレガシーなIOとLabVIEWをつなぐ時のインターフェースに良いかもしれません。
この記事ではMDuino 57AAR+の機能紹介と、Arduino Mega2560でのパルスモーター用のパルス生成とLabVIEWからのパルスモーター動作制御について紹介します。
LINXを使えばArduinoの個別のプログラムを書かなくともArduinoのIOにLabVIEWからアクセスすることができますが、動作速度や機能で不満に感じる場合が多いと思います。そんなときにLabVIEWとArduinoのコマンドインターフェースの簡単な例として参考になるかもしれません。パルス生成にはATmega2560の16bit Timer/Counter4を使用しましたが、他に2個動かしたいモーターがある場合にはTimer/Counter3とTimer/Counter5も同様に使うことができます。
MDuino 57AAR+の機能紹介
Arduino MEGA 2560とIOシールドがDINレールに取り付け可能な筐体に収められ、プッシュインタイプの端子台とスクリュータイプの端子台が用意されています。Arduino MEGA 2560はIOが多数あってワイヤーピンで配線しても大変なので、端子台があるというのはかなり便利です。IOシールドの配線図が公開されていないのは残念です。
MDuinoは端子数と端子の機能によって幾つかのモデルが発売されています。57AAR+は一番端子数が多いモデルです。
MDuinoの筐体はAからDまでのゾーンに分かれています。Aゾーンはすべてのモデルに共通で、12-24V電源入力端子、5V/3.3V出力やUSB端子、イーサネット、RS-485、RS232、I2C、SP、μSD、リアルタイムクロックなどが収められています。
B、C、Dゾーンはアナログシールドかリレーシールドが組み込まれます。
アナログシールドは13入力(13デジタル入力、うち6つはアナログ入力として動作可能)と8つの出力(8つのデジタル出力、そのうちの3つはアナログ出力として動作可能)があります。アナログは0-10Vデジタルは5-24Vです。
リレーシールドは6つの入力(6つのデジタル入力、そのうち4つはアナログ入力として動作可能)と11出力(8リレー出力、3デジタル出力、そのうち3アナログ出力として動作可能)があります。
Dゾーンだけはアナログシールド、リレーシールドともに端子が2個ぐらい少なくなっています。Arduinoのピンは機能が共用されている場合があり、I2CやSPIを使う時には使えなくなる入出力がありますので注意が必要です。
リレーや24Vの入出力が普通の仕事場では便利に使えそうな気がします。(回路図が公開されていないので少し怖いですが、、、。)「M-Duino-PLUS-Family-User-Guide.pdf」というマニュアルがダウンロードできるので検討してください。
Arduino Mega2560でのパルスモーター用のパルス生成とLabVIEWからのパルスモーター動作制御
LabVIEWとMDuinoはシリアル(USB)で通信します。PC上のLabVIEW側から周波数と時間を指定したコマンドを送信して、Arduino Mega2560(MDuino)は16bit Timer/Counter4を使用して固定パルス幅(10μsec)で指定周波数に近いパルス列をD6(Q0.7)から出力します。プリスケーラ機能で16MHzの基本周波数を1/8にして、2MHzを16ビットでカウントします。タイマーカウンターの機能の中で高速PWM(Mode=14)で周期を指定して希望の周波数を作ります。この記事ではシンプルにするために段階的に希望の周波数まで上げていく処理にしました。詳細は添付したプログラムをご覧ください。
LabVIEWでコマンドを送るVIは"M 2000.0 15.5"のように文字列でM(Move) 周波数 時間を送って返信を表示するだけです。
LabVIEWのVIはかなり手を抜いて楽にできます。大変なのは浮動小数点の文字列を受け取るArduinoのプログラムの方ですが、応用範囲が広いのでパターンとして使えるに越したことはないかと思います。これがベストとは思いませんので色々検討してみてください。LINXは便利ですが、Arduinoの能力を十分に発揮させるときにはArduinoと対話した方が良いと思います。
添付ファイル「upLoad190623.zip」には「ControlPulseMotorUpload.ino」と「Serial Write and Read.vi」が圧縮されています。LabVIEWは2014以降、Arduino IDEは1.8.9で動作を確認しました。
MDuinoのコンセプトはすごく良いと思いますが、”パルス出力がダラケすぎて、、”ハードはもう少しなんとかして欲しいと思います。。
Arduino MEGA2560からはキレイに出ているのですが、シールドでひどくなっているように思います。
仕事で使えるようでしたら、ご一報いただけると励みになります。
06-25-2019 06:47 AM
MDuinoの利点として、0-10Vのアナログ出力が使えることを書き忘れていました。Arduino MEGA2560ではPWMなので便利に使える場合があります。
MDuinoの入出力をLINXやArduino IDEで使用する場合に、MDuinoの端子とArduino MEGA2560の端子の対応関係を知る必要がありますが、それはMDuinoライブラリの「pins_arduino.h」に書かれています。動作確認をしながらまとめてみました。
デジタル出力(5-24V)
Q0.0---36pin、Q0.1---37pin、Q0.2---38pin、Q0.3---39pin、Q0.4---40pin、Q0.5---4pin、Q0.6---5pin、Q0.7---6pin
Q1.0---41pin、Q1.1---42pin、Q1.2---43pin、Q1.3---44pin、Q1.4---45pin、Q1.5---8pin、Q1.6---9pin、Q1.7---7pin
Q2.0---12pin、Q2.1---13pin
アナログ出力(0-10V DC) (DIPスイッチで選択)
A0.5---4pin、A0.6---5pin、A0.7---6pin
A1.5---8pin、A1.6---9pin、A1.7---7pin
A2.0---12pin、A2.1---13pin
デジタル入力:アイソレート(10-24V: High/Lowの閾値は5-9V)
I0.0---22pin、I0.1---23pin、I0.2---24pin、I0.3---25pin、I0.4---26pin、I0.5---2pin、I0.6---3pin
I1.0---27pin、I1.1---28pin、I1.2---29pin、I1.3---30pin、I1.4---31pin、I1.5---18pin、I1.6---19pin
I2.0---20pin、I2.1---21pin
デジタル入力(10V: High/Lowの閾値は5.2V前後)
I0.7---54pin、I0.8---55pin、I0.9---56pin、I0.10---57pin、I0.11---58pin、I0.12---59pin
I1.7---60pin、I1.8---61pin、I1.9---62pin、I1.10---63pin、I1.11---64pin、I1.12---65pin
I2.2---66pin、I2.3---67pin、I2.4---68pin、I2.5---69pin
リレー出力
R2.1---33pin、R2.2---32pin、R2.3---35pin、R2.4---34pin、R2.6---49pin、R2.7---48pin、R2.8---69pin
(注)すべてのピンに接続して動作を確認しましたが、I2.0とI2.1は動作が確認できませんでした。
以下の通信関連の動作は確認していません。
I2C:SDA--20pin、SCL--21pin
TTL:RX0--0pin、TX0--1pin、RX1--19pin、TX1--18pin
RS232:RX--17pin、TX--16pin
RS485:Z- --46pin、Y+ --11pin、B- --15pin、A+ --14pin
SPI:SO--50pin、SI--51pin、SCK--52pin
06-30-2019 07:51 AM
前掲の記事で以下のように54pinから69pinが使われています。
<<<<<<<<<<>>>>>>>>>>
デジタル入力(10V: High/Lowの閾値は5.2V前後)
I0.7---54pin、I0.8---55pin、I0.9---56pin、I0.10---57pin、I0.11---58pin、I0.12---59pin
I1.7---60pin、I1.8---61pin、I1.9---62pin、I1.10---63pin、I1.11---64pin、I1.12---65pin
I2.2---66pin、I2.3---67pin、I2.4---68pin、I2.5---69pin
<<<<<<<<<<>>>>>>>>>>
Arduino IDEではdigitalRead(54)やanalogRead(54)のように54というpin番号が使えたので疑問をもたずに記載したのですが、LINXでアナログ電圧を読もうとした時にpin番号の54はエラーで使えませんでした。試しにAI Channelに0を指定すると動作しますので、LINXの場合は54を引いた値、54を0、55を1........69を15と指定するのが良いようです。
簡単そうに見えても、実際に動かしてみないとつまづくことが多いようです。