0.1元成本柿饼派实现红外控制空调了

发布于 2021-07-19 12:28:36    浏览:348

柿饼派实现红外红控制

  • 突发奇想,柿饼派如果可以控制红外设备,是不是很方便,但是发现只有空调控制UI界面,没有输出设备,感觉缺少点什么,动手干!

微信图片_20210719121453.png

  • 查阅资料发现,柿饼派只剩下一个引脚,PE10了,这个引脚还不支持PWM,苍天啊,大地呀,不会这样子吧。

微信图片_20210719124056.png

  • 不死心,再找找,看到市面有种手机通过耳机孔实现红外控制,觉得挺神奇,查阅资料发现,原来是音频模拟发射38k载波。

微信图片_20210719122747.png

  • 能否通过我们的柿饼派喇叭输出口外接一个0.1元的红外发射二极管。

微信图片_20210719122548.png

  • 详细实现过程,及代码见第二季,你的点赞是我的动力...

柿饼派实现红外红控制第二季

38K载波实现方法

  • 下图是常见的红外遥控NEC协议,比较关心的是560us那段38K载波的实现。每个脉冲是一个560us长的38kHz载波脉冲(大约21个周期)。一个逻辑“1”需要2.25毫秒来传输,而一个逻辑“0”只需要一半的时间,即1.125毫秒。建议载波占空比为1/4或1/3。

微信图片_20210720230221.png

  • 分析有几个因素注意。
  • 1 因为红外载波频率38K,理论上要求采样率至少是38K的2倍76k,查阅资料,发现柿饼M3的DAC支持的采样率8k-192k。为了保证效果,选择192K采样率。或许会好奇地小伙伴问,为什么不配置标准的38K的整倍数采样率呢?其实我也想啊,但这是个CODEC,寄存器只有4BIT配置,只有16种固定好的采样率,供我们选配而已。为了保证输出红外发射足够的距离,将音量配置99。虽然这样做有点夸张。配置DAC的代码如下所示。

微信图片_20210720231152.png

    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不分正负极啦。是不是很方便呢?

微信图片_20210721001230.png

  • 5 目前的测试是在海尔空调测试的,如果小伙伴比较关心海尔空调的协议,请你留言告诉我。我会更新一下这部分的实现方法以及代码。
  • 6 如果小伙伴这个红外控制不想写代码实现,其实还有个简单的办法,我们可以制作一个wav文件,比如命名turn_on_25.wav,turn_off.wav,使用wavplayer播放,这样就可以0代码实现控制空调了。是不是感觉很酷?
    如果你想听一下红外的声音,请点击 ac_turnon_38k.wav
  • 7 实操测试的视频。顺便告诉大家,柿饼派M3加入激动人心的语音识别啦,离线控制空调了,如果小伙伴需要关心语音这方面的情况,那请你给我点个赞吧!你的点赞是我更新第三季的动力哦!

视频地址请点击 https://m.bilibili.com/video/BV1iV411H7AX

5 条评论

发布
问题