iOS耳机红外线遥控器

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/dfman1978/article/details/73614340

前言

目前家里很多家用电器都是使用红外线遥控的,如果知道这些遥控器的红外编码,就可以使用手机利用手机的耳机口输出红外信号,从而把手机变成红外遥控器。目前输出红外信号可以通过一个红外发光二极管来实现。这个红外发光二极管可以自己手动做
这里写图片描述
(网上找的,侵删)
也可以在淘宝上买一个
这里写图片描述
硬件原理可以参考这篇文章
http://www.icpcw.com/Smartphone/Android/Skill/3234/323495_all.htm

原理

任何红外线的信号都是可以由一串二进制编码翻译表达出来的,手机通过外设或内部遥控模块电压信号都可以传递出一串含有二进制编码信息,转化为红外遥控器的红外线发射出来。在消费类电子红外遥控系统中,红外信号的载波频率一般都是38KHz的正弦波。在发送载波之前,首先要确定正弦波的频率,产生音频的采样率,采样点的位数等信息。一般手机耳机音频口输出的音频频率应该在19kHz左右,根据采样定律

在进行模拟/数字信号的转换过程中,当采样频率fs.max大于信号中最高频率fmax的2倍时(fs.max>2fmax),采样之后的数字信号完整地保留了原始信号中的信息,一般实际应用中保证采样频率为信号最高频率的2.56~4倍;采样定理又称奈奎斯特定理。

信号调试方式,有脉冲宽度调制(PWM)和脉冲位置调制(PPM)等方法,大多的家用电器使用PPM调制方式。
即发送脉冲信号和不发送脉冲信号分别表示0和1,当然也可能相反。

如果发送载波的频率是19kHz,那么采样率至少应该是44100.采样点数位数是16位。做法就是通过通过红外码算出载波的值,然后添加一个WAV头,通过耳机孔发出去。

红外波形码的获得

红外码的获得一个方法是可以通过是将「遥控精灵」输出的音频录音下来。硬件连接是使用一个公公的耳机插头将「遥控精灵」输出的按键波形录制下来,可以通过软件Audacity录下来,计算波形的时间间隔。
网上也有专门的公司出售遥控器的红外码,这个比较方便。下面就是海信电视的开关功能的红外波形码(这个红外码是时间码)

[8985,4481,578,555,578,555,578,555,578,555,578,555,578,555,578,555,578,555,578,1688,578,1688,578,1688,578,1688,578,1688,578,1688,578,555,578,1688,578,1688,578,555,578,1688,578,1688,578,555,578,555,578,556,578,555,578,555,578,1688,578,555,578,555,578,1688,578,1688,578,1688,578,1688,578,40734,8985,2242,578,96165]

软件实现

下面就以实现遥控器的开关功能来看一下iOS如何实现遥控功能

#define kNum 0.0441  //1微妙采样的点数
#define KAmplitude 32767
#define kFrequency 19000
#define KSampleRate 44100 //采样率

由于每个采样点16个bit来保存,所以正弦波的振幅最高就是32767.由于采样率是44100,那么一个微妙采样点的就是0.0441,那么每个时间码之内的点数就是时间0.0441.例如上面这个开关码的第一个时间码是8985微妙,那么这个时间内的采样点数8985*0.0441= 396个点。
而正弦波产生就是利用正弦曲线函数

y=Asin(ωx+φ)+k

在这里A是 32767,ω的值为2π/19000, φ为0. x的值为j/44100,j为采样的序号。而为了产生一个直流分量驱动发光二极管进行发光,sin(ωx+φ)值需要进行调制,这个值也不是确定的,调整下来为0.3。那么产生正弦曲线计算公式为

 double dVal = 0.3+(double)(0.3*sin(2*M_PI*((double)kFrequency)*((double)j/44100)));
 short val = (short)(dVal*KAmplitude);

由于是通过左右声道连接来导通二极管发光,所以要给一个声道正值,一个声道负值。整个产生正弦曲线函数的代码如下

NSMutableData *pcmData = [[NSMutableData alloc] init];

    for(int i=0; i<num;i++){
        if (i%2 == 0) {//如果是偶数,产生正弦波
            int allNum = plus[i]*kNum;
            for (int j=0; j<allNum; j++) {
                double dVal = 0.5+(double)(0.5*sin(2*M_PI*((double)kFrequency)*((double)j/44100)));
                short val = (short)(dVal*KAmplitude);
                NSData *data = [NSData dataWithBytes:&val length:sizeof(short)];
                [pcmData appendData:data];
                short valMin = (short)(-val);
                NSData *data1 = [NSData dataWithBytes:&valMin length:sizeof(short)];
                [pcmData appendData:data1];

            }
        }else{//如果是奇数,填0
            int allNum = plus[i]*kNum;
            for (int j=0; j<allNum; j++) {
                double dVal = 0.0;
                short shortData = (short)(dVal);
                NSData *data = [NSData dataWithBytes:&shortData length:sizeof(short)];
                [pcmData appendData:data];
                short shortData1 = (short)(-dVal);
                NSData *data1 = [NSData dataWithBytes:&shortData1 length:sizeof(short)];
                [pcmData appendData:data1];
            }

        }
    }

其中num为红外时间码的个数,plus[]为保存时间码的数组。

把产生的数据添加一个WAV头,就可以生成wav声音文件,通过AVAudioPlayer给播出

 //给音频数据添加wav头
    NSMutableData *wavData = [[NSMutableData alloc] init];
    [self addWavHead:wavData FrameSize:pcmData.length];
    [wavData appendData:pcmData];

 //播放音频数据
    NSError *error;
    _audioPlayer = [[AVAudioPlayer alloc] initWithData:wavData error:&error];
    if (error) {
        NSLog(@"error log is %@",error.localizedDescription);
    }else{
        [_audioPlayer play];
    }
阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页