Android万能遥控菜单选择添加,Android万能遥控器小应用

在很久很久以前,手机是有红外功能的,后来随着蓝牙技术的成熟,红外逐渐被蓝牙取代,不再是标配了。

红外本身还是有些优点,比如操作简便,成本低。要想在手机上添加红外功能,就要外接一个转换模块。

0818b9ca8b590ca3270a3433284dd417.png

现在市面上通过Headphone音频口外接MCU实现音频转红外的方案很多,拉卡拉是一个成功案例。

我们的目标是做一个具有学习功能的Android手机遥控器,通过音频转红外,控制大多家电设备。

0818b9ca8b590ca3270a3433284dd417.png

1. 硬件设计

0818b9ca8b590ca3270a3433284dd417.png  

0818b9ca8b590ca3270a3433284dd417.png

右声道输出稳频正弦波,为单片机提供电源

左声道作为tx数据线,phone到mcu

mic线作为rx数据线,mcu到phone

command线,接地

右声道电源供电存在问题,Android手机千差万别,手机里的音频codec模块也不尽相同,

D/A转换的放大倍数(增益)也不同,表现在有些人的手机上铃声大,有些铃声小。

这个值是在Android系统底层驱动里设置,一般无法用上层软件改变。

用galaxy nexus,nexus 4都由于放大倍数不够而导致供电不足,

而三星Galaxy S3就能提供足够的电压,一些山寨机的音量也足够大。

所以考虑更改硬件设计,加入钮扣电池,由硬件直接供电,这样比较稳妥。

2. 数据编码

自定义波形组织形式,这里提供两种频率,一种表示下一个bit不变,另一种表示下一个bit变化。

0818b9ca8b590ca3270a3433284dd417.png

自定义一帧数据的组包形式,一般有包头,包尾,校验位和数据。

0818b9ca8b590ca3270a3433284dd417.png

3. 核心代码

两个线程用来收发数据包

Runnable _outputGenerator = new Runnable() {

public void run() {

Thread.currentThread().setPriority(Thread.NORM_PRIORITY);

while (!_stop) {

updateOutputBuffer();

_audioTrack.write(_stereoBuffer, 0, _stereoBuffer.length);

}

}

};

Runnable _inputProcessor = new Runnable() {

public void run() {

Thread.currentThread().setPriority(Thread.MIN_PRIORITY);

while (!_stop) {

int shortsRead = _audioRecord.read(_recBuffer, 0, _recBuffer.length);

processInputBuffer(shortsRead);

}

}

};提供正弦波输出

double powerMutiplier = Math.PI * (double)_powerFrequency / (double)_sampleFrequency * 2;

_stereoBuffer[i*2+1] = (short) boundToShort(

Math.sin(powerMutiplier * _powerFrequencyPos++) * 32760);

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值