CNCルーターによるプリント基板の自作
はじめに
CNCルーターを使ってある程度精密な(0.5mmピッチのICを扱える)プリント基板を作成できるようにしました.使用したCNCルーターはCNC1610という加工範囲が160x100mmの小型のものです.この製品はWoodpecker CNCとも呼ばれ,加工範囲の違いによりCNC2418やCNC3018といったバリエーションがあるようです.CNCフライスやCNC彫刻機とも呼ばれますが,あまり剛性のない構造なのでここではCNCルーターと呼ぶことにします.
プリント基板を自作する方法として昔ケガキ法というものを試してみましたが,コントロール用のPCを捨ててしまったため使えない状態になっていました.また,事前に生基板にレジストを塗布したり,エッチングを行ったり,穴あけを行う場合は位置合わせをする必要があるなど面倒でした.最近ではFusionPCBなどに基板を発注することもありますが,1枚しか必要のない場合やすぐに必要な場合は不便です.最近はAliExpressなどを通じてCNCルーターやプリント基板切削用のVカッターが安く入手できるようになったので,プリント基板作成専用の工作機械を用意することにしました.最初に購入したCNCルーターが不良品だったり,プリント基板作成に必要な精度がなかなか得られず,通販で部品を揃えながらようやく実用化するまでに結局丸一年かかってしまいました.
プリント基板作成の手順
以下にCNCルーターを使ってプリント基板を作成する手順を説明します.
1. KiCadによる基板レイアウトの設計
回路図を作成して基板レイアウトを設計するためにKiCad (Version 5.1.5-3)を使います.
- pcbnewで基板レイアウトを行う.
- 原点にしたい場所(通常基板左下)を"補助軸の原点を配置"で設定しておく.
- 基板外形はEdge.Cutsのレイヤーに描画しておく.
- 表面実装部品を使った片面基板の場合F.Cuレイヤーで配線を行う.
- ガーバーデータを出力する.
- [ファイル]→[プロット]を選択する.
- <出力フォーマット>は"ガーバー"を選択.
- <レイヤ>は"F.Cu"と"Edge.Cuts"を選択.
- <全般オプション>は"基板外形レイヤーのデータを他のレイヤーから除外"と"原点に補助座標を使用"をチェック.
- <ガーバーオプション>はすべて非選択.
- [製造ファイル出力]を押す.xxx-F_Cu.gbrとxxx-Edge_Cuts.gbrというファイルが出力される.
- [ドリルファイルを生成...]を押す.
- 以下を設定する
- ドリルフォーマットを"Excellon"にして,"PTHとNPTHを一つのファイルにマージ"だけをチェックする.
- マップファイルフォーマットを"ガーバー"にする.
- ドリル原点を"補助座標"にする.
- ドリル単位を"mm"にする.
- ゼロの扱いを"小数点フォーマット"にする.
- [ドリルファイルを生成]を押す.xxx.drlファイルが出力される.
2. FlatCAMによるGコードの生成
ガーバーデータからGコードを生成するためにFlatCAM (Version 8.5)を使います.
- 初期設定
- FlatCAMを起動する.
- <Options>タブでUnitsをmmにする.
- 配線切削のGコードを生成する.
- [File]→[Open Gerber...]でxxx-F_Cu.gbrを読み込む(日本語のディレクトリ名は認識されない).
- もしxxx-B_Cu.gbrを読み込んだ場合は反転する必要があるので,[Tool]→[Double-Sided PCB Tool]でAxis LocationをBoxにしてMirror Objectを実行.
- ドリルファイルや外形ファイルも必要があれば反転する.最初に必要なファイルをすべて読み込んで反転させておくのがよい.
- <Project>タブでxxx-F.Cu.gbrを選択して<Selected>タブに移動.
- <Isolation Routing>で<Tool dia>に工具径を入力.0.1mm/30°のVカッターを0.1mmの深さで使う場合は直径は0.154となるが,カッターの振れを考慮して0.18を入力.<Width>は2を入力.<Pass overlap>は0.05を入力.<Width>が多いとパターンの外側を複数回削るのでハンダブリッジしにくいが切削時間が増える.
- <Generate Geometry>ボタンを押す.
- <Project>タブにxxx-F.Cu.gbr_isoができるのでこれを選択して<Selected>タブに移動.
- <Cut Z>(切り込み深さ: mm)を-0.1にする.<Tool Dia>を上で指定したものと同じ値にする.<Feed Rate>(移動速度: mm/min)に100.0を入力.<Spindle speed>(回転数: rpm)に20000を入力.<Travel Z>(工具移動高さ: mm)に1を入力.<Multi depth>はチェックしない.
- <Generate>ボタンを押す.
- <Project>タブにxxx-F.Cu.gbr_iso_cncというファイルができるのでこれを選択して<Selected>タブに移動.
- <Export G-Code>ボタンを押してxxx.ncと出力ファイル名を入力するとG-codeが生成される.
- ドリルのGコードを生成する.
- [File]→[Open Exellon...]でxxx.drlを読み込む.
- <Project>タブでxxx.drlを選択して<Selected>タブに移動.
- <Tools>で開ける穴の番号を選択する.複数選択可能.
- <Cut Z>にドリル深さを指定する.ドリルの先端は山型なので貫通させるため0.5mmほど深くする.1.2mm厚の基板の場合は-1.7を指定する.
- <Travel Z>は1.<Feed rate>は60.0.<Spindle speed>は20000.
- <Generate>ボタンを押す.
- <Project>タブにxxx.drl_cncができるのでこれを選択して<Selected>タブに移動.
- <Export G-Code>ボタンを押すとG-codeが出力される.
- 基板外形のGコードを生成する(ここでは外形を配線同様にVカッターで削る).
- [File]→[Open Gerber...]でxxx-Edge-cuts.gbrを読み込む.
- <Project>タブでxxx-Edge-cuts.gbrを選択して<Selected>タブに移動.
- <Bounding Box>で<Boundary Margin>を0.0にして<Generate Geometry>を押す.
- <Project>タブにxxx-Edge-cuts.gbr_bboxができるのでこれを選択して<Selected>タブに移動.
- 配線切削の場合と同様に切削条件を指定してGコードを生成する.
- 生成されたGコードを配線切削のGコードにマージする場合は,配線切削の最後のM05の手前に基板外形のGコードのG00以降からM05手前までを挿入する.
3. bCNCによる基板の切削
GコードをCNCルーターに送るためにbCNC (Version 0.9.14.306)を使います.
- 基板の固定
- 後述の捨て板に両面テープで生基板を固定する.両面テープは,薄くて強力ではがしやすい日東のNo. 5000NSというものを使っています.
- GRBLへの接続
- FileタブのSerialフレームのOpenボタンを押してGRBLに接続する.
- 加工データ読み込み
- FileタブのOpenメニューボタンからGコードのデータを読み込む.
- 原点の仮設定
- Controlタブの前後左右の矢印ボタンを使い基板のXY方向の原点に移動する.
- 上下の矢印ボタンを使い工具が基板の上1mm程度に来るようにZ方向の移動をする.
- ZYZ=0ボタンを押して原点に設定する.
- Z原点の調整
- プローブ端子を工具と基板に取り付ける.
- ProbeタブのProbeメニューを選ぶ.
- CommonフレームのProbe Feedを10.0,TLOを0.0,Probe CommandをG38.2に設定する.
- ProbeフレームのAutomatic Gotoのチェックをはずし,Posを(0, 0, -2)に設定する.
- ProbeフレームのProbeボタンを押してZプローブを開始する.
- Z=0ボタンを押して原点を更新する.
- Height Mapの設定
- ProbeタブのAutolevelメニューを選ぶ.
- CommonフレームのProbe Feedを10.0,TLOを0.0,Probe CommandをG38.2に設定する.
- Marginsメニューボタンを押してGコードファイルから処理範囲を取得する.
- AutolevelフレームのXとYのNを設定して1~2cm間隔でプローブするようにして,ZのMin/Maxを-2.0/2.0に設定する.
- Scanメニューボタンを押してスキャンを実行する.
- Controlタブで原点に移動する.
- ProbeタブのZeroメニューボタンを押して補正を反映させる.
- プローブ端子を工具と基板から取り外す.
- 加工開始
- ControlタブのStartを押すと加工が始まる.
- ドリルでの穴あけ
- Vカッターを取り外しドリルに交換してZ原点を調整し直す.
- FileタブのOpenメニューボタンからドリルのGコードファイルを読み込む.「Probeが変更されたが保存するか」と聞かれたらNoを押して,「Autolevelが既に存在するが削除するか」と聞かれたらNoを押す.
- ControlタブのStartを押すと加工が始まる.
- 基板の取り外し
- 両面テープで固定していた基板をはずす.ニトムズのテープはがしカッターが便利で,3Dプリンターで印刷物をはずす時にも重宝しています.
- クレンザーで基板を磨く.
CNC1610の改良
プリント基板を精度よく加工できるようにするため,いくつかの改造を行いました.
非常停止ボタンとZ軸プローブ
まず,CNCルーターが予期しない動作をしたときに素早く止めるための非常停止ボタンを取り付けました.コントローラーボードのSTOPという端子に接続します.このボタンはCNCルーターを使う上で必須だと思います.またZ軸プローブも取り付けました.コントローラーボードのJ-A5という端子に取り付けます.これにより工具のZ原点設定を自動で行ったりheight mapを利用できます.なおリミットスイッチは取り付けませんでした.6つのスイッチを付けて配線するのは面倒だったのと,3Dプリンターとは異なり工作物を固定して使うフライス盤では機械の可動範囲であっても工具が移動できるか常に注意しなければならず,また工作物に対する相対位置が重要で絶対位置はあまり必要ないと思ったからです.
スピンドルの芯振れの改善
0.5mmピッチのICを扱うには,0.2mm以下の幅の線を安定して削れる必要があります.今回プリント基板を作成するにあたって一番問題になったのはスピンドルの芯振れの問題でした.購入したばかりの状態でVカッターを使ってできるだけ細い線を切削しようとしても,スピンドルの振れが大きく太い線になってしまいました.そこで以下4つのチャックを試してみました.
- ER11コレットチャック
購入したCNC1610に付属していたものです.コレットチャック自体の振れは0.01mm未満だったのですが,取り付けたエンドミルの振れは0.1mmを超えました.特に手持ちのVカッターはシャンクが短く奥まで挿入できないのですが,その場合さらに振れが大きくなりました.Web上ではER11でも問題ないような情報もあるため,たまたま自分のコレットがハズレだった可能性もあります.コレットとナットを取り付けていない状態でスピンドルを回しても静かですが,それらを取り付けると振動と騒音がひどくなります.
- ER8コレットチャック
上述の通り手持ちの工具のシャンクが短いため,ER11よりも小型のER8コレットチャックを入手しました.モーターへの取り付けはかなりきつかったのでガスバーナーで熱して行いました.芯振れはER11よりもひどく,コレットチャック自体が0.05mmほど振れていて,取り付けた工具の振れは0.1mmを超えました.モーターも同時に交換したのでモーター側にも問題があるかもしれません.
- 小型チャック
プロクソンのミニルーターなどに使われているのと似たタイプのコレットチャックです.コレットチャック自体の振れは0.01mm程度でしたが,取り付けたエンドミルの振れは0.05~0.3mm程度と取り付け位置によって大きな差がありました.
- 真鍮製ジョイント
一部のCNCルーターにはER11の代わりに付属するようですが,別途購入してみました.モーター側の5mmの穴は問題なかったのですが,工具側の3.175mmの穴が工具を入れても明らかに穴が大きすぎたので,振れの測定は行いませんでした.
結局最終的にプロクソンのMM50というミニルーターをスピンドルに使うことにしました.このルーターは12V/20Wで回転数は20,000rpmであり,元からついていた24V/10,000rpmの775モーターよりもトルクは低そうですがプリント基板の作成には問題ないと思います.2.35mmと3.0mmのコレットが付属しますが,3.2mmのコレットが別売りされています.回転数を調整するツマミがついていますが,これは脈流を与えた場合だけ使うことができて,安定化された12Vを与えた場合は常に最大回転数で動作します.回転数制御用の回路や電源ケーブルが邪魔なので取り外そうかとも思いましたが,分解することで軸の精度が悪化する恐れがあるのでとりあえずそのまま使っています.
このルーターを固定するための部品を3Dプリンターで作りました(STLファイル).ThingiverseにあったMICROMOT 50用の部品が使えるかと思ったのですが,サイズが合いませんでした.Made in Japanと書かれているので,型番は似ているけれど海外版の製品とは異なるのかもしれません.装着したエンドミルの振れを測定したところ0.02mmでした.簡単な構造のコレットなのでこれが限界かもしれませんが,今回の目的に対して許容範囲だと思います.
捨て板の平面出し
CNCルーターのアルミ製テーブルは完全な平面ではなく歪みがあり,またドリルで基板に穴開けすることもあるので,100x150x6mmのPOM板を両面テープでテーブルに固定してエンドミルで平面出しをしました.当初は平面出しをすればheight mapは不要かと思っていましたが切削深さが安定しませんでした.そもそも両面テープ自体の厚さが0.17mmほどあり,基板の固定により歪みも起こるので,0.1mmの深さで銅箔を削るにはheight mapは不可欠でした.
Gコード送信装置
CNC1610はGRBLというGコード解釈用のコントローラーが使われていますが,GRBLにGコードを送るための装置が必要になります.購入したCNC1610にはオフラインコントローラが付属していて,電源を入れるとすぐに使えて便利だったのですが,height mapに対応していないため使うのをあきらめました.
オフラインコントローラーの代わりに,Raspberry Pi Zero WにbCNCをインストールして使うことにしました.480x320の3.5インチLCDを取り付けてタッチスクリーンで操作できるようにします.オフラインコントローラー用の8ピンボックスヘッダにシリアル入出力信号が来ていて5Vも供給されるため,CH340E搭載のシリアル変換モジュールをRaspberry PiのUSB OTGに接続してGRBLコントローラーと通信するようにしました.Raspberry PiのGPIO端子にもシリアル入出力端子がありますが,3.3Vロジックなので電圧の変換が必要になるのと,Bluetoothを使えるようにしたかったのでシリアル変換モジュールを使いました.Sambaでファイルを転送できるようにして,VNCでリモート操作できるようにしました.3.5インチLCDでも必要な情報が表示できるようにbCNCを改造して使っています.
騒音低減
3Dプリンターで使用したものと同じ振動ダンパーを取り付けたところ,騒音の防止にかなり効果がありました.
スピンドル回転数の制御
このタイプのCNCルーターは,搭載しているコントローラによってスピンドル回転数の制御ができたりできなかったりするようです.自分の購入したCNC1610は,S10にすると回転数は落ちるものの,S300以上からS1000まで回転数がほとんど変わらないという中途半端な動作をしました.回転数をGコードで制御できた方が便利だと思い,以下のように改造しました.しかしながら,現状では回転数は常に最高速度で使っているのでこの改造は不要だったかもしれません.
コントローラーの基板を見たところスピンドル用モーター周辺の回路図は下記のようになっていました.これで回転数の制御がおかしい原因が分かりました.モーター制御用のMOSFETであるIRF540はIS181というフォトカプラで駆動しています.PWM信号を与えた場合,フォトカプラがオフになってもMOSFETのゲートの電荷は10kΩの抵抗を通して徐々に減少するので,MOSFETがオフになるのに時間がかかってしまいます.そこでフォトカプラをプッシュプル出力のTLP152に交換しました.またIFT540のゲート電圧は最大20Vなので,コントローラー基板内部で生成している12Vを使うようにしました(24Vをかけて一度MOSFETを燃やしてしまいました).Gコードでスピンドルの回転数を直接指定できるようにするには,GRBLの$30と$31というパラメータに回転数の最大値と最小値を設定する必要があります.購入時のコントローラーのファームウェアはGRBL 0.9でこれらのパラメータには未対応だったので,GRBL 1.1hにアップデートしました.これでスピンドル回転数を連続的に変化できるようになりました.
2020-11-24 ページ作成
T. Nakagawa