来龙去脉
- 因为项目需要使用红外传感器来辨别方向,而且还是用的非标红外通讯协议(协议主要是通过载波脉冲的间隔时间来区别);
- 需要直观地显示/测试红外信号的信息/质量,了解红外信号的在空间上的分布情况。
故做了一个小工装,能够显示接收标准代码数据和自定义的代码数据;
目标功能
- 接收38KHz红外载波信号,通过led闪烁表示接收到红外信号;
- 解码信息/调试信息能够显示在OLED屏幕上;
- 实现自定义和标准(如NEC)数据的解码;
- [TODO]增加旋转编码器
- [TODO]增加led UI,优化UI
硬件组成
- nano,(红外接收头的引脚只做输入电平的检测,故使用普通的引脚即可)
- 1838B红外接收头,带屏蔽罩一体化(集成了信号处理);
- oled 0.96寸 I2C通讯
- 支持NEC码的遥控器,用于测试
软件设计
IRremote库-通过测试NEC码,了解其工作原理
- IRremote的工作原理:在周期是50us的中断函数isr中有个红外接收装态机(https://mc.dfrobot.com.cn/thread-440-1-1.html)
- 在该状态机中记录了脉冲边沿的间隔时间计数值tick,以及间隔的次数 results.rawlen,保存在results.rawbuf[i] ;实际时间 = 50us*tick;
- 同时结果还包含了解码的类型 results.decode_type,定义在 decode_type_t中,如 NEC=8
- 接收到间隔数据后,就根据定义的解码方式进行解码,通常第一个数据为两个帧之间的间隔时间,处理时先跳过;
- NEC编码的特点是 起始位为固定560us,然后载波之后的空格space不一样来区别0/1
- 通过打印NEC码原始时间间隔数据;匹配到了与协议相符的时间数据;验证NEC的编码的解码方式,
+ 接下来就是根据自定义的时间间隔去匹配逻辑0/1
显示库
Adafruit_SSD1306
其他问题
测试中发现红外的散射能力太强,如果要测试红外信号分布的话,需要设计好光路,否则无法判别方向;
参考资源
- 红外编码原理(https://blog.youkuaiyun.com/wuhenyouyuyouyu/article/details/105900088)
- 太极创客(http://www.taichi-maker.com/oled-weather-time-tv/)
- 显示参考(https://www.jianshu.com/p/82ba466a5369)
- 红外参考(http://www.taichi-maker.com/homepage/reference-index/arduino-library-index/irremote-library/ir-send-example-1/)
- Adafruit参考(https://blog.youkuaiyun.com/dpjcn1990/article/details/103376058)