本项目是一个基于 RT-Thread 操作系统和 NXP FRDM-MCXA156 开发板的风洞悬浮球控制系统。系统通过 VL53L0X ToF激光测距传感器实时检测乒乓球的高度,并采用简单的 PID + 前馈 + 增益调度 控制算法,控制 YS4028B12H PWM风扇的转速,从而实现乒乓球在设定高度的稳定悬浮。
此外,项目还包含一个 SSD1306 OLED屏幕用于实时数据显示,并通过 RW007 Wi-Fi模块和Python WebSocket代理,实现了一个Web前端,允许用户在浏览器上远程监控系统状态和调整目标高度。
- 高度控制: 采用简单PID + 前馈 + 增益调度的控制算法,适应不同高度下的系统非线性特性。
- 实时数据显示: 板载OLED屏幕实时显示当前高度和目标高度。
- Web远程监控: 通过Wi-Fi和WebSocket技术,在Web页面上实时展示系统状态图表,并可远程设置目标高度。
- 多线程架构: 基于RT-Thread的多线程架构,将控制、显示、通信等任务解耦,保证系统实时性和稳定性。
- 命令行调试: 集成RT-Thread FinSH/MSH,可通过串口或远程TCP连接进行参数调整和状态查询。
| 组件 | 开发板引脚 | 连接方式 |
|---|---|---|
| PWM风扇 (YS4028B12H) | P3_6 |
连接到 FLEXPWM0_A0,用于PWM调速 |
| ToF传感器 (VL53L0X) | P0_22 (SCL), P0_23 (SDA) |
软件I2C总线 (在使用硬件I2C时这个传感器总是初始化失败) |
| OLED屏幕 (SSD1306) | P1_9 (SCL), P1_8 (SDA) |
硬件I2C总线 (LPI2C2) |
| Wi-Fi模块 (RW007) | (SPI) | 连接到 LPSPI1 |
| 调试串口 | P0_2 (RX), P0_3 (TX) |
连接到 LPUART0 |
| 工作指示灯 | P3_12 |
GPIO输出 |
系统软件分为两部分:运行在MCXA156上的RT-Thread嵌入式固件,和运行在PC上的Python WebSocket代理服务器。
工作流程:
- 数据采集:
主控制线程通过I2C读取VL53L0X传感器的高度数据。 - 控制计算: 线程根据当前高度和目标高度,通过PID、前馈和增益调度算法计算出最终的风扇转速。
- 执行输出:
主控制线程调用PWM驱动,更新风扇转速。 - 本地显示:
OLED显示线程读取全局变量中的高度信息,并刷新屏幕。 - 远程通信:
- PC端的
websocket_proxy.py脚本连接到设备的TCP端口(MSH/FinSH)。 - 脚本定期发送
get_status命令获取系统状态,并将返回的JSON数据通过WebSocket发送给Web浏览器。 - 用户在Web端的操作被转换成命令(如
pid_tune -t 300),通过WebSocket发送给Python脚本,最终由脚本转发给设备执行。
- PC端的
本项目使用 scons 进行构建。
# 编译
scons -j12
# 清理工程
scons --clean使用 pyocd 工具进行烧录。请确保已正确安装pyocd并连接好调试器。
pyocd flash rtthread.bin-
配置Wi-Fi: 固件启动后,通过串口进入FinSH/MSH命令行,使用
wifi join命令连接到你的Wi-Fi网络。设备IP地址将显示在日志中(例如192.168.0.105)。 -
修改代理脚本: 打开
applications/remote/websocket_proxy.py文件,将TCP_SERVER_IP修改为你的设备IP地址。# 板子的TCP服务器地址和端口 TCP_SERVER_IP = "你的设备IP地址" # 例如 "192.168.0.105" TCP_SERVER_PORT = 5000
-
安装依赖并运行:
# 安装依赖 pip install websockets # 运行代理服务器 python applications/remote/websocket_proxy.py
-
打开Web页面: 在浏览器中打开
applications/HTML/index.html文件,即可看到实时数据图表并进行控制。
