CNCフライスに掃除機を接続する(補足)

以下の記事を補足です.ソフトウェア編
sosoru.hatenablog.jp

概要

掃除機をリモコンで操作するために,赤外線信号パターンを市販のリモコンキットで模倣した.
元々,掃除機自体がリモコンでオンオフ出来るようになっていたが,送信機が破損していた.特殊な操作をすれば,送信機から赤外線パターンを読み取れるので,市販のいわゆる学習型のリモコンキットに覚えさせて,操作できるようにした.この際,送信機のパターン発生や,リモコン周りのソフトウェアでトラブルが生じたのでメモっておく.

今回使用したファームウェアについて,ソースコードgithubで変更点を公開している.有志で変更版を公開している人がいるから問題ないはず.
GitHub - sosoru/RemoconServant_sosoru: BTO社赤外線リモコンキットのファームウェア 改変版

送信機の故障

2つに割れたリモコンは片面一層で修復は容易であったが,結局,ICの破損によって常用できる状態ではなかった.
破損といっても,リモコンの送信スイッチの検出端子(スイッチを押すと端子にパルスが入力される)と,ICの赤外線送信パルス出力端子を指の静電容量でカップリングすることで,正常な送信パルスを生成できる.
f:id:sosoru_m:20170324190156j:plain:w400
なぜ,このような操作が正常動作のトリガーになっているか不明だが,正常な送信パルスが得られるので,赤外線リモコンキットに覚えさせればリモコン機能を模倣できる.

赤外線リモコンキット

PICベースで書かれていて,ユーザーがプログラム書き込み機無しでファームウェアを書き換えられる赤外線リモコンキットがBTO社から販売されている.
PICの空きピンも十分にあり,筐体が別売りなので加工もしやすいので,今回の用途にとてもフィットしているので採用.
欠点はプログラムメモリの空きがそのままでは非常に少ないことと,ソースコード自体が1ファイルで2000行を超えており,様態をつかみにくいことである(microchipの元々長いサンプルコードをベースにしたもので,コメントも割と豊富ではある.)

リモコンパターンのエンドトレーラーパルス

リモコンキットを使用し,掃除機のパターンを学習させたが,掃除機側でパターンを正常に認識できない.オシロスコープでオリジナルのパターンと学習したパターンを比較したところ,トレーラーの後ろの約8msecのところにヒゲパルスがある.(長さ1Tに相当).このパルスは家電協会の規格には乗っ取っていない.幸い赤外線リモコンキットはPICのソースコードが公開されているので修正可能.
ソースコードを修正し,エンドトレーラーパルスの後,8msec後に1TのONパルスを立てることで,この問題は解消された.
f:id:sosoru_m:20170324190555j:plain:w500
↑矢印部が問題のパルス

赤外線リモコンキットにオリジナルリモコンのスイッチ機能を追加する

元々のリモコンはスイッチの押下を検出できるが,赤外線リモコンキットにはそのような機能はない.しかし,ソースコードが公開されており,PICベースのプログラムを書き換え可能なので,ユーザーで実装できる.幸い,空きピンもあるのでハード的な実装コストは低く,容易に組み立てられた.
ただし,ソフト側はいくつか苦労を強いられる点があった.

  • IDEのバージョン

上にも記載したが,最新のIDEはMPLABXらしくMPLABではない(?)赤外線リモコンキットのソースコードコンパイルする場合,コード上の#pragma系命令が古く,最新のコンパイラでは通らない.ソースコードにはIDE設定ファイルが含まれているので,バージョンが一致するコンパイラを使用する.

  • メモリ不足

プログラムメモリ,RAM,ともに割り当て領域を変更しないと新しい実装を入れられなかった.特にRAM割り当て領域の空きはゼロに等しく,1byteのグローバル変数を定義するだけでリンカスクリプトが通らない.今回の場合,赤外線送信機能のみ必要なので,受信機能は削除し,コンパイルを通した.

  • プログラムメモリに書き込む定数の処理

定数にromをつけておけばプログラムメモリ上にデータが配置される.この定数を使用するとき型不一致との警告が出る場合がある.
一見,許容できそうにも思えるが,この警告が出た場合,その定数は使用できていないと考えた方がよく,注意深く検証するべき.

箱について

文字がかすれているのは切削ミス.表記は掃除機の元々の表記を引用しており,「じゅうたん」と「ゆか・たたみ」は中と弱設定に対応する(ファジー制御している?).
赤いボタンを押すと掃除機が動作し,黒いボタンを押すと停止する.側面には故障した送信機からレンズを流用しており,信号を拡散してくれている.
電源はNCフライス制御用のPCからUSB給電している.PCが起動していないとリモコンを使用できないが,切削時のみ使用するので問題ない.
リモコンキットはUSBで給電とデータ転送を兼ねているので,LinuxCNCからUSB側にコマンドを送れば,切削開始時と終了時に掃除機がオンオフするよう連携できる.(自動で切ってくれる機能はあってもいいかもしれないが,今のところ,連携する必要はあまり感じない.)

f:id:sosoru_m:20170225235814j:plain:w200

参考

赤外線リモコンキットについて
株式会社 ビット・トレード・ワン | USB接続 赤外線リモコンキット
Assembly Desk - USB接続 赤外線リモコン

赤外線リモコンパターンのフォーマットについては以下が詳しい
赤外線リモコンの通信フォーマット

pgmからromに落とす方法は以下を参照した
まいまいこん: PIC C18 メモ( Warning 2066 )

CNCフライスに掃除機を接続する

経緯

NCフライスで木材を加工する際,大量の粉じんが舞い,ワークのみならず工作機械全体に木くずが付着する.工作後に,掃除機で吸い取れば問題ないが,現在,コンセント分岐のタップを工作空間内に設置しており,粉じんが舞うのは爆発を引き起こしそうでちょっと怖い.
現在構成で切削液を用いた加工はできるが,木材の加工には使用できない.幸い,壊れかけた掃除機があるので,これを流用して工作中に粉じんを吸い取れるようにする
f:id:sosoru_m:20170225230239j:plain:w300

補足情報

リモコンのソフトウェア等について
sosoru.hatenablog.jp

配管図

f:id:sosoru_m:20170225230945p:plain:w400

材料等

ほとんどはミスミで購入可能だった.購入履歴が消える前に,備忘録として記入する.

- 掃除機型番 日立 CV-W65
- リモコン用アルミ箱 タカチMB-3(高さ60mm 幅90mm 奥行き125mm 板厚1mm)
- ホース1 十川産業 SP-19-3(呼び内径:19mm 外径:26mm )
- ホース2 掃除機付属ホース流用
- T字バルブ 東洋バルヴ RB-3N-32A (3方向分岐 径:1 1/4B(32A))
- ホース用継ぎ手 リガルジョイント TH19-3/4-B-N(ホース内径:19mm 接続ネジ:3/4B)
- ねじ径変換用継ぎ手1 ミスミ SGPPB610 (1 1/4B → 3/4B)
- ねじ・配管変換用継ぎ手2 アロン化成 TS-VS-30 (ねじ 1 1/4B → 配管外径38mm) 
- ニトムズ ホーステープ(継ぎ手とホース接着用.スーパーに売っていたやつ)
- 赤外線リモコンキット BitTradeOne USB接続 赤外線リモコンキット
- 長めのタイ,ネジで止められるタイ(ホームセンターで売っていた汎用品)
- 両面テープがついたアルミの配線固定具(汎用品)

その他:
- エアフィルター エスコ EA997PE-6 (掃除機の交換用フィルタ)
- クーラントプライナー MSTコーポレーション PL6-1 (クーラントのプライヤー.高いけど,これ無しでは配管接合できなかった)

流れ

1,掃除機のリモコン基板の修繕

基板が真ん中から割れており,修理が必要.片面一層基板だから,配線を修復するだけで復活する予定だったが,IC側が故障しているようで,別途,購入した赤外線リモコンキットで代用した.
f:id:sosoru_m:20170225231819j:plain:w200
▲真ん中から割れてるので配線修復した状態.

2,リモコン設置用の箱の加工.

【表】
文字は主軸回転数20000[mm/min] F100[mm/min] φ0.5mmのボールエンドミルで加工.
ホールは主軸回転数20000[mm/min] F200[mm/min] φ2mmのスクエアエンドミルで加工.
バリ取りは主軸回転数20000[mm/min] F100[mm/min] φ2mmのスクエアエンドミルで加工.(中止)

【側面】
赤外LED設置のためφ5mmの穴を開ける.
f:id:sosoru_m:20170225235855j:plain:w200
▲文字の部分のバリがひどい.浅い加工であっても,ボールエンドミルを一発目で使うのは良くない?

2-1,箱を加工したあと,被加工部にはバリが多く出てくる,これをリューターとオービタルサンダーで取り除く.(ただしこれはちょっと失敗)

f:id:sosoru_m:20170225235814j:plain:w200
▲完成時の状態.文字の部分のバリ取りを行ったが,アルマイト塗装が剥がれたらしく,とても汚い仕上がりになった.

3,掃除機と工作機械を接続

接続のために塩ビ管の継ぎ手を使用する.掃除機側のジャバラホースは外径38mm程度で,呼び径1 1/4とだいたい等しい.
(実は呼び径よりもホースが若干太い.切れ込みを入れてねじ込んだ後,ホーステープで漏れが無いように固定する.)

f:id:sosoru_m:20170226000110j:plain:w200f:id:sosoru_m:20170226000128j:plain:w200
▲バルブ付近の写真.下から来ている透明なホースがNCフライスに繋がっている.(もう一端は手動掃除用ホース)
奥側に掃除機が接続されている.固定はアルミフレーム用ナットのネジとタイで固定.
実はホース用継ぎ手にホースが微妙に繋がっていない.ホース内径が適合していても,吻合しない場合があるらしい.ホースが抜けないようにタイで固定している.

ちなみに,バルブからNCフライスまでは呼び径3/4のホースを使用する.設置計画の関係で30mm以上の管を通したくないためである.
この影響で,ホースとバルブの継ぎ手では1 1/4から3/4に径を変更する必要がある.この用途では,黄銅製のブラケットが存在しないので,亜鉛メッキの鋼鉄製ブラケットを用いた.

3-1,集塵用配管を設置する.

f:id:sosoru_m:20170226000014j:plain:w200f:id:sosoru_m:20170226000032j:plain:w200
▲NCフライス回りにはタイを使って何とか這い回せる.エンドミル付近のホース端はクーラントホースで固定する.実際の所,先端の固定が難しく,ちょっと使いづらいので何とかしたい.

4,動作確認,MDF板の面取り切削でキチンと集塵できているか確認する.

f:id:sosoru_m:20170226000206j:plain:w200f:id:sosoru_m:20170226000224j:plain:w200
▲切削中の様子と切削直後の状態.大きな木片は残っているものの,粉状の切削片は吸い取られており,効果を確認できる.

動作

動作音はNCフライスの切削音よりも体感的にはうるさい.木製のドアを隔てて数m離れた場所でも騒音を聞き取れる.将来的にフライスが置いてある棚に防音扉を設置すれば,騒音が大きく軽減される見込みである.
MDF板の面だしのような,表面薄く削る作業では非常に効果が大きく,大きな木片は吸い込めないものがあったが,粉じん状のゴミは見当たらなかった.
しかし,板を深く切削する場合には効果が低い.エンドミルが板に深く入るため,集塵ホース端を高く設置する都合,効率よい集塵が行えないためで,切削パス周辺に多くの粉じんがたまる.ただ,NCフライスに付着するような粉じんはある程度吸い込めるので,ないよりはマシである.
板上の粉じんは他方のバルブにつないだ手動掃除用ホースで容易に吸い込めるので,併用すれば問題ない.
総合的には,掃除機システム設置の効果は非常に高く,切削作業に欠かすことはできないシステムである.

LinuxCNCでジョイスティック代わりにトラックボールを使う

経緯

我が家のNCフライスは,設置場所が想定以上に狭く,Z軸の調整用ハンドルが天井に当たってしまい,場合によっては接触して異音の原因となることがあった.調整用ハンドルを除去すれば問題は解決するが,エンドミルの位置決めなど,目視での軸移動が必要な際に不便であるのは必至であった.
そこで,Z軸調整の代替を目的としたジョイスティックを導入する.調整用ハンドルと同様に360度回転可能で,左右にひねれば上下し,材料にぶつかれば感触がフィードバックする機構があれば良い.しかし,現実的にはぶつかった感触を知るのは難しいので,前者の2つをサポートしてれば良い.
市販されている機器の中では,Kensington社が販売しているトラックボールのスクロールリング機能が,求めている機構と最も近い.幸い,4000円以下の廉価なモデルでもスクロールリングが備わっており,これをジョイスティックとして利用することにした.
XY軸移動用にトラックボールは役に立ちそうだが,一方の軸だけを動かす用途には向いていないだろう.アバウトな位置設定用として上手く利用したい.

f:id:sosoru_m:20170109201945j:plain:w300
▲Z軸当たってる

使用したモデル

Kensington社のOrbitTrackball with Scroll Ring 72337JP
https://d107iaxg6vni3j.cloudfront.net/mbank38730_560_560.jpg
https://www.kensington.com/ja/jp/4493/72337jp/orbit-scroll-ring-trackball
https://www.amazon.co.jp/gp/product/B004QE4JXA/ref=oh_aui_detailpage_o00_s00?ie=UTF8&psc=1
購入時は3800円程度.トラックボール・スクロールリングの他,ボタンは2つのみ.
普段使いのマウスとしてはちょっとボタンが少なすぎるかも.LinuxCNCが提供しているDebian環境では特に問題も起きずに認識した.

f:id:sosoru_m:20170113233500p:plain:w300
▲LinuxCNCのShow Hal Configurationで見たトラックボールの状態(loadrt後).トラックボールだと各軸の座標が浮動小数ではない?(参考:Shimalith氏のページでのアナログパッドは浮動小数点を返している)

設定したい機能

トラックボール XY軸移動に対応
スクロールリング Z軸移動に対応
左クリック ジョイスティック有効
右クリック ジョイスティック無効

HAL

LinuxCNCではHALと呼ばれる,ちょっとした設定記述用言語が用意されている.これは,ワイヤードロジックっぽい感じで書かねばならず,C言語というよりかはHDL系の言語に近い.
例えば,クリックでスイッチのON/OFFを切り替える場合,if文で現在と過去のマウスボタンの状態を見てスイッチを変えましょう,というわけにはいかず,まずマウスボタンの現在の状態を2入力and素子で受け取り,その出力をnot素子を通してもう一方のand入力に接続することで過去の状態を取得する.ほとんどデジタル電子回路である.

LinuxCNC側の設定

トラックボールを検出するには,まず

$ less /proc/bus/input/devices

にて,デバイスの名前を確認する.これはhalコードでデバイスを指定するときに必要になる.今回のデバイスは「Eagle」が含まれており,これを利用する.
Xがマウスとして認識した場合には回避する必要があるらしいが,当環境では発生しなかったため,設定は割愛する.(参考:Movement for atomic step(s) by mouse scroll wheel?には書いてある)
次に認識したデバイスを一般ユーザーでも扱えるようにするために,udevの設定を変更する.

$ sudo echo '' >> /etc/udev/rules.d/99-rtai.rules
$ sudo echo 'SUBSYSTEM=="input", MODE="0660", GROUP="plugdev"' >> /etc/udev/rules.d/99-rtai.rules

以上の設定が済めば,halrunコマンドの後に動作を確認する.

$ halrun
halrun : loadusr -W hal_input -KRAL Eagle
halrun :

halrunに何も言われなければOK.
MANを読め,みたいなことを言われたら,上のudevの設定が上手く行っていない可能性あり.その場合,rootで実行すれば成功する.

その他の設定のポイントを以下に示す.

  • 各軸の移動とトラックボール・スクロールリングの移動を対応するには,input.0-rel-?-positionとaxis.?.jog-countsを接続すれば良いが,整数型から浮動小数点型に型変換する必要があるため,conv-floats-32を通して接続する必要がある.
  • ジョイスティックの有効無効を左クリックと右クリックに対応させるにはRS型フリップフロップを用いて対応している.また,jog-enableを切り替えるとトラックボールのボタンが効かなくなる恐れがあるため,jog-scaleを変更し,左クリックが押されるとjogscale=0.1,右クリックが押されるとjogscale=0に設定される.
  • 左クリックはbtn-mouse~を使用する.

halコード

# load remote joystick
loadusr -W hal_input -KRAL Eagle

# define components
loadrt conv_float_s32 count=3
loadrt and2 count=2 
loadrt not count=2
loadrt mux2 count=3

# set clock
addf conv-float-s32.0 servo-thread
addf conv-float-s32.1 servo-thread
addf conv-float-s32.2 servo-thread
addf and2.0 servo-thread
addf and2.1 servo-thread
addf not.0 servo-thread
addf not.1 servo-thread
addf mux2.0 servo-thread
addf mux2.1 servo-thread
addf mux2.2 servo-thread

# setting joystick
setp axis.0.jog-vel-mode 0
setp axis.1.jog-vel-mode 0
setp axis.2.jog-vel-mode 0

setp axis.0.jog-enable 1
setp axis.1.jog-enable 1
setp axis.2.jog-enable 1

# connecting as RS-FF; Q --> muxer.sel
net rsff-sb and2.0.in0 <= input.0.btn-mouse-not
net rsff-rb and2.1.in0 <= input.0.btn-right-not
net rsff-nand-s and2.0.out => not.0.in 
net rsff-nand-r and2.1.out => not.1.in 
net rsff-qb not.1.out => and2.0.in1
net rsff-q not.0.out => and2.1.in1 mux2.0.sel mux2.1.sel mux2.2.sel

# set muxer and connects for changing jog-scale
setp mux2.0.in0 0 
setp mux2.0.in1 0.01 
setp mux2.1.in0 0 
setp mux2.1.in1 0.01 
setp mux2.2.in0 0 
setp mux2.2.in1 0.01 

net x-jog-scale mux2.0.out => axis.0.jog-scale 
net y-jog-scale mux2.1.out => axis.1.jog-scale 
net z-jog-scale mux2.2.out => axis.2.jog-scale 

# connecting moving trackballs with positioning axes, through float casting
net x-float conv-float-s32.0.in <= input.0.rel-y-position
net x-s32 conv-float-s32.0.out => axis.0.jog-counts

net y-float conv-float-s32.1.in <= input.0.rel-x-position
net y-s32 conv-float-s32.1.out => axis.1.jog-counts

net z-float conv-float-s32.2.in <= input.0.rel-wheel-position
net z-s32 conv-float-s32.2.out => axis.2.jog-counts
  • 入力信号をnet文で2回以上使用するとエラーが出る.出力が複数にわたる場合(例えばRS-FFのQ端子)には,スペース区切りで複数指定可能.(参考:Basic HAL)
  • 動作確認後,直感的な動作では無かったため,rel-x-positionとrel-y-positionを入れ替えた.
  • RS-FFのR=S=1は禁止だから,同時に押すとどうなるのか気になるが,ソフトが落ちることは無かった.不定な動作になりそうだが.

動作確認

X軸Y軸の対応が直感的では無かったため修正したが,おおむね期待通り動作した,ジョイスティックだとトップスピードで軸移動するっぽいのが少し不安.
Z軸のスクロールリングは,1周で約80ノッチに相当しており,現在は,0.8mm/周で運用している.感覚的な不具合があれば追記したい.
f:id:sosoru_m:20170113234115p:plain:w300
▲適当に動かせば適当に動いてくれる

CNCフライスでHOME位置割り出し用パーツを作る

はじめに

NCフライスは,軸移動の限界位置を知るため,軸の端の部分に光センサー(フォトインタラプタ)が設置されていて,この位置より先には動かせないような安全機構がある.
制御ソフトにもよるが,LinuxCNCでは軸位置の基準であるHOME位置を知るために使われていて,起動時にこのセンサーがちょうど引っかからない場所を自動で見つける手順(Homing)を踏まないと,Gコードを流し込めない.
しかし,我が家のNCフライスは設置場所の都合上,Y軸方向の移動に制限があり,付属しているHOME位置割り出し用のパーツ(フォトインタラプタの遮光板)では,限界位置を割り出せない.
LinuxCNCのHomingは必須であるから,これまでは適当なアルミ定規で光センサーを引っかけて,Y軸のHOME位置を適当に設定していた.
さすがにこのままでは良くないので,今回は,ちゃんとパーツを作ってやって,LinuxCNCが自動でHomingが出来るようにすることが目的である.

f:id:sosoru_m:20170109200737j:plain:w300
▲作成したパーツを設置したところ(銅箔の基板)

f:id:sosoru_m:20170109200657j:plain:w300
▲手に持っているのが付属していたパーツ,裏の基板が今回作成したパーツ

条件

  • スピンドル回転数S 12000rpm
  • 送り速度F 300mm/min
  • 被切削材 厚さ1.6mmの片面生基板(材質:CEM-3)
  • 直径2mmの超硬エンドミルを使用.

コード

OpenSCADのコード.実際のパーツの角の丸めは1mm(長穴は6mm).これはGコード生成の際,VCarveで付加したので,下記コードでは得られない.
(また,長穴については6mm空けるべき所を5mmで開けていたので修正した)

difference(){
    polygon(points=[[0,0],[65,0],[65,40],[45,40],[45,10],[0,10]]);
    translate([50,29,0], center=true) square([10,6]);
}

流れ

付属していたパーツの寸法を測って,足りない長さを加味しつつ,OpenSCADで形を作る.生成したDXFデータをVCarveにインポート.角を丸めてGコードとして出力する.これをLinuxCNCに渡す.
秋月で購入した片面の生基板の両端に,強力な両面テープを張る(厚さ1mm位).面出しを行ったMDF板にこれを固定.切削を行う.
(一番最初はテープで4辺を固定してたけど,全然固定できていなくて失敗した.)

f:id:sosoru_m:20170109202514j:plain:w300
▲秋月の生基板.赤線で囲んだ両端に両面テープを張る

f:id:sosoru_m:20170109202937j:plain:w300
▲削りたて

f:id:sosoru_m:20170109200107j:plain:w300
🔺作成したパーツ,切削時に材料がビビった様な音がしていた.手元のノギスではピッタリ寸法が出ていたので問題ない.

作成したパーツは長穴の寸法が1mm狭かったのでヤスリで削って調整した.調整後,実際に設置してみてHoming動作確認.問題なし.

反省点

  • 材料の固定で妥協しちゃいけない.
  • 長穴の寸法.5mmのネジを入れるのに5mmしか開けていなくて入らない.ひどいミスをした.
  • ビビり音の原因については,材料の固定が甘いというよりも,NCのZ軸が鉄板に接触して,切削時に鉄板自体が震えて異音を生じたと見ている.これについては後日対策を行う.

f:id:sosoru_m:20170109201945j:plain:w300
▲NCフライスのZ軸が上の鉄板に触れている.ちゃんと回転はするものの,回りずらい感触がする.NCフライスの端の部分では,回りずらさは感じられない.

  • 切削作業自体を夜中の3時に行ったので,今回のビビり音は近隣住民の迷惑になったかもしれない.反省.

CNCフライスでMDF板を面だしする

はじめに

NCフライスに用いる被切削材の土台として、MDF板を使用したい。土台として使用する前に、面を削って平坦化する(面だし)。
今回の場合、四隅をクランプで固定+両面テープで固定し、S12000、F800にて切削を行うと上手く面出しを行える。
f:id:sosoru_m:20170106201133j:plain:w300

条件

  • スピンドル回転数S 12000rpm
  • 送り速度F 800mm/min
  • 被切削材 厚さ9mmのMDF板
  • 直径2mmの超硬エンドミルを使用.

板の表面全面を深さ2mm削り取る(本当は0.5mmぐらいで良いはず.切削材が反って失敗したため大きめに削り取っている.)

流れ

今回は,実際に主軸スピンドルを回転させて,実際に切削する様子を見るのが一つの目的である.ある種,定番となっている土台の面出しをさせてみる.
また,前回,NCフライスの動作確認としてボールペンの替え芯を主軸に持たせてプロットを行ったが,土台の歪みにより,プロット時に位置に依存した歪みが生じていた.今回は,厚さ9mmのMDF板を面出しし,これをベースにプロットすることで,低歪みの地図を見たい.

しかし,面出し一つでも上手く切削することができなかった,どうやら,MDF板の固定が甘く,板の中心から離れた場所を削ろうとすると,板が土台から剥がれ凹型に反り,結果として面を削りすぎてしまう.

f:id:sosoru_m:20170106201133j:plain:w300
▲両面テープを5本にしたまま,クランプで4隅を固定した.この方法であれば上手く面出しできる.
ただし,クランプの影響で,板全面は削れない,余白ができる.

試行錯誤する中で送り速度を下げてみたが,あまり影響はなかった.板を固定する方が重要である.
面出しできたので,前回の地図をプロットした.

f:id:sosoru_m:20170106201409j:plain:w300
▲面だし時の木くずの影響か,インクの出ない部分があるが,上手く角が出ている.ペンの軌跡を見る限り,歪みはなさそうだった.

f:id:sosoru_m:20170106201454j:plain:w300
▲確認できる限り,最小のピッチは0.25mm程度だった.寸法通りの間隔で線が引けている.

反省点

木を切削クズが予想よりも厄介で,ちり取りだけでは処理できない.掃除機が必要.アルミ等の金属であれば切削液が使えるので,今回よりも影響が少なそうであるが,木材に水は使えない,結局のところ,集塵機の装備も必要.
面だししても,MDF材は水に弱い.切削液を使用する切削には使えない.値は張るが,厚めのアクリル板等が必要.ケチるならスチレンボード等も使えるかもしれない(耐水性があれば).

CNCフライスで地図を書かせる

はじめに

NCフライスの動作を確認するため、主軸にボールペンの替え芯を持たしてプロットさせた。
紙の土台の反り、ボールペン芯の歪みの問題が発生したものの、
結果として、0.25mmピッチ(目視)でのプロットが可能であることを確認した。

f:id:sosoru_m:20170106201409j:plain:w300

条件

  • 送り速度 F 200 mm/min
  • Z軸送り速度 Fz 200 mm/min

(Z軸送り速度も同じ速度にする。終点まで書き終わらずに引き上がる可能性あり)

  • ボールペンの替え芯を主軸に取り付けるため、3.125mmのコレットを使用して装着。

使用した替え芯はuni JetStream 0.5mm SXR-80-38である.(売り場で定規を当てて測って決めた)そのままでは長すぎたため,半分程度に切断した.

プロットしたファイル

川崎市の地図。下のサイトから拝借
http://www.dtpmap.com/free_9_11.html

dxfファイルをGコードに変換するにはdxf2gcodeを用いた.(途中からVCarveに切り替えたが,大きな変更はない)

流れ

f:id:sosoru_m:20170106223753j:plain:w300
▲最初、百均で買ってきた下敷きをマスキングテープで貼り付け、その上に紙を乗せた状態でプロットしていた。LinuxCNCのサンプルデータは割ときれいに出力できるが、角の多い図形、たとえば地図をプロットさせると、軸の移動時に替え芯が歪み、角が丸まったままプロットされる。このままでは精度のよいプロットはできない。

f:id:sosoru_m:20170106223115p:plain:w300
▲動作確認用として、15cm四方に3mm角を敷き詰めたdxfファイルをプロットさせたところ、プロットする位置によっても図形の歪みが見られる。これは土台として使用している下敷きの反りによるものであった。

下敷きのエッジをテープで固定しただけでは、反りを押さえ込むのは不十分なようなので、両面テープ(再生紙のポピュラーなやつ)で底面とフライス盤とを固定した。また、替え芯を切り詰めて軸の歪みを抑えた。この方法は割とうまくいくようで、図形の歪みが改善されているように見える。

f:id:sosoru_m:20170106202501j:plain:w300
▲地図をプロットしてみても、先ほどよりはだいぶ改善されたが、未だ位置に依存した図形の歪みが見られ、完全ではない。

f:id:sosoru_m:20170106201409j:plain:w300
▲その後、面出しを行ったMDF板を用い、これを土台にしてプロットを行った。(面出しの記事は別記事参照)紙はエッジをテープにて固定する。
一部インクが出ていないが、この方法であれば、きちんと歪みなくプロットされていることがわかる。

結論

土台に関しては、エッジをテープで固定するだけでは不十分で、両面テープを用いても、とても精度のよい結果が得られるとは言えない。これは薄いアクリル板(1mm)の使用が原因だろう。
面出しを行った9mmのMDF板を両面テープ+4隅をクランプで固定した場合に、最も精度よくプロット可能である。

LinuxCNCでCNCフライスを制御する

はじめに

一般的にNCフライスの制御にはMach3が使われることが多い.しかし,複雑な切削を行う場合(=長いGコードを読み込む場合)には,有料のライセンスを購入する必要があり,ソフトの機能に制約がある.
一方で,LinuxCNCと呼ばれるオープンソースなNCフライス制御ソフトも開発されており,こちらには機能制約はない.(機能的にはこちらの方が汎用的らしい?)
購入したNCフライスはMach3を想定して設定されているが,ライセンス代をケチるためにLinuxCNCで頑張ってみることにした.

なお,使用したNCフライスは以下の「黒い奴」である.

item.rakuten.co.jp

黒い奴にはMach3用の設定が提供されているので、これを元にLinuxCNCを設定する

コマンド

↓LinuxCNCの起動(レイテンシ調査もこっち.Sample Configurations->apps->latency.ツリービューを色々弄ると見つけられる.生成した設定ファイルはMy Configurationsに登録されるはず.)

./linuxcnc

↓LinuxCNC設定ファイル生成画面の起動

./stepconf

LinuxCNCのインストール

以下のサイトから落としてくれば良い.リアルタイム性能を引き出すために,Linuxカーネルに細工をする必要があり,細工済みの起動イメージが配布されている.これを用いるのが一番楽だ.
これを書いている人は,ソースからビルドを試みたが,あまりに躓く点が多いので,一度諦めている.

linuxcnc.org

配布されている起動イメージではvncserverが入っていない.また,sshd_configではパスワード認証を許可していないので,ログイン周りで弄らないといけないかもしれない.

起動出来た場合,最初にlinuxcncのレイテンシを調べておく(latency-histogram).レイテンシが数usec以内に収まっていない場合には,対策が必要かもしれない.
レイテンシ軽減の一つの策として,カーネルの起動コマンドにisolcpusを追加し,割り込み用のcpuを定義する方法がある.レイテンシは減るが,実質的にcpu数が一つ減るので処理速度とのトレードオフである.

f:id:sosoru_m:20170106180857j:plain
▲レイテンシの少ない例。isocpusを有効にした場合さらに改善する.

f:id:sosoru_m:20161024215649p:plain
▲レイテンシが多い例.カーネルレベルでのリアルタイム処理の対策を行っていない.

レイテンシはすなわち出力波形のジッターとして出てくるはず.オシロスコープで実際の波形を見たわけではないが,ジッターはレイテンシ以下の数値にはならないと思う.

stepconf

レイテンシが満足できたら,次はNCフライス制御の設定を行う.
パラレルポートのピン位置や,軸の回転ステップ数や範囲についてを設定する.
LinuxCNC 2.7.8ではMach3の設定を読み込めるが,読み込んだ全ての設定が反映されているかはとても怪しい.(ピン位置の設定は反映されていなかった)

Mach3の設定画面を見つつ,stepconfを進めていけば良い.


f:id:sosoru_m:20170106182524p:plain
▲この画面はあまり設定を変更する必要がなかった.Mach3のKernelSpeedとだいたい一致するように Max step rate を設定してやればよい?

f:id:sosoru_m:20170106183023p:plain
▲ピンアサイン設定.ここは悩まされた。
Mach3と対応していない一部の設定項目について説明する.StepやDirection,Home,EStopは省略する.

項目 Mach3での呼称 説明
Spindle PWM Spindle 主軸スピンドルに与えるPWM信号.
Amplifier Enable Enable1 ステッピングモータの通電切り替え?
Spindle On Output #1 スピンドル回転のオン/オフ
Coolant Flood Output #2 クーラントのオン/オフ(任意負荷)

Mach3のLowActiveはstepconfのinvertedと対応する.
また,EmergencySwitchの入力信号が,Mach3と論理が一致しないようなので,注意する.
Mach3を使いこなしていないから,OutputやEnableに関する設定がどのようにソフトの挙動と対応するかは知らない.これは試行錯誤で設定を行った.
ちなみに,二つ先の画面で軸の移動量をテストする機能があるので,ピンアサインに関して一部動作確認できる.

f:id:sosoru_m:20170106184455p:plain
▲これは重要ではない.オプションでおまけのGUIを表示できるよってやつ.スピンドル回転数などを表示するときに用いるらしい.

f:id:sosoru_m:20170106184837p:plain
▲これは重要.軸の移動量を決定する.灰色背景のテキストボックスは「編集可能」,もっとユーザビリティを考えてほしい.Mach3ではmmあたりのステップ数(画像一番下の数値)のみ決定するが,LinuxCNCでは一回転あたりのステップ数を指定する.軸のリードピッチが分からないと変換できないので,調べる必要がある.
右上のボタンで移動量をテストできる.(もちろん,ピンアサインが間違っていたら動かない.)

f:id:sosoru_m:20170106185605p:plain
▲重要だが躓く要素は少ない.PWM RateはMach3でも同様の設定項目はある.画像では最高回転数の時をPWM(=Duty比)1.0と設定している.

これで設定は終了で,あとは設定ファイルを保存するか聞かれるはず.設定をLinuxCNCに読ませて上手く動けば成功.

おわり

以上,是非とも設定で躓き,泥水を啜り,地べたから這い上がりつつも,なんとか動作確認をすませ,時間を浪費してほしい.なお,Mach3を2万円で購入するのであれば,以上の設定はすべて無駄である.