Skip to content

Diss-Lab/LSE-SPD

Repository files navigation

Laser Scanning Excitation and Single-Point Doppler Sensing System

激光扫描激励,多普勒单点接收实验系统


📖 系统简介

本系统通过 AutoHotKey (AHK) 主控脚本 协调以下三个子系统:

  1. 多普勒振动测量仪(界面操作自动化)
  2. 激光振镜扫描系统(MATLAB 串口控制)
  3. 数据采集与保存(自动化文件操作)

实现激光扫描点阵激励 + 多普勒单点接收的全自动化测量流程。


🚀 快速开始

1. 环境准备

必需软件

  • MATLAB R2014a(或兼容版本)
  • AutoHotKey v2.0.19+下载地址
  • 多普勒振动测量软件(确保已安装并可正常运行)

硬件连接

  • ✅ 振镜控制器通过串口连接至 PC(确认串口号,如 COM7

2. 配置脚本

步骤 2.1:修改 MATLAB 路径

打开 main_control.ahk,修改第 20 行:

global matlabExe := "C:\Program Files\MATLAB\R2014a\bin\matlab.exe"

💡 根据你的 MATLAB 安装路径修改

步骤 2.2:获取多普勒软件按钮坐标

  1. 打开多普勒软件
  2. 运行 main_control.ahk(双击运行)
  3. 将鼠标移动到"单次扫描"按钮上,按 Ctrl+Alt+C
  4. 弹窗会显示坐标,记录下来
  5. 重复上述步骤获取"保存"按钮坐标
  6. 修改 main_control.ahk 中的坐标:
    global DopplerStartX := 500    ; 替换为实际坐标
    global DopplerStartY := 300
    global DopplerSaveX := 600
    global DopplerSaveY := 400

步骤 2.3:配置串口和扫描参数

修改 main_control.ahk

; 振镜串口参数
global SerialPort := "COM7"         ; ← 改为实际串口号
global BaudRate := 115200
global FocalLength := 200           ; ← 改为实际场镜焦距(mm)

; 扫描点阵参数
global ScanStartX := -10            ; 起始 X 坐标(mm)
global ScanStartY := -10            ; 起始 Y 坐标(mm)
global ScanStepX := 5               ; X 步长(mm)
global ScanStepY := 5               ; Y 步长(mm)
global ScanCountX := 5              ; X 方向点数
global ScanCountY := 5              ; Y 方向点数

3. 运行流程

单次扫描测试(必须先执行)

  1. 打开多普勒软件
  2. 手动开启激光器(脚本不控制激光器)
  3. 双击运行 main_control.ahk
  4. Ctrl+Alt+S 启动单次扫描
  5. 观察流程是否正常:
    • 多普勒自动点击"单次扫描"
    • 等待采集完成(5 秒)
    • 自动保存数据(Ctrl+C → 点击 → Ctrl+V)
    • 振镜自动移动到指定位置

多点扫描(确认单次正常后执行)

  1. 确认单次扫描流程无误
  2. Ctrl+Alt+M 启动多点扫描
  3. 确认扫描参数后开始自动扫描
  4. 实时 ToolTip 会显示进度和当前位置

紧急停止

  • Ctrl+Alt+X 发送停止信号
  • 流程会在当前步骤完成后安全终止

📂 文件说明

文件名 功能 说明
main_control.ahk AHK 主控脚本 协调整个时序流程,热键控制
move_galvo_once.m MATLAB 串口控制脚本 单次振镜移动,防死锁设计
move_to_position.m 原始 MATLAB 函数 旧版本,仅供参考
galvo_config.txt 振镜配置文件 运行时自动生成,存储位置参数
galvo_status.flag 状态标志文件 MATLAB 执行结果(OK/ERROR)
workflow.md 工作流程说明 详细的流程描述和注意事项

⌨️ 快捷键说明

快捷键 功能 说明
Ctrl+Alt+S 单次扫描 执行一次完整流程(采集+保存+振镜移动)
Ctrl+Alt+M 多点扫描 蛇形扫描整个点阵
Ctrl+Alt+X 紧急停止 在当前步骤完成后终止循环
Ctrl+Alt+C 获取坐标 显示当前鼠标坐标(用于配置)
Ctrl+Alt+H 显示帮助 显示所有快捷键和使用说明

🔧 常见问题排查

1. MATLAB 脚本卡死不退出

原因move_galvo_once.m 缺少 exit 或串口未释放
解决

  • 确认 move_galvo_once.m 最后一行是 exit
  • 确认串口在 finally 块中正确关闭(fclose + delete + clear

2. 串口占用错误

原因:串口被其他程序占用或未正确释放
解决

  • 关闭所有串口调试工具(如 SSCOM、串口助手)
  • 在 MATLAB 命令行执行:
    delete(instrfindall);  % 清除所有串口对象
  • 如果仍然占用,重启电脑或重新插拔 USB 串口

3. AHK 无法找到 MATLAB

原因:MATLAB 路径配置错误
解决

  • 在 Windows 资源管理器中找到 matlab.exe 的完整路径
  • 复制路径到 main_control.ahkmatlabExe 变量
  • 注意路径中的反斜杠 \ 不需要转义

4. 多普勒按钮点击失败

原因:坐标不准确或多普勒软件窗口位置变化
解决

  • 确保多普勒软件窗口位置固定(不要移动或最大化/还原)
  • 重新使用 Ctrl+Alt+C 获取准确坐标
  • 如果多普勒软件分辨率改变,需重新获取坐标

5. 振镜移动方向错误

原因:坐标系定义不一致
解决

  • move_galvo_once.m 中检查角度计算公式
  • 如果 X/Y 方向相反,在数据包构造时交换高低字节或添加负号

6. 采集时间不足

原因AcquisitionTime 设置小于实际采集时间
解决

  • 手动测量一次多普勒采集的实际时间
  • main_control.ahk 中增加 AcquisitionTime 的值(建议 +500ms 余量)

🛠 高级功能(可选)

1. 自定义文件命名

修改 main_control.ahk 中的保存逻辑,添加位置编号:

; 原代码:
Send, ^v

; 改为:
fileName := "data_X" . focusX . "_Y" . focusY . ".txt"
SendInput, %fileName%

2. 采集完成标志检测(替代固定延时)

如果多普勒软件有完成标志(如状态栏颜色变化),可以使用像素检测:

Loop, 100
{
    PixelGetColor, color, 700, 500  ; 状态指示灯位置
    if (color = 0x00FF00)           ; 绿色表示完成
        break
    Sleep, 100
}

3. 扫描日志记录

main_control.ahk 中添加日志记录:

logFile := A_ScriptDir . "\scan_log.txt"
logContent := A_Now . " | Position: (" . focusX . "," . focusY . ") | Status: OK`n"
FileAppend, %logContent%, %logFile%

📊 系统架构

┌─────────────────────────────────────────┐
│        AHK 主控脚本 (main_control.ahk)   │
│         时序协调 + 热键控制              │
└────────┬─────────────┬──────────────────┘
         │             │
    ┌────▼────┐   ┌────▼────────────────┐
    │ 多普勒   │   │ MATLAB 振镜控制     │
    │ UI 自动化│   │ (move_galvo_once.m) │
    └─────────┘   └────┬────────────────┘
                       │
                  ┌────▼──────┐
                  │ 串口 COM7  │
                  │ 振镜控制器 │
                  └───────────┘

🐍 蛇形扫描示意图

起点 →  →  →  →  → (第1行)
                  ↓
     ←  ←  ←  ←  ← (第2行)
     ↓
     →  →  →  →  → (第3行)
                  ↓
     ←  ←  ←  ←  ← (第4行)
     ↓
终点 →  →  →  →  → (第5行)

优势:减少空驶距离,提高扫描效率


📝 版本历史

  • v1.0(2026-01-15):初始版本
    • 实现 AHK + MATLAB 时序控制
    • 支持单次扫描和多点蛇形扫描
    • 防死锁机制(状态文件 + 串口超时)

开发指南

具体工作流程(根据实际情况可以修改)(每一步都有写好的代码,重点是如何写时序流程):

  1. 启动多普勒单次扫描(鼠标点击一次):此时多普勒等待激光器开启(waiting for trigger);
  2. 控制激光器出光(多普勒主机通过串口发送出光指令):之后多普勒开始单次采集,直到采集完毕;
  3. 保存数据(ctrl+c,鼠标点击一次,自动按文件名打开.txt 文件,ctrl+v):此时可以不关闭激光器,因为串口关闭需要一定时间,也容易卡住;
  4. 多普勒下一次采集前,控制振镜偏振激光束(发送串口指令):偏转到新位置后,可以开始采集信号;
  5. 多普勒开始第二次采集(鼠标点击一次):直到采集完毕,重复上述流程;
  6. ...
  • AHK 作为主控脚本。
  • 激光束偏转点阵应该可调,并按一定的逻辑比如蛇形移动。
  • 严格控制多普勒采集的信号与位置的对应关系,所以激光激励时间应该大于采集时间。

About

Laser-Scanning Wave Excitation with Doppler sensing

Resources

Contributing

Stars

Watchers

Forks

Releases

No releases published

Sponsor this project

Packages

 
 
 

Contributors

Generated from 2p1c/.github