06-14-2025 06:26 AM
2048ピクセルのCCDラインセンサILX511(SONY)を使った分光器の話は2年前の記事
「2048ピクセルのCCDラインセンサILX511(SONY)をESP32で制御してLabVIEWで分光データを受け取る 」
で紹介をしています。この時のLabVIEW側のプログラムはESP32受け取ってからデータを受け取って表示するというシンプルなもので、ArduinoとかMicroPythonなどの電子工作でセンサーから得たデータを見える形にするにはLabVIEWが良いんじゃない、といったスタンスでした。
その後実際に分光測定に使われる方からの要望を少し反映させたプログラムを作りました。今回さらに使いやすくして欲しいという話がありましたので、仕事に使うときにはLabVIEWのライセンス、高校の部活ならばLabVIEW Communityということで、私なりに久しぶりに気合を入れてプログラムを書いてここで公開させてもらうことにしました。
ESP32用にArduinoで書いたプログラムに対応しているプログラムなので汎用性はないのですが、マツラボさんの分光器は後日リンクを紹介しますが、5万円前後の予定だということですので、部活のサポーターの方はぜひご検討ください。安すぎるでしょうと言ったのですが、大丈夫とのことでした。
私は分光器を使った記憶はありますが仕事で使ったことはありませんので、測定プロセスには詳しくありません。仕様についてはGoogle AI Studioと相談しながらプログラムを作ってみました。「それ、めっちゃ便利じゃないですか!」とか、人間以上によいしょしてくれるので、モチベーションを維持するうえでけっこう役に立ちます。それに、測定法の名前とか、制御器の名前とかいくらかでも使う人になじみやすそうな単語を紹介してくれるのでとても助かります。
分光分析の種類はいくつかありますが、あらかた、吸光分光、透過分光、発光分光の3種類に対応すれば良さそうな感じでした。サンプルを入れてデータのノイズを見ながら露光時間とか、ノイズ処理とかを決めるときにはライブビューがあれば便利だろうと思います。標準データを表示しておいて違いを見ながら測定できれば便利な場合もあるでしょう。反応の時間経過を追うときにはインターバル測定ができれば便利です。仕事もサクサクこなしてから後で解析する人もいれば、サンプルごとに詳しく解析したい人もいますので、詳しいスペクトル解析はボタンを押すとサブVIが開くようにしました。
フロントパネルのスクリーンショットを紹介します。ダイアグラムを想像しながらご覧ください。
<<シングル測定の例>>
<<インターバル測定の例>>
<<シングル測定での波形解析>>
<<インターバル測定での波形解析>>
ボタン操作で気持ちよく動くかどうか、シングル測定とインターバル測定の折り合いをどうつけるかとか、押してほしくないときにはグレーにしておくとか配慮しましたので、次回ダイアグラムを紹介します。
(250614)
06-14-2025 04:58 PM
大部分はイベント駆動型のステートマシンを使っていますが、インターバル測定が選ばれた時にはシーケンシャルなステートマシンを使っています。イベント駆動型のステートマシンについてはマーブルルールさんの記事「【LabVIEWまずこれ㉑】ステートマシンを理解しよう」をご覧ください。
イベント駆動型のステートマシンのスクリーンショットです。処理が終わると"UI / idle"ステートでボタンやメニューリングなどを操作したときに発生するイベントを待ちます。
インターバル測定では一定間隔で自動的に測定したいので、シーケンシャルなステートマシンで動作します。測定回数が設定値に達したときかインターバル測定停止ボタンが押された時には"UI / idle"ステートに戻ります。
Google AI StudioがLabVIEWプログラムを読めるならマニュアルも作ってもらえるのですが、まだ「私は主にテキストベースの情報を処理することを得意としており、画像認識や複雑なグラフィカルプログラミング言語の構文解析は専門外となります。」ということでNIのNigelに期待です。それでも、イベント駆動型のステートマシンやシーケンシャルなステートマシンについては理解していますので、概要と利点・注意点などを簡潔にまとめてもらいました。
LabVIEWにおけるステートマシンの活用概要
本プログラムでは、ユーザーインターフェースからの操作(ボタンクリック、メニュー選択など)に対する応答性を高め、プログラム全体の流れを管理するために、主にイベント駆動型ステートマシンを採用しています。これにより、ユーザーのアクションに応じて必要な処理を効率的に実行し、待機中はCPUリソースを消費しにくい、応答性の高いアプリケーションを実現しています。
一方で、一定時間間隔で繰り返し測定を行うインターバル測定機能においては、ユーザーイベントを待つのではなく、設定された時間間隔でシーケンシャルに状態遷移を行う(非イベント駆動型)ステートマシン(※ここでは便宜上、シーケンシャルステートマシンと呼びます)を使用しています。これにより、正確なタイミングでの連続データ取得を確実に行います。
1. イベント駆動型ステートマシン (Event-Driven State Machine)
概要:
ユーザーインターフェースからのイベント(ボタンクリック、値変更、マウス操作など)や、プログラム内部で発生するイベント(タイムアウト、カスタムイベントなど)をトリガーとして、状態遷移や処理を実行する設計パターンです。
イベントストラクチャとWhileループ、ケースストラクチャ、シフトレジスタ(現在の状態を保持)を組み合わせて構築されるのが一般的です。
利点:
応答性が高い: ユーザーのアクションに即座に反応できます。
CPU効率が良い: イベントが発生するまで待機するため、CPUリソースの無駄な消費を抑えられます。
コードのモジュール化: 各イベントに対応する処理を個別のケースに記述できるため、コードの見通しが良くなり、機能追加や修正が比較的容易です。
並行処理の管理: 複数のイベントソースからの入力を効率的に扱えます。
注意点:
イベント処理の競合: 複数のイベントが短時間に連続して発生した場合の処理順序や、イベントハンドラ内の処理時間に注意が必要です(長すぎる処理はUIのフリーズを引き起こす可能性)。
状態管理の複雑化: 状態数が多くなると、状態遷移の管理が複雑になることがあります。
デバッグ: イベントの発生タイミングに依存するため、デバッグがやや難しい場合があります。
2. シーケンシャルステートマシン
概要:
主にWhileループとケースストラクチャ、シフトレジスタで構成され、各状態(ケース)での処理が完了した後、次の状態へシーケンシャルに遷移します。
インターバル測定の場合、各「サンプル測定」状態の後に「待機」状態を挟み、指定時間待機した後に再び「サンプル測定」状態に戻る、といった遷移を繰り返します。
利点:
シーケンシャルな処理の明確化: 一連の決まった手順を順番に実行する処理に適しています。
タイミング制御の直接性: 「待機 (ms)」VIなどを使って、処理間の時間を直接的に制御しやすいです。
シンプルな構造: イベントの複雑なハンドリングがないため、特定の連続処理においては構造がシンプルになることがあります。
注意点:
応答性の低下の可能性: ある状態の処理が完了するまで次の状態に進めないため、処理が長いと全体の応答性が低下する可能性があります(特にユーザー操作への反応)。
CPU効率: 待機処理を「待機 (ms)」VIなどで実装した場合、その間もループは回り続ける(ただしCPU負荷は低い)か、あるいはイベント駆動に比べて効率が劣る場合があります。
外部からの割り込み処理: 測定中にユーザーが「停止」ボタンを押すなどの割り込みに対応するには、ループ内に別途条件分岐を入れたり、イベントストラクチャを部分的に組み込んだりする工夫が必要になります。
次の記事でプログラムを添付しますのでお待ちください。
06-14-2025 08:11 PM
プログラムと測定データのサンプルスクリーンショットなどを"Spectrometer47_2023.zip"にまとめました。プログラムはLabVIEW Community 2024で作成して、バージョンを2023に落として保存しました。
変更があれば随時記事として追加しますので最終記事までご確認ください。
分光器を手に入れてUSBポートに接続します。VISA resource name制御器を選択して、実行ボタン(フロントパネル左上の矢印ボタン)を押すと表示モードは"ライブビュー"となりCCDの出力を随時表示します。
露光時間、多重サンプリング平均化回数、ピクセルスムージングを調整します。たとえば多重サンプリング平均化回数を3にすると3回測定して平均値を表示します。ピクセルスムージングを”ON”にすると3画素の移動平均を表示します。データとして保存されるのは平均化やピクセルスムージングされた値です。
xyグラフ"スペクトラム"のグラフパレットはデータを観察するときにすごく便利ですがLabVIEWに慣れていない人には小さくてよくわからないと思います。Google AI Studioにまとめてもらいました。
XYグラフのグラフパレット:見たいようにグラフをカスタマイズ!
LabVIEWのXYグラフには、測定中にグラフの見た目を直感的に操作できる「グラフパレット」という便利なツールが付いています。
まるで虫眼鏡で細部を拡大したり、グラフ全体を手のひらで掴んで動かしたりするように、マウス操作で簡単に以下のことができます。
ズームイン/ズームアウト: 特定の範囲を拡大して詳しく見たり、全体像を把握するために縮小したりできます。いくつかのズームモード(矩形ズーム、X軸ズーム、Y軸ズームなど)があります。
パン(移動): 表示されているグラフの範囲を上下左右に自由に移動させて、見たい部分を中心に表示できます。
オートスケール: グラフの表示範囲を、現在プロットされているデータ全体がちょうど収まるように自動で調整してくれます。
このグラフパレットを使うことで、プログラムを止めることなく、リアルタイムに表示を調整しながらデータを確認できるため、測定中の状況把握や、注目すべき現象の発見に役立ちます。
測定条件が決まったら表示モードを"測定"にします。
分光法選択で"吸収分光"、"透過分光"、"発光分光"を選択します。
光源をOFFにして"BG実行"ボタンを押すとバックグランドデータが測定されます。バックグランドデータが不要な場合は"BG実行"ボタンを押す必要はありません。
"吸収分光"と"透過分光"の場合には、光源をONにして吸収体がない状態で"RF実行"ボタンを押してリファレンスデータを測定します。
測定モード選択では"シングル測定"か"インターバル測定"を選択します。"インターバル測定"の場合は測定間隔と測定回数を指定します。
"測定実行"ボタンを押すと測定が行われます。
"データ保存"ボタンを押すと"試料名/ID"、"備考”、測定日時なども含めてカンマ区切りのスプレッドシート形式で保存されます。"データ呼出"ボタンを押すと、過去に測定したサンプルデータを標準データとして表示することができます。過去のデータと比較しながら測定することができて便利な場合があります。
表示スペクトル選択でそれぞれのスペクトルを表示して確認することができます。
"解析実行"ボタンを押すとサブVIが開きスムージング、ピーク検出などを行うことができます。このサブVIを改造してご自分の役に立つ解析機能を追加してください。
06-15-2025 02:11 AM
イベント駆動ステートマシン
イベント駆動のステートマシンでは指示されたステートの実行が終わるとイベントストラクチャのあるステートに戻ってきて、次のイベントの発生を待っています。露光時間を変更したときの動きを追ってみます。
(1) 露光時間制御器の値が変わると、露光時間の値から分光器のコントローラに送るコマンド文字列が作られてExpCommand表示器に格納されます。
(2) これから動作させるステートの列挙体をキューに入れます。ここでは"exp_comd"と”UI / idle”をキューに入れています。"exp_comd"を実行したら”UI / idle”で次のイベントを待てという流れです。
次のループ実行でキューから取り出された"exp_cmd"が実行され、ExpCommand表示器のローカル変数から取り出された文字列がシリアル経由で分光器のコントローラに送られます。
その次のループ実行でキューから”UI / idle”が取り出されて次のイベントを待ちます。
なので、イベント駆動キュードステートマシンと呼ぶのが正しいようです。何か所ものステートを回って”UI / idle”に戻ってくる場合があります。
シングル測定モードで、"測定実行"ボタンが押されると以下のダイアグラムとなります。
キューが3個書かれていますが、先頭にあるサブVI "sub_MultiSample.vi”には"多重サンプリング平均化"の回数が接続されていてます。
1回のサンプリングで4個のステートを実行するキューを追加します。
(1) 分光器のコントローラにデータを要求します。
(2) 16進文字列を受け取り、区切り文字列を目印にして10進数に変換します。
(3) CCD出力のダミーデータを切り捨てます。さらに光強度に変換して、必要であればピクセルスムージングを行います。
(4) データをシフトレジスタに加算します。
最大5回の平均化を行いますので、そのときキューは何個書き込まれるのでしょうか?
どこかでエラーがあったときにどうしよう、ということを考えるととても難しいのでしょうが、基本どこかで止まっているだけなので、分光器の場合は大事には至らないだろうと思います。
吸光分光、透過分光、発光分光のデータ処理
シングル測定では5個のXYグラフをクラスターにまとめておきます。名前でバンドルしておくと出し入れが便利です。上から4本目のシフトレジスタがシングル測定のクラスターです。
吸光分光の計算
透過分光の計算
発光分光の計算
計算前のサンプルのデータも保存しますので、後日自分で再計算することもできます。
シングル測定データのグラフ表示表示
表示スペクトル選択という押しボタンスイッチのクラスタで指示して、必要なグラフだけを表示することができます。データが入っていないグラフのスイッチはグレイアウトして操作できないようにしています。
インターバル測定データについて
100個まで記録できることにしてあるので、シンプルに2次元配列に蓄積していくことにしました。吸光分光の例です。
グラフ表示は次のようにどんどんプロットを追加していきます。
06-15-2025 07:19 PM
測定したデータの保存
青いセロファンを通した白色LEDの発光分光を例に説明します。
"データ保存"ボタンを押すとデータはCSV形式で保存されます。無料で使えるリブレオフィスのCALCでもExcelでも開くことができます。
OKを押すとファイルが開きます。
測定の種類や試料名、備考などのほかバックグラウンド、リファレンス、サンプルを測定した時刻がヘッダー部に記録されています。
画素番号、波長、サンプルデータ、サンプル(未加工)、リファレンス、バックグラウンドが画素順に全画素記録されています。サンプルデータは小数点以下6桁ですが、画素番号は整数、それ以外は少数1桁で記録されています。全て同じ桁数で記録するのは簡単ですが、無意味で見るだけでうっとおしいので手間をかけました。
スペクトル解析とカスタマイズの勧め
"解析実行"ボタンを押すとスペクトル解析用のサブVIが開きます。サンプル(未加工)やバックグラウンドなどすべてのデータがサブVIに送られます。
表示するスペクトルを選択してフィルタやピーク検出のパラメータを調整します。赤い点が検出されたピークです。波形をトレースするカーソルを2本用意しています。カーソルの波長の差分もカーソルに連動して表示されます。
ブロックダイアグラムは手抜きではなく改造を誘うために意図的にシンプルにしています。
例えばピーク検出した結果を保存してみましょう。まずサブVIを別名で保存してから改造に取り掛かります。ここでは"sub_MyAnSingle.vi"にしました。
Write Delimited Spreadsheet.vi関数、日本語版では"区切られたスプレッドシートに書き込む”関数ですが、ケース構造に入れてボタンで動作するようにします。
ボタンのアクションはLatch When Pressedなどにしておきます。
ピークデータは次のように保存されます。鉛筆で控えるより便利になると思います。
必要とする解析機能は人それぞれなので、LabVIEWの高度な機能を駆使して改造してみましょう。