LabVIEWでミニCNCフライスを制御して測定治具にする方法

部品の検査で複数箇所の寸法を測定するときに、3軸ステージにセンサーを載せてセンサーを移動させて測定する場合がよくあります。安価なCNCフライス組み立てキット(送料込みで$220)を見ていると、まさに3軸ステージです。測定をLabVIEWで行うとするとCNCフライスもLabVIEWで制御した方が治具としては効率的に運用できるはずです。

OLYMPUS DIGITAL CAMERA

このCNCフライスはGrblという制御用ファームウェアでG-codeを受けてステッピングモーターのパルスと主軸用PWMを生成しています。そしてGrblはAtmega328pチップを使用するArduinoボードに書き込めるオープンソースのファームウェアなのです。CNCキットを使わない場合でも、パルスモーターを使った計測治具をArduinoとGrblを使ってLabVIEWで制御したら簡単で便利です。

さて、G-codeは3軸から6軸のCNC工作機械に使用される数値制御用プログラム言語です。NISTのG-code標準書「The NIST RS274NGC Interpreter」はありますが、メーカー毎の独自規格が用いられているようです。Grblの開発は「LinuxCNC」を参考に進められているとのことですから、Grblで使用するG-codeについてはGrblの資料とLinuxCNCがレファレンスになります。

G-codeはコマンドとパラメータを行単位で記述して機械の動作を指示します。
例えば、「G1 X30.0 Y10.0 F250」は、250という速度(F250)で、XY座標の(30.0, 10.0)まで直線的に移動(G1)するという指示です。mmやinchなどの単位系の指定や絶対座標あるいは相対座標などの座標系の選択は事前に指示されているものが使われます。

G-codeプログラムは、一連の動作をG-codeで記述したものをテキストファイルで保存します。PCからG-codeプログラムをGrblなどのファームウェアに送るアプリケーションをG-code Senderといいます。Grblで使えるG-code Senderとしては[bCNC]や[Universal G-code Sender]など多くの種類があります。フライスの軌跡表示、ボタンによるマニュアル移動、先読みバッファへの効率的なコマンド発信など機能が充実しています。LabVIEWでG-code Senderを作成する意味合いは、G-codeとGrblを使った簡便で安価な位置制御と計測とを統合することにあります。

生産者・消費者デザインパターンで、UIイベントループ、G-code送信&レスポンス受信ループを作成し、さらに測定ルーチン用にループを追加しました。G-codeではカッコ内はコメントとして受け取られるので、UIイベントループから”(measure)”を送信することで測定用のキューを生成し、測定ループの動作タイミングを作り出しています。

測定のための動作例を紹介します。ワーク座標の原点(0,0,0)に移動し、3秒待機した後、250の速度で(20,20,0)に直線補完で移動します。0.5秒待機し、(Measure)というコメントを受けます。LabVIEWプログラムでは(Measure)をトリガーにして測定を行います。測定に要する3秒待機した後、原点に戻ります。

 

GrblはAtmega328pチップを使用するArduinoボード(Uno, Duemilanove, Nano, Micro, etc)で動作します。ArduinoのSketchではありませんが、ブートローダ領域を残したまま書き込むことができるとのことです。GitHub-gnea/grblからZipファイルをダウンロードしてArduino IDEにライブラリとして追加します。サンプルフォルダにある「grblUpload.ino」を開いて「マイコンボードに書き込む」ボタンを押すと書き込まれてGrblが動き出します。

UNOの場合のピン配置は次のようになっています。
D2/D5:X軸Step Pulse / X軸Direction
D3/D6:Y軸Step Pulse / Y軸Direction
D4/D7:Z軸Step Pulse / Z軸Direction
D8:Stepper Enable/Disable
D9:X軸Limit SW
D10:Y軸Limit SW
D11:主軸PWM
D12:Z軸Limit SW
D13:主軸回転Direction

A0:Reset/Abort (DI Pullup)
A1:Feed hold (DI Pullup)
A2:Cycle Start/Resume (DI Pullup)
A3:Coolant Enable
A4:(NotUsed/Reserved)
A5:Probe

AVRチップの優れた機能を駆使して精密なタイミングと非同期の動作を実現し、30kHzまでジッターなしで制御できているとのことです。

Grblではパルスモーターなどハードウェアに関連するパラメータを$xxx変数としてEEPROM領域に記憶します。実際にX軸のStep Pulse(D2)の出力をオシロスコープで測定してみました。

パルス幅($0): 10μsec
step/mm($100): 250steps/mm
F(Feed Rate): 500mm/min
等速移動の周波数: 2.1kHz

パルス幅($0): 10μsec
step/mm($100): 250steps/mm
F(Feed Rate): 10000mm/min
等速移動の周波数: 41.5kHz

 

lv-G-SenderはLabVIEW2014以降で動作します。ダウンロードはここから。CNCが手元に無くとも、Arduino UNOと2相4線のパルスモーターとPulse/Direction入力のドライバーがあれば楽しむことができるのではないかと思います。

上記内容は10月25日のNIDays2017の会場の片隅で行われるユーザー会で紹介する予定です。

<<コメントはスパムがひどいため受け付けないようにしています。トップ画面の下の方に連絡先のメールアドレスがありますのでご連絡ください。スパムでなければメールは大歓迎です。>>

(2017.10.11)

ACC4LVでMPU-6050を使ってみる

** LabVIEW Advent Calendar 2016 ** 2016年12月3日の記事です。

MPU-6050は加速度3軸とジャイロ3軸を内蔵したI2C接続のセンサーで、GY521というモジュールで安価に入手することができます。私は安いので海外直送のGY521を使っていますが、中国から送料無料で商売になるのが不思議です。

仕様書にはジャイロはフルスケール(±250, ±500, ±1000, あるいは±2000°/sec (dps)) を16ビットADC、加速度はフルスケール(±2g, ±4g, ±8g, あるいは±16g)を16ビットADCで測定し、OUTPUT DATA RATEはジャイロが最大8kHz、加速度が最大1kHzと書かれています。

Arduinoはお気に入りのESP8266WiFiモジュールです。使い勝手が良いESPr Developer(ESP-WROOM-02開発ボード)を使います。Arduinoでの使い方は購入元のページにリンクがあります。LabVIEWでプログラムを書いてコンパイルして書き込む場合でも、初めにArduinoで基本的な動作を確認するのが良いでしょう。Arduinoが初めての場合はArduino UNOからスタートするのが苦労が少ないと思います。中国直送の互換ボードは安いし、(経験上)きちんと動きますが、USBシリアル変換チップがCH340なので、ネットでドライバーを探してくる必要があるかもしれません。

pb280115

ESPr DeveloperとGY521との接続は4本だけです。
3.3V <—> VCC
GND <—> GND
SCL <—> IO5
SDA <—> IO4

Arduinoでの動作確認のためのサンプルプログラムはArduino Plyagroundのものを使いました。LabVIEWへの移植も基本的にはこれに従いました。

LabVIEWでArduinoにプログラムを書くことができるツールが「Arduino™ Compatible Compiler for LabVIEW」です。名前が長いのでACC4LVと縮めて書いています。使える関数が限定されているサブセット版なので多少の工夫が必要です。例えばU16からI16への変換がありません。どうしましょ。

 

Arduinoのサンプルを素直に移植するとこんな感じです。
mpu-8050d

 

14要素のU8配列を7要素のI16に変換します。U8を2個を上位、下位で合わせてU16になるのですが、I16にする必要があります。U16–>I16の変換はACC4LVには無いので、加算で出力をI16にしています。
sub__rawtoi16d

I16を加速度、温度、ジャイロの単位に変換します。
sub__i16tovalued

シリアル出力用の文字列に変換します。
sub__valuetostringd

 

では、では、