1.背景介紹
老人和小孩子獨自在家的時候如果遇到緊急情況,通過撥打電話或者微信的方式通知家人存在操作不便的問題。例如,如果老人摔倒了手機很可能不在身邊,對小孩來說手機的操作又過于復(fù)雜。針對這種情況,研發(fā)一種主動語音上報的系統(tǒng),語音實時時別人的求救聲,然后通過網(wǎng)絡(luò)發(fā)送信息告知家人。
2.硬件選型
在該語音主動告警系統(tǒng)中,需要語音時別模塊和網(wǎng)絡(luò)告警模塊。xr806有豐富的外圍接口,能夠采集外部多種傳感器的數(shù)據(jù),功耗低,可以采用移動電源供電,支持wifi和bt,體積小,可以靈活部署于房間的各個角落。語音模塊選用天問的ASRPRO模塊,該模塊集成度高,支持模塊化編程,識別率高的特點。
硬件連接框圖如下所示,Speech Module支持uart通信和gpio信號,本次實驗選用gpio通信,即當(dāng)識別到特定詞匯時拉高gpio向xr806發(fā)送信后,xr806接收到信號后發(fā)送信息給mqtt client。
硬件實物鏈接如下圖所示
3.軟件實現(xiàn)
3.1 軟件流程
軟件整體的流程如下圖所示。xr806完成初始化以后,連接網(wǎng)絡(luò),建立mqtt連接等待語音模塊的輸入,接收到信號后,發(fā)送mqtt信息給broken,訂閱該topic的所有client都會收到該告警信號。語音試別模塊上電完成初始化以后輸入語音提示信息并循壞等待語音的輸入,匹配到對應(yīng)語音后拉高gpio發(fā)送信號給x806,延遲一秒下拉gpio,并輸入提示語音。
3.2 語音識別(ASR)的實現(xiàn)
天問的語音試別模塊支持類似Scrach的模塊化圖形編程,程序代碼如下。
程序編寫完成后先生成模型,然后編譯下載即可。
3.3 XR806主機編程
3.3.1 工程的建立
3.3.2 代碼開發(fā)
官方SDK中提供了參考,代碼位于xr806_sdk/project/example
,本次實現(xiàn)主要參考gpio和mqtt兩個文件,基于mqtt的代碼完成整體工程的開發(fā)。
官方例程是采用的阿里云的mqtt broken服務(wù),使用前需要注冊,本次開發(fā)采用EMQX提供的免費的公共MQTT服務(wù)器,相關(guān)信息如下:
按照此信息修改代碼的定義:
#define MQTT_DEMO_CLIENT_ID "xr806-mqtt"
#define MQTT_DEMO_HOST_NAME "mqtt://broker.emqx.io"
#define MQTT_DEMO_PORT "1883"
// #define MQTT_DEMO_USERNAME "xr806_senor_set0&vo84Hm3xbUj"
// #define MQTT_DEMO_PASSWORD "4f9ebb2143f01e4489133c1ea55051fbbfc4c44e"
#define MQTT_DEMO_TOPIC "/topic/xr806-sos"
客戶端采用EMQX免費的MQTTX,該工具跨平臺且提供網(wǎng)頁版。手機端可以搜到MQTT助手等類似工具。
GPIO直接套用實例中的即可,需要完成默認(rèn)func等配置的初始化:
static void gpio_input_init(void)
{
GPIO_InitParam param;
param.driving = GPIO_DRIVING_LEVEL_1;
param.mode = GPIOx_Pn_F0_INPUT;
param.pull = GPIO_PULL_NONE;
HAL_GPIO_Init(GPIO_INPUT_PORT, GPIO_INPUT_PIN, ¶m);
}
static uint8_t gpio_input_read(void)
{
return (uint8_t)HAL_GPIO_ReadPin(GPIO_INPUT_PORT, GPIO_INPUT_PIN);
}
修改mqtt_demo_fun
的while(1)
代碼塊,先判斷采集到的gpio信號,然后再publish信息,相關(guān)修改如下:
while (1) {
if (gpio_input_read()) {
/* publish message to topic */
mqtt_demo_publish(MQTT_DEMO_TOPIC, MQTT_DEMO_MSG_TEXT);
ret = MQTTYield(&mqtt_demo_client, 300);
if (ret != 0) {
printf("mqtt yield err, ret:%dn", ret);
reconnect:
printf("mqtt reconnectn");
mqtt_demo_disconnect();
ret = mqtt_demo_connect(MQTT_DEMO_HOST_NAME, MQTT_DEMO_PORT);
if (ret != 0) {
reconnect_times++;
if (reconnect_times > 5)
goto exit;
OS_MSleep(5000); //5s
goto reconnect;
}
}
}
OS_MSleep(10); //10ms
}
3.3.3 編譯執(zhí)行
編譯步驟可以參考工程建立章節(jié)提供的鏈接,官方實例,mqtt的啟動依賴于網(wǎng)絡(luò)的建立,因此系統(tǒng)啟動后需要先建立網(wǎng)絡(luò),建立網(wǎng)絡(luò)的命令如下:
# net sta config [ssid] [password]
# net sta enable
系統(tǒng)啟動以后,說一句“救命”,XR806就會發(fā)送"SOS"信息到broken,同時語音試別模塊會發(fā)出“我來了”的提示信息。訂閱/topic/xr806-sos
該topic的Client會收到sos信息,如下:
4.總結(jié)
首先感謝極術(shù)社區(qū)和全志科技組織的這次活動,能夠有機會試用到功能如此強悍的芯片。通過本次試用一方面對XR806芯片本身的功能和開發(fā)流程有了更深入的了解,另一方面也接觸到了FreeRtos的開發(fā)。相對于鴻蒙liteos SDK,F(xiàn)reeRtos的SDK使用起來方便了很多,這也看出了廠商的用心。因為時間的原因XR806的很多功能還沒有來得及挖掘,接下來有時間會利用這顆芯片做一些更有意思的設(shè)計。
-
傳感器
+關(guān)注
關(guān)注
2545文章
50453瀏覽量
751099 -
ASR
+關(guān)注
關(guān)注
2文章
35瀏覽量
18694 -
FreeRTOS
+關(guān)注
關(guān)注
12文章
483瀏覽量
61918 -
GPIO
+關(guān)注
關(guān)注
16文章
1189瀏覽量
51839 -
MQTT協(xié)議
+關(guān)注
關(guān)注
0文章
97瀏覽量
5335
發(fā)布評論請先 登錄
相關(guān)推薦
評論