3Dプリンタで基板のようなもの(3DPCB)を作ってみた

基板のようなもの?

下記の記事で紹介していた方法が、前から気になっており、今回はこの方法でオリジナルの基板のようなものを作ってみました。

inajob.github.io

この手法は Developing 3DPCB – 3D Printed Circuit Board with lots of potential. – Johan von Konow で紹介されており、「3DPCB」と呼ばれています。

基板設計

基板の設計は通常のプリント基板と同様にKiCADで行います。

こんな風に論理回路図を書いて・・

f:id:inajob:20211202213528p:plain

基板を書きます。

f:id:inajob:20211202213553p:plain

この時KiCADを「レガシーツールセット」に切り替えて、「配線時の角度を45度単位に制限」のチェックを外して、自由な角度に配線できるようにしておくのがポイントです。

45度に制限しても良いのですが、実際に配線をするときに導線を曲げる必要があり面倒です。なるべく直線で配線します。

f:id:inajob:20211202213743p:plain

3Dプリンタの精度にもよりますが、私は2mmの配線幅としました。

データ作成

基板の片面にのみ配線したので、その面のデータをdxfで出力します。

f:id:inajob:20211202214044p:plain

ドリルデータはいつも通りに出力します。

ドリルデータはそのままだとCADソフトに読み込ませることが出来ないので、下記スクリプトでDXFに変換します。 (元となるソースコードDRL NC file to DXF · GitHub を参考にしています。)

import ezdxf
from sys import argv
import re

if len(argv) < 2:
    print("Need filename")

in_filename = argv[1]
out_filename = in_filename[:-4] + ".dxf"

doc = ezdxf.new(dxfversion="R2010")

doc.layers.add('holes', color=2)
msp = doc.modelspace()

tools = {}
current_tool = None
for line in open(in_filename).readlines():
    line = line.strip()

    match = re.match("^T(\d+)C(.+)$", line)
    if match:
        tool_id = int(match.group(1))
        size = float(match.group(2))
        tools[tool_id] = size
        continue
    match = re.match("^T(\d+)$", line)
    if match:
        current_tool = int(match.group(1))
        continue
    match = re.match("^X(.+)Y(.+)$", line)
    if match:
        x = float(match.group(1))
        y = float(match.group(2))
        size = tools[current_tool]

        print(x/100,y/100,size/2*50*4)
        msp.add_circle((x/100,y/100), radius=size/2*50*4)

print(out_filename)
doc.saveas(out_filename)

3DPCBの作成

OpenSCADを使います。

difference(){
  translate([0,0,-1])
  // 雑に外形線を描く
  linear_extrude(height=3){
    polygon([[0,50],[40,20],[25,20],[50,-20],[30,-20],[15,-20],[10,-40],[0,-40]]);
    mirror([-1,0,0])
      polygon([[0,50],[40,20],[25,20],[50,-20],[30,-20],[15,-20],[10,-40],[0,-40]]);
  }
  // 配線をくりぬく
  linear_extrude(height=3)
    translate([0,40,0]){
      import("out/christmas-B_Cu.dxf");
    }
  
  // ドリル穴をくりぬく
  translate([0,0,-2])
  linear_extrude(height=2-0.3)
  translate([0,40,0]){
    scale([1/4, 1/4, 1/4])
    import("out/christmas.dxf");
  }
  
  // ドリル穴の上部にはんだ付けしやすいように大き目の穴をくりぬく
  translate([0,0,0])
  linear_extrude(height=6)
  translate([0,40,0]){
    scale([1/4, 1/4, 1/4])
    offset(5)
    import("out/christmas.dxf");
  }
}

これでこんな立体が生成できます。

こちらははんだ付け面。

f:id:inajob:20211202214615p:plain

部品配置面はこんな感じ。

f:id:inajob:20211202214647p:plain

ドリル穴部分は裏面には小さな穴をあけつつ、表面にははんだ付けしやすいように、大きな穴をあけています。

dxfデータはドリル穴しかないですがOpenSCADのoffsetを使うことでこの穴を大きくして大きな穴のデータを用意しています。

今回は配線面を下にして、部品実装面を上に3Dプリントしようとしていたので、オーバーハング部分の造形をうまい事やるために、1層だけあえて穴をふさぐようにデータを作っています。

f:id:inajob:20211202215846p:plain

(このテクニックは FDM(FFF)3Dプリンタで印刷する機械部品をモデリングするときの、たくさんの小さな工夫|はるかぜポポポ|note この神記事を参考にしています)

3Dプリント

あとは3Dプリンタが出力するのを待つだけです。

厚さは3mmでそこまで大きくないので、40分ほどで完成しました。

部品取り付け穴は1層分だけふさがっているので、キリで突いて穴を貫通させます。

部品の取り付け

今回の部品はLEDと抵抗です。部品取り付け穴に部品を差し込んで、溝に沿って余った足を折り曲げて配線します。

配線すべき個所には溝があるため、迷うことなく配線できました。これがこの3DPCBを使う利点ですね。

PLAは熱に弱いので、はんだ付けは素早く行います。と言っても普通にはんだ付けしてる分にはそこまで気を遣う必要もなさそうでした。 (PLAが溶けたとき独特の甘い匂いが少し出ます)

そんなこんなでできた基板がこちら!

f:id:inajob:20211203072456p:plain

まとめ

挑戦してみたかった3DPCBを試してみました。

PCBほどではありませんが、ユニバーサル基板に実装するよりは簡単でミスが少ない基板が出来たように思います。

今回は試していないですが、配線面を下にして3Dプリントすることが出来ることもわかったので、部品実装面にも造形できそうです。

参考とした記事には具体的なツールの紹介などは無かったのですが、使い慣れたKiCAD, OpenSCADを組み合わせる事で比較的「職人芸」なしに3DPCBが作れることが分かったのも大きな収穫でした。

リアランスなどはPCBには遠く及びませんが、家にある3Dプリンタでこういうものが作れるのは意外と使えるテクニックのように思いました。