文章

[應用] 藍芽 BLE client/server 架構:BLE remote controller

圖片
實作目的         本文要實現一個藍芽 BLE client/server 的架構,以 Filogic 130A 開發板做為智慧音箱的 BLE server 端,另外 ESP32 的藍芽遙控器做為 BLE client 端,架構圖如下所示。在先前的文章 https://han-ya.blogspot.com/2022/04/smart-speaker-on-filogic-130a-kit.html  已經實現智慧音箱的功能,不只是聲控方式,我們還希望能再增加無線遙控的功能。然而, MT7933 晶片(Cortex-M33)本身有語音運算且具有藍芽連接的能力,所以採用 BLE 來達到這項目的。本文的最後一段,有影片呈現實現的結果。         架構中,做為 BLE server 的設備,就是等待其他周邊設備的連接請求,所以連線之前需要發出廣播與配對 (advertising) 的訊號到空中。另一方面,做為 BLE client 的設備,本身要進入掃描模式,查看空中有哪些 server 設備,然後再對特定的 server 提出連線的請求。等連線成功後,client 便可以取得 server 端的 GATT 各種屬性。 圖一:BLE client / server 架構圖 ESP32 client         在 Arduino IDE 開發環境中,ESP32 提供不少範例程式,其中打開範例 ESP32 BLE Arduino\BLE_client,這是一個 client 端的應用,它會開啟 scan 模式,掃描周圍能提供服務的藍芽設備,並將名稱顯示在 COM port 上,如下圖所示,這個範例能掃描到藍芽位址,設備名稱,以及服務的 UUID。一般來說,client 設備上會有顯示資訊,讓我們選擇連線哪一個藍芽設備,在 ESP32 BLE 模組就先用 COM port 充當顯示囉! 圖二:BLE client 掃描設備的結果         如果 client 端要連線某一指定的設備,要先知道設備名稱,比如我們這個實驗打算連線的是 Filogic 130A 開發板,它廣播的名稱為 " ...

智慧音箱 (Smart speaker) on Filogic 130A Kit

圖片
        聯發科在2021年發表 MT7931 / MT7933 晶片,高度集成了無線網路 、 藍芽 、 語音處理於單晶片上,再提供一塊開發板( Filogic 130/130A )做為設計評估之用。先前,我們已經研究開發工具和 SDK 一段時間,並且將操作紀錄成教學影片,請參考 聯發科 Filogic 130A(MT7933) 教學影片 https://han-ya.blogspot.com/2022/03/mt7933.html ,分享給後進的開發人員,以縮短摸索的時間。目前,在這個平台的應用方面,智慧音箱或智能語音助手(Voice Assistant)是解決方案之一,本文將介紹如何在該平台實現智慧音箱這個應用,其影片可參考底下的連結。 系統介紹         下圖一是 Filogic 130A 開發板的方塊示意圖,中心是一顆 MT7933 晶片核心,其包含兩個處理器,一個是 ARM Cortex M33 核心,另一個是 DSP 核心。M33 的工作負責周邊的 I/O 介面,如:SPI / I2C / ADC / UART / SDIO...等通訊介面,而 DSP 負責語音的處理,比如:play / record / VAD / AEC...等。這兩個內部的核心處理器之間有一套通訊的介面,名為 IPI (Internal Process Interface),做為兩邊的命令、event、回應...的溝通橋樑。         做為智慧音箱的解決方案,在喇叭播放的部分,可以提供雙聲道的聲音輸出。在麥克風的部分,可以接兩路音源的輸入,具有陣列的效果 (far-end / near-end)。因此,喇叭與麥克風之間所產生的回音,這顆晶片的 DSP 能藉由 AEC (Acoustic Echo Canceling) 運算來消除,再者, VAD (Voice Activity Detection) 的算法能分辨出音源是屬於環境噪音或是來自人聲,最後才能進行語音識別 ASR (Acoustic Speech Recognition) 的運算。ASR 計算後的結果,如果偵測到符合預設的指令集,則將結果傳遞給 ARM Cortex 處理,AR...

Tutorial Video:聯發科 Filogic 130A(MT7933) 教學影片

圖片
        近期研究聯發科 Filogic 130A (MT7933) 的紀錄,如下,它是一套智慧音箱的解決方案。首先,核心晶片是採用聯發科 MT7931 / MT7933,集成了無線網路 WiFi 6、藍芽、語音處理 、DSP  ...等功能到一顆晶片裡 。另外,一般 MCU 常見的周邊介面,如:SPI / I2C / ADC / UART ...通訊介面也同樣支援,SDIO 資料儲存介面也具備。此外,開發板除了具有撥放音樂的介面,晶片核心還提供語音辨識的功能。         下表是 MT7933 晶片內部的規格,雙核心 ARM Cortex-M33 和 HiFi4 DSP 處理器,內建的 flash 容量高達 16MB,以及內部記憶體 SRAM,相較其他的 MCU 廠商,這容量真是佛心來的,不怕記憶空間不夠,適合語音控制方面的應用。除了這顆晶片之外,另一顆同等級的 MT7931 ,則是內建單核心 Cortex-M33,少了 HiFi4 DSP 處理器,但是做為常規的 MCU 控制器,性能也是很強大。由這兩顆晶片所設計出的開發板,分別稱為 Filogic 130 (MT7931) 和 Filogic 130A (MT7933)。 表一:MT7933 晶片規格 (取自 Acsip 網站)

WiFi Modbus 應用:在 Filogic 開發板, 實現無線連網的資料收集

圖片
        本文將在聯發科的 Filogic 130A 開發板上實現一個無線連網的資料收集方案, 利用工業常見的 Modbus 通訊協定收集產線設備的數據。隨著工廠智能化的發展,生產線上的設備,如:PLC 、 測儀器...都具有聯網的功能,並能提供即時的產線資訊輸出,因此後端需要一個資料收集的方案將產線資訊整合。Filogic 130A 這塊板子除了無線連網功能外,還有 SD 卡介面和 FAT 檔案管理系統,請參考影片連結: "Implement SD + FTP server on Filogic 130A" https://youtu.be/C8EW4fvFUds 。接下來,本文要介紹板子的 SDK [1] 所提供的 DNS (Domain Name System) 和 NTP (Network Time Procotol),並實現 Modbus 通訊功能,最後將數據資料依據當下的時間實時地記錄到 SD 卡裡面。完整的教學影片連結: https://youtu.be/TPryHb3H2oM DSN & NTP         關於數據收集,首先遇到第一個問題是時間,板子需要一個本地時間。因此,我們採用 NTP 協定取得網路時間,以便板子開機後能同步為本地時間。再者,另一個問題是 NTP 服務器常以 domain name 方式呈現,非 IP 位址方式。所以,我們還需要 DNS 的功能,將服務器的網域名稱轉成實體 IP 位址,這樣才能取得網路時間。這段正是要說明這塊 Filogic 開發板如何做到 DNS 和 NTP 的功能。         在 Filogic 提供的 SDK 裡頭,它整合了一個第三方開源碼,為 LwIP (Light Weight IP),是一個 TCP/IP protocol stack。DNS 正是裡面所支援的通訊協定之一,因此我們只要呼叫 LwIP 函數庫就可以使用 DNS 的服務,如下所示。調用 dns_gethostbyname 函數,再給定一個自己的 callback 函數,這樣就能取得 domain name 的 IP 位址了。         ...

在聯發科 Filogic 物聯網板上, 實現 WiFi 功能的開發與測試

圖片
        在前一篇文章  "在 MediaTek Filogic 130A 系統中,如何新增模組到 SDK 項目裡" https://han-ya.blogspot.com/2022/02/mediatek-filogic-130a-sdk.html  學習如何新增自己程式的 module,基於前文所創建的範例,我們往下延伸學習操作這塊板子的 WiFi 無線網路的功能。本文分成四段,開發板的 command line interface (CLI) 、WiFi scan、WiFi連線、建立TCP連線與測試。為了更清楚說明如何在 Filogic 板子上設計開發無線網路的程式,底下提供完整的教學影片連結。 教學影片連結: https://youtu.be/THd5xSAUOyk CLI (Command Line)         當板子接上 COM port 後,我們可以透過這個介面輸入指令,開發板就會運行指令的動作。其中,"wifi" 是一個指令集,當輸入 " wifi init " 後,板子的系統就會對 WiFi physical layer 做初始化的動作,接著開始掃描四周環境,檢查環境的無線網路 SSID,一直掃描,直到我們輸入 " wifi deinit " 結束這過程。通常,這種 CLI 指令多半用來 debug 或者熟悉開發板時候才會操作,我們開發程式不可能用 CLI 來設計,必須呼叫相關的 API 函數,設計出符合自己功能的程式碼。 WiFi scan         我們開發 WiFi scan 需要調用底下幾個 API 函數,首先要將 wifi_api.h 和 nvdm.h 的標頭檔包含進來,接著呼叫的步驟,如下: printf("\n1. wifi_config_init called -----------------\n\n"); if( wifi_config_init (&wifi_config) != 0 )  // 從 flash 載入無線網路的配置 { printf("wifi_config_init failed !!!!!!\n"); } ...

在聯發科 Filogic 130A 系統中,SDK 如何擴增更多模組和項目呢?

圖片
        有關 MediaTek 的 Filogic 130/130A 物聯網開發板的操作,在前一篇文章  "MediaTek Filogic 開發板的初次體驗"  已經學習如何搭建一個編譯系統 、 編譯 SDK 、 燒錄 firmware 、測試板子的指令,接下來如何新增一段自己的函數到 SDK 項目裡,就像在學習第一個程式 hello world 一樣。撰寫自己的程式碼,然後編譯 、 燒錄 、 再驗證,這樣才能逐漸豐富這塊開發板的內容,實現自己想要的功能。YouTube 教學影片的連結如下: https://youtu.be/1ZxxTD8Qxg4         第一步,我們先了解SDK文件夾的結構圖,下圖一所示,SDK 原始程式碼主要放在 kernel 和 middleware 目錄底下,另外放在 bga_sdk_demo 目錄下,包含主程式 main.c 以及開機初始化程式 startup_mt7933.s 。而編譯 SDK 時的配置文件 Makefile 放在  bga_sdk_demo\GCC 目錄底下,之後我們需要添加自己的函數檔案到這個 Makefile 內容裡。 圖一:SDK 文件夾的架構圖         接下來第二步,我們在 middleware 底下創建一個函數的目錄,名稱自行命名。根據 " Build Environment " 技術文件的描述,該目錄下要準備 Makefile 和 module.mk 檔案用於編譯配置,有關 Makefile 內容的設定需參考文件裡的範例,這裡就不多說明。同樣地,module.mk 也是參考文件裡的範例後創建即可,這個檔案的內容用來說明編譯時載入哪幾個我們寫的程式碼檔案,如 .c 和 .h 檔案。 圖二:新增自己設計的函數         第三步,要將前述的編譯配置加入到 SDK 項目裡,如此一來,當系統編譯時,便會把我們的函數檔案一起編譯了。打開 在  bga_sdk_demo\GCC 目錄底下的 Makefile,新增一段配置,如下圖所示。到目前為止,我們只是先把函數的編譯環境創建出來,還...

MediaTek Filogic 開發板的初次體驗,一個具有WiFi 6和藍芽 5.2功能的模組

圖片
        最近拿到聯發科 Filogic 130A 開發板,其核心晶片主要集成了無線通訊 Wi-Fi 6 和藍芽 5.2,光看這兩點就知道這晶片很新穎,原本設計就是以 ARM 架構的晶片(Cortex-M33等級以上),還整合了 DSP 核心,負責處理語音相關的運算,在應用上就多了無線通訊加語音的功能。 有關開發板的介紹與詳細資料,請連結到大大通網站  https://www.wpgdadatong.com/ 。接下來,我要從該網站下載 SDK 版本來試試看板子的操作。 搭建環境         SDK裏面包含了多達五十幾份的技術文件,一開始要怎麼進行呢?一般使用者若沒有原廠支持,確實有點麻煩。底下我整理了入手的步驟,第一步先搭建一個編譯 SDK 的環境,根據 " Build Environment " 文件,編譯必須在 Linux 系統或者 MSYS2 (可在Windows系統編譯),本人自己嘗試用 MSYS2 環境編譯,其實還要修改 SDK 的編譯檔案後才能成功編譯,過程對初學者恐怕不容易立刻入手。還是回到 Linux 系統上,Linux 要安裝好 Make 、Curl 、python...等軟體,而根據" Build Environment Virtual_Env " 文件提到,除了基本軟體外,必須安裝 venv virtualenv 軟體後,這樣才算完整的編譯環境。 Compile SDK         第二步就是編譯 SDK 程式,先要了解 Filogic 130/130A 是兩種封裝的晶片,在編譯時我們輸入的命令不同,一個是 QFN,一個是 BGA 。我在虛擬機的 Ubuntu 上編譯,輸入命令 ./build.sh mt7933_hdk bga_sdk_demo -o= IMGTOOL_ENV = ~/ venv/imgtool/bin/activate 後,便開始進行編譯,有可能會遇到出錯,這時查看 build.log 可以找出錯誤的原因。記得我第一次編譯發生的錯誤是 venv/imgtool 找不到,原來是編譯命令的 IMGTOOL_ENV 所設定的路徑不正確,建議最好設定絕對路徑以免出錯。  底下...