|
前言
感谢 Luna 姐姐的厚爱早早就寄来了 SIM808 模块,真是抱歉这么迟才发帖。
制作
首先看一下结构框图吧:
然后是组装整体图:
这是一个音频线以及一个自制的衰减线,测试的时候电话录音再通过这些线接到语音模块的 MIC 接口是可以识别的,可是用 SIM 模块通话的时候却识别不了,推测可能是因为电话通话中有一些奇怪的杂音导致的:
所以最后竟然是用这么土的方法:直接耳机对着语音识别模块的话筒,声音开到最大。真是不忍直视。当然识别效果也很差,因为车子跑的时候马达声音很吵……录了二三十个视频才出来一个效果过得去的:
视频
下面就是精挑细选的视频了:
...呃,发表帖子的怎么没有添加视频的控件呢?
只好直接放一下链接了:http://www.tudou.com/programs/view/rMyw9XvYw3I/
语音识别模块
代码中看不到语音识别模块的相关内容,这里解释说明一下。我用的是一个集成度很高的模块,非常方便,只需要给 TF 卡里配置上需要识别的语音就可以了,然后就可以通过串口提供结果,或者直接有 IO 引脚输出控制信号。下面是从说明书里截的一个配置说明以做展示。为了防止被奈何因打广告嫌疑封号,咱就避嫌打点码:
我的配置文件如下,串口输出中使用 FA FB 做标识,在程序中识别这两个数据后的数据即是控制命令,用来控制小车的行动:
[mw_shl_code=cpp,true]90:FA FB 01 00 00:qian jin:前进.mp3
91:FA FB 02 00 00:ting zhi:停止.mp3
92:FA FB 03 00 00:hou tui:后退.mp3
93:FA FB 04 00 00:zuo zhuan:左转.mp3
94:FA FB 05 00 00:you zhuan:右转.mp3
95:FA FB 06 00 00:jia su:加速.mp3
96:FA FB 07 00 00:jian su:减速.mp3
97:FA FB 08 00 00:guan deng:关灯123.mp3
98:FA FB 09 00 00:kai deng:开灯123.mp3[/mw_shl_code]
代码
最后贴个代码片段,完整代码请下载附件压缩包:
altarVoice.zip
(7.27 KB, 下载次数: 2)
DF库里的判断模块是否上电,启动模块以及接听电话的接口为啥我觉得都没有起作用,好奇怪,自己用串口输出 AT 指令是正常的,反正用 AT 指令可以操作了,也就不去深究啥原因了。
[mw_shl_code=cpp,true]
#include "CarWithL9110.h"
#include "VoiceController.h"
#include "ControllerManager.h"
#include <DFRobot_sim808.h>
const uint8_t LEFT_FORWARD_PIN = 5;
const uint8_t LEFT_BACK_PIN = 3;
const uint8_t RIGHT_FORWARD_PIN = 6;
const uint8_t RIGHT_BACK_PIN = 9;
const uint8_t SOFT_SERIAL_RX_PIN = 7;
const uint8_t SOFT_SERIAL_TX_PIN = 10;
const uint8_t LED_PIN = 11;
SoftwareSerial softSerial(SOFT_SERIAL_RX_PIN, SOFT_SERIAL_TX_PIN);
CarWithL9110 altar(LEFT_FORWARD_PIN, LEFT_BACK_PIN, RIGHT_FORWARD_PIN, RIGHT_BACK_PIN);
ControllerManager controllerMgr;
VoideController voiceController(&altar, &softSerial, LED_PIN);
DFRobot_SIM808 sim808(&Serial);
#define PERMIT_NUMBER "13********00"
#define SIM808_POWER_PIN 12
// DF 库的 powerUpDown() 好像没作用,自己写一个
void simPowerUp(uint8_t pin)
{
digitalWrite(pin, LOW);
delay(100);
digitalWrite(pin, HIGH);
delay(1500);
digitalWrite(pin, LOW);
}
void checkAndAnswerPermitPhoneCall(DFRobot_SIM808 sim808, char *permitPhoneNumber)
{
char number[20];
if (!sim808.isCallActive(number))
return;
Serial.println(number);
if (strcmp(number, permitPhoneNumber) != 0)
return;
// sim808.answer();
// sim808.answer() 不起作用啊好奇怪,自己发AT命令吧……
Serial.println("ATA");
}
void initSim808()
{
Serial.begin(9600);
pinMode(SIM808_POWER_PIN, OUTPUT);
if (!sim808.checkPowerUp())
simPowerUp(SIM808_POWER_PIN);
while(!sim808.init())
{
delay(1000);
Serial.println("Sim808 init error");
}
Serial.println("Sim808 init success");
// 将声音开大
Serial.print("AT+CLVL=99\r\n");
}
void setup()
{
Serial.begin(9600);
softSerial.begin(9600);
initSim808();
altar.init();
altar.setSpeed(80);
voiceController.init();
controllerMgr.registerController(&voiceController, ControllerManager::VOICE, true);
}
void loop()
{
checkAndAnswerPermitPhoneCall(sim808, PERMIT_NUMBER);
controllerMgr.update();
delay(20);
}
[/mw_shl_code]
|
|