极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 60050|回复: 29

【Arduino】168种传感器模块系列实验(146)---MT8870语音解码

[复制链接]
发表于 2020-3-3 12:19:53 | 显示全部楼层 |阅读模式
本帖最后由 eagler8 于 2020-3-3 17:09 编辑

37款传感器与模块的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止37种的。鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的,这里准备逐一动手试试做实验,不管成功与否,都会记录下来---小小的进步或是搞不定的问题,希望能够抛砖引玉。

【Arduino】168种传感器模块系列实验(资料+代码+图形+仿真)
实验一百四十六:MT8870 DTMF语音解码板模块 电话拨号控制音频解码处理电路



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复

使用道具 举报

 楼主| 发表于 2020-3-3 12:22:21 | 显示全部楼层
MT8870
音调译码器(Tone Decoder)是 MITEL 公司所开发生产为一颗常用复频译码 IC,这个电路可以接收 DTMF 信号,是一个完整的 DTMF 接收器。它接收了 DTMF 信号后,内部将信号分成高频带和低频带,并将此信号送至数字译码器,然后将讯号送至数字译码器以解出按键值,接着将解出的按键值以二进制的方式以四条线(Q1、Q2、Q3、Q4)输出到外部共享 Bus 上,其MT8870 接脚说明如表 1 及内部结构如图 2。值得一提的是,当 MT8870 解出一个按键值且输出到外部时,其 STD 接脚会由低态升为高态,经一段时间后再降为低态,我们便可利用此特点侦测到此脚有讯号时便马上将 Q1-Q4 接脚所产生的值读入 CPU,然后解出电话的按键值。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-3 12:51:30 | 显示全部楼层


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-3 12:59:30 | 显示全部楼层

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-3 13:07:34 | 显示全部楼层
DTMF
双音多频 DTMF(Dual Tone Multi Frequency),双音多频,由高频群和低频群组成,高低频群各包含4个频率。一个高频信号和一个低频信号叠加组成一个组合信号,代表一个数字。DTMF信号有16个编码。利用DTMF信令可选择呼叫相应的对讲机。

在编码时将击键或数字信息转换成双音信号并发送,解码时在收到的DTMF信号中检测击键或数字信息的存在性。一个DTMF信号由两个频率的音频信号叠加构成。这两个音频信号的频率来自两组预分配的频率组:行频组或列频组。每一对这样的音频信号唯一表示一个数字或符号。电话机中通常有16个按键,其中有10个数字键0~9和6个功能键*、#、A、B、C、D。由于按照组合原理,一般应有8种不同的单音频信号。因此可采用的频率也有8种,故称之为多频,又因它采用分别从高低频中任意抽出1种进行组合来进行编码,所以又称之为“8中取2”的编码技术。根据CCITT的建议,国际上采用的多种频率为697Hz、770Hz、852Hz、941Hz、1209Hz、1336Hz、1477Hz和1633Hz等8种。用这8种频率可形成16种不同的组合,从而代表16种不同的数字或功能键。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-3 14:16:41 | 显示全部楼层

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-3 14:34:53 | 显示全部楼层
MT8870的应用电路





本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-3 16:44:24 | 显示全部楼层


1、板载MT8870复频译码芯片
2、板载语音输入接口
3、板载5个LED指示灯,方便查看输出状态
4、芯片主要管脚基本都已经引出
5、PCB尺寸:26.5(mm)x24.5(mm)

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-3 17:07:08 | 显示全部楼层
模块电原理图

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-4 07:21:29 | 显示全部楼层


双音多频信号(DTMF)
电话系统中电话机与交换机之间的一种用户信令,通常用于发送被叫号码。
在使用双音多频信号之前,电话系统中使用一连串的断续脉冲来传送被叫号码,称为脉冲拨号。脉冲拨号需要电信局中的操作员手工完成长途接续(早期方法,很老很古董)。

双音多频信号是贝尔实验室发明的,其目的是为了自动完成长途呼叫。

双音多频的拨号键盘是4×4的矩阵,每一行代表一个低频,每一列代表一个高频。每按一个键就发送一个高频和低频的正弦信号组合,比如'1'相当于697和1209赫兹(Hz)。交换机可以解码这些频率组合并确定所对应的按键。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-4 08:40:52 | 显示全部楼层


DTMF编码器
基于两个二阶数字正弦波振荡器,一个用于产生行频,一个用于产生列频。向DSP装入相应的系数和初始条件,就可以只用两个振荡器产生所需的八个音频信号。典型的DTMF信号频率范围是700~1700Hz,选取8000Hz作为采样频率,即可满足Nyquist条件。DTMF双音频信号由两个二阶数字正弦振荡器产生,一个用来产生行音频信号,另一个产生列音频信号。

CCITT规定每秒最多按10个键,即每个键时隙最短为100MS,其中音频实际持续时间至少为45MS,不大于55MS,时隙的其他时间内保持静默,因此按键产生双音频信号时,相继的两个信号间隔一段时间;解码器利用这个时间识别出双音频信号,并转换成对应的数字信息,而且要识别出间隙信息。因此流程包含音频任务和静默任务,前者是产生双音频采样值,后者产生静默样值,每个任务结束时,要重置定时器和下一个任务。其中静默任务还要加上一个任务:从数字缓冲区取出数字并解包。解包就是将数字映射为对应的行列音频特性,装载指针指向振荡器特征表对应的正确位置。两个任务轮流执行。由CCITT(国际电报电话咨询委员会)的规定,数字之间必须有适当长度的静音,因此编码器有两个任务,其一是音频信号任务,产生双音样本,其二是静音任务,产生静音样本。每个任务结束后,启动下一个任务前(音频信号任务或静音任务),都必须复位决定其持续时间的定时器变量。在静音任务结束后,DSP从数字缓存中调出下一个数字,判决该数字。信号所对应的行频和列频信号,并根据不同频率确定其初始化参数。

DTMF信号包含两组音频信号,解码器的任务是通过数学变换把它从时域转化到频域,然后得出对应的数字信息。由于芯片处理的是数字信号,所以必须把输入信号数字化,再用DSP芯片处理。频率检测时,检测出DTMF信号的基波及二次谐波,DTMF信号只在基波上有较高的能量,而话音信号则是在基波上叠加有较强的二次谐波,检测二次谐波的作用是用来区分DTMF信号与语言和音乐信号。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-4 09:03:48 | 显示全部楼层


DTMF特性
DTMF是由低频组(fb)和高频组(fa)两组频率信号构成,每个数字信号由低频组和高频组的任意一个叠加而成。根据CCITT的建议,DTMF的编译码定义可用下式表示 f(t)=A_{a}sin(2f_{a}t)+A_{b}sin(2f_{b}t) 式中两项分别表示低、高音频的值,Ab和Aa分别表示低音群合高音群的样值量化基线,而且两者幅值比为K=Ab/Aa(0.7<K<0.9)。同时规定,对应于DTMF编译码中的标称频率在发送时,DTMF信号的频率偏差不应当超过1.5%,每位数字的信号极限时长应该大于40ms,而接收设备对2%的偏差应能可靠地接收,对30ms~40ms时长的信号可以正常地接收。

与单音编码不同,DTMF信号是采用8中取2的方式,从高低两个音组中各取一个音频复合而成来代表0-9十个号码和其他功能码,再加上这8个音频信号的各频率间不存在谐波关系,大大减少了虚假信号的干扰,因而DTMF信号工作可靠性特别是抗干扰能力很强。

DTMF应用
DTMF信号即双音频信号,最先用于程控电话交换系统来代替号盘脉冲信号,主叫用户摘机按键拨号后,电话号码所对应的DTMF信号通过电话线传到程控交换机中的DTMF接受电路,交换机中的微机识别被叫电话号码后,接通主被叫用户实现双方通话。

DTMF信号还用于自动控制系统,如果把DTMF的发送电路用于主控系统,接收电路用于被控系统,就可以方便地组成有线或无线通信系统,其通道数视需要而定,16通道以内每通道只需编一位号码即可,若需要更多通道,则可像电话号码编号一样编为两位或两位以上的号码。DTMF信号还被用于部分型号的车载导航终端,用于远程下发目的地坐标信息。比如警情自动拔号、DTMF远程控制系统,基于DTMF编解码的智能家居电话远程控制系统等。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-4 13:01:11 | 显示全部楼层
【Arduino】168种传感器模块系列实验(资料+代码+图形+仿真)
  实验一百四十五:MT8870 DTMF语音解码板模块 电话拨号控制音频解码处理电路
  第一项实验:用arduino的PWM脚(11、12)合成DTMF双音多频编码信号
  
  1、安装 "Tone.h"库: IDE-工具-管理库-搜索-安装
  2、项目测试 :将喇叭贴近电话机话筒,然后发送要拨的电话号码到串口,比如10000,即可拨通电话10000
  3、需要材料:喇叭1个,68Ω电阻两个
  4、硬件连接:在D11,D12引脚各接一个68Ω电阻一端,
     68Ω电阻另一端接喇叭,然后喇叭另一端接地。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-4 13:14:28 | 显示全部楼层
  1. /*
  2.   【Arduino】168种传感器模块系列实验(资料+代码+图形+仿真)
  3.   实验一百四十五:MT8870 DTMF语音解码板模块 电话拨号控制音频解码处理电路
  4.   
  5.   第一项实验:用arduino的PWM脚(11、12)合成DTMF双音多频编码信号
  6.   1、安装 "Tone.h"库: IDE-工具-管理库-搜索-安装
  7.   2、项目测试 :将喇叭贴近电话机话筒,然后发送要拨的电话号码到串口,比如10000,即可拨通电话10000
  8.   3、需要材料:喇叭1个,68Ω电阻两个
  9.   4、硬件连接:在D11,D12引脚各接一个68Ω电阻一端,
  10.      68Ω电阻另一端接喇叭,然后喇叭另一端接地。
  11. */

  12. #include <Tone.h>
  13. String Phone_Number = "";
  14. int i = 0, mark = 0;
  15. //定义freq1,freq2为Tone实例,并且定义双音多频的频率

  16. Tone freq1;
  17. Tone freq2;
  18. const int DTMF_freq1[] = {1336, 1209, 1336, 1477, 1209, 1336, 1477, 1209, 1336, 1477};
  19. const int DTMF_freq2[] = {941,  697,  697,  697,  770,  770,  770,  852,  852,  852};

  20. void setup()
  21. {
  22.   Serial.begin(9600);
  23.   //定义声音产生引脚在Arduino的D11,D12
  24.   freq1.begin(11);
  25.   freq2.begin(12);
  26. }

  27. void loop()
  28. {
  29.   //读出串口数据,串接成Phone_Number字符串
  30.   while (Serial.available() > 0)
  31.   {
  32.     Phone_Number += char(Serial.read());
  33.     delay(2);
  34.     mark = 1;
  35.   }
  36.   //播放DTMF音频,电话号码来自Phone_Number,持续长度200ms,间隔长度300ms
  37.   PlayDTMF(Phone_Number, 200, 300);

  38.   //如果刚才接收到串口的电话号码,因为号码已经在喇叭输出了,清空电话号码并且重置mark
  39.   if (mark == 1)
  40.   {
  41.     Phone_Number = "";
  42.     Serial.println();
  43.     mark = 0;
  44.   }
  45. }
  46. /*
  47.   DTMF播放函数
  48.   调用格式:playDTMF(数字(0~9), 持续时间)。
  49. */
  50. void PlayDTMF(String Number, long duration, long pause)
  51. {
  52.   //如果输入数字为空,或者持续时间不为正数,或者暂停时间不为正数
  53.   //则视作错误,立即停止执行返回主程序。
  54.   if (Number.length() == 0 || duration <= 0 || pause <= 0) return;
  55.   //将Number逐个文字分离,
  56.   for (i = 0; i < Number.length(); i++)
  57.   {
  58.     //如果Number属于0~9的数字字符
  59.     if (Number[i] >= '0' && Number[i] <= '9')
  60.     {
  61.       //则将它ASCII码减去‘0’,得到纯数字,
  62.       Number[i] = '0';
  63.       //然后在串口输出一份,便于查看
  64.       Serial.print(i, DEC);
  65.       //输出双音多频之一
  66.       freq1.play(DTMF_freq1[i], duration);
  67.       //输出双音多频之二
  68.       freq2.play(DTMF_freq2[i], duration);
  69.       delay(pause);
  70.     }
  71.   }
  72. }
复制代码
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-4 13:39:32 | 显示全部楼层
通过串口,尝试输入10000号码,手机11位号码和一个28位的号码

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 需要先绑定手机号

Archiver|联系我们|极客工坊

GMT+8, 2024-3-28 19:45 , Processed in 0.052384 second(s), 18 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表