姓名:袁永辉 学号:17101223423
转载自:http://mp.weixin.qq.com/s/-qeGnGGUu0f6gvM_E7sa1Q
【嵌牛导读】:随着蓝牙功能在手机上的普及,红外功能逐渐被取代,但对于我们学习还是很有好处的。
【嵌牛鼻子】:红外功能 音频转红外 硬件设计 数据编码
【嵌牛提问】:是通过怎样具体的线程控制的?
【嵌牛正文】:
在很久很久以前,手机是有红外功能的,后来随着蓝牙技术的成熟,红外逐渐被蓝牙取代,不再是标配了。
红外本身还是有些优点,比如操作简便,成本低。要想在手机上添加红外功能,就要外接一个转换模块。
现在市面上通过Headphone音频口外接MCU实现音频转红外的方案很多。
我们的目标是做一个具有学习功能的Android手机遥控器,通过音频转红外,控制大多家电设备。
1. 硬件设计
· 右声道输出稳频正弦波,为单片机提供电源
· 左声道作为tx数据线,phone到mcu
· mic线作为rx数据线,mcu到phone
· command线,接地
右声道电源供电存在问题,Android手机千差万别,手机里的音频codec模块也不尽相同,
D/A转换的放大倍数(增益)也不同,表现在有些人的手机上铃声大,有些铃声小。
这个值是在Android系统底层驱动里设置,一般无法用上层软件改变。
用galaxy nexus,nexus 4都由于放大倍数不够而导致供电不足,而三星Galaxy S3就能提供足够的电压,一些山寨机的音量也足够大。
所以考虑更改硬件设计,加入钮扣电池,由硬件直接供电,这样比较稳妥。
2. 数据编码
自定义波形组织形式,这里提供两种频率,一种表示下一个bit不变,另一种表示下一个bit变化。
自定义一帧数据的组包形式,一般有包头,包尾,校验位和数据。
3. 核心代码
两个线程用来收发数据包
[java] view plain copy
1. Runnable _outputGenerator = new Runnable() {
2. public void run() {
3. Thread.currentThread().setPriority(Thread.NORM_PRIORITY);
4.
5. while (!_stop) {
6. updateOutputBuffer();
7. _audioTrack.write(_stereoBuffer, 0, _stereoBuffer.length);
8. }
9. }
10. };
11.
12. Runnable _inputProcessor = new Runnable() {
13. public void run() {
14. Thread.currentThread().setPriority(Thread.MIN_PRIORITY);
15.
16. while (!_stop) {
17. int shortsRead = _audioRecord.read(_recBuffer, 0, _recBuffer.length);
18. processInputBuffer(shortsRead);
19. }
20. }
21. };
提供正弦波输出
[java] view plain copy
1. double powerMutiplier = Math.PI * (double)_powerFrequency / (double)_sampleFrequency * 2;
[java] view plain copy
1. _stereoBuffer[i*2+1] = (short) boundToShort(
2. Math.sin(powerMutiplier * _powerFrequencyPos++) * 32760);