最近在给实验室做一个工程项目,功能要求:实现实时反馈某物体的位移距离(二维平面内)。通过考量各种传感器并考虑到这个情景和鼠标比较接近,所以去查了光电鼠标的工作原理,最终定下来使用原属Avago公司现属于PixArt公司的传感器ADNS-9500。整个关于ADNS-9500方面的开发主要集中在年前放假回家前的两周。发现网络上关于这个传感器的资料比较少,可能是因为功能比较小众吧,相关的开发人员比较少,既然我走过这条路了,就给后人留盏灯吧。在这里首先要谢谢PixArt公司深圳办事处黄工对我的帮助,谢谢回复我了一封邮件,也正是这封邮件才让我有可能在两周内实现它的主体功能。好了言归正传,开始谈谈我们的开发过程。
工作原理
激光鼠标在原理上和光电鼠标类似,只不过用激光代替了普通的LED灯,好处是可以在更多表面上使用。因为激光是相干波,几乎是单一波长,即使经过长距离的传播依然能保持良好的强度和波形。激光鼠标传感器获得影像的过程是根据激光照射在物体表面所产生的干涉条纹而形成的光斑点反射到传感器上获得的。而传统的光学鼠标是通过照射粗糙的表面的表面所产生的阴影来获得。因此激光能对表面的图像产生更大的反差,从而使得“CMOS”成像传感器得到的图像更容易辨别,提高鼠标的定位精确性。
开发环境
MUC:C8051F410
IDE:Keil C51
工作流程
主要参考ADNS-9500的datasheet来书写。
- 向地址为0x3A的寄存器写入0x5A
- 做至少50ms的延时
- 从地址为0x02、0x03、0x04、0x05和0x06读取数据
- SROM下载
- SROM下载首先在CONFIGURATION_IV_ADDR中选择SROM的size
- 向SROM_Enable寄存器写入0x1D
- 延时一个FRAME
- 向SROM_ENABLE寄存器写入0x18开始SROM下载
- 开始写入SROM时需要先从SROM_LOAD_BRUST寄存器开始写,这块我使用code变量将SROM的值存在了单片机的ROM里面,然后通过数组名字直接访问,从而避免使用EERPOM
- 进行SROM_CHECK
- 使能激光源,将LASER_CTRL0寄存器的最低位置为0
至此,ADNS-9500的初始化就全部完成了,下来就是典型的SPI操作,发送寄存器地址值,读取对应寄存器的值。
闲话
回顾这个过程,当时才开始写代码的时候真是一筹莫展,写完之后回过头看看。觉得当时进展不顺是因为数据手册读的不够好的结果。
代码书写部分的心得,最好封装这样两个函数,一个是SPI操作的函数,一个是SPI操作sensor的函数,在每一次操作的时候都去置位一下NCS的值。这样封装,一来代码易读,并且也不太容易出错。
至于调试经验部分,我是用的串口打印获取到的坐标数据,在PC上利用串口调试助手来观测数据是否正确与否。
最后共享一份demo样例到我的gitbub,关于代码实现部分有什么问题可以给我发邮件,看到后我会及时回复的。