こんにちは、いまかみです。
前の更新でCNCフライスの精度を自動測定するネタを書きましたが、それに関連して以前から試そうとしていたネタをやってみました。
一次元で連続して測定できるなら、XYで走査すれば3次元スキャナになるんじゃないかという目論見です。
テストにはNT京都で頒布された基板コースターを使いました。うまくいけば基板の配線部やシルク印刷のわずかな凹凸が見られるはずです。
Arduino側のスケッチは前回から変更せず、そのまま使いました。
LinuxCNCで実行するGコードのマクロにはY軸用のループを追加しました。
#1=0 (xpos) #2=0.1 (xstep) #3=0 (ypos) #4=0.1 (ystep) O200 do G0 X-0.5 O201 do G0 X#1 G0 Z-1.0 M3S100 G4 P0.5 M5 G0 Z0 #1=[#1+#2] O201 while[#1 le 4.5] #1=0 G0 Y#3 #3=[#3+#4] O200 while[#3 le 7.5] M2 %
実際に測定します。1ポイントに約1.5秒かかるので、0.1mmごとに45mmx75mmをスキャンした今回の場合は1時間半かかりました。
コンマ区切りの一行のデータを、OpenSCADで読んでくれるスペース区切り・一列で改行する形式に整形するコードをPythonで適当に書きます。
import sys import os write = sys.stdout.write xwidth = 46 def main(): input_file = open(sys.argv[1],'r') path = os.path.split(sys.argv[1])[0] basename = os.path.split(sys.argv[1])[1] output_file_name = 'out_'+basename output_file = open(os.path.join(path,output_file_name),'w') output = [] output_stl = '' for line in input_file: for token in line.split(','): output.append(str((int(token)-500.0)/1000)) for out_token in enumerate(output): output_stl += out_token[1] if (out_token[0]+1) % xwidth == 0: output_stl += '\n' else: output_stl += ' ' print len(output) output_file.write(output_stl) if __name__ == '__main__': main()
整形したデータをOpenSCADに流し込みます。このCADには点列データをポリゴンメッシュにしてくれるステキ機能があるのです。
そこからSTLでエクスポートすれば、他のソフトでも読めます。
見やすいようにZ軸を10倍してみました。
コースター中央あたりのEnter~の文字と配線が確認できます。Z軸の繰り返し精度が心配でしたが、結果を見るとそんなに悪くなさそうです。
・測定に時間がかかる
・プローブの先端が当たるように凹凸の穏やかな面でなければいけない
と制限はありますが何かに使えそう?
比較的安価に入手できる信号出力付きのデジマチックインジケーターを利用するのは面白い。自分は圧電スイッチを使ってCNCのZ位置を読んでいますが、下げる時のスピードを速くすることが出来ず恐る恐る下げる動作なので測定にかなり時間が掛かっています。その点、これは下げ速度を比較的高く取れる(測定物が硬いものであれば)のが良いですね。
コメントありがとうございます。
Z軸の速度はこの方式のメリットですね。でも立体物だとインジケーターのばねに負けてたわまないように固定する必要があるのが面倒です。
あとこの記事では基板をスキャンしていますが、鉄製の針を使用したのでスキャン後表面に針の跡が若干残りました。針の先端を丸くしたり材質を変えれば軽減できると思われます。