資料介紹
描述
概述
記憶力減退只是老年帶來的許多不愉快經歷中的一小部分,這些問題可能對老年人的舒適度和安全感產生深遠影響。癡呆癥是與老年人相關的最常見的神經系統問題之一。想象一下老年人把水龍頭開著的情況。可能隨之而來的那種水害簡直是難以想象的。更不用說許多安全問題,例如觸電和溺水。此外,有時孩子甚至大人在使用后會忘記關掉水龍頭。它還會增加您每月的用水費用。在這個項目中,我已經構建了一個支持物聯網的設備的概念驗證,它可以使用聲音傳感器檢測正在運行的水龍頭,并可以通過蜂鳴器發出警報并可以選擇向您發送電子郵件。
硬件設置
我正在使用帶有內置麥克風的 i.MX RT1010 開發板。另外,我正在使用 PCF85063AT-ARD 實時時鐘 (RTC) Shield。在 i.MX RT1010 開發板接頭頂部安裝 PCF85063AT-ARD 后,無法訪問主板上的其他引腳,但 PCF85063AT-ARD 具有外部 I2C 引腳,可用于連接其他 I2C 外設。我使用 M5Stack Atom Lite(ESP32 開發板)進行 Wifi 連接,使用 SSD1306 OLED 顯示器顯示預測標簽。此外,Grove 無源蜂鳴器連接到 M5Stack Atom Lite 以發出警報。
我構建了一個自定義子板,用于將 M5Stack Atom Lite 和 OLED 顯示器安裝到 PCF85063AT-ARD I2C 接頭連接器上。
連接圖可以在原理圖部分找到。您可以在圖像(下圖)中看到最終設置,它非常整潔緊湊。
開發環境設置
對于固件的開發,我正在使用 MCUXpresso 集成開發環境,
安裝后打開 MCUXpresso IDE 并在快速啟動面板中單擊新建項目鏈接。在 Device selection 頁面中,選擇evkmimxrt1010并單擊Next按鈕。
我選擇了 C++ 項目,因為 Tensorflow Lite 和 Edge Impulse SDK 庫中的大部分代碼庫都使用 C++。此外,我在“驅動程序”選項卡中選擇了sai-edma ,因為我們將使用同步音頻接口 (SAI) 進行音頻捕獲。
在Components中選擇提供音頻編解碼控制接口的codec_wm8960_adapter 。
PCF85063AT-ARD RTC 和 SSD1306 OLED 庫
目前,MCUXpresso SDK 中沒有可用于 PCF85063AT-ARD RTC Shield 和 SSD1306 OLED 的庫,因此我使用數據表和 Arduino 庫中現有代碼庫的一些幫助編寫了一個。除了準確的實時時鐘外,PCF85063AT-ARD 還具有鬧鐘和倒數計時器功能。我們將在項目中使用倒數計時器和時鐘功能。
Tensorflow Lite 模型創建
我們將使用 Edge Impulse Studio 來訓練和構建 Tensorflow Lite 模型。我們正在使用預建數據集來檢測水龍頭是否基于音頻運行。它包含在以下兩個類別中從麥克風以 16KHz 采樣的 15 分鐘數據:
- Faucet - 水龍頭正在運行,具有各種后臺活動。
- 噪音 - 只是背景活動。
我們可以使用 Edge Impulse CLI 上傳器將此數據集導入 Edge Impulse Studio 項目。請按照此處的說明安裝 Edge Impulse CLI:https://docs.edgeimpulse.com/docs/cli-installation。數據集可以從這里下載:https://cdn.edgeimpulse.com/datasets/faucet.zip。
$ unzip faucet.zip
$ cd faucet
$ edge-impulse-uploader --clean
$ edge-impulse-uploader --category training faucet/training/*.cbor
$ edge-impulse-uploader --category testing faucet/testing/*.cbor
系統將提示您輸入用戶名、密碼和要添加數據集的項目。上傳完成后我們可以在數據采集頁面看到數據。
在Impulse Design > Create Impulse頁面中,我們可以添加處理塊和學習塊。我們選擇了 MFCC 作為處理塊,它使用 Mel 頻率倒譜系數從音頻信號中提取特征,對于學習塊,我們選擇了神經網絡 (Keras),它從數據中學習模式,并將這些模式應用于新數據以識別音頻。
現在我們需要在 Impulse Design > MFCC 頁面中生成特征。我們可以使用默認參數。
單擊“保存參數”按鈕后,頁面將重定向到“生成特征”頁面,我們可以在此處開始生成特征,這需要幾分鐘時間。特征生成后,我們可以在特征資源管理器中看到輸出。
現在我們可以轉到 Impulse Design > NN Classifier 頁面,我們可以在其中定義神經網絡架構。我們正在使用適用于音頻分類的一維卷積網絡。
完成架構后,我們可以開始訓練,這需要幾分鐘才能完成。我們可以在下面看到準確率和混淆矩陣。
對于這么小的數據集,89.3% 的準確率已經不錯了,所以我們將使用這個模型。目前 Edge Impulse Studio 不支持 i.MX RT1010 MCU,因此我們需要在部署頁面中選擇創建庫> C++ 庫并單擊構建按鈕來下載 C++ 庫包。構建完成后,將下載到本地計算機,我們可以將庫包解壓縮并移動到 MCUXpresso 項目源目錄。
移植 Edge Impulse 庫
i.MX RT1010 MCU 沒有開箱即用的支持,因此我們需要移植它。在 MIMXRT1011_Faucet_Alarm_Project/source/edge-impulse-sdk/porting/ei_classifier_porting.h 中,在文件末尾添加以下行。
#ifndef EI_PORTING_IMXRT1010
#ifdef CPU_MIMXRT1011DAE5A
#define EI_PORTING_IMXRT1010 1
#else
#define EI_PORTING_IMXRT1010 0
#endif
我們需要在 porting/imxrt1010 目錄下添加兩個文件。
1. 移植/imxrt1010/ ei_classifier_porting.cpp
#include "../ei_classifier_porting.h"
#if EI_PORTING_IMXRT1010 == 1
#include
#include
#include
#include "clock_config.h"
#include "board.h"
#define EI_WEAK_FN __attribute__((weak))
extern "C" {
volatile uint32_t g_systickCounter;
volatile uint32_t g_millis_counter;
void SysTick_Handler(void)
{
if (g_systickCounter != 0U)
{
g_systickCounter--;
}
g_millis_counter++;
}
}
void SysTick_DelayTicks(uint32_t n)
{
g_systickCounter = n;
while (g_systickCounter != 0U) { }
}
EI_WEAK_FN EI_IMPULSE_ERROR ei_run_impulse_check_canceled() {
return EI_IMPULSE_OK;
}
EI_WEAK_FN EI_IMPULSE_ERROR ei_sleep(int32_t time_ms) {
SysTick_DelayTicks(time_ms);
return EI_IMPULSE_OK;
}
uint64_t ei_read_timer_ms() {
return (uint64_t)g_millis_counter;
}
uint64_t ei_read_timer_us() {
return ei_read_timer_ms() * 1000UL;
}
/**
* Printf function uses vsnprintf and output using Arduino Serial
*/
__attribute__((weak)) void ei_printf(const char *format, ...) {
va_list args;
va_start(args, format);
vprintf(format, args);
va_end(args);
}
__attribute__((weak)) void ei_printf_float(float f) {
ei_printf("%f", f);
}
__attribute__((weak)) void *ei_malloc(size_t size) {
return malloc(size);
}
__attribute__((weak)) void *ei_calloc(size_t nitems, size_t size) {
return calloc(nitems, size);
}
__attribute__((weak)) void ei_free(void *ptr) {
free(ptr);
}
#if defined(__cplusplus) && EI_C_LINKAGE == 1
extern "C"
#endif
__attribute__((weak)) void DebugLog(const char* s) {
ei_printf("%s", s);
}
#endif // EI_PORTING_IMXRT1010 == 1
2. 移植/imxrt1010/debug_log.cpp
#include "../ei_classifier_porting.h"
#if EI_PORTING_IMXRT1010 == 1
#include "tensorflow/lite/micro/debug_log.h"
#include
#include
// On IMXRT1010, we set up a serial port and write to it for debug logging.
#if defined(__cplusplus) && EI_C_LINKAGE == 1
extern "C"
#endif // defined(__cplusplus) && EI_C_LINKAGE == 1
void DebugLog(const char* s) {
ei_printf("%s", s);
}
#endif // EI_PORTING_IMXRT1010
流程圖
下面給出應用流程圖。
使用 i.MX RT1010 FlexRAM
i.MXRT1010 有限的 128 KB 內存分為 32 KB 存儲區。由于內存溢出,編譯失敗。由于我們使用雙緩沖來捕獲音頻數據;第一個緩沖區用于音頻采樣過程,用新的樣本數據填充緩沖區,第二個緩沖區用于推理過程,從緩沖區中獲取樣本數據,提取特征并運行推理。所以它需要更多的內存。如果我們構建固件,它會顯示以下錯誤。
錯誤:arm-none-eabi/bin/ld:MIMXRT1011_Faucet_Alarm_Project.axf 部分“.bss”不適合區域“SRAM_DTC”。
Memory region Used Size Region Size %age Used
BOARD_FLASH: 289968 B 16 MB 1.73%
SRAM_DTC: 49840 B 32 KB 152.10%
SRAM_ITC: 0 B 32 KB 0.00%
SRAM_OC: 0 B 32 KB 0.00%
NCACHE_REGION: 0 B 32 KB 0.00%
多虧了 FlexRAM,我們可以通過以下步驟重新配置 SRAM_DTC 以增加堆內存大小。在“快速入門”面板中,單擊“編輯項目設置”。在設置窗口中,選擇C/C++ build > Settings > MCU C++ Linker > Managed Linker Script ,然后在大小字段中將默認堆值從 2 KB (0x800) 更改為 20 KB (0x5000)。單擊應用和保存按鈕以保存設置。
此外,在主代碼中,通過在__DATA(RAM3) 前加上前綴來修改占用大量內存的緩沖區變量的聲明,以便將數據放置在 OCRAM 內存區域中。
__DATA(RAM3) static inference_t inference;
__DATA(RAM3) static signed short sampleBuffer[EI_CLASSIFIER_SLICE_SIZE>>1];
重建項目后,我們可以在輸出中看到所有內存區域都在其限制范圍內。
Memory region Used Size Region Size %age Used
BOARD_FLASH: 309988 B 16 MB 1.85%
SRAM_DTC: 28268 B 32 KB 86.27%
SRAM_ITC: 0 B 32 KB 0.00%
SRAM_OC: 20012 B 32 KB 61.07%
NCACHE_REGION: 0 B 32 KB 0.00%
引腳配置
WM8960 編解碼器 IC 使用 LPI2C1。對于 PCF85063AT-ARD,我們將在 GPIO_AD_01 和 GPIO_AD_02 上配置 LPI2C2 (SCL/SDA),它們是通過 I2C 連接到 PCF85063AT IC 的接頭上的引腳。此外,OLED 顯示器和 ESP32 I2C 從設備將通過該 LPI2C2 總線連接。
在Quickstart Panel > MCUExpresso Config Tools >> Open Pins中,我們可以配置引腳。
一一點擊GPIO_AD_01和GPIO_AD_02,分配LPI2C2_SCL和LPI2C2_SCL。之后,從頂部菜單中選擇 ConfigTools > Update Code 以生成代碼。
生成的代碼保存在 board/pin_mux.c 文件中,該文件不正確且無法運行。因此,在從 NXP 論壇獲得幫助后,我們需要修改生成的代碼,如下所示。
void BOARD_InitPins(void)
{
CLOCK_EnableClock(kCLOCK_Iomuxc);
IOMUXC_SetPinMux(IOMUXC_GPIO_AD_01_LPI2C2_SDA, 1U);
IOMUXC_SetPinMux(IOMUXC_GPIO_AD_02_LPI2C2_SCL, 1U);
IOMUXC_SetPinConfig(IOMUXC_GPIO_AD_02_LPI2C2_SCL, 0xD8B0U);
IOMUXC_SetPinConfig(IOMUXC_GPIO_AD_01_LPI2C2_SDA, 0xD8B0U);
}
構建 i.MXRT1010 固件
克隆項目存儲庫。
$ cd ~
$ git clone https://github.com/metanav/MIMXRT1011_Faucet_Alarm.git
在 MCUXpresso IDE 中打開項目。在Quickstart 面板中單擊Build鏈接。構建完成后,點擊Quickstart panel > Debug來燒錄并運行項目。
構建 ESP32 固件
我們還需要構建和閃存 M5Stack Atom Lite (ESP32) 以提供 Wifi 和蜂鳴器功能。
$ cd ~/MIMXRT1011_Faucet_Alarm/esp32_i2c_slave_ntp_smtp
$ idf.py build
$ idf.py -b 1500000 -p /dev/tty.usbserial-5D52E80CAC flash
請根據您的操作系統更改上面的 usb 串口設備路徑。ESP32 在地址 0x19 運行一個 FreeRTOS 應用程序作為 I2C 從設備。MCUExpresso 項目中的主要應用程序連接到此 I2C 從設備以獲取 NTP 時間以在啟動時設置 PCF85063AT RTC,啟用/禁用蜂鳴器并發送電子郵件警報消息。
設備上推理
使用帶有增強型直接內存訪問 (eDMA) 控制器的同步音頻接口 (SAI) 捕獲音頻。DSP 應用程序中的音頻 MFCC 模塊從音頻信號中提取系數并作為輸入發送到模型。該模型將音頻預測為水龍頭或噪音,并在 OLED 屏幕上顯示輸出。出于演示目的,我們將水龍頭運行警報閾值保持在 25 個連續水龍頭運行檢測閾值后,它將通過 I2C 向 ESP32 發送消息觸發蜂鳴器,并在接下來的 10 秒內使用 PCF85063AT-ARD 啟動倒計時器。一旦觸發倒計時,就會向 ESP32 發送一條消息以啟動電子郵件發送過程。
推理演示
現場演示
結論
如果用更多的音頻數據訓練模型,可以提高模型的準確性。此外,板載麥克風數據有一些噪音和低增益,這可以通過修改某些設置來解決,或者可以使用外部數字麥克風來獲得更好的性能。我要感謝 NXP 為這個項目提供免費硬件。
- 智能火災報警器開源分享
- 用于COVID-19的帶門控系統的非接觸式水龍頭
- 使用智能水龍頭進行智能水管理
- GSM報警器開源分享
- 防盜報警器開源分享
- 智能水龍頭的制作方法
- 運動感應水龍頭系統開源分享
- 門禁報警器開源分享
- 激光安全報警器開源分享
- 如何實現紅外線控制自動水龍頭的設計 0次下載
- 如何基于單片機紅外線自動控制水龍頭的詳細中文資料免費下載 53次下載
- 觸摸式自動出水水龍頭電路設計與實現 15次下載
- 水龍頭機器人打磨拋光生產線-2 0次下載
- 電池驅動型感應水龍頭安裝說明書 130次下載
- 火災報警 溫度報警器 短信報警器
- 門把手觸摸報警器分享 636次閱讀
- 報警器電路圖大全 2527次閱讀
- 低壓差線性穩壓器的穩壓原理介紹 3088次閱讀
- 氣體報警器的應用及選擇 5069次閱讀
- 基于555芯片的紅外感應自動水龍頭電路 7258次閱讀
- 一文看懂煙感報警器原理 3.2w次閱讀
- 報警器的中與應用范圍及電路原理分析 6316次閱讀
- 煙霧報警器如何才不會報警 5.5w次閱讀
- 怎樣用水龍頭發電 環保低碳還實用 7767次閱讀
- 汽笛報警器 3524次閱讀
- 水啟動的報警器 1327次閱讀
- 閃光信號報警器 2181次閱讀
- 無聲報警器 2323次閱讀
- 基于555電路的報警器 3818次閱讀
- 缺氧報警器電路 2227次閱讀
下載排行
本周
- 1山景DSP芯片AP8248A2數據手冊
- 1.06 MB | 532次下載 | 免費
- 2RK3399完整板原理圖(支持平板,盒子VR)
- 3.28 MB | 339次下載 | 免費
- 3TC358743XBG評估板參考手冊
- 1.36 MB | 330次下載 | 免費
- 4DFM軟件使用教程
- 0.84 MB | 295次下載 | 免費
- 5元宇宙深度解析—未來的未來-風口還是泡沫
- 6.40 MB | 227次下載 | 免費
- 6迪文DGUS開發指南
- 31.67 MB | 194次下載 | 免費
- 7元宇宙底層硬件系列報告
- 13.42 MB | 182次下載 | 免費
- 8FP5207XR-G1中文應用手冊
- 1.09 MB | 178次下載 | 免費
本月
- 1OrCAD10.5下載OrCAD10.5中文版軟件
- 0.00 MB | 234315次下載 | 免費
- 2555集成電路應用800例(新編版)
- 0.00 MB | 33566次下載 | 免費
- 3接口電路圖大全
- 未知 | 30323次下載 | 免費
- 4開關電源設計實例指南
- 未知 | 21549次下載 | 免費
- 5電氣工程師手冊免費下載(新編第二版pdf電子書)
- 0.00 MB | 15349次下載 | 免費
- 6數字電路基礎pdf(下載)
- 未知 | 13750次下載 | 免費
- 7電子制作實例集錦 下載
- 未知 | 8113次下載 | 免費
- 8《LED驅動電路設計》 溫德爾著
- 0.00 MB | 6656次下載 | 免費
總榜
- 1matlab軟件下載入口
- 未知 | 935054次下載 | 免費
- 2protel99se軟件下載(可英文版轉中文版)
- 78.1 MB | 537798次下載 | 免費
- 3MATLAB 7.1 下載 (含軟件介紹)
- 未知 | 420027次下載 | 免費
- 4OrCAD10.5下載OrCAD10.5中文版軟件
- 0.00 MB | 234315次下載 | 免費
- 5Altium DXP2002下載入口
- 未知 | 233046次下載 | 免費
- 6電路仿真軟件multisim 10.0免費下載
- 340992 | 191187次下載 | 免費
- 7十天學會AVR單片機與C語言視頻教程 下載
- 158M | 183279次下載 | 免費
- 8proe5.0野火版下載(中文版免費下載)
- 未知 | 138040次下載 | 免費
評論
查看更多