柿饼派实现红外红控制
突发奇想,柿饼派如果可以控制红外设备是不是很方便?遗憾的发现空调的UI界面,没有红外输出控制设备的能力,于是决定自己动手实现!
查阅资料发现,柿饼派只剩下一个引脚,PE10了,这个引脚还不支持PWM,苍天啊,大地呀,不会这样子吧。
不死心,再找找,看到市面有种手机通过耳机孔实现红外控制,觉得挺神奇,查阅资料发现,原来是音频模拟发射38k载波。
能否通过我们的柿饼派喇叭输出口外接一个0.1元的红外发射二极管。
详细实现过程,及代码见第二季,你的点赞是我的动力...
柿饼派实现红外红控制第二季
38K载波实现方法
下图是常见的红外遥控NEC协议,比较关心的是560us那段38K载波的实现。每个脉冲是一个560us长的38kHz载波脉冲(大约21个周期)。一个逻辑“1”需要2.25毫秒来传输,而一个逻辑“0”只需要一半的时间,即1.125毫秒。建议载波占空比为1/4或1/3。
分析有几个因素注意。
1、因为红外载波频率38K,理论上要求采样率至少是38K的2倍76k,查阅资料,发现柿饼M3的DAC支持的采样率8k-192k。为了保证效果,选择192K采样率。或许会好奇地小伙伴问,为什么不配置标准的38K的整倍数采样率呢?其实我也想啊,但这是个CODEC,寄存器只有4BIT配置,只有16种固定好的采样率,供我们选配而已。为了保证输出红外发射足够的距离,将音量配置99。虽然这样做有点夸张。配置DAC的代码如下所示。
1 struct rt_audio_caps caps = {0};
2
3 snd = rt_device_find("sound0");
4 rt_device_open(snd, RT_DEVICE_FLAG_WRONLY);
5
6 /* 设置采样率、通道、采样位数等音频参数信息 */
7 caps.main_type = AUDIO_TYPE_OUTPUT; /* 输出类型(播放设备 )*/
8 caps.sub_type = AUDIO_DSP_PARAM; /* 设置所有音频参数信息 */
9 caps.udata.config.samplerate = 192000; /* 采样率 */
10 caps.udata.config.channels = 1; /* 采样通道 */
11 caps.udata.config.samplebits = 16; /* 采样位数 */
12 rt_device_control(snd, AUDIO_CTL_CONFIGURE, &caps);
13
14 caps.main_type = AUDIO_TYPE_MIXER;
15 caps.sub_type = AUDIO_MIXER_VOLUME;
16 caps.udata.value = 99;
17 rt_device_control(snd, AUDIO_CTL_CONFIGURE, &caps);
2、 载波的560us时间长度计算方法。目前采用了192k采样率,也就是1ms内有192个采样点,很容理解吧?那么560us就是0.56ms,算了一下, 192*0.56=107
大约有107个采样点,192k/38k=5.052631...
,大约是5倍左右的样子,表示大约5个采样点表示38k载波的一个周期。于是定义一个数组,并且赋值32767,-32768,因为这样的数值可以使DAC可以输出比较陡峭的方波,最后通过rt\_device\_write写入soud0设备中,大约重复写入107/5=21
次,每个脉冲是一个560us长的38kHz载波脉冲(大约21个周期)。即可实现长度560us的载波了,是不是很简单?
1int16_t pcm[5]={32767,32767,32767,-32768,-32768};
2for(int i=0, i<21; i++)
3{
4 rt_device_write(snd, 0, pcm, sizeof(pcm));
5}
3、逻辑1之后大约有2.25-0.56=1.69ms空载波区,意思这部分时间段没有发送38k载波,怎么实现呢,很简单,写入‘0’就可以了。实现代码如下。
1int16_t pcm[5]={0,0,0,0,0};
2for(int i=0, i<21; i++)
3{
4 rt_device_write(snd, 0, pcm, sizeof(pcm));
5}
4、输出的波形,细心的小伙伴发现没有,空载波区电平1/2电压,这样有个好处,红外LED不分正负极啦。是不是很方便呢?
5、目前的测试是在海尔空调测试的,如果小伙伴比较关心海尔空调的协议,请你留言告诉我。我会更新一下这部分的实现方法以及代码。
6 如果小伙伴这个红外控制不想写代码实现,其实还有个简单的办法,我们可以制作一个wav文件,比如命名turn\_on\_25.wav,turn\_off.wav,使用wavplayer播放,这样就可以0代码实现控制空调了。是不是感觉很酷?
如果你想听一下红外的声音,请点击 ac\_turnon\_38k.wav
7 实操测试的视频。顺便告诉大家,柿饼派M3加入激动人心的语音识别啦,离线控制空调了,如果小伙伴需要关心语音这方面的情况,那请你给我点个赞吧!你的点赞是我更新第三季的动力哦!
作者开源地址:https://gitee.com/achinwoo/lib_audio_remote
推荐阅读
【国产MCU系列】在 HK32F030 上移植 RT-Thread Nano
【如何把Linux工具里的“军刀”BusyBox移植到RT-Thread Smart?
【RT-Thread开源作品秀】基于STM32F407与RT-Thread的智能水培系统
原文链接:【奇思妙想】0.1元成本柿饼派实现红外控制空调了
作者: wuxinzheng