初心者向けプログラミング講座
第10回: 自動測定システムの応用例

講座の概要については以下からご覧ください。
目的
この回では、これまで学んだ知識を基に、自動測定システムを現実の応用例に拡張する方法を学びます。複数の計測器を連携させたシステム、リアルタイムのデータ表示、GUI操作の導入などを取り扱います。また、ロギング機能やデータ管理機能を組み合わせた高度な自動測定システムの例についても解説します。
学習内容
- 複数計測器を制御するシステム
- リアルタイムデータ表示
- ロギングと監視システム
- GUI(グラフィカル操作インターフェイス)の設計
- 実践的応用例:自動測定のフロー統合
- 演習問題
1. 複数計測器を制御するシステム
(1) 背景
1台の計測器だけでなく、データ収集や制御に複数の計測器を必要とする場面では、それぞれを適切に連携するシステムが必要です。
例:関数発生器で信号を生成し、それをオシロスコープで測定。
(2) 複数計測器の制御コード
以下のコードでは、関数発生器とオシロスコープを組み合わせて動作させます。
import pyvisa
# PyVISAで計測器を接続
rm = pyvisa.ResourceManager()
resources = rm.list_resources()
print("接続された計測器リスト:", resources)
# 計測器の接続
if len(resources) >= 2:
# 関数発生器とオシロスコープを接続
func_gen = rm.open_resource(resources[0]) # 関数発生器
oscilloscope = rm.open_resource(resources[1]) # オシロスコープ
# 関数発生器の設定
func_gen.write("OUTPUT ON") # 出力をON
func_gen.write("FREQ 1kHZ") # 周波数1kHz
func_gen.write("VOLT 2") # 振幅2V
print("関数発生器設定完了")
# オシロスコープで測定したデータを取得
data = oscilloscope.query("MEAS:VOLT?") # 電圧測定の例
print("オシロスコープ測定値:", data)
# 接続を閉じる
func_gen.close()
oscilloscope.close()
else:
print("十分な計測器が接続されていません。")
結果:
関数発生器で設定した信号をオシロスコープで測定。
計測データを取得して表示。
2. リアルタイムデータ表示
リアルタイムで測定したデータをグラフとして表示する仕組みを構築します。matplotlibのアニメーション機能を使えば、リアルタイムで更新されるグラフを表示できます。
リアルタイム表示の例
以下のコードは、2秒ごとに更新されるリアルタイムグラフです。
import matplotlib.pyplot as plt
import matplotlib.animation as animation
import random
# データバッファ
time_data = []
voltage_data = []
# リアルタイム更新の描画関数
def update_frame(frame):
global time_data, voltage_data
if len(time_data) > 50: # 最大50データまでバッファに保持
time_data.pop(0)
voltage_data.pop(0)
time_data.append(len(time_data) * 2) # 時間データ
voltage_data.append(random.uniform(0, 5)) # ダミーデータ(実際の測定値に置き換え)
line.set_data(time_data, voltage_data)
ax.set_xlim(0, max(time_data) + 2)
ax.set_ylim(0, 5)
return line,
# 初期化
fig, ax = plt.subplots()
line, = ax.plot([], [], lw=2)
ax.set_title("Real-time Voltage Monitoring")
ax.set_xlabel("Time (s)")
ax.set_ylabel("Voltage (V)")
# アニメーションの設定
ani = animation.FuncAnimation(fig, update_frame, frames=100, interval=2000, blit=True)
plt.show()
結果:
測定結果(もしくはダミーデータ)がリアルタイムでプロットされ、リフレッシュされる。
3. ロギングと監視システム
自動測定システムでは、測定値やエラー情報をリアルタイムで記録するロギング機能と、異常値やエラーを通知する監視機能が重要です。
ロギング機能の実装
Pythonのloggingライブラリを利用します。
import logging
# ログの設定
logging.basicConfig(filename="measurement.log", level=logging.INFO,
format="%(asctime)s - %(levelname)s - %(message)s")
# ログの例
logging.info("測定を開始しました。")
try:
# 測定シミュレーション
for i in range(5):
voltage = random.uniform(0, 10) # ダミーデータ(測定値)
if voltage > 8: # 異常値チェック
logging.warning(f"異常値検出: {voltage:.2f} V")
else:
logging.info(f"測定値: {voltage:.2f} V")
except Exception as e:
logging.error(f"エラー発生: {e}")
結果:
測定値や異常値がmeasurement.logに記録されます。
4. GUI(グラフィカルユーザーインターフェース)の設計
自動測定システムにGUI(グラフィカルユーザーインターフェイス)を追加し、ボタンや入力フォームを用いて操作性を向上させます。Pythonのtkinterを使用します。
GUIでの測定システム
以下は、測定開始ボタンを使ったGUIの例です。
import tkinter as tk
import random
# 測定を開始する関数
def start_measurement():
result_label.config(text="測定中...")
measurements = [random.uniform(0, 5) for _ in range(10)]
avg_voltage = sum(measurements) / len(measurements)
result_label.config(text=f"平均電圧: {avg_voltage:.2f} V")
# GUIウィンドウの作成
window = tk.Tk()
window.title("自動測定システム")
# ラベルとボタン
label = tk.Label(window, text="自動測定システム", font=("Arial", 16))
label.pack(pady=10)
start_button = tk.Button(window, text="測定を開始", command=start_measurement)
start_button.pack(pady=10)
result_label = tk.Label(window, text="結果がここに表示されます", font=("Arial", 12))
result_label.pack(pady=10)
# GUIの実行
window.mainloop()
結果:
GUIウィンドウが開き、ボタンを押すと測定が開始され、結果が表示される。
5. 実践的応用例:統合自動測定システム
以下は、複数の機能を組み合わせた応用的な測定システムのフローです。
統合プログラム例
import pyvisa
import matplotlib.pyplot as plt
import logging
import time
import csv
# ログ設定
logging.basicConfig(filename="system_log.log", level=logging.INFO,
format="%(asctime)s - %(levelname)s - %(message)s")
logging.info("自動測定システムを起動しました。")
# PyVISA接続
rm = pyvisa.ResourceManager()
resources = rm.list_resources()
logging.info(f"接続された計測器: {resources}")
if resources:
instrument = rm.open_resource(resources[0])
logging.info(f"計測器に接続しました: {instrument.query('*IDN?')}")
# 測定ループ
measurements = []
time_intervals = []
for i in range(10):
try:
time_intervals.append(i * 2)
voltage = float(instrument.query("MEAS:VOLT?"))
measurements.append(voltage)
logging.info(f"測定値獲得: {voltage:.2f} V")
time.sleep(2)
except Exception as e:
logging.error(f"測定エラー: {e}")
# 結果を保存
with open("results.csv", "w", newline="") as csvfile:
writer = csv.writer(csvfile)
writer.writerow(["Time (s)", "Voltage (V)"])
writer.writerows(zip(time_intervals, measurements))
logging.info("測定結果をCSVに保存しました。")
# グラフ作成
plt.plot(time_intervals, measurements, label="Voltage (V)")
plt.title("Automatic Measurement Results")
plt.xlabel("Time (s)")
plt.ylabel("Voltage (V)")
plt.grid()
plt.show()
# 接続解除
instrument.close()
logging.info("測定システムを終了しました。")
else:
logging.error("接続された計測器がありません。")
6. 演習問題
演習問題 1: 測定の自動化+異常値の通知
測定中に値がしきい値の電圧を超えた場合、ログに記録し、結果をリアルタイムで画面に表示するプログラムを作成してください。
演習問題 2: 複数計測器のGUI操作
GUIを使用して、複数の計測器の測定をボタンで起動してみてください。また、このときの各計測器の測定結果を逐次画面に表示してください。
まとめ
今回の応用例で、実際の測定システムに少しだけ近いプロセスを構築しました。今回使用したPythonのライブラリはほんの一部ですので、これまでに得た知識をベースに様々なライブラリにトライしてみてください。