柿饼派实现红外红控制
突发奇想,柿饼派如果可以控制红外设备,是不是很方便,但是发现只有空调控制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的代码如下所示。
struct rt_audio_caps caps = {0};
snd = rt_device_find("sound0");
rt_device_open(snd, RT_DEVICE_FLAG_WRONLY);
/* 设置采样率、通道、采样位数等音频参数信息/
caps.main_type = AUDIO_TYPE_OUTPUT; /输出类型(播放设备 )/
caps.sub_type = AUDIO_DSP_PARAM; /设置所有音频参数信息/
caps.udata.config.samplerate = 192000; /采样率/
caps.udata.config.channels = 1; /采样通道/
caps.udata.config.samplebits = 16; /采样位数 */
rt_device_control(snd, AUDIO_CTL_CONFIGURE, &caps);
caps.main_type = AUDIO_TYPE_MIXER;
caps.sub_type = AUDIO_MIXER_VOLUME;
caps.udata.value = 99;
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的载波了,是不是很简单?
int16_t pcm[5]={32767,32767,32767,-32768,-32768};
for(int i=0, i<21; i++)
{
rt_device_write(snd, 0, pcm, sizeof(pcm));
}
3 逻辑1之后大约有2.25-0.56=1.69ms空载波区,意思这部分时间段没有发送38k载波,怎么实现呢,很简单,写入‘0’就可以了。实现代码如下。
int16_t pcm[5]={0,0,0,0,0};
for(int i=0, i<21; i++)
{
rt_device_write(snd, 0, pcm, sizeof(pcm));
}
4 输出的波形,细心的小伙伴发现没有,空载波区电平1/2电压,这样有个好处,红外LED不分正负极啦。是不是很方便呢?
5 目前的测试是在海尔空调测试的,如果小伙伴比较关心海尔空调的协议,请你留言告诉我。我会更新一下这部分的实现方法以及代码。
6 如果小伙伴这个红外控制不想写代码实现,其实还有个简单的办法,我们可以制作一个wav文件,比如命名turn_on_25.wav,turn_off.wav,使用wavplayer播放,这样就可以0代码实现控制空调了。是不是感觉很酷?
7 实操测试的视频。顺便告诉大家,柿饼派M3加入激动人心的语音识别啦,离线控制空调了。
原作者:14510690