ヘキサ日記 Blog

 

2016年4月8日

3Dスキャナがなんだか欲しい

こんにちはkayanuma.です。

 

3Dスキャナがなんだか欲しい・・

 

そんなSFな、とか思ってたらふと気づけば普及し始めていました。
もう普通に売ってる時代なのか・・
しかし”なんだか欲しい”にかける金額としてはやや高額。
飽きるかもしれないし。
これなんかずいぶんと安いですが、PCのプロセッサがi5以上必須なのでいまだにCore2Quad派の自分にはどうも使えないようです。

 

モノづくりにこだわるなら
ATLAS 3D Scanner

B20160408_10
Ciclop 3D Scanner

B20160408_11
こういったDIYやキットで行くという手もあって
キットは2~3万前後だったりしてそれなりにお手軽に試せるのですが、

 

ネットを徘徊しているうちに<1000円で立体スキャナ作ってみた>

 


を見つけてしまったのでこれは試してみなければいけません(使命感)

 

というわけで
今回は<今江科学>さんの<Tri-Coder>を試してみました。

 

サイトを読むとわかりますが10年以上前から公開されているもので(すごい)
白熱電球を利用した光源とかWindows95対応なんかが時代を感じさせる気がします。
(なお自分の環境ではWindows10でもXP互換モードで動作可能でした)

 

Tri-Coder自体はソフトウエアなので、撮影装置などは自分で用意しなければなりませんが
デジカメやWebカメラが使えそうなので概ね家にあるもので何とかなりそうです。

 

しかしちょっと面倒なのが撮影台で、被写体を一回転させて200枚の写真を取り込むのですがワンステップずつ1.8度正確に回転させる仕組みが必要で
マニュアルによるとギアを組み合わせて1.8度ずつ動く回転台を作るか、目盛りを印刷してちょっとづつ動かす・・

とあるのですがどちらも自信ない。。なので家にあるものが利用できないかと見回すと

10年ぐらい前に買って文鎮として活躍していた
ステッピングモーター

B20160408_08

そういえばこれがワンステップ1.8度だったはず・・。

 

ステッピングモーターとはパルスを与えると決められた角度だけ動くモーターの一種です。
コンピューターと相性が良くてロボットなんかにもよく使われています。

 

ああこれが使えるね。手動のスイッチでワンステップずつ動かそうかな・・と漠然と考えていたら良いものを見つけました。

USB-IO2.0>http://km2net.com/usb-io2.0/
パソコンから手軽に外部機器を制御できるUSB機器。

 

ほほう。もしかしてこれをモーターに繋いでWebカメラと連携すれば自動で・・。でもライブラリがVisualBasicでプログラム作るの面倒だな・・。

するとまた良い情報が。
UWSCで汎用USB-IO2.0を利用する方法
UWSCとはWindowsでマクロを使えるようにするプログラムで、
アプリケーションの操作を記録するマクロ機能に加えスクリプトで細かな制御もおこなえ、
さらにVBのDLLも利用できるという優れものです。

 

・・というわけで急遽USB-IO2を取り寄せ、モーターの駆動回路をつなげて組んでみました。
追試する人もあまりいないと思いますが一応回路図とサンプルスクリプトを書いときます。
ちなみに購入したのは秋月電子通商版のUSB-IO2.0(AKI)です。

B20160408_00
B20160408_09
こだわりのフリーハンド

(DLLの初期化方法などは上のサイトに説明がありましたので割愛)

現在見られないようですので一番最後に掲載

for i=1 to 200
	Step()
next
//ステッピングモーターの駆動
procedure Step
	DIM ptn[4]=$8,$4,$2,$1
	public cnt=0
	uio2_out(1,ptn[cnt],0,0,0,0,0,0)
	sleep(0.02)
	uio2_out(1,0,0,0,0,0,0,0)
	sleep(0.02)
	cnt=(cnt+1) and $03
fend

ああ、うまい具合に動きました。

これにWebカメラで写真を撮るマクロを使い自動取り込みのルーチンを挟みます。
この部分は各自変わってくるかと思いますので注意してください

//MyCamera のマクロ
procedure Cam
	sleep(1.5)
	id = GETID("MyCamera", "#32770", -1)
	sleep(0.5)
	clkitem(id, "スナップ", CLK_BTN)
	sleep(0.5)
	clkitem(id, "OK", CLK_BTN)
fend

こんな感じでモーター駆動の前に呼び出します。

for i=1 to 200
	print "("+200+"/"+i+")"
	Cam()
	Step()
next

ウエイト時間が多めなのは撮影台が動いた後に被写体の揺れが収まるのを待っています。

 

上の例では画像取り込みとして<MyCamera>というフリーソフト(vector)
を利用しました。

 

これで自動的に写真取り込み→1.8度回転、を200回繰り返すシステムが出来ました。やった。

 

光源はマニュアルでは白熱電球をスリットで遮って筋状の光線を作るのですが
ラインレーザーのモジュールを持っていたのでこれを使いました。

B20160408_01

システム全景
B20160408_02

一般的な黒猫のぬいぐるみ
B20160408_04
これをスキャンしてVRMLで吐き出し3D-COATで取り込みました。
データの取り込みに3D-COATが直に使えることもわかったのでリトポロジして綺麗なポリゴンデータに整形するフローに期待が持てそうです。
しかしVRMLとか懐かしすぎるフォーマット・・

 

あれ?取り込めているようないないような
B20160408_05

 

次は一般的な人形
取り込み風景

B20160408_03

レーザー光が強すぎて乱反射してしまうのでサングラスで光量を抑えてます(ひどい)
むむ縦長!

B20160408_06 B20160408_07

どうもキャリブレーションが良くないのか変なスケールになってしまいます。

 

でも良く見ると筋彫りの部分もちゃんと取り込めていて、それなりに表面を捉えてそうです。テスト一発目としては上々ですかね。
しっかりと固定されたセットを作って真面目にキャリブレーションを行えばもっと良くなるはず。

 

あと使用したWebカメラの露出が自動設定しかなく絞りがピョコピョコ動くのでこれもエラーのもとなのでなんとかしなければ。

 

次回、飽きてなければもうちょっと突っ込みたいと思いますがはたして。

 

//メッセージウインドウ等
const PHOTOLOOP=200
stopform(1)
logprint(1)

//id=exec("C:\\Program Files (x86)\\MyCamera\\MyCamera.exe")//64bitでは機能しない?


// USB-IO DLLの定義
DEF_DLL uio_find():int:vbausbio.dll
DEF_DLL uio2_out({byte,byte,byte,byte,byte,byte,byte,byte}):int:vbausbio.dll
DEF_DLL uio2_inp({byte,byte,byte,byte,byte,byte,byte,byte}):int:vbausbio.dll
DEF_DLL uio_out({byte,byte,byte}):int:vbausbio.dll
DEF_DLL uio_inp({byte,byte,byte}):int:vbausbio.dll
DEF_DLL uio_free():int:vbausbio.dll
DEF_DLL uio_getDevs():int:vbausbio.dll

OpenD = uio_find()

if OpenD=0 then
	PRINT "USB-IO 初期化"
else
	print "USB-IO がありません"
	sleep(1)
	logprint(0)
	stopform(0)
	exitexit
endif
print "デバイス"+uio_getDevs()


for i=1 to PHOTOLOOP
	print "("+PHOTOLOOP+"/"+i+")"

	Cam()
	Step()
next

//USB-IOの終了
uio_free()

logprint(0)
stopform(0)
exitexit


//ステッピングモーターの駆動
procedure Step
	DIM ptn[4]=$8,$4,$2,$1
	public cnt=0
	uio2_out(1,ptn[cnt],0,0,0,0,0,0)
	sleep(0.02)
	uio2_out(1,0,0,0,0,0,0,0)
	sleep(0.02)
	cnt=(cnt+1) and $03
fend


//MyCamera のマクロ
procedure Cam
	sleep(1.5)
	//uio2_out(1,$80,0,0,0,0,0,0)	//Pin7にLEDインジケータを付ける場合
	id = GETID("MyCamera", "#32770", -1)
	sleep(0.5)
	//uio2_out(1,0,0,0,0,0,0,0)
	clkitem(id, "スナップ", CLK_BTN)
	sleep(0.5)
	clkitem(id, "OK", CLK_BTN)
fend


ヘキサブログ ピックアップ



過去の日記はこちら

2017年5月
« 4月    
1234567
891011121314
15161718192021
22232425262728
293031