前回、イラストをシルクやレジスト、カッパーを利用して表現する萌基板の作り方についての記事を書きました。
今回は一歩進んで、1色のレジストの萌基板をより簡単に作る方法と2色のレジストを使った萌基板を作る方法について書きたいと思います。 2色のレジストを使った基板の製造方法の解説記事は私の調べた限りではあまり見つからなかったのでお役に立ったら幸いです。
また、こちらの記事はPCBGOGOさんの協賛をいただいております。 こちらのリンクよりアクセスいただけると大変ありがたいです。
目次
萌基板をより手軽に作る方法
絵を描いた後に基板用のレイヤーに分ける際、9割の方は混乱するのではないでしょうか。私も混乱しました。混乱する理由としては下記になると思います。
色を塗る領域と反転したデータが必要なレイヤーがある
レジストの下に配線があり明るく見える色の部分は、そのままレイヤーとして出力しない
頭の中でこことここが重なるからこのレイヤーはここは塗りつぶさないで…と考えて整理しても、いざプレビュー画面で確認すると意図と違う状態になってしまうケースがあります。 これは手動でペイントソフト上でデータを整えているから大変なのです。どの組み合わせでどの色が出るかは決まっているため、プログラムで色を抽出できれば簡単にレイヤーを作ることができます。
1色レジスト用プログラム
pythonで書きました。あらかじめopencvを入れておく必要がありますのでご注意下さい。また、それぞれのレイヤーの色はBGRの順で数値で指定します。また、もう一つコツとしてはペイントソフトで絵を描く際にアンチエイリアス無しで0/1のベタ塗りのペンで描くことです。これにより、指定した以外の色が使われなくなるので正しくデータを作ることができます。
プログラム本体
ChatGPTに相談しながら書いてみました。
クリックで詳細表示
import cv2 #pip install opencv-python import numpy as np def extract_and_save_bgr(input_path, output_path, target_color, target_color2 = None): # 画像の読み込み image = cv2.imread(input_path) # RGB値の変換 target_color = np.array(target_color, dtype=np.uint8) # 特定のRGB値のピクセルを抽出 mask1 = cv2.inRange(image, target_color, target_color) if target_color2 != None: #2色のORのマスク カッパー用 target_color2 = np.array(target_color2, dtype=np.uint8) mask2 = cv2.inRange(image, target_color2, target_color2) result = cv2.bitwise_or(mask1, mask2) else: #1色の場合 result = cv2.bitwise_and(image, image, mask=mask1) # 結果を保存 cv2.imwrite(output_path, result) if __name__ == "__main__": input_path = "karaageall.png" ## レジストの出力 output_path_resist = "output_resist.png" target_bgr_resist = [233, 197, 149] #銀色部(レジストがマスクされていない部分 生基板部分も含める場合は要調整) extract_and_save_bgr(input_path, output_path_resist, target_bgr_resist) ## シルクの出力 output_path_silk = "output_silk.png" target_bgr_silk = [255, 255, 255] #白(シルク印刷) extract_and_save_bgr(input_path, output_path_silk, target_bgr_silk) ## カッパーの出力 output_path_copper = "output_copper.png" target_bgr_temp = [149, 153, 233] #薄ピンク(レジストの下にカッパーがある) extract_and_save_bgr(input_path, output_path_copper, target_bgr_temp, target_bgr_resist)
出力例
こちらの画像で実際にプログラムを回してみると下記の様になります。
レジストマスク
レジストマスクのデータです。こちらはレジストを塗らない部分に色がついています。
シルク
シルクです。こちらは元々プログラムでレイヤーを想定していなかったデータなので 斜めの線は白のBGRが255ではない値が入ってしまっている部分があったので拾いきれていないです。
カッパー
カッパーです。これの抽出を手動でやろうとすると混乱して難しいです。 また、頭のところ等で塗りの境界でRGBの値が変わってしまっているので意図せず色が抜けています。
2色レジスト用プログラム
こちらも考え方自体は一緒です。ただ2色あるのでややこしいです。
プログラム本体
微妙に整理しきれていない部分もありますが 公開せず埋もれるよりは不完全でも公開した方がいいだろうマインドで公開してみます。
クリックで詳細表示
import cv2 #pip install opencv-python import numpy as np def extract_and_save_bgr(input_path, output_path, target_color, target_color2 = None, target_color3 = None, invert_flag = None): # 画像の読み込み image = cv2.imread(input_path) # RGB値の変換 target_color = np.array(target_color, dtype=np.uint8) # 特定のRGB値のピクセルを抽出 mask1 = cv2.inRange(image, target_color, target_color) if target_color2 != None: #2色のORのマスク カッパー用 target_color2 = np.array(target_color2, dtype=np.uint8) mask2 = cv2.inRange(image, target_color2, target_color2) result = cv2.bitwise_or(mask1, mask2) if target_color3 != None: #多色レジスト対応のため追加 target_color3 = np.array(target_color3, dtype=np.uint8) mask3 = cv2.inRange(image, target_color3, target_color3) result = cv2.bitwise_or(result, mask3) else: #1色の場合 result = cv2.bitwise_and(image, image, mask=mask1) if invert_flag == True: #反転する result = cv2.bitwise_not(result) # 結果を保存 cv2.imwrite(output_path, result) if __name__ == "__main__": input_path = "toko.png" ## 赤レジストの出力 output_path_resist = "output_resist_tokor_2.png" target_bgr_resist_silver = [210, 200, 195] #銀色部(レジストがマスクされていない部分 生基板部分も含める場合は要調整) target_bgr_light_red = [110, 115, 197] #薄ピンク(レジストの下にカッパーがある) target_bgr_red = [63, 61, 126] #濃いピンク(カッパー無し赤レジスト) extract_and_save_bgr(input_path, output_path_resist, target_bgr_light_red, target_bgr_red, None, True) # extract_and_save_bgr(input_path, output_path_resist, target_bgr_resist_silver, target_bgr_light_red, target_bgr_red, True) ## 青レジストの出力 output_path_resist = "output_resist_tokob_2.png" target_bgr_light_blue = [216, 157, 134] #薄青(レジストの下にカッパーがある) target_bgr_blue = [142, 90, 70] #濃い青(カッパー無し青レジスト) extract_and_save_bgr(input_path, output_path_resist, target_bgr_light_blue, target_bgr_blue, None, True) ## シルクの出力 output_path_silk = "output_silk_toko_2.png" target_bgr_silk = [255, 255, 255] #白(シルク印刷) extract_and_save_bgr(input_path, output_path_silk, target_bgr_silk) ## カッパーの出力 output_path_copper = "output_copper_toko_2.png" extract_and_save_bgr(input_path, output_path_copper, target_bgr_red, target_bgr_blue,None,True)
出力結果は白色が使う部分です。 こちらの方法の注意点としてスルーホールの穴に対応できないことがあります。 頑張ってランドを絵に反映できれば良いですが、今のところ簡単な良いやり方は思いついていません。 根性で手動で修正するしかないと思います。部品は全て裏面に配置した方が良いです。 今回はpcbgogo様の方で私のミスに何点か気付いていただき、 データ修正いただきました。ありがとうございました。 また、製造用データも特別に共有いただいたので、 プログラムで出力したものと実際に使用された製造用データも並べて表示します。
出力例
こちらが元の画像です。今回はプログラミングでのレイヤー分け前提で アンチエイリアシングごりごりで色もベタ塗りにしています。
赤レジストマスク
赤を塗らないところにマスクをするのでこちらの白い領域をマスクします。 いただいた赤レジストマスクの製造データはこちらになります。穴や外形外の部分以外はおよそ正しくできていそうです。 上の画像と色の付け方が違い少しわかりづらく申し訳ないですが、赤色の部分がマスクです。
青レジストマスク
青を塗らないところにマスクをするのでこちらの白い領域をマスクします。 こちらでカッパーが露出している領域もマスクしています。 下が、いただいた製造用データです。スルーホールの部品がショートしない様に調整いただいています。 これを自力で調整するのは非常に面倒だと思います。
シルク
シルクです。こちらはマスクではないのでそのまま色が付いた白い部分が白くなります。 こちらも色が反転して少しわかりづらいですが、ピンクのところにシルクの白色が載ります。
カッパー
カッパーは白色のところにそのまま載ります。 こちらも本来スルーホールの部分を考慮する必要がありますが この時点ではできていないです。 製造用データで見ると、こちらの水色の部分に金属が載ります。
データの読み込み方
KiCadへのデータの読み込み方も何種類かあるかと思いますが、 今回はイメージコンバータを使ってみました。
イメージコンバータでの読み込み
画像を読み込み、どの基板レイヤーであるかとフットプリントを選択して、クリップボードにエクスポートします。 必要に応じてネガのチェックはつけたり外したりしてください。基本はネガのチェックはそのままでOKと思います。画像はシルクのレイヤーです。
その後、PCBエディタへ移動し、Ctrl+Vをすると形状を貼り付けられます。 本当はこれで終われば楽なのですが、ここから少し面倒です。
フットプリントのレイヤーの設定
例えば今回はシルクのレイヤーを想定して読み込んでいますが、 左のフットプリントの基本プロパティからは表と裏のカッパーしか選べません。
これを手動で変える必要があります。 フットプリントをダブルクリックすると、「フットプリントのプロパティ」が開きます。
その中の右下の「フットプリントを編集」を選択します。
画面が開いたら図形をダブルクリックするとレイヤを選べます。 これで閉図形を一つ一つ正しいレイヤーに設定する必要があります。 面倒です。他に良いやり方があるかもしれませんが、現時点で私は知りません。 前回のInkScapeの変換に比べたこちらの方法のメリットは、思った形状が出やすいことかと思います。 InkScapeでベクターに変換すると思った様に角が出なかったりうまくいかないケースがありました。
2色目のレジストマスクの設定
また、普通の設定では前面のレジストマスクは1層しかありません。 今回の様に2色使いたい場合は、余っているユーザレイヤーに入れておくとよいです。 出力の際にそちらも出力することを忘れない様ご注意ください。 普段だとデータ出力はアドイン一発ですが、今回の様なケースではユーザレイヤーにもチェックを入れて 「ファイル」→「製造用出力」→「ガーバー」で出力する必要があります。
また、完成のイメージ図のpngやjpgの画像も一緒に入れてコメントも添えておいた方が良いです。 かなり2色レジストはデータ作成が難しいので、 おそらく何等か問題があった場合にPCBGOGOさんであればご連絡いただけると思います。 毎回実施いただけるのかはわかりませんが、今回はデータの修正を実施いただけて大変助かりました。
製造費用
やはり気になるのは製造費用ではないでしょうか。 普通の基板であればかなり格安ですが、2色のレジストの基板は通常ラインと別での対応となるため価格は上がります。また、今回かなり細かい図柄だったのも影響しているそうです。
今回10枚で132USDでした。およそ2万円になるかと思います。費用半分位が多色レジスト対応の費用とのことです。 また、100枚まとめて注文すると約200USDとなるとのことで、多く注文すると単価は抑えられる様です。
費用面からもなかなか2色のレジストはハードルが高いですが、ここぞというアイディアがあれば作ってみてはいかがでしょうか。 1色の基板であればこちらと比べてかなり格安で作れるのでおすすめです。 PCBGOGOさんであれば初回登録クーポンもあり25USDまで割引がかかります。
今回の回路
表の絵の話ばかりしていましたが、 今回はリレー以外は表面実装を多用して ソレノイドを動かす基板を作ってみました。
AH1806-Wはフットプリントが同じサイズだったので面倒でそのまま流用したので回路的にはおかしいです。 本当は2SC2412KT146Rを使っていますが、見事にフットプリントの向きを逆にしてしまいました。ものぐさするものではないですね。
基板の品質
届いた基板を見てみました。
細かい集中線の部分までシルク印刷されています。口のところは少し埋まってしまっています。 髪は青色のレジストが使われており、色の違いも表現できました。
裏側です。今回は使った素子をメモで書いてみました。また私のミスでU1は足の向きが逆なので注意です。
動作の様子
動作の様子です。 実は何らか仕上げてソレコンに出そうかと思っていたのですが いまいち期限内にまとめきれず断念しました。
これは某コンテストに間に合わなかったソレノイドでドアをノックする2色レジストの萌基板です
— パスコンパス (@pscmps) February 24, 2024
動画ではCdsをトリガにしていますがマイコンのピンからでも動かせます
※PCBGOGOさんに協賛いただいた基板になります pic.twitter.com/aCnnWvgLda
ペンプロッタの上下とかにすると絵を描いているっぽくなって良いかもしれないですね。
まとめ
2色レジストの基板は調べても情報があまり出ず、結構苦労しましたが PCBGOGOの窓口の方に色々助けていただき無事完成させることができました。 ありがとうございました。
萌基板シリーズの記事の集大成として、次回はUVフルカラー印刷の基板の記事を書きたいと思います。 作り方自体は今までで一番簡単なのではと予想しています。 読んで下さり、ありがとうございました!
追記:部品リスト
部品リストを載せておきます。 部品はRSで買いました。
こちらは初回ロットは向きを間違えたので上下逆に実装する必要があります。 2SC2412KT146R ローム トランジスタ, NPN, 表面実装, 150 mA, 2SC2412KT146R | RS
- 抵抗
TE Connectivity 厚膜チップ抵抗器, 2012サイズ, 0.125W, 1kΩ, ±1% https://jp.rs-online.com/web/p/surface-mount-resistors/2230427?gb=s
Yageo 抵抗器, 10kΩ, 0402 (1005M), 0.0625W AC0402FR-0710KL https://jp.rs-online.com/web/p/surface-mount-resistors/1977966?gb=s
- リレー
3V駆動の方でも使い勝手が良いかもしれません。 Omron シグナルリレー SPDT 5V dc IM G5V-1 DC5 https://jp.rs-online.com/web/p/signal-relays/0369343?gb=s
ローム スイッチングダイオード 表面実装, シングル,エレメント数 1 SC-90A, SOD-323FL, UMD, 2-Pin 1SS355VMTE-17 https://jp.rs-online.com/web/p/switching-diodes/1681456?gb=s
回路は秋月のドライバ内蔵リレーモジュール基板(販売コード 113574)を大変参考にさせていただきました。