(以下SolExProメモの後半に書いていた部分を分光器利用に絞ってまとめています)
SolExという「自作できる太陽分光望遠鏡」があって、それを2024年11月頃に作りました。その時に分光器部分は実験室での汎用の自作分光器としても使えそうだと思い、色々と試してみました。以下は分光器としての利用方法について書いてます。SolEx自体についてはSolExProメモをご覧ください。なお正確にはSolとExの間にアポストロフィが入るのですが、このwikiではアポストロフィがあるとエラーになるのでSolExと記載しています。
SolExの分光器は3Dプリンターで印刷できて、入射側コリメートレンズf=80 mm、2400 gr./mmの回折格子、検出側集光レンズf=125 mmの仕様となってます。ただ回折格子やレンズ等は交換可能です。レンズの焦点距離を変えるためには一部改造が必要となります。回折格子は自由に回転できるようになってます(上の写真の左側の丸いところ)。分光器部分だけだと光学系パーツが7万円程度で、それプラス3DPの印刷費用、さらにCMOSカメラが必要です。光学系パーツをAliExpressなどで調達するともっと安くなります。ラマンとして使う場合には、レーザー、対物レンズ、結像レンズ、フィルター類、高感度CMOSカメラなども必要ですので数十万円は必要になります。分光器部分のSolEx Proはキットで販売されています。自分で3Dプリンターで作ることもできますが、その場合はSolEx Ver.2となります。印刷用のファイルがダウンロードできます。作り方等も詳しい説明があります。光学部品もセットで売られてますが、個々のパーツを自分で買って集めることもできます。詳しくはSolEx本家やSolExProメモを見てください。以下は既に完成したSolEx ProまたはSolEx Ver.2があるとして進めます。
そのままでは汎用の分光器としては使いづらいので、まずは光ファイバーで分光器に光を入力できるようにします。スリット部の端(四角い部分)はM42メスネジとなっているので、ソーラボ(米国の光学パーツメーカー)のM42オスネジ–SM1メスネジのアダプタ(SM1A49)を使うと、ソーラボ標準のSM1使用の光学系に組み込むことができます。光ファイバーのコネクタをSM1のパーツ(光ファイバーアダプタ、SM1外ネジ付き)を使って接続すれば光ファイバー入力の分光器としてすぐ使えます(スリットは外しておく)。右の写真はそうやって光ファイバーを接続した状態です(これはSMAタイプ)。これで光ファイバーから導入した光を分光して測定できるようになります。
ただよくあるNA0.22の光ファイバーを使うとして、コリメートレンズ80 mm焦点距離だとファイバーからの光はレンズ位置で35.2 mmまで広がるのですがレンズ直径は25 mmなので実際は半分くらいの光しかレンズを通らないことになります。50 mmくらいの焦点距離レンズを使えばいいのですが、そうすると拡大倍率が2.5倍になるので、それもちょっと困る気がします。まあそちら側のレンズの焦点距離も変えればいいのですが。太陽用には分散方向を縦(CMOSセンサーの短い方向)にしますが、分光器目的では分散方向は横にして横長なセンサーを有効利用します。
ソーラボに組み込むもう1つの方法は後で出てきますが、M42メスネジがついている部分を30 mmケージ用の穴を開けたものを自作して交換することです。これは3Dプリンターで作ってます。こちらでもソーラボの光学系に組み込めます。
SolExは望遠鏡に取り付けて使うことを想定しているため、平らな机の上では単体で安定しません。取り付けるカメラが大きいと机に当たります。私はAzur3dprintでKodak Turntableも購入しました。これはSolEx Proの下部に取り付けて、雲台に載せるためのアダプタです(3Dプリンターで作ることも可能です)。その下にさらに自作プレート1枚を置いて雲台用ネジを使って固定しました。これで机の上でも安定するようになりました。SolEx Ver.2でも同様なプレートをいくつか作ってます。1つは雲台ネジありで、これがあると三脚に固定できます。ソーラボのポストはメトリックだとネジがM4なので、M4ネジをつけておくと固定できますが、M4なのでポスト1本だとちょっと不安定な感じがあります。広めのベースで単に机の上で安定するだけのものも作ってます。
光ファイバー入力にしたSolEx Proを少し使ってみました。右の図は光ファイバー(50ミクロン径)の波長分散されたイメージです。ネオンランプからの光を取り込んでいます。これはPlayer OneのNeptune-CIIで撮ってます。SharpCapという天体撮影用のプログラムを使って撮影しました。範囲的には590 nm付近です。保存ファイル形式は天文分野でよく使うfitsを使いました。この画像を1次元スペクトルに変換するためにpythonでちょっとコードを作りました。fitsファイルを処理する場合にはastropyライブラリーがよく使われるので、astropyを使ってfitsファイルを読み込んで、縦方向にスポットがある辺りを縦に積算して1次元スペクトルに変換してみました。積算にはNumpyを使ってます。1行で(範囲を指定した)積算が処理できるので便利です。得られたスペクトルを下に示してます。左側が長波長側になります。そのままだとギザギザするので少し平滑化してます。これもNumpyの関数を使ってます。バックグラウンド処理なしでそのまま積算しているので、スペクトルのバックグラウンドが非常に大きな値になってます。
532 nmレーザーをルビーに照射して生じた蛍光(R1,R2)を見てみました。ルビー蛍光の2つのピークが690 nm付近に出ます。100ミクロン径光ファイバーを使ってます。ルビー蛍光法による圧力測定用途にも十分使えそうです。別ページで自作のLittrow型分光器について書いてますが、分解能はそれと同じかもっといいかもしれません。焦点距離が短い割に分解能がよくなっている理由は検出器のピクセルの大きさがSolExで使っているCMOSカメラの方がかなり小さいからです(約1/5)。もちろんファイバー径がそれよりは遥かに大きいので、十分分解能を生かしている訳ではありませんが、ルビー蛍光自体の線幅自体が広いのでファイバー径を小さくしても線幅はほぼ変わりません。
比較的安く分光器を入手する方法の1つとしてSolExはいいかもしれせん。もう少しきちんとしたものが欲しい場合は、 OpenRaman や同じ人が作っている 分光器 がいいかもしれません。これらはソーラボのパーツを主に使ってます。このページの最後にPulsar Engineering設計の分光器とほぼ同じものを紹介してます。
ここまで来ると個人的にはSolEx Pro (SolEx Ver.2)でラマンスペクトルが測定できるのかどうかが気になります。簡単な顕微測定光学系を組んでみました(上のルビー蛍光もこれで測定)。これは上記の光ファーバーを使うものです。
上記はSolEx Proを使っていたのですが、そちらは本来の太陽分光望遠鏡に戻して、分光器として使う目的でSolEx Ver.2を自分で印刷して作りました。こちらは太陽には使わない予定なのでPLA+黒をフィラメントに印刷しました。Anker MakeのM5Cで印刷して特に問題は生じませんでした(M42外ネジのあるカメラ側のレンズ筒はネジの具合が悪く、印刷し直しましたが)。印刷後はM4とM3のインサートネジを埋め込む必要があります。
SolEx Proは回折格子のアオリ角を調整しやすくする工夫がされているのですが、Ver.2にはありません。そこで回折格子ホルダーを取り付けるホルダーの底とハンドルの間にカマボコ形の薄い棒を挟んである程度調整できるようにしています。ハンドルを固定する2つのネジの締め加減で角度を調整できます。
私の目的(実験室での分光)ではレンズを80 mmから100 mmに取り替えて、別のスリットやピンホールをSolExの外側で使いますので、SolExに用意されているスリットは使いません。コリメーターボックス外側にソーラボの30 mmケージと接続するアダプタを3DPで印刷しました。SolEx ProとVer.2ではコリメーターボックスの形状が異なるので共用できず、作り直しました。これでソーラボのケージを使った光学系に組み込めます。さらに本体底に15 mm厚のプレートも3DPで印刷して取り付けて、それにカメラネジのインサートナットを埋め込んでソーラボのポストで本体を支えるようにしてます(このためにはM4/カメラネジ変換が必要)。本当は1点だけの支持ではバランスが悪いのですが、ケージで別途繋がっているので、とりあえずはこれでもOKでしょう。光学パーツ(アクロマートレンズ2個と回折格子)はソーラボで買ったものを使ってます。回折格子は観察できる波長領域を広げるために1200 g/mmを使います。ただカメラ側のレンズは焦点距離f=100 mmだとちょっとうまく手持ちのCMOSカメラでフォーカスが合わないことが分かりました。そこでSolEx Proのf=125のレンズと交換しています。SolEx Proの方はf=100でも問題ありません。これは延長筒である程度調整できるためですが、それがVer.2ではできません(その後レンズ筒部分を自作してf=100でも使えるようにしました)。
なお回折格子は6 mm厚のものだと交換可能です。厚さが異なるとホルダー部分をカスタマイズする必要があります。私の持っている回折格子は6 mm厚が多いのですが、9.5 mmのものもありました。9.5 mmはちょっと取り付け難しいと思います。
下の写真は光ファイバーからの光を分光する場合のSolEx Ver.2の構成で、入射部分にファイバーを接続する端子をつけています。前述のようにProで同様のことを行ないました。アダプタでソーラボの30 mmケージが付くようにして、ロッドにケージプレートを固定、ケージプレートにファイバーコネクタを固定してます。ケージプレートは移動できるので、0次反射で光ファイバーのコア像を見ながらフォーカスを合わせます。ルビー蛍光やラマンも測定できます。波長は光ファイバーで繋いだネオンランプや低圧水銀ランプで校正できます。
その後、3Dプリンターでソーラボの30 mmケージに接続できるようにするアダプタ(望遠鏡と繋ぐアダプタと入れ替える)を作成しました。下の写真で、30 mmケージ用の4本の6 mmロッドが固定できるようになってます(テプラシール貼っているところ)。これでソーラボの光学系と直接組み合わせて分光器として使うことができます。下の写真はVer.2の場合で、手前には可変スリットが付いてます(ミツトヨのマイクロメータがついているもの)。
それを使って上のファイバー光学系の時のラマン光学系をほぼそのまま使ってミニ顕微ラマン分光器を組んでみました。全部載せるために300x300のブレッドボードを斜めに使ってます(適当なボードがないので)。小さいXYZステージをポストに付けてます。ここでは幅が変えられるスリットをラマン散乱を集光する所に置いています(前のファイバー位置)。コリメート側のレンズは焦点距離を100 mmと変えてます。回折格子は1200 g/mmへ変更してます。検出側のレンズも120から100 mmに変えて対称的にしたいのですが、これはVer.2では(この時点では)ちょっと難しく120 mmのままです。下の写真が光学系の全体像です。
可変スリットのいいところは幅を広げておいて、さらに0次反射になるように回折格子を回転させると、試料像が観察できることです(ミラーとして働くので)。そこで試料像にフォーカスを合わせて、レーザースポットがスリット中央に来るようにダイクロイックビームスプリッターの回転を微調整します。その状態でスリットを50~100 micron程度に絞って、回折格子を560 nmくらいに移動するとラマンピークが観察されました。こちらの方が調整しやすいので、可変スリットのこの利用方法は結構いいなと思ってます(ただ回折格子を回転させると校正が毎度必要になります)。スリットを使ってますが、ビーム自体はスポット状なので、ラマン散乱(スペクトル)は実際にはCMOS画面の上下かなり狭い範囲に出ることになります。SharpCapだと2712x200という観察領域が選べたので(Neptune-CIIの場合)、それを使うと撮像が速くなります。
下は2秒露光のCMOS画面。中央から少し左の明るい2点がオリビンの2つの強いピークに対応してます。右端の縦長の部分がレーザー(0 cm-1)によるもので、その付近が暗いのはラマンエッジフィルターによる減光のため。2つのピークの分離が前より悪いのは回折格子を変えているためで、倍の波数領域が見えてます。Windows上のSharpCapで画像を取得してます。SharpCapにはMac版がないのですが、AstroDMx CaptureにはMac版もあって、これを使うとMacからもラマンピークを見ることができました。今回はフィルター類は本格的なもの(Semrockの532 nm用ラマンエッジフィルター、ダイクロイックフィルター)を使ってます。
現状、2D画像をSharpCapかAstroDMx Captureで取得してfitsファイルで保存して、それをpythonのコードで縦方向に積算して1次元スペクトルに直しています。よりよいスペクトルを得るにはStackingが必要です。SharpCapではLive Stackingが可能なのですが、試してみたところうまくいきません。星雲写真のように基準となる星に対応するものがないためのようです。普通に繰り返し測定は可能なのですが、fitsファイルが多量に出来るので、それを別途stackingしないといけないので、pythonでstacking用のプログラムを作りました。それでオリビンの2秒露光データ100個を処理したのが下のスペクトルです。上の2Dの図とは横軸を反転させてます。積算で波形がスムーズになりました。ただ、スリットが100ミクロンだったこと、レーザー自体が幅広いことなどからピークはSolEx Proでの測定例と比べてブロードになっています。
カメラ側のレンズ筒部分を作り直しました。オリジナルだとレンズの焦点距離が125 mmかそれ以上でないとフォーカスできなかったため。新しいものはスリット側と同じくソーラボのケージが使えるようなアダプタがレンズ筒の端に付いてます。ヘリコイドフォーカサは使いません(その分安くなります)。ケージプレートをずらしてフォーカスを調整します、これで100 mmの焦点距離が使えるようになり、現在コリメート側も100 mmにしているので対称的な配置になりました。
さらにもう1台SolEx Ver.2を印刷しました。今回はコリメートボックス部分を止めて、カメラ側と同じレンズ筒を使うように改造しました。最初からソーラボケージに組み込む目的です。これはNIRでの分光に使ってみる予定。これで本当に対称的になりました。また回折格子の回転ハンドルと止めネジをカラフルにしてみました。
これまで2D画像をSharpCapかAstroDMxで取得してfitsファイルで保存して、それをpythonのコードで縦方向に積算して1次元スペクトルに直していましたが、すぐにスペクトルを見れなくて不便でした。また調整の時に2D画像からはピーク強度の変化が分かりづらいことも問題になってました。直接スペクトルを表示できるソフトが必要で、自分で作るしかないようです。PlayerOneカメラを使うことが多いので、まずはPlayerOneカメラから始めました。PlayerOneはSDKを配布しているので、それに入っているpythonテストプログラムを動かすことから。以下Macを使ってますが、Windowsでもほぼ同じでできるはずです。
Macの場合はreadmeにlibusbをインストールする必要があると書いてありました(Windowsは不要ですが、ドライバーインストールが必要)。brewをインストールしているので、brew install libusbでインストールできました(実際は古いlibusbがあったが、更新した)。
私はminicondaでインストールしたpythonを使っています。テストプログラムではOpenCVライブラリーを使っているので、ライブラリーをインストールしました(Numpyも必要ですが既にインストールしてました)。minicondaの場合はconda install opencvで出来ます。ただ私の場合はエラーが出て、classicでやれとなったので、先にconda config --set solver classicを実行して、それからconda install opencvを実行すると今回はエラーなく出来ました。なお、このテストプログラムではOpenCVが必要ですが、自作プログラムで画像表示にMatPlotLibを使う場合には不要です。
SDKにあるpythonコードはPOA_Camera_test.pyとpyPOACamera.pyで、test.pyの方が実行する方です。まずは実行ファイルになってなかったので、chmod 755 *.pyで実行可能ファイルに直しました。readmeに従ってpythonプログラムがあるディレクトリーにPlayerOneCamera.hとlibPlayerONeCamera.3.8.0.dylibをコピーします(header fileはいらないと思いますが)。そしてpyPOACamera.py中のdllの名前がWindows用のようなので、dll = cdll.LoadLibrary("./libPlayerOneCamera.3.8.0.dylib")と直しました。ディレクトリさえ正しく指定すればlibPlayerOneCamera.3.8.0.dylib自体はどこに置いてもいいはずです。これはユニバーサルバイナリなので古いIntel MacBookAirでも動作しました。
これでPlayerOneカメラを繋いで、POA_Camera_test.pyをターミナルから実行すると、カメラ情報を出力し、さらに画像を表示しました。最初明るすぎてよく見えないのですが、これは露光時間の設定がなぜか長いためです。また左右逆転設定になってました。終了するにはqキーを押します。一応カメラを制御できることは確認できました。
これをベースにちょっと直してみました。イメージはNumpyの配列(3次元になっている)に入るので、Numpyを使って処理します。画像を縦に積算して、1次元スペクトルへの変換ができました。
現在はTKinterでGUI化した測定プログラムを作っているところです。スペクトルや画像の表示にはMatPlotLibを使ってます(OpenCVは使ってません)。連続的な表示やスタックもできるようになってます。これで自作分光器が使いやすくなるはずです。動かしている動画を置いておきます。これはネオンランプのスペクトルを測定しているところです。外部ライブラリーとしては、numpy, pillows, MatPlotLib, tkinterを使ってます。非冷却カメラしか持ってないので、温度やファン制御などはやってません。非冷却カメラでも温度は取得できますが。
POA-spectrum.pyのデモ動画
上記の簡易ラマン分光装置でプログラムを使ってみました。同様に532 nmレーザーで4.5 mW出力。下はオリビン結晶を測定したもので、1秒露光で60回積算。この試料はいつもバックグラウンドが高くなります…
次は水晶を測定したもので、1秒露光で20回積算。どちらもスリットは50ミクロンくらいで、binningは40ピクセルで約120ミクロンの領域に対応します。こちらはバックグラウンドは低いです。
使っていて1つ気付いたのはカラーカメラだと隣合うピクセルで強度が大きく異なることです。カラーCMOSの感度の差による問題だとは思いますが、スペクトルでピークがギザギザに見えることやピークが二重に見えることがあります(拡大すると分かりやすい)。モノクロカメラではこの問題は出ません。そのために平滑化機能を現在付けてます。これを使うとカラーCMOSかめらのギザギザは消えます。
ついでにSolExを使ってない自作分光器(最近作った)も紹介します(下の写真)。これはPULSER Engneeringさん設計の400~800 nm分光器とほぼ同じもので、ソーラボのパーツで組んであり、カメラはFLIRのBlackFlyを使ってます。PULSER Engneeringさんの見積もりでは必要な予算は1400ユーロくらいになります。台はPULSER Engneeringさんは使わない方がいいと言っている積層式3Dプリンターで作りました。PULSER Engneeringさんは粉末式3Dプリンターで作ることを推奨してます(またはアルミ板を加工)。この分光器は50 mmのレンズを両側に使っていて、300 gr./mmの回折格子を使って、一度に400 nmくらいの範囲を測定できるような仕様になってます。理想的には使う光ファイバーは10 micronがいいのですが、持ってないので50 micronでテストしました。ネオンランプや蛍光灯のスペクトルがよく見えましたが、ネオンランプでは明らかに本来ピークが出ない位置にピークがあり、高次回折のピークが紛れこんでいるようでした。ショートパスやロングパスフィルターで必要ない波長をカットした方がいいようです。
現在これを温度測定用に使おうとしてます。BlackFlyもpythonのデモプログラムが付いているのですが、今のところうまく動かせてません。なので検出器にはPlayerOneのスティックタイプのCMOSカメラ(Ceres-M)と交換しています。センサーサイズが小さいので、これだと300 nm弱の領域が測定できます。現在これを収める箱を設計しているところ。
写真に写っているスケールは15 cm長さ。