×

由太阳能供电基于声学事件构建非法记录检测的森林守护者

消耗积分:0 | 格式:zip | 大小:0.17 MB | 2022-11-15

分享资料个

描述

每年有近 1900 万英亩的森林被毁,相当于每分钟 27 个足球场。森林是成千上万动物的家园,对许多人来说,它们是食物、水、衣服、药品和庇护所的来源。所谓的地球之肺还通过充当碳汇来缓解气候变化。随着城市随着森林火灾等自然灾害的增加而以惊人的速度扩张,保护森林生态系统的必要性是我们应对气候变化的重要一步。森林火灾无需介绍。话虽如此,超过 80% 的森林火灾是人为的(人为的),而不是生物的(自然的)。这些原因可能有很多,例如非法采伐、砍伐森林的努力。非法采伐造成的森林损失对生物多样性构成威胁在森林栖息地。越来越多的物种无法生存,因为这种做法否认了对自然相互联系至关重要的栖息地。森林的广泛破碎和退化使更多的动植物物种濒临灭绝。因此,停止非法采伐将有助于恢复动植物并恢复自然平衡以维持世界。

建议的解决方案

解决方案是在边缘本身由太阳能供电,基于声学事件构建非法记录检测。迄今为止,大多数解决方案都严重依赖云来对从传感器收集的数据进行后处理,这受到网络带宽的限制,这使得它们成为耗电设备。因此,所提出的设备将能够在边缘对 3 类声学事件进行分类,即:正常(天然森林声音)、斧头(使用 Axe 记录树木)、电锯(使用链锯记录树木),并且只会发送通过射频将分类结果和设备状态发送到基站。基站接收数据,将其上传到云端,如果检测到非法登录,则会向有关当局发出短信警报。为了在森林中维持这种解决方案,我们需要收集太阳能并将其储存在电池中。此外,为了节省电力,设备将处于睡眠、唤醒推理和再次睡眠的连续循环中。

pYYBAGNy3DuAMGWjAAFHMhvEOYk573.jpg
系统总览
 

建筑五金

我们的首要目标是选择节能的组件,因为该设备将完全依靠电池和太阳能运行。下面提到的是选择的组件列表:

1) QuickFeather 开发套件:该板具有 80Mhz Arm 内核和 eFPGA,有助于更快地执行计算密集型任务,同时减少能耗。该板具有带低功率声音检测器 (LPSD) 的板载麦克风、NOR 闪存、带 JST 连接器的电池充电器,这使其成为我们应用的合适候选者

2) Xbee S2C:此射频模块可在低至 2mW 的功率下运行,睡眠电流为微安。除了电源规格外,模块的可用性和价格也使其脱颖而出。

3) 太阳能答题板:该模块包含 TI 的 BQ25570 纳米功率升压充电器和降压转换器。低冷启动电压 (300mV)、峰值输出电流 (110mA)、简单的引脚分配和备用超级电容器使其适合我们的项目。

在亚马逊上找到了一个便宜的太阳能照明模块,结果证明它是该项目的一个很好的外壳,因为太阳能电池板已经连接到外壳上,还有一个电池座。由于快羽板上的麦克风朝下,请确保开口没有被外壳堵塞。所有组件都使用焊接到原型板的母头针连接。硬件连接如下:

1)太阳能电池板输入连接到太阳能点击模块的输入引脚。为了启用降压升压转换器,太阳能答题器模块的EN 引脚短接到地。升压后的电压又使用 just 连接器连接到快速引出板。XBee 通过快速转接板上的稳压输出 (J3_15) 供电,以保持稳定的射频通信。电池也通过 JST 连接器旁边的 Vbat 引脚连接。

2)快速羽毛板上的Rx和Tx引脚分别连接到Xbee模块的Rx和Tx引脚。连接到 Xbee 模块的 Pin 9 的 Quick Feather 上的 IO_6 引脚控制 Xbee 模块的睡眠周期。将其拉高(3.3 V)会使 XBee 进入睡眠模式并保持低电平(GND)将其唤醒。

小飞线用于形成组件之间的互连。以下是硬件设计的一些快照。

数据采集

SensiML 为数据捕获、数据建模和固件生成提供端到端软件解决方案,用于低功耗资源受限设备的设备上推理。要使用 SensiML Solutions 的快速功能,我们需要将数据收集固件 bin 文件闪存到板上。您可以直接从SensiML 网站下载 bin 文件(确保下载支持音频的 bin 文件)并按照本教程开始我在为 Tinyfpga 程序员创建别名时遇到问题,但是,使用 git bash 控制台帮助我解决了创建别名“qfprog”以及将 bin 文件闪存到板上的问题。

由于我们需要在项目后期编写一些固件,因此最好获得一些在eclipse ide上使用Quickfeather Simple Streaming Interface AI Application Project生成bin文件的实践经验。这是在 Eclipse 上设置应用程序项目的描述性演练。

在 IDE 上设置项目后,前往Fw_global_config.h文件并为要在Data capture Lab中检测到的设备进行以下更改

pYYBAGNy3EaAdQ0pAADQS_EE8W8278.png
宏配置。
 

选择音频宏以通过 UART 启用音频流。您还需要在项目的sensor_audio目录中的sensor_audio_config_user.h头文件中启用SENSOR_AUDIO_LIVESTREAM_ENABLED宏。

poYBAGNy3EiAWWrlAABNYeAA9B4477.png
音频选择宏配置
 

点击构建按钮(锤形),生成位于 GCC_Project/output/bin 目录中的 bin 文件。在同一目录下打开 git bash,在绿色 LED 停止闪烁之前按板上的重置按钮,然后按用户按钮,然后使用以下命令刷新 bin 文件。

qfprog --port  --m4app .bin --mode m4

一旦程序被刷新,根据以下连接将 USB 到 TTL 串行转换器连接到快速羽毛:

Rx(串行转换器)-> Rx(快速羽毛板)

Tx(串行转换器)-> Tx(快速羽化板)

接地(串行转换器)-> 接地(快速羽毛板)

首先,创建一个新帐户下载 DCL 软件,然后登录。连接就绪后,打开 Data Capture Lab,创建一个新项目,为其命名并将其保存在某个位置。然后从“标签资源管理器”模式切换到“捕获”模式。DCL 使用 SSF 文件形式的插件,告诉它如何与设备通信。在此处下载QuickFeather 的一个(确保为 Simple Streaming 选择一个)并使用 Edit->Import Device Plugin 并选择刚刚下载的 SSF 文件添加它。在右上角你会看到 Sensor Configuration 是空的,所以点击 add new sensor 按钮,选择 QuickFeather Simple Stream 插件,使用“Audio”捕获源,采样率为每秒 16000 个样本,然后确保选中“麦克风”。继续并使用您喜欢的名称保存它。

设置好电路板后,使用“扫描设备”按钮找到正确的串行端口(用于 USB 到 TTL 串行转换器的端口!)后,在 DCL 中单击“连接”。如果它最初不起作用,请尝试拔下转换器,将其重新插入,或断开并重新连接。在该窗格下方,有一个用于添加标签和元数据的部分。我添加了三个标签:普通、斧头和电锯。准备好后点击录制按钮。

走过。
 

录制完成后,我们需要清理音频数据,因为我们不希望将不需要的音频片段输入到训练模型中。这可以通过转到左上角的 Project Explorer 选项卡并双击要修改的捕获来完成。然后我们可以通过在要保留的区域上按住鼠标右键单击的同时拖动鼠标来添加段。您可以在右上角看到它们。这也允许我们通过为每个标签创建段并更改标签来在同一捕获中捕获不同的标签。您还可以使用检测段底部的选项可自动检测数据中的段并为您完成所有重复性工作。确保为每个类创建相同数量的段,因为这将平衡模型并防止其欠拟合或过拟合。您还可以添加数据视频以与音频事件相关联。

poYBAGNy3E2AdUdnAAMl3d_Ni0A357.png
数据分割
 

在前往 File->Close File 之后,是时候使用 Analytics Studio 从捕获的数据生成模型了。请记住,保存在 DCL 中的数据会自动上传并存储在云中,尽管刷新和显示可能需要一些时间。

数据训练:

SensiML 提供社区版订阅计划,该计划以零成本提供分析工具包中的大部分功能。对于想要尝试的制造商来说非常有用。

在 Web 浏览器中登录到Analytics Studio ,然后选择在 DCL 中创建的项目。

pYYBAGNy3E-ADZ_mAAFiRlgAk0Q899.png
项目页面
 

要训​​练模型,我们必须首先通知 Analytics Studio 我们要在查询表单中使用的数据。这可以通过单击Prepare Data选项卡并输入名称、会话、标签、相关元数据、传感器以及如何绘制它来完成。保存后,数据集应该出现在右侧,我们可以看到每个标签中有多少段。

pYYBAGNy3FKAOjx1AAEZ4iczF8c951.png
管道
 

管道是一系列数据处理步骤的容器。管道对象允许您获取现有管道或创建具有给定名称的新管道。您可以使用创建的对象设置输入数据源、添加转换、特征生成器、特征选择器、特征转换和分类器。我们可以通过单击Build Model选项卡并输入以下详细信息来创建管道:

1) 管道名称:

2)选择刚刚创建的查询,

3) 窗口大小:它对应于每个事件要缓冲的样本数。这会对模型和模型的大小产生显着影响。因此明智地设置它。

4) 优化指标:在准确性、F1 分数、灵敏度之间选择您的优先级。

5) 分类器大小:这限制了模型的大小,非常适合加载到 ROM 受限的芯片上。

单击Optimize将通过并构建模型。单击“显示高级设置”栏以显示选项。我喜欢这组选项,因为它提供了更多的灵活性和对模型构建过程的控制。我选择的选项之一是“平衡数据”,它可以平衡每个班级中的数据以进行训练。随意使用这些设置,因为管道日志非常智能,因为它建议用户在构建失败的情况下更改某个参数。

poYBAGNy3FSAEjOAAAEH7KPbMmE068.png
高级参数。
 

SensiML 提供了更多选项来研究生成的模型。切换到左侧的 Explore Model 选项卡以显示与模型相关的所有详细信息,例如 Model Visualization、Confusion Matrix、Feature Summary 和 Knowledge Pack Summary。如果您想优化和调整底层算法,请访问 e 高级模型构建教程

pYYBAGNy3FeAfhv1AAGTyPQ_aRo484.png
模型探索
 

您可以通过单击左侧下拉菜单中的“下载模型”选项继续下载模型/知识。SensiMl支持的板子非常多,我们需要选择的就是快羽板。即使您的开发板不受支持,您也可以选择 ARM GCC Generic,它会下载静态库以及示例代码,以便与任何支持 ARM 的开发板一起使用。下面提到的是我们在下载知识包之前需要关注的选项:

1) 浮点选项:这将为浮点特定约定生成浮点指令目标

2)格式:我们这里有三个选项(二进制、库、源)。源代码仅适用于付费版本。如果您想直接将其闪存到板上,请下载选择二进制文件。对于我们的项目,我们需要库格式以无缝集成到固件中。

3) 应用:选择简单流选项,因为我们使用 Uart 进行数据采集,而不是 WIFI 板。

4) Debug:在 Advanced Setting 选项卡下,确保将其设置为true ,因为在快速逻辑论坛上已经报告了与识别结果不显示在 Uart Terminal 相关的问题

poYBAGNy3FqAZlloAACMoT3ixBk457.png
下载知识包
 

固件开发:

固件开发的第一步是将生成的知识包集成到qf_ssi_ai_app项目中。下面提到的是一些可以帮助您实现相同目标的链接:

将 SensiML 库编译到 QuickLogic QuickFeather 文档中

 

这里的任务是开发固件,在特定持续时间内执行音频推理,进入睡眠模式以在固定时间段内节省电量,然后再次唤醒以恢复循环。qf_ssi_ai_app项目使用音频数据处理器线程来收集音频数据,将其输入模型,并将识别结果输出到控制台。如果我们可以挂起这个线程,设备将自动进入理想状态,因为没有更多任务要运行。因此,固件设计计划解释如下:

pYYBAGNy3FyAdaAUAAJ8I13KZOY036.png
固件设计
 

代码开发的分步指南如下:

1)在sensor_audio_config_user.h文件中开启识别模式:

#define SENSOR_AUDIO_RECOG_ENABLED (1)    // Change it to 1
#define SENSOR_AUDIO_LIVESTREAM_ENABLED (0)
#define SENSOR_AUDIO_DATASAVE_ENABLED (0)

2)在main.c文件中添加如下头文件

#include "ql_audio.h"   
#include "sml_output.h"

3) 创建一个附加到音频数据块处理器线程的句柄并定义外部,使编译器的生活变得容易。创建计时器句柄以控制设备的活动持续时间和睡眠周期。

extern TaskHandle_t xTobeParsed;
TickType_t xTimestart;
TimerHandle_t idealtimer;
TimerHandle_t worktimer;
#define IDEAL_TIMER_PERIOD    10000
#define WORK_TIMER_PERIOD     2000

4) 现在通过更改以下文件将任务附加到线程:

  • sensor_audio_process.c:
// Add this at the top of file
TaskHandle_t   xTobeParsed;

// Pass the address of the task handle in the last parameter
datablk_processor_params_t audio_datablk_processor_params[] = {
    { AUDIO_DBP_THREAD_PRIORITY,
      &audio_dbp_thread_q,
      sizeof(audio_datablk_pe_descr)/sizeof(audio_datablk_pe_descr[0]),
      audio_datablk_pe_descr,
      256,
      "AUDIO_DBP_THREAD",
      &xTobeParsed                   /****** Edited here ********/
    }
};
  • datablk_processor.h:
// As we are passing the address of the task handle, we need to change type of the 
// datablk_pe_handle to pointer. 

typedef struct st_datablk_processor_params
{
  int                      dbp_task_priority;  ///< desired task priority
  QueueHandle_t           *p_dbp_task_inQ;     ///< input queue handle
  int                      num_pes;         ///< number of PEs for this thread
  datablk_pe_descriptor_t  *p_descr;        ///< array of thread PE configurations
  int                      stack_depth;     ///< depth of stack needed for this thread
  char                    *dbp_task_name;    ///< datablock processor task name string
  xTaskHandle             *datablk_pe_handle;  /****** Edited here ********/
} datablk_processor_params_t ;
  • datablk_processor.c:
// Remove the Ampersand sign in order be compatible with the pointer operator. 
xTaskCreate ( datablk_processor_task,
                  p_dbp_params->dbp_task_name,
                  p_dbp_params->stack_depth,  
                  p_dbp_params,
                  p_dbp_params->dbp_task_priority, 
                  p_dbp_params->datablk_pe_handle   /****** Edited here ********/
                );

4)为以下任务添加功能:

  • 初始化定时器:
void timer_init(void)
{
	  if (!idealtimer) {
		  idealtimer = xTimerCreate
	                (
	                   "idealTimer",
	                   IDEAL_TIMER_PERIOD, // 10 ticks = ~10ms
	                   pdTRUE,            // auto-reload when the timer expires
	                   (void *)0,
	                   idealTimer_Callback
	                );
	  }
	  if (!worktimer) {
		  worktimer = xTimerCreate
	                (
	                  "workTimer",
			   WORK_TIMER_PERIOD, // 10 ticks = ~10ms
	                   pdTRUE,            // auto-reload when the timer expires
	                   (void *)0,
	                   workTimer_Callback
	                );
	  }
}
  • 每个计时器到期后要调用的回调函数:
void workTimer_Callback (TimerHandle_t timHandle)
{
	max_class_print();
	vTaskSuspend(xTobeParsed);
	TimerStart(1);
	uart_tx_raw_buf(UART_ID_SSI,"\r\nSleeping",10);
	Xbee_Sleep_Config(1);
	TimerStop(0);
}

void idealTimer_Callback(TimerHandle_t timHandle)
{
	vTaskResume(xTobeParsed);
	TimerStart(0); //work start
	Xbee_Sleep_Config(0);
	TimerStop(1);  // ideal stop
	HAL_DelayUSec(1000);
	uart_tx_raw_buf(UART_ID_SSI,"\r\nInferencing",13);
}
  • 启动和停止定时器的功能:
void TimerStart(bool timer_select)
{
  BaseType_t  status;
  if (timer_select)  {
    status = xTimerStart (idealtimer, 0);                // start timer
    if (status != pdPASS)  {
      // Timer could not be started
    	uart_tx_raw_buf(UART_ID_SSI, "\r\n start ideal timer failed\r\n", 30);
    }
  }
   else
   {
	status = xTimerStart (worktimer, 0);                // start timer
	if (status != pdPASS)  {
	// Timer could not be started
	uart_tx_raw_buf(UART_ID_SSI, "\r\n start work timer failed\r\n", 30);
	}
  }
}

void TimerStop(bool timer_select)
{
  if (timer_select) {
    xTimerStop(idealtimer, 0);
  }
  else {
    xTimerStop(worktimer, 0);
  }
}
  • 配置 Xbee 睡眠​​模式:
void Xbee_Sleep_Config(bool enable_sleep) {
	IO_MUX->PAD_6_CTRL = 0x103;
	// Pull the Pin 6 to 3.3v, which is
	// connected o PIN9 on Xbee
	if(enable_sleep)
		HAL_GPIO_Write(GPIO_0, 1);
	else
		HAL_GPIO_Write(GPIO_0, 0);
}

我们需要将设备波特率与 XBee 模块的波特率相匹配,以便通过 UART 建立通信。访问以下链接以设置 XBee 模块并更改App/src/qf_hardwaresetup.c文件中的uart_setup()函数中的brate参数。完整的项目源代码在 github 上,这里是它的链接:

https://github.com/Pratyush-Mallick/qorc-sdk.git

低功耗优化:

QORC SDK 中的低功耗模式是通过利用 FreeRTOS 无滴答 IDLE 节能技术实现的。当 FreeRTOS 中没有活动任务时,只有 IDLE 任务处于活动状态并导致 CPU 进入睡眠状态。Quicklogic 有一个关于这个主题的指导性良好的文档。该页面可以在这里找到

测量嵌入式系统的功耗是一项越来越困难的任务,然而,Nordic Semiconductor Power Profiler Kit II (PPK2)使其成为一种无缝体验。我们在源模式下测量了系统的电流消耗,即被测设备 (DUT)由 PPK2 供电。安装Power Profiler 应用程序,将 PPK2 上的 VOUT 连接到快速引出板上的 VBAT,同时接地,一切顺利。

 
 
 
 
1 / 2测试设置
 

以下是 3.3 伏特的平均功耗(1 分钟)观察结果,睡眠周期为 10 秒,识别时间为 2 秒:

  • 仅 Quickfeather:6mA
  • 只有 Quickfeather (DFS):7mA(可以通过在 Fw_global_config.h 文件中将 #define CONST_FREQ 设置为 1 来启用动态频率缩放)
  • 仅 Xbee(无睡眠):31mA
  • 仅 Xbee(启用睡眠):1.97mA(本指南可以帮助您配置 XBee 睡眠​​模式)
  • Quickfeather + Xbee(无睡眠):36mA
  • Quickfeather(DFS)+ Xbee(睡眠):7mA
 
 
 
pYYBAGNy3F-ACG_DAAH8MtjSbvU534.png
 
1 / 6最小工作电流为 3mA
 

通过在 s3x_pwrcfg.c 文件中将睡眠策略节点时钟配置为 256 kHz,我可以通过在固件端进行以下更改来实现至少 3mA。

pYYBAGNy3GKAMHZpAADrfIBn94A801.png
睡眠策略配置
 

我想将功耗降到最低,因此联系了 Quicklogic 和 SensiML 团队。这是他们不得不说的:

“在保持最佳性能的同时降低功耗需要大量开发和微调。如果不清楚了解模型尺寸、传感器 ODR(仅 IMU 或音频) 等。为了进一步降低功耗,FW 需要将所有未使用的组件(特定于用例)置于最低功耗模式。当前 FW 没有解决这个问题。

但是,他们确实为我提供了以下指导,我将在未来的开发中纳入这些指导:

  • 在当前的 SimpleStreaming 应用程序中,CONST_FREQ 设置为提供最大性能。在这种情况下,有两种功耗模式:睡眠和活动。睡眠状态是 S3 M4 进入 WFI 模式,同时 S3 IP 在缓冲区中收集传感器数据。活动状态是 M4 运行算法或设置硬件以传输数据时。M4 活动时间取决于知识包数据的算法。
  • 对于 Active,S3 内核消耗 ~5.67mW (@ 1.8V);# 不包括 S3 IO 消耗和传感器。
  • 对于 WFI,S3 内核消耗 ~ 0.370uW (@1.8V);# 不包括 S3 IO 消耗和传感器。
  • 对于 EOS S3,在更改 HOSC 频率时,需要重新配置所有时钟网络分频器更新以获得正确的输出时钟频率。

以下是户外测试期间的一些图片和视频

 
 
 
pYYBAGNy3GuAAgiGAByipeUjqak789.jpg
 
1 / 6监控电池充电
 

 

 

 

 

 

 

 

云网关和短信提醒:

我们的云网关由连接到互联网的个人计算机和通过 UART 连接到 PC 的 Xbee 协调器组成。在 PC 上运行的 python 脚本通过 UART 从 Xbee Coordinator 获取数据,对其进行处理,然后将其转发到ThingSpeak云以进行进一步的可视化和分析。您可以在youtube上观看此视频以开始使用 thingspeak。

一旦我们开始在云上成功接收数据,如果检测到非法伐木,我们将需要一个触发机制来发送警报短信。幸运的是,Thingspeak 有一个ThingHTTP 应用程序,可以在设备、网站和 Web 服务之间进行通信,而无需在设备级别实现协议。我们将使用这个应用程序来触发可以发送自动电子邮件和 SMS的Twilio API。由于 ThingSpeak 基于 Matlab,因此我们需要在 Matlab 中编写此过程。访问以下链接以开始使用ThingHTTPTwilio帐户我在这篇博客的末尾附上了 python 和 Matlab 代码。

这里是显示快速羽化睡眠状态、识别等级和设备位置的公共频道的链接:https ://thingspeak.com/channels/1370213

poYBAGNy3G6APqvCAAE5op-2smI592.png
物联网视觉板
 

关键时刻:

恭喜你完成了这个项目。!让我们拥抱最终的原型。这是一个演示设备完整工作的视频。

 

未来范围:

以下是我计划在下一次修订中完成的任务列表(非常感谢任何形式的帮助):


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

评论(0)
发评论

下载排行榜

全部0条评论

快来发表一下你的评论吧 !