以下作品由安信可社區用戶
sujingliang制作
Ai-M61 系列模組是由安信可科技開發的 Wi-Fi6 & 藍牙雙模模組,搭載BL618芯片作為處理器,支持Wi-Fi 802.11b/g/n/ax協議和BLE 5.3協議。BL618芯片內置低功耗的32位RISC-V CPU,最高主頻可達320M. 豐富的外圍接口,包括DVP、MJPEG、Dispaly、Audio Codec、USB2.0、SDU、以太網(EMAC)、SD/MMC(SDH)、SPI、UART、I2C、I2S、PWM、GPDAC、GPADC、ACOMP和GPIO等。可廣泛應用于音視頻多媒體、物聯網(IoT)、移動設備、可穿戴電子設備、智能家居等領域。
Ai-M61系列模塊的核心BL618確實支持傳統藍牙功能,然而,由于博流官方(BL618芯片制造商)尚未正式發布針對這一功能的SDK,開發者在使用M61進行傳統藍牙開發時面臨諸多挑戰。
GitHub上雖然可以找到博流官方的SDK,但其中關于傳統藍牙的代碼非常有限,且基于Zephyr藍牙棧的官方代碼缺乏具體的例程,這無疑增加了開發的難度。
1論壇里有大佬實現了BTstack port
使用BTstack測試M61
https://bbs.ai-thinker.com/forum.php?mod=viewthread&tid=44962&fromuid=14007
(出處: 物聯網開發者社區-安信可論壇)
也就是說可以用BTstack開源協議棧來開發M61模塊傳統藍牙功能。
2本文想實現的藍牙歌詞播放功能
看到有藍牙歌詞播放器在賣,感覺很神奇,用ESP32實現一下
https://bbs.21ic.com/icview-3414880-1-1.html?fromuser=sujingliang
(出處: 21ic電子技術開發論壇)
為了達到目標,需要完成以下工作:
1、驅動一個屏幕,可以是LED、LCD,這個決定最終的顯示效果。
2、需要一個GBK漢字字模庫,用來獲取顯示漢字。
3、需要一個UTF轉GBK的函數,因為AVRCP是UTF-8格式的,需要轉換成GBK格式才能通過GBK漢字字模庫獲取字模。
4、讀懂A2DP例程,加入適當的功能。(btstack編程)
3關于LCD驅動和字庫驅動(不是本重點)
【外設移植】+LCD_ST7735+M61開發板+GB2312字庫
https://bbs.ai-thinker.com/forum.php?mod=viewthread&tid=44421&fromuid=14007
(出處: 物聯網開發者社區-安信可論壇)
4關于UTF轉GBK的函數
UTF漢字不能直接轉換為GBK,需要先將UTF轉換為unicode,再將unicode通過查表法轉換為GBK。
這部分不用自己實現,網上有現成的。https://gitee.com/zhangkt1995/my ... /utf8_gb2312_switch
5btstack編程
可參考前面大佬提供的btstack_test工程。
git clone https://github.com/bouffalolab/bouffalo_sdk.git
cd ./bouffalo_sdk/examples
git clone https://github.com/O2C14/btstack_test.git
cd ./btstack_test
rm -rf ./btstack
git clone https://github.com/bluekitchen/btstack.git -b v1.6.1
在CMakeLists.txt中設置使用a2dp_sink_demo.c這個例子。
set(EXAMPLE "a2dp_sink_demo")
a2dp_sink_demo.c中在 case
AVRCP_SUBEVENT_NOW_PLAYING_TITLE_INFO增加如下內容
case AVRCP_SUBEVENT_NOW_PLAYING_TITLE_INFO:
if (avrcp_subevent_now_playing_title_info_get_value_len(packet) > 0){
memcpy(avrcp_subevent_value, avrcp_subevent_now_playing_title_info_get_value(packet), avrcp_subevent_now_playing_title_info_get_value_len(packet));
printf("AVRCP Controller: Title %sn", avrcp_subevent_value);
memset(gb2312Data,'',sizeof(gb2312Data));
size_t gb2312DataLen = utf8_to_gb2312((uint8_t *)avrcp_subevent_value, strlen(avrcp_subevent_value), (uint8_t *)gb2312Data, sizeof(gb2312Data));
if(gb2312DataLen>0){
if(gb2312DataLen<256)gb2312Data[gb2312DataLen]='';
gb2312Data[64]='';
printf("%s,len:%drn",gb2312Data,strlen(gb2312Data));
GUI_Write16CnCharMatrix(10,10,gb2312Data,LCD_COLOR_RGB565(255,255,255),LCD_COLOR_RGB565(255,0,0));
}
}
break;
大概就是在AVRCP收到TITLE事件后,獲取title(歌詞)信息avrcp_subevent_value;通過utf8_to_gb2312將utf8格式轉為GB2312格式;然后在LCD上顯示出來。
AVRCP_SUBEVENT_NOTIFICATION_TRACK_CHANGED中增加對avrcp_controller_get_now_playing_info的調用,就是在TRACK發生改變時調用獲取playing_info函數,進而觸發AVRCP_SUBEVENT_NOW_PLAYING_TITLE_INFO。
6使用效果
●手機打開藍牙,和M61配對連接,然后可以斷開連接
●在手機藍牙斷開連接的情況下,通過串口工具發出btstack c命令使M61發送AVRCP連接命令,
缺省會觸發訂閱AVRCP_NOTIFICATION_EVENT_TRACK_CHANGED
avrcp_controller_enable_notification(a2dp_sink_demo_avrcp_connection.avrcp_cid, AVRCP_NOTIFICATION_EVENT_TRACK_CHANGED);
這時手機和M61會自動連接上。
●打開手機上的音樂播放軟件
手機上的歌詞變化,LCD上也會相應變化
7總結
使用了BTstack下的a2dp_sink_demo例程,這個例程好像是mcu這邊連接手機發送A2DP、AVRCP連接和訂閱才能獲取歌詞信息,而通過手機連接MCU就不能。嘗試改成手機端主動連接實現相同功能,但沒有成功,還是對btstack了解太少。而且從MCU端連接需要提供手機藍牙的MAC地址,這個比較頭暈了,打個比方:想用藍牙耳機連接手機聽歌需要先知道手機藍牙MAC,這完全不具有操作性。
類似下面的報錯時不時就發生,然后程序就掛了,非常不穩定。
exception_entry
mcause=38000007
mepc:a0004732
mtval:00000000
Store/AMO access fault
不是每個手機都可以建立AVRCP連接,手頭2個手機,1個可以,1個不行。
歸根到底利用AVRCP協議獲取歌詞信息,實現的方案還是存在不少問題。主要是因為接觸傳統藍牙時間比較短,而且藍牙協議棧還是太復雜,好多東西都不懂,慢慢學習。
8原貼地址
Ai-M61實現藍牙歌詞播放功能 - 電子DIY - 物聯網開發者社區-安信可論壇 - Powered by Discuz!?bbs.ai-thinker.com/forum.php?mod=viewthread&tid=45524&_dsign=3bc296c7
審核編輯 黃宇
-
藍牙
+關注
關注
114文章
5944瀏覽量
172161 -
wi-fi
+關注
關注
14文章
2188瀏覽量
125867 -
安信可
+關注
關注
0文章
172瀏覽量
4209
發布評論請先 登錄
相關推薦
高性能、低功耗、可驅屏,Ai-M61系列模組驅屏能力介紹

安信可推出Wi-Fi 6+BLE5.3模組Ai-M62-M2-I

小尺寸,高性能!WiFi 6+BLE 5.3, Ai-M62-M2-I模組發布

“WiFi 6+BLE5.3+Thread”,安信可Ai-M61系列模組選型

基于Ai-M61模組打造一個智能魚缸水質監測系統
【雷達燈控】安信可 Rd-03E+ 燈 + Ai-M61

智能家居之旅(3):Ai-M61/M62 接入HomeAssistant 實現點燈

能和Ai-M61模組對話了?手搓一個ChatGPT 語音助手

評論