在创客马拉松深圳站,来自SZDIY社区的just4fun团队打造一款多彩LED留声机,具有本地录音和“网络传音”功能。比较悲催的是,当时他们把发音芯片烧坏了,所以评选当天未能拿个好名次。这个炫酷的东西是怎么打造出来的呢?来看看just4fun团队的分享。
像是很多人小时候都幻想拥有哆啦A梦的道具一样,这个灵感也来源于此。我们也制造了这个设备——时光留声机。它的功能简单说来,像是一台带有网络和蓝牙功能的录音机,又因为它只有一个按钮,所以我们又起了个名字给它——One Button。
在生活中有这样的情景:家里只有一辆摩托车,有人有急事要骑车出门,又不必告诉家中的每一个人。离开前,他只要对着盒子录一段话,盒子的颜色就从蓝色变成了红色。别人看到后,点一点按钮就知道了原因。用灯光来提醒不同时间到来的人,这是留声机的第一个功能。
留声机的第二个功能是通过蓝牙来遥控发声,它的应用场景或许是开不了口的道歉。文字通过手机发送到盒子,合成语音来帮你说出那句说不出口的抱歉,或许会让你轻松一些,也少一些尴尬。
留声机的第三个功能是可以通过网络来留言,我们希望它变成一个礼物,在送出去以后,你还可以源源不断的送上祝福。WiFi模块可以帮助设备从网络上获取微信信息。微信客户端可以通过向该设备留言,将数据发送到网络,同时会返回哪些发出的信息已被读取,而哪些尚未被读到。
我们是这样完成它的制作的:
使用的材料有:
Arduino UNO
ISD1820录音模块
SYN6658TTS语音模块
蓝牙模块
WiFi模块
RGB LED灯带及其它
首先,是将Arduino和录音模块连接起来,使用数字端口8号来播放声音,使用9号端口来录制声音,再单独制作按钮连接在12号端口上。因为TTS语音模块是通过串口通讯的,所以我们把它的RX和TX分别连接在Arduino的2、3号端口,蓝牙模块的RX和TX连接在4、5号端口。因为RGB LED灯带的三色要使用PWM控制,所以红绿蓝三色的控制分别连接在了6、10、11号端口。串口的WiFi模块可以连接在7、13号端口。
实际的制作过程中,我们是一个部分一个部分调试成功后再进行整合。部分代码如下:
//端口定义
int buttonPin = 12;
int recordPin = 9;
int playPin = 8;
#define REDPIN 6
#define GREENPIN 10
#define BLUEPIN 11
#include
SoftwareSerial portOne(2, 3);
SoftwareSerial portTwo(4, 5);
........
//TTS字符处理
void parser(unsigned char c)
{
unsigned int len;
if (gSerialBufIndex == 0)
{
if (c == 0xFD)
{
gSerialBuf[0] = 0xFD;
gSerialBufIndex = 1;
} else {
return;
}
} else if (gSerialBufIndex < 3)
{
gSerialBuf[gSerialBufIndex ] = c;
} else if (gSerialBufIndex >= 3)
{
len = gSerialBuf[1] << 8 | gSerialBuf[2];
if (len > 200)
return;
if ((gSerialBufIndex - 3 1 ) <= len)
{
gSerialBuf[gSerialBufIndex ] = c;
if ((gSerialBufIndex - 3 1 ) > len)
{
gSerialBuf[gSerialBufIndex] = '\0';
portOne.write(gSerialBuf[0]);
portOne.write(gSerialBuf[1]);
portOne.write(gSerialBuf[2]);
portOne.write(gSerialBuf 3);
gSerialBufIndex = 0;
return;
}
}
}
}
.......
//蓝牙数据转发TTS模块
while (portTwo.available() > 0) {
analogWrite(GREENPIN,255);
delay(50);
analogWrite(GREENPIN,0);
char inByte = portTwo.read();
parser(inByte);
电路连接的部分结束后,我们使用3D打印制作了留声机的外壳,并将电路部分固定在了里面。
关于通过android端手机蓝牙控制的发声过程,首先发现蓝牙设备,并且连接上去。
输入你要说的话,点击发送就可以让发声模块发声。还可以通过点击男声和女生来变换声音的语调。
蓝牙连接流程:
下面是蓝牙的连接原理图,首先通过界面GUI点击连接按钮通过连接按钮的事件hitConnectButton()来发出连接命令,命令ACTION_CONNECT发送给后台服务Background Service通过checkAddressFormat来检查地址格式,然后通过initBuletoothDevice()来调用蓝牙连接库BlueTooth Library来初始化蓝牙连接。当蓝牙连接库返ready()的时候Background Service开始启动连接线程startConnectThread(),接着打开蓝牙连接socket,当返回socketOpen时启动socket连接池管理socket。然后Background Service返回给GUI命令ACTION_CONNECTED,表示连接成功。同时通过updateButtonState()来更新界面的显示状态。
数据格式生成代码:
下面是从android手机端发送给发声模块的数据帧结构。下面的代码就是怎么样在android上用java代码生成这样的数据格式。经调试该发声模块目前能接受的是GBK的数据编码格式,所以我们用message.getBytes(“GBK”)来生成该编码格式。Msg_byte_len是数据帧总长度,byteHead代表帧头,byteLen代表数据区长度,byteType代表命令字和命令参数,然后将这些数据组合在destArray中,发送到发声模块上,发声即可。
稍加调试,留声机就基本能工作起来了。对我们最具挑战的第三个功能——网络留言功能,也使用微信的API测试成功。当它被作为礼物送给对方的时候,你还可以在后面的日子里访问它,很喜欢为它设计的广告语:每一份爱都应该得到礼物,每一份礼物都应该持续不断地得到祝福。