光学鼠标的 CMOS 传感器本质上是一个小型图像采集芯片,原设计用于捕捉桌面纹理变化计算位移,但其核心是低分辨率 CMOS 阵列,能以高帧率输出原始像素数据。通过添加合适镜头、解码传感器串行信号,并结合微控制器生成 VGA 输出,即可将其转化为功能性视频相机。这种改造充分利用闲置硬件,实现成本低于 50 元的 VGA 实时显示设备,适用于嵌入式监控、艺术装置或教育演示。
改造的核心观点在于:鼠标传感器虽分辨率仅 30x30 像素(约 900 像素),但帧率可达数千 FPS,远超许多廉价摄像头;其 SPI 接口暴露像素缓冲区,便于直接读取灰度帧。证据来自多个 DIY 项目,如 Reddit 用户 Dycus 使用 ADNS-3090 传感器构建的复古相机,支持连拍与全景拼接;spritesmods.com 经典 hack 展示 ADNS-2610/5020 的像素读取协议。这些项目证实,传感器输出 8 位灰度值阵列,经简单处理即可可视化。
硬件准备清单:
- 传感器模块:拆解 Logitech 或兼容鼠标,提取 ADNS-30xx/50xx 系列芯片(如 ADNS-3090,30x30 阵列)。保留原 IR LED(850nm 波长,避免可见光干扰),或替换为白光 LED 提升成像质量。
- 镜头添加:原鼠标镜头焦距约 5-10mm,用于微距。将之替换为 f=4-8mm 凸透镜(淘宝 5 元),固定于传感器前方 2-5mm,确保景深覆盖 10-50cm。参数:孔径 f/2.8,光圈手动用黑纸遮挡控制曝光。
- 微控制器:STM32F103 或 Arduino Uno(SPI 高速读取)。连接:传感器 NCS→MCU Pin10, SCLK→Pin13, DOUT→Pin12, +5V/GND 直连。添加 10kΩ 上拉电阻于 NRST。
- VGA 输出:使用 CH7033B VGA 芯片或 FPGA(如 ICE40),输入 MCU 串口帧数据。备选:R-2R DAC 电阻网络(74HC595 移位寄存器驱动),生成 640x480@60Hz VGA( upscale 30x30 帧至全屏)。
- 电源与外壳:5V/1A USB 供电,3D 打印壳体固定镜头(STL 文件开源)。
信号解码流程: 传感器通过 SPI 寄存器访问像素。初始化序列(伪码):
SPI_write(0x00, 0x01); // Power up
SPI_write(0x07, 0x80); // Frame capture
delay_ms(1);
for(y=0; y<30; y++) {
for(x=0; x<30; x++) {
pixel[y][x] = SPI_read_reg(0x7F + y*30 + x); // 逐像素读缓冲,8-bit 灰度 0-255
}
}
证据:ADNS 数据手册(Avago/PixArt)指定寄存器 0x7F 起为帧缓冲。帧率参数:ROSC 电阻 10kΩ 设为 2000 FPS,曝光时间寄存器 0x25=0x80(自动增益 AGC)。风险:过曝导致饱和,用寄存器 0x24 设 LED 电流 20mA。
实时 VGA 实现: MCU 以 60Hz 刷新率读取帧(每帧 900 字节,SPI 10MHz 速率下 <1ms)。Upscale:双线性插值扩展至 640x480,每像素重复 21x16 次。VGA 时序:HSYNC 31.77kHz,VSYNC 60Hz,RGB 各 8-bit。参数清单:
- 像素时钟:25.175 MHz
- 可见区:640x480
- 总线宽:800x525
- DAC 参考电压:3.3V,R-2R 精度 1% 同步监控:用示波器捕获 SPI MOSI/MISO,帧质量寄存器 0x06 >80(低则调整表面纹理或 LED 强度)。回滚策略:若帧丢失 > 10%,降帧率至 30Hz。
优化落地:
- 曝光控制:手动寄存器 0x25=0x40-0xC0,结合 AGC(寄存器 0x27)。
- 噪声抑制:中值滤波 3x3 核,阈值 0x20 去黑电平。
- 显示增强:伪彩色映射(灰度→RGB),对比度拉伸 (min-max 归一)。 测试参数:景深 20cm,帧率 120 FPS,功耗 <500mW。实际输出如 Game Boy 风格复古视频,适合近距离物体追踪。
此改造不只趣味,还展示嵌入式图像处理的精髓:低资源下榨取硬件潜力。
资料来源:
- Dycus Reddit 项目:ADNS-3090 相机原型。
- spritesmods.com:传感器 hack 协议。
- PixArt/Avago ADNS 数据手册:SPI 寄存器细节。