admin管理员组

文章数量:1539777

2024年1月19日发(作者:)

手机与设备音频接口通信原理及案例分析

简单目录(部分内容目录中未显示)

android音频口通信——2FSK信号调制2 ......................................... 2

一、前言................................................................. 2

二、通信建立的基础——耳机线上传输的信号 ................................. 3

三、如何调制数据 ......................................................... 4

3.1 何为2FSK ........................................................ 5

3.2 android下实现2FSK(纯软件调制) ................................. 6

3.3 android下音频播放相关 ........................................... 6

四 补充.................................................................. 8

一、解调电路 ......................................................... 8

二、解调原理 ......................................................... 9

如何从手机音频口获得电能 .................................................... 11

利用音频线与arduino进行通信 音频信号频率计 ................................. 17

拉卡拉手机刷卡器音频通讯技术原理初步分析 .................................... 26

关于手机音频通信实际开发经验分享 ............................................ 33

一、手机音频通信的特点 .................................................. 33

二、手机音频通信分类 .................................................... 33

四、各个通信方案对比分析 ................................................ 34

三、手机音频通信硬件通信方式分类:手机音频通信的硬件通信方式大体可分为方波和正弦波两种。 ............................................................ 36

五、研发注意事项(通讯方案分析部分由于过长,放到最后来讲) .............. 37

android音频口通信——2FSK信号调制2

一、前言

今天要和大家分享一个本人最近研发的完全具有自主知识产权的项目——android音频口通信,并寻求有兴趣的同行和友人一起合作!

大家都知道拉卡拉,但它具体的技术实现我相信很少有人能说出来个一二,本人也正是抱着遇见问题勇往直前的技术男的精神,花了一两个月的时间,完全摸透并已初步实现了用android手机的音频口(耳机输出输入)来实现全双工的通信,一但通信协议建立了,下面好玩的东西就多了!!

你可以完全不再用担心你家的电视或者空调等此类用红外遥控的电器一时找不到遥控器而烦恼了,加上我现在研发的音频口扩展头,将其插入你的android手机的耳机口,装上特制的APP,你将可以用它来遥控你家的任何带红外遥控功能的电器!

你也可以抛开目前那种单调的耳机口防尘塞,加上相应的扩展头,你将可以实时知道你周围环境的温度、湿度等等指标……

诸如此类的运用,数不胜数,在这里我就不一一列举了,下面转入我们的正题吧(^_^不好意思,闲话说多啦,哈哈……)

二、通信建立的基础——耳机线上传输的信号

我们知道,耳机是用来听音乐,打电话的,既然是和声音相关的,那么耳机线上传输的就是音频信号,常见的音频信号一般都是在100Hz——10KHz左右的范围内,那么手机里面的音频输出系统(DA和音频功放)的幅频特性(也既带宽)一定也是在这个范围(这是本人的猜想,由于设备和仪器有限,没有进行系统的测试,有兴趣的朋友可以用相关的测试仪器测测)

那么,既然有带宽,好家伙,我们就可以通过努力在这个频带内实现我们的通信信道了!另外值得提的一点是,耳机线上传输的音频信号是交流的!

下面我们来看看市面上常见的耳机座(公头)的引脚定义,android手机上用的耳机大多都是3.5mm的四芯座,在这四个芯中,分别是:地、左声道、右声道和线控开关(MIC),而这四芯的排列常见的有如下两种:

1、国家标准

2、国际标准

国际标准耳机座MIC和GND和国内标准是反的,其它的一样!

不难发现有了左右声道,向外设扩展头供电和发送数据就有了相应通信线路的支持,另外有了MIC这个打电话时输入说话的信号通道,那么手机接收数据也有了硬件通道的支持了!

三、如何调制数据

说到信号的调制解调,很多人都会想到收音机,没错,收音机之所以能听到千里之外的歌声,正是利用了电磁波作为传输媒介,将声源的信号通过特定的调制加载到电磁波上,然后传输到

广阔的空间里的,无线电的调制有调幅(AM)、调频(FM)和调相(PM)三种,而调制又有模拟调制和数字调制之分,模

拟调制就是把模拟信号(比如人说话的声音)直接加载到电磁波上,使得电磁波的某一特性随着声源的变化而变化;而数字调制是近现才发展起来的,特别是DSP(没错,就是数字信号处理)技术的发展,数字调制中的FM有2FSK(2进制调制)、4FSK(4进制调制)、8FSK(8进制调制)等等。

由于在数字系统中,使用的是0、1表示的二进制数据,在这里,我使用了2FSK来作为信号的调制。

3.1 何为2FSK

2FSK按字面的英语全称是:2(binary

system) Frequency-shift keying(二进制频移键控),就是用二进制里的0、1来控制载波的频率,从而达到通信的目的!例如:我们用1ms长、1KHz的正弦信号来代表二进制里的1;用1ms长、2KHz的正弦来代表二进制里的0;那一连串的1KHz、2KHz的信号解调出来就是一连串的0和1,这样是不是达到了我们想要的二进制调制的目的了?

下面我们来看一张更加形像的gif动画图

3.2 android下实现2FSK(纯软件调制)

要实现2FSK,首先我们得在android系统下面获得一个基准的正弦信号发生器,有了这个基准的正弦信号发生器,只要给它一个二进制量(0 or 1),就可改变输出频率,从而达到我们想要的信号调制目的。

下面直接上图了,经过调制后的信号输出波形图:(黄色的是实际输出波型、红色方波是我

后来P上去的对应二进制数据)

这是我定义的通信协议头的一部分是:0x5AA5

3.3 android下音频播放相关

android下音频播放的基本步骤如下:

①获取对应音频采样率下的最小缓冲区的大小

[java] view plaincopyprint?

1. public static int

2.

3.

1.

②新建AudioTrack

[java] view plaincopyprint?

2. new

3.

4.

5.

6. 2

③将缓冲区中的音频数据写入音频播放线程并设置左右声道音量等

[java] view plaincopyprint?

1. 0//写入音频数据

2. //刷新

3. 10//设置左右声道播放音量

4. 01//设置音频播放循环点

5. //开始播放

这部分代码是左声道对外部扩展头进行供电的,所以要设置循环播放,如果是发送消息就不必循环了!

四 补充

一、解调电路

我的设计中,解调端用的是MSP430的单片机,因为TI这种系列的单片机功耗很低,在休眠状态下,电流可达到uA级,正常工作下电流也可以保持在几个mA级左右。

将手机右声道接至MSP430单片机的P2.3脚,在代码里设置并激活此引脚的第二功能(比较器0)的正向输入端,并将比较器0的反向输入端配置成内部VCC/2参考电压,如图,在手机右声道上用两个100K的电阻对VCC进行分压,所以只要右声道的电压在比较器导通的范围内变化时,比较器就能捕获到手机右声道上的信号了!下图是比较器的输出特性

像上一节中的那种调制信号经过比较器之后的输出波形图如下:

二、解调原理

既然前面的调制信号是用不同频率的波形来表示的,经过比较器之后,输出的波形如上图所示,很容易发现,这些宽窄有续的

方波里就携带了我们想要的信息,然后再通过MSP430单片机里的捕获器来捕获这些方波信号

并用定时器来计算这些方波的时间,从而解调出我们前面调制的信号,从而获得码元。解调方框图如下:

如何从手机音频口获得电能

时下手机音频(耳塞)口的外设配件已不是什么新鲜事了。

目前应用最广的就是支付领域了,似乎Square公司在2011年就展开了移动支付业务,推出的刷卡支付方式受到的广泛的使用和好评,在短短的一年时间做出了惊人的成绩。现在国内也有很多厂商模仿退出类似产品和服务。

Square的产品

国内的类似产品

从图上可以看出,这些个玩意儿只是利用了手机的耳塞插口,所以电源、通信都在一个耳塞插口。

这个项目Hijack

/~prabal/projects/hijack/ 是另外一个更好的应用耳塞插口的例子。

Hijack

HiJack是一个硬件和软件平台,用来在小型、低耗电周边设备和iOS设备之间建立通信。该系统采用22kHz音频信号,将其转换为7.4mW电能(转化效率47%),可以带动一个TI MSP430微控制器和其它电子元件,允许HiJack和iOS应用进行通信。所有的资料都能在上面给的链接找到,有兴趣的可以自己动手做一个。

本文就单独对如何从手机音频口获得电能做一个介绍。

下面是我的实验过程:

1. 手机的耳塞插孔简介

手机耳塞插孔线都是由四根线组成,也就是插头前面分成四部分,1和2是两路音频输出,这个对所有耳机插孔都是兼容的,极个别厂商也许会有例外?至少我没见过。因为普通的3根线的耳塞在那款设备上都可以用,普通耳塞的3、4两根线其实只有一根的,也就是上图中的3、4中间是没有隔开的,就是一跟底线GND。而手机的

耳塞插孔3、4有一根是GND,还有一根则是麦克风MIC输入。这两根线好多厂商都不一样,比如iphone就是3对应GND,4是MIC;而我手头的索爱E15i和诺基亚E63则是3对应MIC,4对应GND,华为C8812则跟iphone一样。

2. 电路

这是电路和对应的元器件型号表(价目都列出来了):

J1接耳塞一路输出(另外一路还可以留作他用)。之后是一个升压变压器T1,因为输出的音频电压很低,甚至不能触发后面的FET导通,所以需要先升压。升压完了之后经过FET组成的桥整流电路,再经D1调整以后就得到直流输出。实际做电路的时候发现T1很难买,价格比起这个指导价巨贵,这个指导价是一万片的价格,另外Q1-Q4也不好买,就用了A3401和A3402代替。

做好以后像下面这样,ugly but works:

3. 实验

音频输出找了个Android simple frequency generator的软件,它可以调整输出频率和波形,结果发现输出16448HZ的方波的时候输出电压最大。其实是可以通过最佳匹配输入阻抗来计算这个频率值的,但是不清楚厂商的技术指标,所以直接试也是不错的办法,而且很方便。

华为手机能得到2.2v的电压,发光二接管亮了。

索爱的能得到2.8V。

Hijack的文档上说它在iphone能得到3.5v电压,不曾考究过。如果电压在2.2V-2.8V,可以加个charge pump来调整到3.3V。只要最后功率能达到驱动应用电路就可以了。

利用音频线与arduino进行通信 音频信号频率计

前言部分

在多媒体电子设备中,音频设备是不可缺少的。音频就是指我们人耳正常能听到的机械振动所对应的频率范围,一般在20Hz到20kHz之间。一般来说,机械振动发声(比如人的喉咙内的空气振动)通过介质传递到声音采集器中,然后使采集器产生相应的模拟信号,这些信号通过音频接口接入一个高质量的数模转换器(就电脑而言是是声卡),转成计算机或其它多媒体设备可以处理数字信号。而如果这些设备想复原声音,只需要将信号再次返回给数模转换器,重新转换成模拟信号,驱动音响等设备产生相应的机械振动,传到耳朵里就是声音了。

说了这么多,听起来很枯燥。不过我们换个思路去思考,在这个音频的传递过程中,我们若把那些机械振动的采集和产生设备换成其他的我们想要的信号产生和接受装置,那么原则上我们是可以实现这些装置与电子设备的通信的,例如,电脑上的声卡可以帮助我们实现外部设备的拓展。我们将两个电子设备通过这一系列装置去连接,进而通信,这也是可能的。

最简单的例子便是两个手机上《会说话的tom猫》对着喊话,如果我们按照原理说,这两部手机不仅实现了通信,还是无线通信。不过,这的确是个很糟糕的例子。做过这个实验的人就发现,每次成功

的概率不是很高,语音反复重复的过程很中可能因为周围的响声被混入而彻底和以前不一样。因为这里面的无线传输的实际是通过机械振动传输实现的,也就是声音。声音有强弱的差异,也就是所谓的在模拟信号中电压的大小,声卡或者其他音频处理设备要负责将他们转化和还原,并不是一件简单的事情。做个类比,这样传递过程就好像一队人从头到尾传一句话,即使话的含义不发生改变,说话的语气和其他因素也是难以复制的。不过我们如果换个方式,使用纸条的话,只要语义清晰,中间有人传下去,到最后队尾收到的肯定是队头想要表达的内容。而在电子设备的通信中,我们正是通过这种“传纸条”的方式去做。这种”纸条“,我们就叫做数字信号。那也许有人问,那声卡采集和产生的不是模拟信号吗?的确如此,不过模拟信号也可以看做数字信号,数字信号本身也可以看成一种简化了的模拟信号,本来连续的电压值被离散的限定在0和1两个数字里。正是因为我们忽略了“语气”之类的我们无法把握的信息,“纸条”才方便传递,数字信号就是这个道理。

( 不过,模拟信号才是音频设备的重头戏,不信看看森海塞尔耳机和高保真功放的价格。我们选择数字信号传播主要原因也是要避开这些不必要的成本。)

那么,有什么现成的例子可以证明这个在音频设备间使用数字信号的想法是可行的呢?电话。电话在拨号时发出不同音高的声音不是偶然的,每个数字对应一个频率,这些固定频率的声音被转化成电流再通过电话线传递给控制端,控制端再根据频率的顺序得到数字的顺序,

也就是电话号码,再按照既定的程序接通对应用户的电话。这样我们就用按键完成了一段指令的输入,又经过一系列的信号的传递和转换,完成了对远程终端的控制。而如果我们把这种做法更复杂化点,就是所谓拨号上网。不过,这个信号的传递所使用的频率,远远超过了音频的所谓20-20kHz定义,但是我们看到,原理还是一样的。不过,原来的声卡被换了个名字,叫调制解调器。而原来声卡中最重要的数模转换器也被尽量的简化掉了,因为我们只需要0或1,或者多几个数字而已。

现在回头讨论下,为什么要利用电话上网。原因很简单,电话是最普及的音频设备,甚至说是最普及和最简单的远程通信装置,即使在网络时代也是这样。电话线的覆盖范围基本是100%,而移动通信的信号那就不必说了。这样在电话线上载入网络通信,就避免了重新布线入户的成本。而从我们的角度看,手机,mp3,电脑,这些最常见的电子设备,都有一个共同音频端口,我们甚至没有必要为这个端口做特别的修改,就能做很多事情,比如手机与单片机通信。有人说,ADK就好了?不过ADK需要新的成本,以及复杂的配置,这些配置对于一般用户来说太难以解释了,就是极客也很难上手。而音频端口,只要一根线,一个简单的放大器电路,,一个写好的通信协议,也能完成类似的事情。事实上,网络上已经流传了android利用音频线与串口通信的程序,请去电子市场搜索和下载AudioSerialOut程序,一目了然。他们的官方网站也提供了一致的思路,笔者讲在下文中讲解。

另外,iphone用户也不必发愁,虽然苹果能锁死usb,但是在国

外,伟大的极客们早就悟出谁也无法锁

死音频端口的事实。不信,看看这个iphone盖革管计数器。注意连接方式。

首先是简单的电路部分。我们要做到单片机对音频信号的读取,就需要一个简单的放大电路。因为电脑音频输出大概只有几十毫伏,而arduino使用的avr单片机数字信号对应的高电平则是5v。幸运的是,因为我们需求的是简单的只有高低电平的数字信号的放大,模拟电路

里所谓的失真之类的问题就可以不必考虑了。

这里我们使用lm358作为放大器。电路原理图如下

注意这里,lm358的放大倍数远远超过了本身5v的电源电压的能力,这我们不必考虑太多,关键是在R1放上一个大电阻让放大倍数足够使arduino识别高低电平就可以了。另外记住,lm358输出的信号和原来的信号是反向的,高低电平会调置。国外那个网站(就是做Audioserial软件的那个用的是lm324,是4个放大器在一起,原理一致不做解释)所使用的我继续花了个接线图,注意这个图是为了省空间在元件下面走线了。

一般电脑是两个声道,充分利用了lm358的两个放大器,而放大器5v的电源寄生在arduino上也就可以了。输入端和音频插头连接,接线上,最靠近内侧的是地。输出端自然要连在arduino的数字端口上,这不用解释。

看看我自己悲催用耳机改的插头吧。

建议用铜丝拧成圈固定这个插头,焊锡是不沾的,所以固定不住。不过固定好还是要涂焊锡,只有面接触,才能保证信号质量,否则,杂波很夸张。这是我在面包板上做的lm358电路,只用了一个声道。

如果这些都做好,并且,没有啥故障的话,那么就可以进入软件方面的设计和调试了。

音频信号频率计

为了验证单片机可以顺利的读取高低电平信号并研究这个信号频率上的范围和精度,也为了研究arduino时钟的设置,我制作了一个音频信号频率计,arduino读取声卡模拟出的占空比为0.5的方波(就是均匀交替的高低电平信号),通过计时器,得到方波每个波谷的长度(因为是lm358反置),进而计算出这个方波的频率。首先我们要讨

论的是,计时器。

为了了解单片机上计时器的原理,我们先从最原始的计时工具——日晷和日历说起。古人通过观察日月星辰的变化规律,了解到,太阳做周期的往复运动

拉卡拉手机刷卡器音频通讯技术原理初步分析

1. 拉卡拉刷卡器

大家都知道,拉卡拉就是一个手机刷卡器。拉卡卡、智能手机、拉卡拉软件、网络,构成了一个完整的、更强大的POS系统。为什么说更强大呢?因为在手机应用app的这一层,拉卡拉可以做很多很多方便的功能,这样借助于类似传统的刷卡服务,提供一系列现在支付宝也正在大力发展的生活服务等功能。而这个是银联的POS所严重缺乏的。目前来说,移动支付里,最方便的肯定是支付宝的快捷支付;但考虑国内目前的安全环境,用户把银行卡和密码托管给一个网站来管理,明显不如用的时候输入一下的方式更能被接受。相对于更安全的

支付宝加网银的方式,拉卡拉做到了与发卡行无关,这样也不需要手机上安装各种不同的银行的网银客户端。所以,显然拉卡拉在某些应用场景比一些其他的移动支付方式更有优势。下面我们就来看看拉卡拉的技术原理是怎么回事。

2. 内部结构

上面左右是一个常见的拉卡拉设备,挺好看的。如果我们把它拆开来看,就如右图所示,当然除了这个东西,下面还有个耳机插头、侧面还有一个刷卡的槽。

总体来说,这个电路板很简单。

2.1 一个电池就占了绝大部分地方,导致整个拉卡拉个头偏大,可供刷卡万次以上(见参考资料1)。

2.2 左边的四根引线,对应于耳机插头上的4个区域。分别是左声道(Left)、右声道(Right)、麦克风(Mic)和接地线(Gnd)。其中L和R是接收手机往外输出信号的接口,M是输出信号到手机的接口。需要注意的是并不是所有的顺序都想右图所示。因为存在两个不一样的标准,国际标准和国家标准。像联想、中兴等大部分国产手机都是国家标准,跟右侧的图一样的顺序。而iphone、htc、三星、小米等手机都是国际标准,M和Gnd的顺序是反向的。拉卡拉的某些版本可以自动识别M和G的正反向。(见参考资料2)

2.3 电路板最右面的芯片处理输入信号和转换刷卡数据的AD(音频数字)处理模块,它是整个系统的核心。在手机应用里点击刷卡时,音频信号通过L或R从手机发送到电路板,通过AD模块转换成数据信号。刷卡时电路板拿到银行卡信息,再通过AD模块转换成音频传输给手机。当然手机APP应用里在信号出入的时候,也需要做相应的AD编解码工作,这个也是手机APP里最重要的工作。

3. 刷卡支付流程

手机与拉卡拉音频通讯示意图

手机与拉卡拉的音频通讯大概结构见上图,大概的流程是:

3.1 先在手机上打开拉卡拉的应用。点击刷卡。

3.2 手机应用会调用android api的AudioTrack,通过L和R线路给拉卡拉手机刷卡设备发送一段通知信号(L和R表达的信息是一样的,只是波形是反相的,L的高电平对应于R的低电平,还没搞清楚拉卡拉为什么这么设计)。

3.3 芯片上的通讯模块拿到音频信号,解码后发现是刷卡通知,就等待刷卡层传来刷卡信息。

3.4 在刷卡槽刷卡后,卡的信息传递给芯片。

3.5 芯片拿到卡的信息,编码成音频信号,同M线路发送给手机。

3.6 手机APP通过AudioRecord对音频信号进行采样,拿到数字信号。

3.7 手机APP程序通过对数据信号进行解码,拿到实际的数据信息,即卡的信息。

3.8 如果刷卡失败,则手机APP拿到的是一段失败提示信息。

3.9 至此手机与刷卡器的通讯完成,手机APP再使用此卡的信息与拉卡拉的服务器端后台通讯,处理后续支付操作。

其中的技术关键点是(细节本文暂不讨论):

a)传输上使用什么样的调制方式,采用什么样的波特率、频率。

b)通讯上如何制定合适的协议,包括如何判断信号开始、如何握手建立连接。

c)编码上如何编码表示数据,如何校验和纠错,如何滤波和解码数据。

4. 相关的一些技术问题

4.1 A/D转换的问题

耳机线传输一般是1250HZ~9600HZ之间的交流音频信号。信号的调制解调有3种方式,调幅(AM)、调频(FM)和调相(PM)三种。根据对拉卡拉的输入输出信号的分析,我们发现拉卡拉使用的是调幅方式,频率为9600HZ和4800HZ的音频信号。

4.2 耳机接口标准的问题

两种标准见2.2中所描述的。

4.3 不同android手机的问题

a)我们发现,在个别手机上,接收到的音频波形跟其他手机相比,是反相的。即高电平的波峰变成了低电平的波谷。这个问题可以在解码的时候,根据特定的前导码来判断。

b)手机Mic采样到的音频信号电平可能会不一样。例如同一段音频信号,使用A手机AudioRecord采样出来,波峰的值大概是32000;另外找一个手机可能是3200,根据我们的多种不同手机测试,发现可以相差10倍。处理方法是,可以额外的进行一次处理,先归一化;或者是滤波的时候,动态的根据峰值来调整阈值。

c)有些手机的Mic不认非标准的采样率。比如三星的I9308,如果使用9600*4的采样率初始化

AudioRecord,就会报错;改成44100就没有问题。

4.4 数据传输的效率

每次通讯报文在100字节左右(50个汉字左右)(见参考资料1)。因此,拉卡拉的传输效率看来不是问题。

4.5 数据传输的准确性

拉卡拉用了一个取巧的方式。其先发送一段9600HZ的音频信号,紧接着再发送一段表示同样数据的4800HZ的音频信号。如果手机能处理高频率的信号,后面的低频率信号就可以用来校验前面的数据。如果前面的处理有问题,直接从后面拿低频率的信号来处理也一样可以保证拿到完整的数据。当然,我们还可以在数据本身叫上校验和纠错。

4.6 数据的安全性

官方说“拉卡拉手机刷卡器内置有安全芯片,每一台刷卡器对应有唯一的银行卡磁条信息保护密钥。使用专用安全算法,保证一机一密,一次一密。用户的个人密码,采用RSA非对称加密方法进行加密”。(见参考资料1)

但是根据我们观察,貌似拉卡拉的电路板上并没有特殊的安全相关模块。整个体系也没有使用CA证书做相关的电子签名和身份认证。所以,其安全性还有待研究。

5. 更多的可能性

拉卡拉的使用场景还是太简单了。其基本上仅仅使用了一个刷卡后的信号通过音频MIC线路传输给手机APP的功能。传输的数据也很简单。其实相当于将数据从电路板发送到手机APP,通过L/R将数据从手机发送到电路板要更简单、更高效,这一块拉卡拉几乎没怎么用上。我们可以在这个系统结构上做更多双向的数据通讯,把一些安全性要

求更高的操作放到硬件上来完成,从而实现更高的安全保障,提供更多的功能,适用更多的应用场景。

关于手机音频通信实际开发经验分享

一、手机音频通信的特点

1、通用性强:在智能手机普及的今天,手机的对外通信接口多种多样,而其中以3.5mm的音频接口通用新最强,基本所有的手机、平板电脑都会有这个接口,所以在一些要求通用性的设备上,音频接口登上了舞台。

2、速率低:由于手机音频部分的采样频率一般为44.1KHZ(部分国产山寨为8KHZ),这极大的限制了音频通讯的速率。我们都知道44.1KHZ的采样频率,那么最高的信号频率只能为20KHZ左右,而信号周期也不可能只有2个采样点,通常要到10个以上,这样层层下来通讯速率可想而知。

3、小信号:音频通信的信号都是毫伏级的,各个手机厂商略有不同,但通常最大不超过200mv,通常我们通信使用的信号强度也就100mv左右,这导致信号比较容易受干扰,且在开发阶段对工具有着种种限制。

二、手机音频通信分类

1、无线方式:

a)无线方式大家可能不太熟悉,容我慢慢道来。我们都知道人耳能听到的声音频率为20HZ~20KHZ,而手机通信的信号频率最高也就20KHZ,所以无线通信方式是可行的。因为虽然人耳的极限听力能到

20KHZ,但普通人一般在19KHZ以上时基本就听不到了,所以如果信号的强度比较弱,且控制在19KHZ到20KHZ之间,那么我们就可以将之当做是“超声波”来看待了。

b)其实在此提到手机音频通信的无线方式,算是给大家一种产品开发思路吧。它的通讯半径在10M左右,前景还是很广阔的,大家有兴趣的可以试试。(其实已经有这方面的产品了)

2、有线方式:

a)有线方式分为单向(设备→手机)和双向两种,单向的限制少,开发难度也小一些,但实际应用时会受限制。而双向通信限制多,开发难度也大一些,但实际应用时更方便些。

b)设备→手机:曼彻斯特编码;FSK;DTMF;自定义正弦波

c)手机→设备:由于手机输出的音频信号很小,无法直接使用,要么用运放发大到合适的范围,要么用电压比较器转换成TTL方波。

四、各个通信方案对比分析

1、设备→手机:

a)曼彻斯特编码:在诸多通信方式中,曼彻斯特编码是最灵活简便的一种方法,编码信号可由单片机直接产生,经衰减电路衰减后便可直接使用。注意事项:曼彻斯特编码信号的生成有两种方式,一种是用PWM生成,一种是用定时器中断翻转IO,我个人比较倾向于定时器中断方式。因为我们知道曼彻斯特编码中有宽沿河窄沿之分,且宽沿和窄沿可能会灵活变化,而用PWM方式不容易精确控制宽沿、窄沿

输出的变化,而定时器中断方式则非常灵活且容易控制。(后面会送上我自己写的曼彻斯特编码、解码函数)

b)FSK、DTMF方式:FSK和DTMF两种方式大同小异,使用时通常都是用集成的芯片来生成的,而这些芯片通常都是遵守固定的通信协议的的要求(FSK为Bell202或V.23协议,DTMF记不清名字了)。这两种通信方式的优点是采用正弦波通信、稳定性好且使用简便。但由于固定通信协议的限制导致通信速率、比特率也受到限制而缺乏灵活性。在这里跟他家推荐一款英国的通信芯片CMX系列,这个系列的芯片融合的FSK、DTMF的编码、解码,还是很不错的,大家有兴趣可以试试。(相关手册在附件里)

c)信号发生器、锁相环方式:这种方式用信号发生器或者锁相环来产生方波或正玄波,由单片机来控制波形的输出,也可以实现音频通信,且十分灵活。但缺点是电路较复杂,且不同频率信号之间衔接不好掌握,用不好反而是麻烦。(相关手册在附件里)

d)在这里送上一种我个人认为比较好的方案:就是曼彻斯特编码加低通滤波器,由单片机输出曼彻斯特编码,再经由低通滤波器将方波滤成正弦波后输出。既解决了FSK、DTMF灵活性的问题,又解决了曼彻斯特编码方波稳定性、通用性的问题。在低通滤波器方面我个人采用的是“集成低通开关电容滤波器”,它成本虽然高一些,但好处也是明显的,电路简单,使用方便,且占用的空间亦很小。(相关手册在附件里)

2、手机→设备:

a)放大电路方式:将手机输出信号经放大电路放大到合适的幅值,然后有锁相环或者结成FSK、DTMF芯片进行解析。该中方式难度最大,需要非常强的模拟电路功底,我个人水平有限,故采用的另一种方式。

b)电压比较器方式:将手机输出的交流信号经电路强行拉到Vcc/2级别,然后加到电压比较器一端,另一段接比较电压Vcc/2,这样交流信号即被转化为TTL方波信号,此时再进行解析就变得很简单了。

三、手机音频通信硬件通信方式分类:手机音频通信的硬件通信方式大体可分为方波和正弦波两种。

1、方波:方波通常使用的是曼彻斯特编码方式(什么是曼彻斯特编码自己去查),它的好处是可以用单片机直接输出方波,经过衰减后即可使用,方便简单。缺点是兼容性不好,因为手机音频部分有这样一个特性,它只识别变化的电平信号,当麦克输入的信号长时间保持在某一非零电平时,手机会将其视为零,而强行拉回零电位。这就是采用方波通讯方式的兼容性不好的最大原因了,并且方波也容易受干扰。

2、正弦波:正弦波不会出现上面所说的方波的问题,故正弦波的兼容性和稳定性更好一些。通常采用方案有FSK、DTMF、信号发生器、或方波转正弦波等。(后面会对以上方案逐一分析)

3、通信信道分析

a)我们知道音频接口有4根线,MIC、地、左、右声道。设备→手机

用MIC,手机→设备用地、左、右声道中的任意一个。这里说一下,实际产品中,有一些厂家会更换地线,即将原本左、有声道中的一根改为地线来用,其实道理是一样的。因为音频通信的信号时交流信号,而地其实也是悬浮地,即便地线换了,最终的波形还是一样的,因为最终手机解析信号时需要的是频率和幅值。这样还剩下一个声道,通常被用来帮助设备进行上电识别,因为音频通信的设备通常都是电池供电的。

b)另外还要在MIC和地之间并联一个4.99K的电阻,因为手机是通过检测MIC和地之间的阻抗是否为4.99K(也有其他阻值的)来判断是否有设备(耳机)插入,这一点要谨记。

五、研发注意事项(通讯方案分析部分由于过长,放到最后来讲)

1、一个好手机录音软件是必须的,最好能在手机上直接看到波形的。

2、建议用笔记本电脑进行开发,而非台式机。因为音频信号很小,容易受干扰,而台式机干扰较大,笔记本还有一个好处是必要时可将外接电源拔掉,用电池供电。

3、一个好录音笔必不可少,有时需要得到纯净的音频信号,方便更加准确的分析。

4、做一个转接板,一边接音频母座,一边接音频公头,将MIC、地、左、右声道4跟线用排阵引出,方便录音。

5、做一个信号衰减电路,可将设备电路产生的信号衰减至音频接口

能承受的范围内。前期调试时,我们可以用该电路将信号录进电脑进行信号分析。(推荐一个电脑音频信号分析软件:Goldwave)

6、录音用的音频线切记不要太长,不然会给你带来不少麻烦。最好自己做,用音频裸头、杜邦线、排阵即可制作,方便好用。

曼彻斯特编码的编码解码函数如下:

1. /**********************************************************************

2. 注释:编码函数都是采用定时器中断的形式,以曼彻斯特编码的窄沿作为定时器周期。

3. 发送的数据包括1个起始位、8个数据位、1个奇偶校验位、3个停止位。

4. ***********************************************************************/

5.

6.

7.

8.

9.

10.

11.

12.

13.

14.

15.

16.

17.

18.

19.

20.

21.

22.

23.

24.

25.

26.

27.

28.

29.

30.

31.

32.

33.

34.

35.

static void VIC_VECT_Fucton_00(void)//发送编码数据中断函数

{

TIMER0IS =0x0;

if((send_time%2==0) && (send_start==1))

{

switch(FSK_txState)

{

case STARTBIT:

if((GPIODATA&0x00000002)==0x00000000)//如果检测到数据发送管脚为零

send_time++;

else

{

currentSym=0;

FSK_txState = BYTE;

}

break;

case BYTE:

if(txBit < 8)

{

currentSym = (send_byte >> txBit) & 0x01;

txBit++;

txParity += currentSym; //奇偶校验位

}

else if (txBit == 8)

{

currentSym = txParity & 0x01; //发送奇偶校验位

txBit++;

}

else if(txBit>8 && txBit<12)

{

// next bit is the stop bit

36.

37.

38.

39.

40.

41.

42.

43.

44.

45.

46.

47.

48.

49.

50.

51.

52.

53.

54.

55.

56.

57.

58.

59.

60.

61.

62.

63.

64.

65.

66.

67.

68.

69.

70.

71.

72.

73.

74.

75.

76.

77.

78.

currentSym = 1; //发送停止位

txBit++;

}

else if(txBit == 12)

FSK_txState = STOPBIT;

break;

case STOPBIT :

txBit=0;

FSK_txState=IDLE;

send_start=0;

txParity=0;

send_byte=0;

break;

}

if(lastSym!=currentSym)

{

timer1_num++;

lastSym=currentSym;

}

}

if(timer1_num%2==0)

GPIODATA&=0xFFFFFFFD;//输出管脚复位

else

GPIODATA|=0x00000002;//输出管脚置位

timer1_num++;//用来控制IO口的电平翻转

send_time++;//用来控制发送的字节的每一位

Delay++;//Delay就是延时函数

}

/**********************************************************************

注释:解码函数采用外部IO中断形式(上升沿或下降沿中断,即电平电平跳变中断),

用一个定时器作为时钟,每次产生中断时便从定时器见时间值取出,并和上一次的

记录做差求出时间间隔,以此来判断当前为宽沿还是窄沿。

***********************************************************************/

static void VIC_VECT_Fucton_04(void)//接受解码数据中断函数

{

GPIOIC|=0x00000001;//清楚上一次中断内容

RX_time=TIMER1VALUE;

if(RX_lasttime>=RX_time)

RX_diff=RX_lasttime-RX_time; //lasttime初始值为0

else

RX_diff=65535-RX_time+RX_lasttime;

RX_lasttime=RX_time;

79. switch(RX_state) //启动代码时state已经被配置为STARTBIT

80. {

81. case STARTBIT_FALL:

82. if ((SHORTINTERVAL

83. {

84. if(RX_ones<5) //ones初始值为0

85. {

86. RX_ones = 0;

87. }

88. else

89. {

90. RX_state = DECODE;//将状态配置为解码

91. }

92. }

93. else if(RX_diff < SHORTINTERVAL)

94. RX_ones++;

95. else

96. RX_ones=0;

97. break;

98. case DECODE:

99. /**************通过间隔长短来判定数据**************/

100. if ((SHORTINTERVAL

101. {

102. currentbit=(currentbit+1)&0x01;

103. RX_times+=2;

104. }

105. else if( RX_diff < SHORTINTERVAL)

106. {

107. currentbit=currentbit;

108. RX_times++;

109. }

110. else

111. RX_state = DATAINIT;

112.

113. /****************接受数据位,从低位接起****************/

114. if(RX_times%2==0)

115. {

116. if(RX_bitcounter<8)

117. {

118. if (currentbit==1)

119. {

120. uartByteRx = (uartByteRx >> 1) + (1<<7);

121. rxParity++;//奇偶校验位

122. RX_bitcounter++;//接受数据位数

123. }

124. else

125. {

126. uartByteRx = (uartByteRx >> 1);

127. RX_bitcounter++;

128. }

129. }

130. else

131. {

132. rxParity&=0x01; //进行奇偶校验

133. if(rxParity==currentbit)

134. {

135. RX_bitcounter++;

136. RX_finish=1;

137. RX_state=DATAINIT;

138. }

139. else

140. RX_state=DATAINIT; //若奇偶校验错误则,重新检测

141. }

142. }

143. break;

144. case DATAINIT : //初始化参数状态

145. RX_bitcounter=0;

146. RX_ones=0;

147. rxParity=0;

148. currentbit=0;

149. RX_state=STARTBIT_FALL;

150. RX_times=0;

151. break;

152. default:

153. break;

154. }155. }

本文标签: 信号音频手机方式设备