激光扫描激励,多普勒单点接收实验系统
本系统通过 AutoHotKey (AHK) 主控脚本 协调以下三个子系统:
- 多普勒振动测量仪(界面操作自动化)
- 激光振镜扫描系统(MATLAB 串口控制)
- 数据采集与保存(自动化文件操作)
实现激光扫描点阵激励 + 多普勒单点接收的全自动化测量流程。
- ✅ MATLAB R2014a(或兼容版本)
- ✅ AutoHotKey v2.0.19+(下载地址)
- ✅ 多普勒振动测量软件(确保已安装并可正常运行)
- ✅ 振镜控制器通过串口连接至 PC(确认串口号,如
COM7)
打开 main_control.ahk,修改第 20 行:
global matlabExe := "C:\Program Files\MATLAB\R2014a\bin\matlab.exe"💡 根据你的 MATLAB 安装路径修改
- 打开多普勒软件
- 运行
main_control.ahk(双击运行) - 将鼠标移动到"单次扫描"按钮上,按
Ctrl+Alt+C - 弹窗会显示坐标,记录下来
- 重复上述步骤获取"保存"按钮坐标
- 修改
main_control.ahk中的坐标:global DopplerStartX := 500 ; 替换为实际坐标 global DopplerStartY := 300 global DopplerSaveX := 600 global DopplerSaveY := 400
修改 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 方向点数- 打开多普勒软件
- 手动开启激光器(脚本不控制激光器)
- 双击运行
main_control.ahk - 按
Ctrl+Alt+S启动单次扫描 - 观察流程是否正常:
- 多普勒自动点击"单次扫描"
- 等待采集完成(5 秒)
- 自动保存数据(Ctrl+C → 点击 → Ctrl+V)
- 振镜自动移动到指定位置
- 确认单次扫描流程无误
- 按
Ctrl+Alt+M启动多点扫描 - 确认扫描参数后开始自动扫描
- 实时 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 |
显示帮助 | 显示所有快捷键和使用说明 |
原因:move_galvo_once.m 缺少 exit 或串口未释放
解决:
- 确认
move_galvo_once.m最后一行是exit - 确认串口在
finally块中正确关闭(fclose+delete+clear)
原因:串口被其他程序占用或未正确释放
解决:
- 关闭所有串口调试工具(如 SSCOM、串口助手)
- 在 MATLAB 命令行执行:
delete(instrfindall); % 清除所有串口对象
- 如果仍然占用,重启电脑或重新插拔 USB 串口
原因:MATLAB 路径配置错误
解决:
- 在 Windows 资源管理器中找到
matlab.exe的完整路径 - 复制路径到
main_control.ahk的matlabExe变量 - 注意路径中的反斜杠
\不需要转义
原因:坐标不准确或多普勒软件窗口位置变化
解决:
- 确保多普勒软件窗口位置固定(不要移动或最大化/还原)
- 重新使用
Ctrl+Alt+C获取准确坐标 - 如果多普勒软件分辨率改变,需重新获取坐标
原因:坐标系定义不一致
解决:
- 在
move_galvo_once.m中检查角度计算公式 - 如果 X/Y 方向相反,在数据包构造时交换高低字节或添加负号
原因:AcquisitionTime 设置小于实际采集时间
解决:
- 手动测量一次多普勒采集的实际时间
- 在
main_control.ahk中增加AcquisitionTime的值(建议 +500ms 余量)
修改 main_control.ahk 中的保存逻辑,添加位置编号:
; 原代码:
Send, ^v
; 改为:
fileName := "data_X" . focusX . "_Y" . focusY . ".txt"
SendInput, %fileName%如果多普勒软件有完成标志(如状态栏颜色变化),可以使用像素检测:
Loop, 100
{
PixelGetColor, color, 700, 500 ; 状态指示灯位置
if (color = 0x00FF00) ; 绿色表示完成
break
Sleep, 100
}在 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 时序控制
- 支持单次扫描和多点蛇形扫描
- 防死锁机制(状态文件 + 串口超时)
具体工作流程(根据实际情况可以修改)(每一步都有写好的代码,重点是如何写时序流程):
- 启动多普勒单次扫描(鼠标点击一次):此时多普勒等待激光器开启(waiting for trigger);
- 控制激光器出光(多普勒主机通过串口发送出光指令):之后多普勒开始单次采集,直到采集完毕;
- 保存数据(ctrl+c,鼠标点击一次,自动按文件名打开.txt 文件,ctrl+v):此时可以不关闭激光器,因为串口关闭需要一定时间,也容易卡住;
- 多普勒下一次采集前,控制振镜偏振激光束(发送串口指令):偏转到新位置后,可以开始采集信号;
- 多普勒开始第二次采集(鼠标点击一次):直到采集完毕,重复上述流程;
- ...
- AHK 作为主控脚本。
- 激光束偏转点阵应该可调,并按一定的逻辑比如蛇形移动。
- 严格控制多普勒采集的信号与位置的对应关系,所以激光激励时间应该大于采集时间。