在創客馬拉松深圳站,來自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測試成功。當它被作為禮物送給對方的時候,你還可以在后面的日子里訪問它,很喜歡為它設計的廣告語:每一份愛都應該得到禮物,每一份禮物都應該持續不斷地得到祝福。