RTThreadIoTOS · 2021年08月17日

【奇思妙想】0.1元成本柿饼派实现红外控制空调了

image.png

柿饼派实现红外红控制

突发奇想,柿饼派如果可以控制红外设备是不是很方便?遗憾的发现空调的UI界面,没有红外输出控制设备的能力,于是决定自己动手实现!

image.png

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

image.png

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

image.png

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

image.png

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

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

38K载波实现方法

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

image.png

分析有几个因素注意。

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

image.png

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

image.png

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
推荐阅读
关注数
8071
内容数
181
小而美的物联网操作系统,经过14年的累积发展,RT-Thread 已经拥有一个国内最大的嵌入式开源社区,同时被广泛应用于能源、车载、医疗、消费电子等多个行业,累积装机量超过4亿台,成为国人自主开发、国内最成熟稳定和装机量最大的开源 RTOS。
目录
极术微信服务号
关注极术微信号
实时接收点赞提醒和评论通知
安谋科技学堂公众号
关注安谋科技学堂
实时获取安谋科技及 Arm 教学资源
安谋科技招聘公众号
关注安谋科技招聘
实时获取安谋科技中国职位信息